前几天其他专业的同学给了我一道C语言的题目,没有正式学过C的我决定做一波尝试。题目如下图所示:
完成此简单的功能代码如下:
#include "stdio.h"
#define S 5 //100个学生,先定义5个
struct student
{
int num;//学号
char name[10];//名字
char sex[4];//性别
int grade;//成绩
};
void sort(struct student *ptr,int n)
{
struct student t;
for(int i=1;i<n;i++)
for(int j=0;j<n-i;j++)
if(*(ptr+j).grade < *(ptr+j+1).grade)
{
t=*(ptr+j);
*(ptr+j)=*(ptr+j+1);
*(ptr+j+1)=t;
}
}
int main()
{
struct student stu[S],*ptr;
int i;
ptr=stu;
printf("Input the student's number,name,sex and grade:\n");
for(i=0;i<S;i++)
{
printf("No.%d:",i+1);
scanf("%d%s%s%d",&stu[i].num,stu[i].name,stu[i].sex,&stu[i].grade);
}
sort(ptr,S);
printf("The students score from high to low:\n");
for(i=0;i<S;i++)
{
printf("%d\t%s\t%s\t%d\r\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].grade);
}
return 0;
}
刚开始程序是这样的,编译出错,错误信息:
error C2228: left of '.grade' must have class/struct/union type
查阅很多资料和其他人的错误都没有什么进展,最后决定去仔细看看C语言的结构体指针。
p是指向一维结构体数组的指针,对数组元素的引用可采用三种方法。
1)地址法
student+i和p+i均表示数组第i个元素的地址,数组元素各成员的引用形式为:
(student+i)->name、(student+i)->num和(p+i)->name、(p+i)->num等。student+i和p+i
与&student[i]意义相同。
2)指针法
若p指向数组的某一个元素,则p++就指向其后续元素。
3)指针的数组表示法
若p=student,我们说指针p指向数组student,p[i]表示数组的第i个元素,其效果与
student[i]等同。对数组成员的引用描述为:p[i].name、p[i].num等。
摘自:http://blog.youkuaiyun.com/marlene0312/article/details/4746951
根据地址法来修改源代码中第18行
改后的代码为:
if((ptr+j)->grade < (ptr+j+1)->grade)
编译通过,运行结果为:
编程感悟:编程会出很多错误,不过有很多错误编译器输出的错误都是相同的。也就是说,直接搜索错误看别人代码出错的地方来检查你的错误是很吃力的。所以要么你用更多的时间和功夫把什么情况出现什么编译错误弄清,要么冷静下来,想想你自己的代码哪里会出错,进行调试,找出错误,譬如这次这个简单的C语言结构体,直接搜索了错误,结果浪费了大量的时间去看别人的代码,仔细思考觉得应该是结构体指针问题,最后还是愉快的解决了~