结构体和结构体指针(一)

一、定义和引用结构体数组

题目描述

有3个候选人(假定为:Li An,Zhang Mu, Sun Yi)每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。

输入格式

依次输入15张选票上所写的被选人的姓名。

输出格式

就正常输出吧。

输入样例

Li An
Li An
Sun Yi
Zhang Mu
Zhang Mu
Sun Yi
Li An
Sun Yi
Zhang Mu
Li An
Zhang Mu
Li An
Li An
Sun Yi
Zhang Mu

输出样例

Result:
Li An:6
Zhang Mu:5
Sun Yi:4

代码如下

#include <stdio.h>
#include <string.h>
struct Candidate
	{
		char name[20];
		int count;
	}leader[3]={"Li An",0,"Zhang Mu",0,"Sun Yi",0};
	int main()
{
		int i,j;
		char leadername[20];
		for(i=1;i<=15;i++)
		{
			gets(leadername); 
			for(j=0;j<3;j++)
			{
				if(strcmp(leadername,leader[j].name)==0)
				leader[j].count++;	
			}	
		}
	printf("Result:\n");
	for(i=0;i<3;i++)
	{
		printf("%8s:%d\n",leader[i].name,leader[i].count++);
	}
	return 0;
}

二、结构体数组的应用举例

题目描述

有5位学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。

输入样例

10101 Zhang 78
10103 Wang 98.5
10106 Li 86
10108 Ling 73.5
10110 Sun 100

输出样例

The order is:
 10110    Sun 100.00
 10103   Wang  98.50
 10106     Li  86.00
 10101  Zhang  78.00
 10108   Ling  73.50

代码如下

#include <stdio.h>
#define N 5
struct Student
	{
		int num;
		char name[20];
		float score;
	};
int main()
{
	int i,j,k;
	struct Student stu[N]; 
	for(i=0;i<N;i++)
	{
		scanf("%d %s %f",&stu[i].num,stu[i].name,&stu[i].score);//输入学生的信息 
	}	
	struct Student temp;//定义结构体变量temp,用作交换式的临时变量 
	printf("The order is:\n");
	for(i=0;i<N-1;i++)
	{
	 	k=i;
	 	for(j=i+1;j<N;j++)
	 	{
	 		if(stu[j].score>stu[k].score)
	 		k=j;
	 		temp=stu[k];
	 		stu[k]=stu[i];
	 		stu[i]=temp;
	    }
	}//排序 
	for(i=0;i<N;i++)
	{
		printf("%6d %8s %6.2f\n",stu[i].num,stu[i].name,stu[i].score);	
	}
	return 0; 
}

三、结构体指针变量的运用

题目描述

通过指向结构体变量的指针变量输出结构体变量中成员的信息。

样例输入

10101//学号
 LiLin //姓名
 M//性别
 89.5//成绩

样例输出

No.:10101
name:LiLin
sex:M
score:89.5

No.:10101
name:LiLin
sex:M
score:89.5

No.:10101
name:LiLin
sex:M
score:89.5

代码如下

#include <stdio.h>
#include <string.h>
int main()
{
	struct Student
	{
	 long num;
	 char name[20];
	 char sex;
	 float score;			
	};
	struct Student stu1;
	struct Student * p;//定义指向struct Student类型数据的指针变量p 
	p=&stu1;//p指向stu1 
	scanf("%ld %s %c %f",&stu1.num,stu1.name,&stu1.sex,&stu1.score);
	printf("No.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",
	stu1.num,stu1.name,stu1.sex,stu1.score);
	printf("\n");
	printf("No.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",
	(*p).num,(*p).name,(*p).sex,(*p).score);
	printf("\n");
	printf("No.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",
	p->num,p->name,p->sex,p->score);
	return 0;
}

四、结构体数组指针的运用

题目描述

有3个学生的信息,放在结构体数组里,要求输出全部学生的信息。

代码如下

#include <stdio.h>
int main()
{
	struct Student
	{
		int num;
		char name[20];
		char sex;
		int age;	
	};
	struct Student stu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFang",'M',19},
	{10104,"WangMing",'F',20}};
	struct Student * p;
	printf(" No.  Name      sex  age\n");
	for(p=stu;p<stu+3;p++)
	{
		printf("%5d %-10s %c %4d\n",p->num,p->name,p->sex,p->age);
	}
	return 0;
}

五、用结构体变量和结构体变量的指针做函数参数

题目描述

有n个结构体变量,内含学生学号、姓名、和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。
补充:为简化操作,本程序只设10个学生(n=10)。在输出时使用中文字符串,以方便阅读。

输入样例

10101 LiLin 78 89 98
10102 LiAn 93 83 77
10103 SunYi 81 66 90
10104 ZhangMu 82 84 88
10105 WangSu 98.5 87 69
10106 ZhaoQuan 77.5 84.5 95
10107 QianMu 93 90 91
10108 YingTian 59.5 80 75
10109 LuoXin 64 88 71
10110 YangSu 88 92 73.5

输出样例

成绩最高的学生是:
学号:10107
姓名:QianMu
三门课成绩:93.0 90.0 91.0
平均成绩:  91.33

代码如下

#include <stdio.h>
# define N 10
struct Student
{
	int num;
	char name[20];
	float score[3];
	float average;
};
void input(struct Student stu[])
{
	int i;
	printf("请输入个学生的信息:学号、姓名、3门课成绩:\n");
	for(i=0;i<N;i++)
	{
		scanf("%d %s %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],
		&stu[i].score[1],&stu[i].score[2]);
		stu[i].average=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
	}
}
struct Student max(struct Student stu[])//结构体数组做函数参数 
{
	int i,m=0;
	for(i=0;i<N;i++)
	{
		if(stu[i].average>stu[m].average)
		m=i;
	}
	return stu[m];//返回的是结构体数组元素 
}
void print(struct Student stud)//结构体做函数参数 
{
	printf("\n成绩最高的学生是:\n");
	printf("学号:%d\n姓名: %s\n三门课成绩:%5.1f,%5.1f,%5.1f\n平均成绩:  %6.2f\n",
	stud.num,stud.name,stud.score[0],stud.score[1],stud.score[2],stud.average);
}
int main()
{
	struct Student stu[N],*p=stu;//一边定义一边赋值 
	input(p);
	print(max(p));
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值