【问题标题】:C code: What am I doing wrong?C代码:我做错了什么?
【发布时间】:2015-09-20 10:18:05
【问题描述】:

我编写了这段代码来获取学生的字母成绩并计算他们的 GPA。 运行程序时,我可以正确获取学生的姓名和科目,但无法显示成绩或 GPA。

示例输入:

Sally
1
A
N

样本输出:

Enter Student Name: Sally
How many subjects: 1
Grades for subject 1: A
Student Name: Sally
Grade: 4.00
Do you want to enter another student? N

这是我试过的代码sn-p。

#include <stdio.h>

int main()
{
    char studentName[20];
    char grade[10];
    int k1;
    int totalSub1,totalGrade;
    float gpa1;
    char ch1;
    do
    {
        //Student Name
            scanf("%s",studentName);
            printf("Enter Student Name: %s\n", studentName);

        //Number of subjects
            scanf("%d",&totalSub1);
            printf("How many subjects: %d\n",totalSub1);

        //Get Grades
            for(k1=0;k1<totalSub1;k1++)
            {
                printf("Grades:\n%c",grade[k1]);
                scanf("%c",&grade[k1]);
            }
        //Find the gade points
            for(k1=0;k1<totalSub1;k1++)
            {
                totalGrade=0;
                switch(grade[k1])
                {
                    case 'A':
                    totalGrade+=4;
                    break;
                case 'B':
                totalGrade+=3;
                break;
                case 'C':
                totalGrade+=2;
                break;
                case 'D':
                totalGrade+=1;
                break;
                case 'F':
                totalGrade+=0;
                break;
            }
        }
        //Calculate GPA
        gpa1=totalGrade/totalSub1;
        //Print Student name with GPA
        printf("Student Name: %s\n",studentName);
        printf("Grade: %.2f\n",gpa1);
            printf("Do you want to enter another student?\n");
            scanf("%c",&ch1);
        }while(ch1=='Y'||ch1=='y');
    getchar();
    return 0;
}

【问题讨论】:

  • 调试器说什么?它哪里出错了? “我无法获得成绩”不是具体的问题陈述。始终检查可能遇到错误的函数的结果。 scanf 就是其中之一!
  • scanf 有时非常不直观。例如%s 只扫描一个单词,因此像“Norman Bates”这样的学生姓名将被读取为“norman”,然后下一次扫描尝试从待处理的输入“Bates”中读取一个整数。此外,虽然大多数格式会跳过前导空格,但 %c 不会,因此您的成绩最终可能会变成换行符和空格。
  • 请将您的问题标题edit 命名为有意义的内容,描述您遇到的问题或您提出的具体问题。从您使用的 c 标记可以看出它是 C 代码的事实,而 我在做什么错? 毫无意义。您的标题应该对在搜索结果中找到它的本网站的未来读者有用。一个清晰的描述性标题通常也会更快地为您提供帮助。谢谢。

标签: c


【解决方案1】:

您的代码中有两个问题:

   scanf("%c",&grade[k1]); 
   scanf("%c",&ch1);

应该替换为,

   scanf(" %c",&grade[k1]); //notice the whitespace
   scanf(" %c",&ch1);

这告诉 scanf 忽略空格!阅读它here

您计算 GPA 的代码也应替换为:

   gpa1=totalGrade/(float)totalSub1; 

假设一个人的 GPA 为 2.67,如果您不添加(浮点)字段 gpa1 将存储 2.00!

【讨论】:

    【解决方案2】:

    您的代码存在几个问题。这是您的固定代码。

    #include <stdio.h>
    
    int main()
    {
        char studentName[20];
        char grade[10];
        int k1;
        int totalSub1,totalGrade;
        float gpa1;
        char ch1;
        do
        {
            //Student Name
            scanf("%s",studentName);
            scanf("%d",&totalSub1);
            //Get Grades
            for(k1=0; k1<totalSub1; k1++)
            {
                //getchar();  //If you not interested to give extra space in scanf
                scanf(" %c",&grade[k1]);   //extra white space needed to discard ENTER from previous scanf
    
            }
            //Find the gade points
            totalGrade=0;                     //Initialize totalGrade here not in the loop
            for(k1=0; k1<totalSub1; k1++)
            {
                switch(grade[k1])
                {
                case 'A':
                    totalGrade+=4;
                    break;
                case 'B':
                    totalGrade+=3;
                    break;
                case 'C':
                    totalGrade+=2;
                    break;
                case 'D':
                    totalGrade+=1;
                    break;
                case 'F':
                    totalGrade+=0;
                    break;
                }
            }
            //getchar();
            scanf(" %c",&ch1);
            printf("Enter Student Name: %s\n", studentName);
            printf("How many subjects: %d\n",totalSub1);
            for(k1=0; k1<totalSub1; k1++)
            {
                printf("Grades for subject %d: %c\n", k1+1, grade[k1]);
            }
            //Calculate GPA
            gpa1=(float)totalGrade/totalSub1;      //If you don't cast to float then gpa1 get result from integer division of totalGrade and totalSub1
            //Print Student name with GPA
            printf("Student Name: %s\n",studentName);
            printf("Grade: %.2f\n",gpa1);
            printf("Do you want to enter another student? %c\n", ch1);
        }
        while(ch1=='Y'||ch1=='y');
        getchar();
        return 0;
    }
    

    【讨论】:

    • 输入输入时说:Sally 1 A N 我得到的输出 i:输入学生姓名:多少科目:科目 1 的成绩:学生姓名:Sally 成绩:4.00 你想输入另一个学生?为什么前三行没有打印学生姓名、科目数或科目成绩?我错了吗?
    • f 是什么意思?
    • 请举例说明您期望的输入和输出格式。将此添加到您的问题中。
    • @Chels 答案已编辑,这符合您的输入和输出格式。
    猜你喜欢
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 2021-09-06
    • 2016-02-14
    相关资源
    最近更新 更多