C基础:使用阵列存储和打印,加上循环的成绩簿

时间:2016-06-03 23:58:47

标签: c arrays loops

是的,你好。我对编程很陌生。我真的需要帮助,因为我希望既能理解我做错了什么又能通过我的课程。

我参加了编程简介课程,我的任务是创建一个程序,该程序使用数组来存储0到100(含)范围内的百分比等级。该程序应允许用户指示何时完成成绩。当用户输入成绩时,程序应打印输入的成绩。

我有一个在Code :: Blocks中编译的运行代码。但我的问题是:

A。)用户完成后告诉C的最佳方法是什么?我应该

  • 保持代码不变,让任何键被击中?
  • 添加特定变量,例如' done'?
  • 做点什么吗?

B。)如何只打印已输入的成绩而不通过所有100个插槽?我无法找到解决方案。

欢迎并赞赏任何和所有建议!

int i = 0;
float percentScore[100];

for (i = 0; i < 10; i++) {
    printf("Grade %d: ", i + 1);
    scanf("%f", &percentScore[i]);
}

for (i = 0; i < 10; i++) {
    printf("\n%.2f%%", percentScore[i]);
}

return 0;

2 个答案:

答案 0 :(得分:1)

您对A)的选择并不相互排斥;第一个是用户可以做的事情,第二个是在代码中表示的东西。因此,你可以合理地做到这两点。

对于B),你需要一种方法来表示输入的成绩数(提示:一个变量);然后可以用它来控制打印的数量。

答案 1 :(得分:1)

以下是解决问题的简单方法:

  • 对于每个输入,从用户读取一整行;
  • 尝试使用sscanf();
  • 将此行转换为数字
  • 如果转换失败,请考虑输入已用尽;
  • 如果值超出范围,请重新启动此输入。

用户可以通过输入空行来表示列表的结尾。

这是一个例子:

#include <stdio.h>

#define GRADE_NB  100

int main(void) {
    int i, n;
    float grade, percentScore[GRADE_NB];
    char buf[100];

    for (n = 0; n < GRADE_NB;) {
        printf("Grade %d: ", n + 1);
        if (!fgets(buf, sizeof buf, stdin)) {
            /* end of file reached: input exhausted */
            break;
        }
        if (sscanf(buf, "%f", &grade) != 1) {
            /* not a number: input exhausted */
            break;
        }
        if (grade >= 0 && grade <= 100) {
            /* value is OK, grade accepted */
            percentScore[n] = grade;
            n++;
        } else {
            printf("Invalid grade: %f\n", grade);
        }
    }

    for (i = 0; i < n; i++) {
        printf("%.2f%%\n", percentScore[i]);
    }

    return 0;
}

如果潜在的输入数量不受限制,则必须从堆中分配数组并在收集更多输入时重新分配它。这是一个简单的解决方案,为每个输入重新分配数组:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int i, n;
    float grade, *percentScore;
    char buf[100];

    for (n = 0, percentScore = NULL;;) {
        printf("Grade %d: ", n + 1);
        if (!fgets(buf, sizeof buf, stdin)) {
            /* end of file reached: input exhausted */
            break;
        }
        if (sscanf(buf, "%f", &grade) != 1) {
            /* not a number: input exhausted */
            break;
        }
        if (grade >= 0 && grade <= 100) {
            /* value is OK, grade accepted */
            percentScore = realloc(percentScore, (n + 1) * sizeof(*percentScore));
            if (percentScore == NULL) {
                printf("allocation failed\n");
                return 1;
            }
            percentScore[n] = grade;
            n++;
        } else {
            printf("Invalid grade: %f\n", grade);
        }
    }

    for (i = 0; i < n; i++) {
        printf("%.2f%%\n", percentScore[i]);
    }

    free(percentScore);
    return 0;
}