首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何实现CS50的pset3频率和理解notes.c

如何实现CS50的pset3频率和理解notes.c
EN

Stack Overflow用户
提问于 2018-06-04 00:38:33
回答 2查看 1.1K关注 0票数 -3

我对CS50的音乐有几个问题。

1)在notes.c中有一行for (int i = 0, n = sizeof(NOTES) / sizeof(string); i < n; i++)。什么是sizeof(string)?我可以理解sizeof(注释),这里的注释是一个字符串数组。但是在sezeof(string)?中string意味着什么呢?我拿不到。

2)下面是我对“频率”的实现:

代码语言:javascript
复制
int frequency(string note)
{
    char N[2];
    int octave;
       //parsing the string into a note...
    strncpy(N, note, (strlen(note) - 1));
    //...and its octave
    octave = note[strlen(note) - 1] - '0';
    //add semitones
    int semitone;
    if (strcmp(N, "C") == 0)
        semitone = 1;
    if (strcmp(N, "C#") == 0 || strcmp(N, "Db") == 0)
        semitone = 2;
    if (strcmp(N, "D") == 0)
        semitone = 3;
    if (strcmp(N, "D#") == 0 || strcmp(N, "Eb") == 0)
        semitone = 4;
    if (strcmp(N, "E") == 0)
        semitone = 5;
    if (strcmp(N, "F") == 0)
        semitone = 6;
    if (strcmp(N, "F#") == 0 || strcmp(N, "Gb") == 0)
        semitone = 7;
    if (strcmp(N, "G") == 0)
        semitone = 8;
    if (strcmp(N, "G#") == 0 || strcmp(N, "Ab") == 0)
        semitone = 9;
    if (strcmp(N, "A") == 0)
        semitone = 10;
    if (strcmp(N, "A#") == 0 || strcmp(N, "Bb") == 0)
        semitone = 11;
    if (strcmp(N, "B") == 0)
        semitone = 12;
    //calculate freq: semitones
    float freq = 440 * (powf(2, (semitone -10) / (float)12));
    //calculate freq: multiply by num of octaves
    return round(freq * (powf(2, octave - 4)));
}

./note之后的输出为:

代码语言:javascript
复制
 C4: 262
C#4: 922746880
 D4: 294
helpers.c:55:12: runtime error: value 5.85908e+09 is outside the range of representable values of type 'int'
D#4: -2147483648
 E4: 330
 F4: 349
F#4: -2147483648
 G4: 392
G#4: -2147483648
 A4: 440
A#4: -2147483648
 B4: 494

代码本身可以工作,但在notes.c中不能工作。

请帮我了解一下到底出了什么问题。

EN

回答 2

Stack Overflow用户

发布于 2018-06-04 01:14:06

谢谢。现在,它看起来和工作起来都更好了。

代码语言:javascript
复制
//parsing the string into a note...
    char N = note[0];
    //...and its octave
    int octave = note[strlen(note) - 1] - '0';
    //add semitones
    int semitone;
    if (N == 'C')
        semitone = 1;
    if (N == 'D')
        semitone = 3;
    if (N == 'E')
        semitone = 5;
    if (N == 'F')
        semitone = 6;
    if (N == 'G')
        semitone = 8;
    if (N == 'A')
        semitone = 10;
    if (N == 'B')
        semitone = 12;
    //add accidentals
    if (note[1] == '#')
        semitone ++;
    if (note[1] == 'b')
        semitone --;
    //calculate freq: semitones
    float freq = 440 * (powf(2, (semitone - 10) / (float)12));
    //calculate freq: multiply by num of octaves
    return round(freq * (powf(2, octave - 4)));

我将阅读更多关于sizeof的内容。

票数 0
EN

Stack Overflow用户

发布于 2018-11-14 18:02:22

你可能想把它分解一下。

你从你的数组中得到:

代码语言:javascript
复制
   int octave = note[strlen(note) - 1];

您将获得作为整数的最后一个字符串的ASCII值。要将其转换为正确的数字,您需要在ASCII表中“移位”。

代码语言:javascript
复制
   octave -= 48; // Adjust ASCII to int value

因为char 0= ASCII 48,所以你可以一步完成。

代码语言:javascript
复制
   int octave = note[strlen(note) - 1] - '0';

请注意,当您想要在数组中取回一个表示为alpha的整数时,这是有效的。如果你想从数组中得到一个字符串(也就是char *),你需要做一些不同的事情。关键是即使是一个单字符长的字符串也应该以\0结尾

所以,现在你想要得到音调:

代码语言:javascript
复制
    char N[2];
    N[0] = note[0];
    N[1] = '\0';

请注意上面和这个之间的区别:

代码语言:javascript
复制
    char N = note[0];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50668632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档