一、定义和引用结构体数组
题目描述
有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;
}