解题思路:
1.首先将a[21]中所有元素初始化为零,且每次输入不同组数组时都初始化为零,防止影响输出结果;
2.其次写一个循环输入数据,同时用a[x]++,记录本数据出现的次数并存储下来;
3.最后输出循环输出a[i],得出1-20分别出现的次数。
为什么写a[21],而不是a[20]?
如果将计数数组定义为a[20],下标范围是0-19,无法直接对应数字1-20,会导致统计逻辑混乱甚
至数组越界错误。a[20]的长度不足以“容纳”1-20的数字下标,而a[21]通过牺牲一个下标0的空间。
#include <stdio.h> #include <string.h> int main() { int n,x; while(scanf("%d",&n)!=EOF) { int a[21]={0}; for(int i=0;i<n;i++) { scanf("%d",&x); a[x]++; } for(int i=1;i<=20;i++) { printf("%d:%d\n",i,a[i]); } } return 0; } 定义结构体数组:
解题思路:
1.设一个结构体数组,数组中包含3个元素;
2.每个元素中的信息应包括候选人的姓名(字符型)和得票数(整型);
3.输入被选人的姓名,然后用strcmp函数与数组元素中的姓名成员比较,如果相同,就给这个元素中的“得票数”成员的值加1;
4.输出所有元素的信息。
#include <string.h> #include <stdio.h> struct Person { char name[20]; int count; }leader[3]={“Li”,0,“Zhang”,0,“Sun”,0}; int main() { int i,j; char leader_name[20]; for (i=1;i<=10;i++) { scanf(“%s”,leader_name); for(j=0;j<3;j++) if(strcmp(leader_name, leader[j].name)==0) leader[j].count++; } for(i=0;i<3;i++) printf("%5s:%d\n“,leader[i].name, leader[i].count); return 0; }指向结构体数组的指针:
解题思路:用指向结构体变量的指针处理
1.声明struct Student,并定义结构体数组、初始化;
2.定义指向struct Student类型指针p;
3.使p指向数组首元素,输出元素中各信息;
4.使p指向下一个元素,输出元素中各信息;
5.再使p指向结构体数组的下一个元素,输出它指向的元素中的有关信息。
#include <stdio.h> struct Student { int num; char name[20]; char sex; int age; }; struct Student stu[3]={{10101,"Li Lin",'M',18}, {10102,"Zhang Fun",'M',19}, {10104,"Wang Min",'F',20} }; int main() { struct Student *p; printf(" No. Name sex age\n"); for(p=stu;p<stu+3;p++) printf(“%5d %-20s %2c %4d\n”, p->num, p->name, p->sex, p->age); return 0; }用结构体变量和结构体变量的指针作函数参数:
解题思路:
1.将n个学生的数据表示为结构体数组。按照功能函数化的思想,分别用3个函数来实现不同的功能
2. 用input函数输入数据和求各学生平均成绩;
3.用max函数找平均成绩最高的学生;
4.用print函数输出成绩最高学生的信息;
5.在主函数中先后调用这3个函数,用指向结构体变量的指针作实参。
6.最后得到结果。本程序假设n=3
#include <stdio.h> #define N 3 struct Student { int num; char name[20]; float score[3]; float aver; }; int main() { void input(struct Student stu[]); struct Student max(struct Student stu[]); void print(struct Student stu); struct Student stu[N],*p=stu; input(p); print(max(p)); return 0; } void input(struct Student stu[ ]) { int i; printf("请输入各学生的信息:学号、姓名、三门课成绩:\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].aver=(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].aver>stu[m].aver) 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.aver); }