寒假集训第一天——结构体

来源:互联网 发布:淘宝lol神半价怎么搜 编辑:程序博客网 时间:2024/06/05 02:38

期待已久的寒假集训终于开始了,第一天讲的内容比较简单——结构体,之前就学了点。。。
表示普通的结构体会用,涉及到指针都不大会,今天算是学了点指针的用法。。。

作业描述如下:

结构体

今天作业 
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 13int 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头文件中。。。

待更新。。。


0 0
原创粉丝点击