下面是一个简单的程序,用户输入所学主题的数量->成绩(A,B,C等)->并且该程序计算并打印包括所有cgpa的学生成绩单。

#include<stdio.h>
#include<conio.h>
#include<string.h>

void main()
{
  char string[10];
  char grade[10];
  float out[10];
  int num;
  float cgpa=0.0;

  for(int x=0;x<num;x++)
  {
    printf("\nEnter the number of subjects? \n ");
    scanf("%d",&num);

    printf("\nEnter Student Name: \n");
    scanf("%s",&string[x]);

    printf("\nEnter Student Grade: \n");
    scanf("%s",&grade[x]);


    if(grade[x]>="A" || grade[x]>="a")
      out[x]==4.0;
    else if(grade[x]>="B" || grade[x]>="b")
      out[x]==3.0;
    else if(grade[x]>="C" || grade[x]>="c")
      out[x]==2.0;
    else if(grade[x]>="D" || grade[x]>="d")
      out[x]==1.3;
    else if(grade[x]>="F" || grade[x]>="f")
      out[x]==0.1;
    else
      printf("You've entered a wrong grade");
  }

  cgpa+=out;
  cgpa=cgpa/num;

  printf("%s\n", string);
  printf("%s\n", grade);
  printf("%f\n", cgpa);

  getch();

}


我的主要问题是我不断遇到以下两个错误:


无法将char转换为char *
非法使用浮点数


我得到的错误在以下几行:

    if(grade[x]>="A" || grade[x]>="a")
      out[x]==4.0;
    else if(grade[x]>="B" || grade[x]>="b")
      out[x]==3.0;
    else if(grade[x]>="C" || grade[x]>="c")
      out[x]==2.0;
    else if(grade[x]>="D" || grade[x]>="d")
      out[x]==1.3;
    else if(grade[x]>="F" || grade[x]>="f")
      out[x]==0.1;


非法使用浮点错误的原因如下:

cgpa+=out;

最佳答案

请参阅解决方案。您原始的解决方案有很多问题,并且从根本上来说是有缺陷的。上面的评论强调了您犯的大多数错误,但是原始解决方案的主要缺陷是缺乏清晰的流程结构。

建议在以后开始编码之前草拟算法或处理流程

1. Grab user input for student name and number of subjects
2. For every subject
    a. Get user to input grade
    b. Check grade is valid
    c. Add to cumulative GPA value
   Until num_subjects is met
3. Print out Student Name, Num Subjects and his GPA (cgpa/num_subjects)


请参阅下面的示例解决方案,该解决方案遵循我上面定义的过程。
我希望这可以帮助您进行编程:)

#include <stdio.h>
// #include <conio.h> - Commented this out because this is MS Dos specific and makes solution non portable
#include <ctype.h>

int main(void)
{
    int num_subjects;
    char name[10];
    char grade;
    float cgpa=0.0;
    int x;

    // These do not need to be within your loop. Especially num_subjects
    printf("\nEnter Student Name: \n");
    scanf("%s", &name[0]);

    printf("\nEnter the number of subjects? \n ");
    scanf("%d", &num_subjects);

    // I've replaced this with a while loop, because you need a continuous loop until a valid grade is required
    while( x < num_subjects )
    {
        printf("\nEnter Student Grade: \n");
        scanf("%c", &grade);

        // Upper case the value, so there is no ambiguity in 'a' or 'A'
        grade = toupper(grade);

        printf("\nGrade Entered: %c\n", grade);
        if (grade == 'A') {
            cgpa+=4.0;
        }
        else if (grade == 'B') {
            cgpa+=3.0;
        }
        else if (grade == 'C') {
            cgpa+=2.0;
        }
        else if (grade == 'D') {
            cgpa+=1.3;
        }
        else if (grade == 'F') {
            cgpa+=0.1;
        }
        else {
            printf("You've entered a wrong grade");

            // Being lazy here. I'm decrementing the counter, because I am lazy.
            // By right, the efficient thing to do is to increment the counter on a valid value
            // But in the interest of writing less code, I've decided to decrement the value on an invalid value.
            // And add more comments :P
            x--;
        }

        // Increment x if a valid grade was entered.
        x++;
    }

    // Final output line
    printf("\nStudent: %s, Number Subjects: %d, GPA: %.2f", name, num_subjects, cgpa/num_subjects);
}

08-16 01:08