本文主要是介绍寒假集训第一天——结构体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
期待已久的寒假集训终于开始了,第一天讲的内容比较简单——结构体,之前就学了点。。。
表示普通的结构体会用,涉及到指针都不大会,今天算是学了点指针的用法。。。
作业描述如下:
结构体
今天作业
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头文件中。。。 待更新。。。
这篇关于寒假集训第一天——结构体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!