题目要求:
²1.定义一个acmer结构体,包括以下信息:姓名,学号,手机号,做题数,出生日期,其中出生日期date也是一个结构体,包括年、月、日
²2.建立结构体数组,实现对多个同学的信息输入,输出
²3.实现简单的统计功能,比如统计做题数大于150的同 学并输出其完整信息
²4.实现查找功能,包括按姓名、学号查找
²5.实现信息修改功能
²6.按做题数目进行排序(选作)
²7.其他功能可以自由扩展,多多益善 ^_^
²8.程序一个函数实现一个功能
²9.代码测试成功后贴在论坛上,大家互相学习借鉴
运用结构体构建一个新的数据类型
首先说明信息输入模块,在第一遍写的时候,多组输入没有实现,原因是scanf输入时遗留在输入流中的回车被gets吸收,可以用fflush清空缓冲流,修改后的代码如下:
int xxgl(void)
{
n++;
while(1)
{
printf("请输入姓名:");
char temp[30];
fflush(stdin);
gets(temp);
if(strcmp(temp,"\0")==0)
break;
else
{
strcpy(stu[n].name,temp);
}
printf("请输入学号:");
scanf("%s%*c",stu[n].xh);
printf("请输入手机号:");
scanf("%s%*c",stu[n].sjh);
printf("请输入做题数:");
scanf("%d%*c",&stu[n].num);
printf("请输入出生年:");
scanf("%d%*c",&stu[n].birthday.year);
printf("请输入出生月:");
scanf("%d%*c",&stu[n].birthday.month);
printf("请输入出生日:");
scanf("%d%*c",&stu[n].birthday.day);
n++;
}
main();
}
全部代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct date
{
int year;
int month;
int day;
};
struct acmer
{
int bh;
char name[30];
char xh[20];
char sjh[20];
int num;
struct date birthday;
};
volatile int n = 0;
struct acmer stu[40];
struct acmer tmp;
int xxgl(void);
int xxcx(void);
int xm(void);
int xh(void);
int xxtj(void);
int main()
{
int a;
printf("请选择要执行的功能序号:\n");
printf("\t1.学生信息管理\n");
printf("\t2.学生信息查询\n");
printf("\t3.学生信息统计\n");
printf("\t0.退出系统\n");
scanf("%d%*c",&a);
switch(a)
{
case 1:
xxgl();
break;
case 2:
xxcx();
break;
case 3:
xxtj();
break;
case 0:
return 0;
}
return 0;
}
int xxgl(void)
{
n++;
printf("请输入姓名:");
scanf("%s",stu[n].name);
printf("请输入学号:");
scanf("%s",stu[n].xh);
printf("请输入手机号:");
scanf("%s",stu[n].sjh);
printf("请输入做题数:");
scanf("%d",&stu[n].num);
printf("请输入出生年:");
scanf("%d",&stu[n].birthday.year);
printf("请输入出生月:");
scanf("%d",&stu[n].birthday.month);
printf("请输入出生日:");
scanf("%d",&stu[n].birthday.day);
main();
}
int xxcx(void)
{
printf("请选择:\n");
printf("\t1.按姓名查询\n");
printf("\t2.按学号查询\n");
printf("\t0.返回主菜单\n");
int c;
scanf("%d",&c);
switch(c)
{
case 1:
xm();
break;
case 2:
xh();
break;
case 0:
return 0;
}
main();
}
int xm(void)
{
char st[30];
int bo = 0,x = 0;
int m,y,z;
printf("请输入要查询的姓名:");
scanf("%s",st);
while(x < n)
{
x++;
z = strcmp(st,stu[x].name);
if(z == 0)
{
bo = 1;
break;
}
}
if(bo == 1)
{
printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t",stu[x].name,stu[x].xh,stu[x].sjh,stu[x].num,stu[x].birthday.year,stu[x].birthday.month,stu[x].birthday.day);
printf("是否修改该学生的信息?1代表修改,0代表不修改");
scanf("%d",&m);
if(m == 1)
{
printf("请输入要修改的信息:");
printf("\t1.修改姓名\t2.修改学号\t3.修改手机号码\t4.修改做题数\t5.修改出生年月日\n");
scanf("%d",&y);
getchar();
switch(y)
{
case 1:
gets(stu[x].name);
break;
case 2:
gets(stu[x].xh);
break;
case 3:
gets(stu[x].sjh);
break;
case 4:
scanf("%d",&stu[x].num);
break;
case 5:
scanf("%d%d%d",&stu[x].birthday.year,&stu[x].birthday.month,&stu[x].birthday.day);
}
}
}
else
printf("该学生不是集训队的成员\n");
return 0;
}
int xh(void)
{
char st[20];
int bo = 0,x = 0;
printf("请输入要查询的学号:");
scanf("%s",st);
while(x <= n)
{
x++;
if(strcmp(st,stu[x].xh) == 0)
{
bo = 1;
break;
}
}
if(bo == 1)
printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t",stu[x].name,stu[x].xh,stu[x].sjh,stu[x].num,stu[x].birthday.year,stu[x].birthday.month,stu[x].birthday.day);
else
printf("该学生不是集训队的成员\n");
return 0;
}
int xxtj(void)
{
int i,j,m,x;
for(i = 1; i <= n-1; i++)
{
for(j = 1; j<=n-i; j++)
{
if(stu[j].num > stu[j+1].num)
{
tmp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = tmp;
}
}
}
printf("请输入要查询的最少题目数:");
scanf("%d",&m);
for(i = 1; i<=n; i++)
{
if(stu[i].num >= m)
break;
}
if(i <= n)
{
for(x = i; x <= n; x++)
printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\n",stu[x].name,stu[x].xh,stu[x].sjh,stu[x].num,stu[x].birthday.year,stu[x].birthday.month,stu[x].birthday.day);
}
else
printf("没有比这题目数高的同学\n");
main();
}