从 char 赋值到 char * 使指针中的整数不带大小写

assignment to char from char * makes integer from pointer without a case

提问人:ssjwi_ 提问时间:6/4/2022 最后编辑:Vlad from Moscowssjwi_ 更新时间:6/5/2022 访问量:724

问:

我需要制作一个程序,根据输入对任意数量的学生进行计算和评分。我还需要在评分后打印前 3 名学生,并以 Letter 格式显示最终成绩。我想知道我在字母等级中做错了什么,因为这一直作为一个错误弹出:字母等级错误

这是我到目前为止的代码:

#include <stdio.h>

struct student {
    char firstName[50], lastName[50], equigrade;
    int q1, q2, q3, q4, q5, midterms, finals;
    float FinalGrade;
} s[15];

int main() {
    int i, n, q1, q2, q3, q4, q5, midterms, finals, TotalQuiz;
    float QuizGrade, MidtermExamGrade, FinalExamGrade, FinalGrade;
    printf("Enter number of students:");
    scanf("%d",&n);
    printf("\nENTER STUDENT'S INFORMATION\n");

// storing information
for (i = 0; i < n; ++i) 
{
    printf("\nEnter Student's Full Name: ");
    scanf("%s %s", s[i].firstName, s[i].lastName);
    printf("SCORES\n");
    printf("Quiz 1: ");
    scanf("%d", &s[i].q1);
    printf("Quiz 2: ");
    scanf("%d", &s[i].q2);
    printf("Quiz 3: ");
    scanf("%d", &s[i].q3);
    printf("Quiz 4: ");
    scanf("%d", &s[i].q4);
    printf("Quiz 5: ");
    scanf("%d", &s[i].q5);
    printf("Midterms (100pts): ");
    scanf("%d", &s[i].midterms);
    printf("Finals (100pts): ");
    scanf("%d", &s[i].finals);
    printf("\n");
}

//calculation
TotalQuiz = q1 + q2 +  q3 + q4 + q5;

QuizGrade = (TotalQuiz/50)*100*0.50;
MidtermExamGrade = (midterms/100)*100*0.20;
FinalExamGrade = (finals/100)*100*0.30;
FinalGrade = QuizGrade + MidtermExamGrade + FinalExamGrade;

// alphabetic equivalent
for(i = 0; i < n; i++)
{
    if(s[i].FinalGrade>=97 && s[i].FinalGrade<=100)
    {
        s[i].equigrade = "A+";
    }
    else if(s[i].FinalGrade>=93 && s[i].FinalGrade<=96)
    {
        s[i].equigrade = 'A';
    }
    else if(s[i].FinalGrade>=90 && s[i].FinalGrade<=92)
    {
        s[i].equigrade = "A-";
    }
    else if(s[i].FinalGrade>=87 && s[i].FinalGrade<=89)
    {
        s[i].equigrade = "B+";
    }
    else if(s[i].FinalGrade>=83 && s[i].FinalGrade<=86)
    {
        s[i].equigrade = 'B';
    }
    else if(s[i].FinalGrade>=80 && s[i].FinalGrade<=82)
    {
        s[i].equigrade = "B-";
    }
    else if(s[i].FinalGrade>=77 && s[i].FinalGrade<=79)
    {
        s[i].equigrade = "C+";
    }
    else if(s[i].FinalGrade>=73 && s[i].FinalGrade<=76)
    {
        s[i].equigrade = 'C';
    }
    else if(s[i].FinalGrade>=70 && s[i].FinalGrade<=72)
    {
        s[i].equigrade = "C-";
    }
}


printf("Displaying Information:\n\n");

// displaying information
for (i = 0; i < n; ++i) 
{
    printf("First name: %s %s\n", s[i].firstName, s[i].lastName);
    printf("Marks: %d\n", s[i].q1);
    printf("Marks: %d\n", s[i].q2);
    printf("Marks: %d\n", s[i].q3);
    printf("Marks: %d\n", s[i].q4);
    printf("Marks: %d\n", s[i].q5);
    printf("\n");
}
return 0;

}

C char 赋值运算符 string-literals incompatibletypeerror

评论

0赞 Jabberwocky 6/4/2022
不要发布文本图片,将文本发布为格式正确的文本。您的错误日志是 txt。

答:

1赞 Vlad from Moscow 6/4/2022 #1

根据声明

char firstName[50], lastName[50], equigrade;

数据成员的类型为 。但是在这样的陈述中equigradechar

s[i].equigrade = "A+";

您正在尝试将指向字符串文本的指针分配给字符。也就是说,字符串文本具有用作初始值设定项的字符数组类型,该类型被转换为指向其类型的第一个元素的指针。"A+"char[3]char *

像指针一样重新声明变量

char firstName[50], lastName[50], *equigrade;

在此类语句中,任何地方都使用字符串文本而不是整数字符常量。例如,这个任务不是这样

s[i].equigrade = 'A';

s[i].equigrade = "A";

在这些声明中请注意这一点

QuizGrade = (TotalQuiz/50)*100*0.50;
MidtermExamGrade = (midterms/100)*100*0.20;
FinalExamGrade = (finals/100)*100*0.30;

似乎您需要在每个子表达式中使用浮动算术。那就是写

QuizGrade = (TotalQuiz/50.0f)*100*0.50f;
MidtermExamGrade = (midterms/100.0f)*100*0.20f;
FinalExamGrade = (finals/100,0f)*100*0.30f;

同样在此声明中

TotalQuiz = q1 + q2 +  q3 + q4 + q5;

您使用的是未初始化的变量 Q1、Q2、Q3、Q4、Q5。这种说法没有意义。也许您的意思是使用结构 q1、q2、q3、q4、q5 的数据成员。

我不知道,但也许你想在 for 循环中写

for (i = 0; i < n; ++i) 
{
      printf("Quiz 1: ");
      scanf("%d", &s[i].q1

      q1 = s[i].q1;

     // and so on
);

评论

0赞 ssjwi_ 6/4/2022
我按照你说的做了,谢天谢地,错误消失了。但在打印中,equigrade 仅输出 (null)。计算有什么问题吗?
0赞 Vlad from Moscow 6/4/2022
@ssjwi_ 请看我回答的底部。
0赞 Vlad from Moscow 6/4/2022
@ssjwi_ 你在哪里输出equigrade?要输出它,您需要使用转换说明符 %s。
0赞 ssjwi_ 6/4/2022
尽管将其更改为浮动算术,它仍然显示 (null)。
0赞 Vlad from Moscow 6/4/2022
@ssjwi_ 这是因为这个语句 TotalQuiz = q1 + q2 + q3 + q4 + q5;没有意义。您正在使用未初始化的变量 q1、q2、q3、q4、q5。