简单的c语言题目

前几天其他专业的同学给了我一道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.csdn.net/marlene0312/article/details/4746951


根据地址法来修改源代码中第18行

改后的代码为:

if((ptr+j)->grade < (ptr+j+1)->grade)


编译通过,运行结果为:



编程感悟:编程会出很多错误,不过有很多错误编译器输出的错误都是相同的。也就是说,直接搜索错误看别人代码出错的地方来检查你的错误是很吃力的。所以要么你用更多的时间和功夫把什么情况出现什么编译错误弄清,要么冷静下来,想想你自己的代码哪里会出错,进行调试,找出错误,譬如这次这个简单的C语言结构体,直接搜索了错误,结果浪费了大量的时间去看别人的代码,仔细思考觉得应该是结构体指针问题,最后还是愉快的解决了~ 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值