首页 > 解决方案 > 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 行,数学仍然是正确的。我做错了什么?

标签: ccs50

解决方案


代码至少有这个问题:等级为 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] == '?') {

推荐阅读