把小节转时间的程序

#include <iostream>
#include <iomanip>
#include <cmath>

// 计算总时长并格式化为MM:SS
std::string calculateMusicTime(int bars, double bpm, int numerator, int denominator) {
    // 计算总拍数 = 小节数 * 每小节的拍数
    double totalBeats = bars * numerator;
    
    // 计算总秒数 = 总拍数 * (60秒 / BPM)
    double totalSeconds = totalBeats * (60.0 / bpm);
    
    // 分解为分钟和秒
    int minutes = static_cast<int>(totalSeconds / 60);
    int seconds = static_cast<int>(std::round(totalSeconds - minutes * 60));
    
    // 处理秒数进位(如62秒转为1分02秒)
    if (seconds >= 60) {
        minutes += seconds / 60;
        seconds %= 60;
    }
    
    // 格式化输出为MM:SS(补零)
    std::ostringstream oss;
    oss << std::setw(2) << std::setfill('0') << minutes << ":" 
        << std::setw(2) << std::setfill('0') << seconds;
    return oss.str();
}

int main() {
    int bars, numerator, denominator;
    double bpm;
    
    std::cout << "输入小节数量: ";
    std::cin >> bars;
    std::cout << "输入BPM值: ";
    std::cin >> bpm;
    std::cout << "输入拍号分子(如4/4拍输入4): ";
    std::cin >> numerator;
    std::cout << "输入拍号分母(如4/4拍输入4): ";
    std::cin >> denominator;
    
    std::string duration = calculateMusicTime(bars, bpm, numerator, denominator);
    std::cout << "总时长: " << duration << std::endl;
    
    return 0;
}

 nim版

import strformat
import math
import strutils

proc calculateMusicTime(bars: int,bpm: float,numerator: int, denominator: int): string =
    # 计算总拍数 = 小节数 * 每小节的拍数
    let totalBeats: int = bars * numerator
    
    # 计算总秒数 = 总拍数 * (60秒 / BPM)
    var totalSeconds: float = float(totalBeats) * 60.0 / bpm
    
    # 分解为分钟和秒
    var minutes = (totalSeconds.int) / 60
    var seconds = math.round(totalSeconds - float(minutes) * 60).int
    
    # 处理秒数进位(如62秒转为1分02秒)
    if seconds >= 60:
        minutes += float(seconds div 60)
        seconds = seconds mod 60
    
    # 格式化输出为MM:SS(补零)
    var a = "minutes: " & $minutes & " seconds: " & $seconds
    return a

echo "请输入小节"
var bars = stdin.readLine()
echo "请输入BPM"
var bpm = stdin.readLine()
echo "请输入拍号分子"
var numerator = stdin.readLine()
echo "请输入拍号分母"
var denominator = stdin.readLine()
echo calculateMusicTime(bars.parseInt(),bpm.parseFloat(),numerator.parseInt(),denominator.parseInt());

 

posted on 2025-06-22 10:14  小沙盒工作室  阅读(18)  评论(0)    收藏  举报