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

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

作业描述如下:

结构体

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

待更新。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值