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

2024-09-04 09:08
文章标签 结构 集训 第一天 寒假

本文主要是介绍寒假集训第一天——结构体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

作业描述如下:

结构体

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

待更新。。。


这篇关于寒假集训第一天——结构体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135592

相关文章

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s