期待已久的寒假集训终于开始了,第一天讲的内容比较简单——结构体,之前就学了点。。。
表示普通的结构体会用,涉及到指针都不大会,今天算是学了点指针的用法。。。
作业描述如下:
结构体
今天作业
1.定义一个acmer结构体,包括以下信息:姓名,学号,手机号,做题数,出生日期,其中出生日期date也是一个结构体,包括年、月、日
2.建立结构体数组,实现对多个同学的信息输入,输出
3.实现简单的统计功能,比如统计做题数大于150的同 学并输出其完整信息
4.实现查找功能,包括按姓名、学号查找
5.实现信息修改功能
6.按做题数目进行排序(选作)
7.其他功能可以自由扩展,多多益善 ^_^
8.程序一个函数实现一个功能
9.代码测试成功后贴在论坛上,大家互相学习借鉴
1.定义一个acmer结构体,包括以下信息:姓名,学号,手机号,做题数,出生日期,其中出生日期date也是一个结构体,包括年、月、日
2.建立结构体数组,实现对多个同学的信息输入,输出
3.实现简单的统计功能,比如统计做题数大于150的同 学并输出其完整信息
4.实现查找功能,包括按姓名、学号查找
5.实现信息修改功能
6.按做题数目进行排序(选作)
7.其他功能可以自由扩展,多多益善 ^_^
8.程序一个函数实现一个功能
9.代码测试成功后贴在论坛上,大家互相学习借鉴
花了一上午完成作业。。。
#include<stdio.h> #include<string.h> #include<stdlib.h> //#include<windows.h> #define NAMELEN 20 #define MAXNUM 100 #define MAXPHO 13 #define MAXID 13 int cmp(const void *p1,const void *p2); void acm_sort(struct acmer *p,int count);//排序功能函数 void find(struct acmer *p,int count);//查找功能函数 void change(struct acmer *p,int count);//修改功能函数 void countt(struct acmer *p,int count);//统计功能函数 struct dates//内嵌结构先定义 { int year; int month; int day; }; struct acmer { char name[NAMELEN]; char stuid[MAXID]; char phonum[MAXPHO]; int ac; struct dates date;//内嵌结构 }; struct acmer stu[MAXNUM]; int main () { //freopen("1.txt","r",stdin); int index,f=0,select; int count=0; puts("———————————————————————————————\n\n\n\t\t\t欢迎使用本系统\t\t\t\n\n\t\t\t\t\t\t by:juncoder\n———————————————————————————————"); puts("首次使用本系统需要键入acmer信息,确认请键入回车!"); if(getchar()=='\n') { system("cls"); puts("请输入acmer的姓名"); while(count<MAXNUM &&gets(stu[count].name)!=NULL && stu[count].name[0]!='\0')//实现对多个同学的信息输入 { printf("输入学号\n"); scanf("%s",stu[count].stuid); printf("输入电话号码\n"); scanf("%s",&stu[count].phonum); printf("输入做题题目\n"); scanf("%d",&stu[count].ac); printf("输入出生年月\n"); scanf("%d/%d/%d",&stu[count].date.year,&stu[count].date.month,&stu[count].date.day); count++; while(getchar()!='\n')continue; if(count<MAXNUM) printf("输入下一个acmer的姓名\n"); } if(count==0) { puts("没有信息输入!无法实现其他功能操作!"); exit(1); } } else exit(1); system("cls"); puts("键入回车进行功能选择"); if(getchar()) system("cls"); puts("功能列表"); puts("1.查找"); puts("2.修改"); puts("3.排序"); puts("4.统计"); scanf("%d",&select); system("cls");//清屏 switch(select){ case 1:find(&stu[0],count);break; case 2:change(&stu[0],count);break; case 3:acm_sort(&stu[0],count);break; case 4:countt(&stu[0],count);break; default:puts("暂未开发其他功能!"); } } void find(struct acmer *p,int count)//查找功能函数 { int index,f,n; char names[NAMELEN]; char xuehao[MAXID]; puts("1.按姓名查找"); puts("2.按学号查找"); scanf("%d",&n); switch(n) { case 1: { gets(names); puts("输入想查找的姓名"); scanf("%s",&names); for(p=stu;p<stu+count;p++) if(strcmp(names,p->name)==0) { printf("姓名:%s 学号:%s 电话号码:%s 做题数:%d 出生年月:%d/%d/%d\n",p->name, p->stuid,p->phonum,p->ac, p->date.year,p->date.month,p->date.day); f=1; } if(f==0) printf("不存在此人"); }break; case 2: { puts("输入想查找的学号"); scanf("%s",&xuehao); for(p=stu;p<stu+count;p++) if(strcmp(xuehao,p->stuid)==0) { printf("姓名:%s 学号:%s 电话号码:%s 做题数:%d 出生年月:%d/%d/%d\n",p->name, p->stuid,p->phonum,p->ac, p->date.year,p->date.month,p->date.day); f=1; } if(f==0) printf("不存在此人"); }break; } } void change(struct acmer *p,int count)//修改功能函数 { int index=1,num,t,zshu,y,m,d,f=0; char ch_pho[MAXPHO],numid[MAXID]; puts("输入要修改信息的学号"); scanf("%s",numid); puts("选择要修改的信息内容:"); puts("1.电话号码\n2.做题数\n3.出生年月"); scanf("%d",&t); switch(t){ case 1: { puts("该acmer的原信息:"); for(p=stu;p<stu+count;p++) { if(strcmp(numid,p->stuid)==0) { printf("姓名:%s 学号:%s 电话号码:%s 做题数:%d 出生年月:%d/%d/%d\n",p->name, p->stuid,p->phonum,p->ac, p->date.year,p->date.month,p->date.day); puts("输入修改的电话号码:"); getchar(); gets(ch_pho); strcpy(p->phonum,ch_pho); f=1; } } };break; case 2: { puts("该acmer的原信息:"); for(p=stu;p<stu+count;p++) { if(strcmp(numid,p->stuid)==0) { printf("姓名:%s 学号:%s 电话号码:%s 做题数:%d 出生年月:%d/%d/%d\n",p->name, p->stuid,p->phonum,p->ac, p->date.year,p->date.month,p->date.day); puts("输入修改的做题数:"); getchar(); scanf("%d",&zshu); p->ac=zshu; f=1; } } };break; case 3: { puts("该acmer的原信息:"); for(p=stu;p<stu+count;p++) { if(strcmp(numid,p->stuid)==0) { printf("姓名:%s 学号:%s 电话号码:%s 做题数:%d 出生年月:%d/%d/%d\n",p->name, p->stuid,p->phonum,p->ac, p->date.year,p->date.month,p->date.day); puts("输入修改的出生年月:"); getchar(); scanf("%d/%d/%d",&y,&m,&d); p->date.year=y; p->date.month=m; p->date.day=d; f=1; } } };break; } if(f){ puts("修改完该acm的信息:"); for(p=stu;p<stu+count;p++) { if(strcmp(numid,p->stuid)==0) { printf("姓名:%s 学号:%s 电话号码:%s 做题数:%d 出生年月:%d/%d/%d\n",index,p->name, p->stuid,p->phonum,p->ac, p->date.year,p->date.month,p->date.day); } } } else puts("不存在此人"); } void acm_sort(struct acmer *p,int count)//排序功能函数 { p=stu; qsort(p,count,sizeof(struct acmer),cmp); for(p=stu;p<stu+count;p++) { printf("姓名:%s 学号:%s 电话号码:%s 做题数:%d 出生年月:%d/%d/%d\n",p->name, p->stuid,p->phonum,p->ac, p->date.year,p->date.month,p->date.day); } } int cmp(const void *p1,const void *p2)//排序 { const struct acmer *a1=(const struct acmer*)p1; const struct acmer *a2=(const struct acmer*)p2; return (a1->ac)>(a2->ac)?1:0; } void countt(struct acmer *p,int count)//统计功能函数 { int n,m,num,f=0; puts("1.统计做题数"); puts("2.统计出生年月"); scanf("%d",&n); system("cls"); switch(n){ case 1: { puts("1.统计大于"); puts("2.统计小于"); scanf("%d",&m); system("cls"); switch(m) { case 1: { puts("输入x,统计做题数大于x的同学"); scanf("%d",&num); system("cls"); for(p=stu;p<stu+count;p++) { if(p->ac>num) { printf("姓名:%s 学号:%s 电话号码:%s 做题数:%d 出生年月:%d/%d/%d\n",p->name, p->stuid,p->phonum,p->ac, p->date.year,p->date.month,p->date.day); f=1; } } if(f==0) printf("没有同学做题数超过%d",num); }break; case 2: { puts("输入x,统计做题数小于x的同学"); scanf("%d",&num); system("cls"); for(p=stu;p<stu+count;p++) { if(p->ac<num) { printf("姓名:%s 学号:%s 电话号码:%s 做题数:%d 出生年月:%d/%d/%d\n",p->name, p->stuid,p->phonum,p->ac, p->date.year,p->date.month,p->date.day); f=1; } } if(f==0) printf("没有同学做题数小于%d",num); }break; } }break; case 2: { puts("此功能暂未完善!"); }break; default:puts("暂未开发其他功能!"); } }
略长了点。。。
总结下学到的知识点:
1.先说下排序吧,这次排序也是用快排函数。重要的是直接对数组结构使用排序,函数的第三参数参量为sizeof(struct acmer)。。。
关于cmp函数的写法:
int cmp(const void *p1,const void *p2)//必须的形式
{
const struct acmer *a1=(const struct acmer*)p1;
const struct acmer *a2=(const struct acmer*)p2;
return (a1->ac)>(a2->ac)?1:0;
}
2.还学到一个小功能
system("cls");//清屏
包含在stdlib.h头文件中。。。
待更新。。。