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

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

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径

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

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