#include<stdio.h>
#define N 2
struct student
{
int stu_NO;
char name[20];
int grade[i];
};
int main(void)
{
struct student number[N];
int i,grade_count=0;
int excellent_sum=0,good_sum=0,middle_sum=0,pass_sum=0,fail_sum=0;
for(i=0;i<N;i++)
scanf("%d %c %d",&number[i].stu_NO,&number[i].name,&number[i].grade);
for(i=0;i<N;i++)
{
if(*number[i].grade>90)
excellent_sum++;
else if(*number[i].grade<=90||*number[i].grade>80)
good_sum++;
else if(*number[i].grade<=80||*number[i].grade>70)
middle_sum++;
else if(*number[i].grade<=70||*number[i].grade>=60)
pass_sum++;
else if(*number[i].grade<60)
fail_sum++;
grade_count+=*number[i].grade ;
}
printf("%d %d %d %d %d",excellent_sum,good_sum,middle_sum,pass_sum,fail_sum);
printf("%.2f %.3f %.4f %.5f %.6f",excellent_sum/N,good_sum/N,middle_sum/N,pass_sum/N,fail_sum/N);
printf("grade_count=%d",grade_count);
return 0;
}
我不太清楚指针和数组之间究竟有什么内在联系,这是我的第一个结构代码,希望你能帮我解决问题。我将在这里评分[i]评分,和*删除后,更改代码仍然存在一些我没有想到的错误,grade_count有一些奇怪的错误。最后一个printf有一个最后的%d。你能帮我解释一下这些小细节吗?
答案 0 :(得分:1)
由于int grade[N]
是一个数组,因此您可以使用*number[i].grade
访问number[i].grade[N]
的第一个元素
*number[i].grade
与number[i].grade[0]
答案 1 :(得分:0)
int grade[N];
grade
是一个数组。因此,您可以使用*number[i].grade
或number[i].grade[0]
(相当于)来访问它。
number[i].grade
是int
上的指针。
答案 2 :(得分:0)
除非它是sizeof
或一元&
运算符的操作数,或者是用于初始化数组的字符串文字,否则T
“将被转换(”衰减“)到类型为”T
指针“的表达式,表达式的值将是数组的第一个元素的地址
所以,在行
if (*number[i].grade > 90)
表达式number[i].grade
的类型为“{-1}}的2元素数组”;由于表达式不是int
或一元sizeof
运算符的操作数,因此它“衰减”以键入“指向&
的指针”,表达式的值是{的地址{1}}。
因此,表达式int
相当于number[i].grade[0]
。表达式被解析为*number[i].grade
;数组下标运算符number[i].grade[0]
和组件选择运算符*(number[i].grade)
的优先级高于一元[]
运算符。