c - cs50 的可读性。在“if”行无缘无故地进行了有价值的更改
问题描述
所以我在 5 天前开始编程。我正在学习cs50课程。有一个任务(参见https://cs50.harvard.edu/x/2020/psets/2/readability/)来制作一个评估文本等级的程序。我做的。
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
int main(void) {
int ln = 0;
int wn = 1;
int sn = 0;
string text = get_string("write your text:\n");
int l = strlen(text);
for (int i = 0; i < l; i++) {
if (isalpha(text[i])) {
ln++;
}
if ((char) (text[i]) == (char) (' ')) {
wn++;
}
if ((char) (text[i]) == (char) ('.') | (char) (text[i]) == ('!')
| (char) (text[i]) == ('?')) {
sn++;
}
}
float grade = ((float) ((ln / wn * 100) * 0.0588)
- ((float) ((sn / wn * 100) * 0.296)) - 15.8);
if (grade > 1 && grade < 16) {
printf("Grade %f\n", grade);
} else if (grade < 1) {
printf("Before grade 1\n");
} else if (grade > 16) {
printf("grade 16+\n");
}
printf("%i, %i, %i", ln, wn, sn);
}
当我使用调试器时,我可以看到在那条长线上,我做所有的数学运算,float grade
正好等于我需要的数字,一切都很好。但就在它之后,“if”开始的地方,它无缘无故地变成了 1.8。我试图改变不同的参数,直到 if 行,数学仍然是正确的。我做错了什么?
解决方案
代码至少有这个问题:等级为 1 或 16 时没有打印
// Nothing printed when grade is 1 or 16
if (grade > 1 && grade < 16) {
printf("Grade %f\n", grade);
} else if (grade < 1) {
printf("Before grade 1\n");
} else if (grade > 16) {
printf("grade 16+\n");
}
建议
// >= <=
if (grade >= 1 && grade <= 16) {
printf("Grade %f\n", grade);
} else if (grade < 1) {
printf("Before grade 1\n");
} else {
printf("grade 16+\n");
}
整数除法可能错误。使用FP除法。
// vvvvvvv vvvvvvv
// float grade = ((float) ((ln / wn * 100) * 0.0588) - ((float) ((sn / wn * 100) * 0.296)) - 15.8);
float grade = 0.0588 * ln / wn * 100 - 0.296 * sn / wn * 100 - 15.8;
改进
// if ((char) (text[i]) == (char) (' ')) {
if (text[i] == ' ') {
// if ((char) (text[i]) == (char) ('.') | (char) (text[i]) == ('!') | (char) (text[i]) == ('?')) {
if (text[i] == '.' || text[i] == '!' || text[i] == '?') {
推荐阅读
- python - 无法用 seaborn 地块来评估斧头对象
- python - 如何自动复制 - 粘贴 - 运行 .exe 文件?
- javascript - 带有数组值的jQuery排序元素没有html属性
- python - 如何根据特定字符串匹配将特定字符串附加到另一个字符串?
- c# - 没有递归的 C# 字符串数组修改
- azure - 如何将源中的行键映射到接收器中的行键?没有按预期工作
- node.js - 使用 multer-s3 将大型视频文件上传到 s3
- python - Treating a percentage over 100% as a double digit %
- c# - XmlSerializer 在一种特定情况下不序列化
- reactjs - 在 jest-emotion 中添加道具时未更改的快照