提问人:ssjwi_ 提问时间:6/4/2022 最后编辑:Vlad from Moscowssjwi_ 更新时间:6/5/2022 访问量:724
从 char 赋值到 char * 使指针中的整数不带大小写
assignment to char from char * makes integer from pointer without a case
问:
我需要制作一个程序,根据输入对任意数量的学生进行计算和评分。我还需要在评分后打印前 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;
}
答:
1赞
Vlad from Moscow
6/4/2022
#1
根据声明
char firstName[50], lastName[50], equigrade;
数据成员的类型为 。但是在这样的陈述中equigrade
char
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。
评论