发布网友 发布时间:2023-10-09 09:40
共5个回答
热心网友 时间:2024-11-16 04:29
代码如下:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
typedef struct examinee //考生信息结构
{ char examno[20]; //准考证号
char name[10]; //姓名
char sex[4]; //性别
short age; //年龄
char examtype[10]; //报考科目
}ElemType;
typedef struct Node //定义链表结点
{
ElemType data; //数据域
struct Node *next; //指针域
}Node,*List,*position;
List make_empty( List L ); //创建一个带头结点的空表
int is_empty( List L ); //测试链表是否是空表
int is_last( position p, List L ); //测试当前位置是否是表尾
position make_node( position p,int n ); //创建结点并输入考生信息
void put_information( position p ); //是否输出该考生信息
void put_name_information( List L ); //输出姓名为xx的考生信息
int put_pos_information( position p ); //输出该地址考生信息
void link_to_tail( List L, position p ); //将结点连接到表尾
int ciculation_make(); //循环创建考生信息
int judge_put_all(); //是否输出所有考生信息
void put_all(List L); //输出所有考生信息。
position find( List L ); //查找第一个姓名为xx的元素并返回位置
position find_previous( List L ); //查找第一个姓名为xx的元素并返回该元素直接前驱的位置
//int judge_delete_val(); //询问是否删除考生数据
int delete_val( List L ); //删除指定考生信息并输出其信息
void menu(List L); //菜单函数
List L;
//position p;
int
main( void )
{
List L = NULL; //定义头结点指针
position p = NULL; //定义表工作指针
L = make_empty( L ); //创建空表
printf("\t\t\t★★考生报名管理程序★★\n\t\t----------------------------------------\n");
menu(L);
return 0;
}
//创建一个带头结点的空表
List
make_empty( List L)
{
L = ( List ) malloc (sizeof( Node ));
if(NULL == L)
{
printf("内存分配失败");
exit( 1 );
}
L->next = NULL;
//printf("空表创建成功。\n");
return L;
}
//创建结点并输入考生信息
position
make_node( position p ,int n)
{
if(n) //n为1是创建结点并输入,n为0是修改
{
p = ( position ) malloc ( sizeof ( Node ));
p->next = NULL ;
}
printf("请输入考生准考证号:");
gets(p->data.examno);
printf("请输入考生姓名:");
gets(p->data.name);
do
{
printf("请输入考生性别,只能输入“男”或者“女”:");
gets(p->data.sex);
}
while( 0 != strcmp( p->data.sex, "男" ) && 0 != strcmp( p->data.sex, "女" )); //判断性别是否有误
printf("请输入考生年龄:");
scanf("%hd",&p->data.age);
getchar(); //如果把这句删掉,就“无法执行”下面的报考类别
/*下面的do while用来判断报考类别是否输入有误*/
do
{
printf("请输入报考类别,只能输入“数学”或“英语”或者“数据结构”:");
gets(p->data.examtype);
}
while( 0 != strcmp( "英语", p->data.examtype ) && 0 != strcmp( "数学", p->data.examtype ) && 0 != strcmp( "数据结构", p->data.examtype ));
if(n)
{
printf("报名成功\n");
}
else
{
printf("修改成功\n");
}
return p;
}
//前插法;
void
link_to_tail( List L, position p)
{
p->next = L->next;
L->next = p;
}
//查找第一个姓名为xx的元素并返回位置
position
find( List L )
{
position p = L->next;
char name[10];
printf("请输入你要查找的考生姓名:");
gets(name);
while( p != NULL && 0 != strcmp( p->data.name , name))
{
p=p->next;
}
return p;
}
//测试链表是否是空表
int
is_empty( List L )
{
return L->next == NULL;
}
//测试当前位置是否是表尾
int
is_last( position p, List L )
{
return p->next == NULL;
}
//输出姓名为xx的考生信息
void
put_name_information( List L )
{
position p = find(L);
if(p!=NULL)
{
printf("您要查找的考生信息:\n");
printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype);
}
else
{
printf("没有您要找的学生。\n");
}
}
//循环创建考生信息
int
ciculation_make()
{
int n = 2;
do
{
printf("是否继续创建考生信息?是请输入“1”,不是请输入“0”:");
scanf("%d",&n);
getchar();
}
while( n != 0 && n != 1);
return n;
}
//是否输出考生信息
void
put_information( position p )
{
int n=2;
do
{
printf("是否输出该考生信息?是请输入“1”,不是请输入“0”:");
scanf("%d",&n);
getchar();
}
while( n != 0 && n != 1);
if(n)
{
printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype);
}
}
//是否输出所有考生信息
int
judge_put_all()
{
int n = 2;
do
{
printf("是否输出所有考生信息?是请输入“1”,不是请输入“0”:");
scanf("%d",&n);
getchar();
}
while( n != 0 && n != 1);
return n;
}
//输出所有考生信息
void
put_all(List L)
{
if(L->next == NULL)
{
printf("现无考生报名!\n");
}
else
{
position p=L->next;
while( p != NULL )
{
printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype);
p=p->next;
}
}
//getchar();
}
//询问是否删除考生数据
int
judge_delete_val()
{
int n = 2;
do
{
printf("是否要删除某个考生数据?是请输入“1”,不是输入“0”:");
scanf("%d",&n);
getchar();
}
while( n != 0 && n != 1);
return n;
}
//查找第一个姓名为xx的元素并返回其直接前驱的位置
position
find_previous( List L )
{
position q = L;
position p = L->next;
char name[10];
printf("请输入你要查找的考生姓名:");
gets(name);
while( p != NULL && 0 != strcmp( p->data.name , name))
{
q=p;
p=p->next;
}
if( p != NULL )
{
return q;
}
else
return p;
}
//删除指定考生信息并输出其信息
int
delete_val(List L)
{
int n=2;
position q=NULL;
position p=find_previous( L ); //返回考生信息地址
if( NULL == p )
{
printf("你要删除的考生不存在\n");
return 0;
}
else
{
q = p->next;
p->next = q->next;
printf("删除成功。\n删除的考生信息为:\n");
printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",q->data.examno,q->data.name,q->data.sex,q->data.age,q->data.examtype);
free(q);
return 1;
}
}
//输出该地址考试信息
int
put_pos_information( position p )
{
if(p != NULL )
{
printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype);
return 1;
}
else
{
printf("没有您要查找的学生。");
return 0;
}
}
//菜单函数
void
menu(List L)
{
printf("\t\t\t a. 考生报名入口\n");
printf("\t\t\t b. 查询考生信息\n");
printf("\t\t\t c. 修改考生信息\n");
printf("\t\t\t d. 删除考生信息\n");
printf("\t\t\t e. 全部考生信息\n");
printf("\t\t\t f. 程序作者信息\n");
printf("\t\t\t g. 退出程序\n");
char n='h';
while(n != 'g')
{
do //确定正确输入
{
printf("请通过字母序号选择功能:");
n = getchar();
getchar();
putchar('\n');
if( n < 'a' || n > 'g')
{
printf("错误的字母序号。\n");
}
}
while( n < 'a' || n > 'g' );
switch (n)
{
case 'a':
{
printf("请输入报名考生信息:\n");
position p = make_node( p, 1 ); //创建新结点
link_to_tail( L, p ); //将新结点连接到表上
put_information( p ); //是否输出该考生信息
putchar('\n');
}
break;
case 'b':
{
put_name_information( L );
putchar('\n');
}
break;
case 'c':
{
int n=0;
position p = NULL;
printf("您正在进行修改操作。\n");
p = find(L);
n = put_pos_information( p );
if(n)
{
make_node( p , 0 );
put_information( p ); //是否输出该考生信息
}
putchar('\n');
}
break;
case 'd':
{
printf("您正在进行删除操作。\n");
delete_val( L );
putchar('\n');
}
break;
case 'e':
{
put_all( L );
putchar('\n');
}
break;
case 'f':
{
printf(" 修改日期 版本号 修改人 修改内容 \n");
printf(" --------------------------------------------------------\n");
printf(" 2018.6.19 v2.0 陈百川 增加主菜单\n");
printf(" 2018.6.23 v3.0 陈百川 增加生成文件功能\n\n");
printf(" 该版本号为v2.0\n");
putchar('\n');
}
break;
default:
break;
}
}
printf(" 感谢本次使用,祝您生活愉快。");
getch();
}
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。[1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
百度百科——C语言
热心网友 时间:2024-11-16 04:29
/*引用库函数*/热心网友 时间:2024-11-16 04:30
#include<stdio.h>热心网友 时间:2024-11-16 04:30
这是成绩管理系统热心网友 时间:2024-11-16 04:31
一.需求分析
用动态链表储管理姓名、电话、住址、身份证等信息和具备添加、删除等编辑功能
可以通过身份证号码识别性别,省份,年龄
可以统计总人数,男生人数,女生人数,同一年龄段人数
可以通过姓名,身份证号查询与修改数据
具备较美观的界面与汉字提示
具备保存信息至文件,及从文件中读取信息的功能
用动态链表来储存数据,便于管理
二.概要设计
流程图
添加信息
声明一个结构体来储存数据,并通过声明指针来动态添加信息
显示信息
声明一个结构体指针,让指针等于头指针,并遍历所有节点,打印每个节点的信息
查询信息
1.获取用户的选择确定 用姓名查找或是身份证号查找
2.遍历所有节点,找到与用户输入相和的节点
3.打印该节点的信息
修改信息
1.获取用户的选择确定 用姓名查找或是用身份证号查找并修改
2.遍历所有节点,找到与用户输入相和的节点
3.开始修改该节点的姓名,身份证号,手机号
删除信息
1.获取用户的选择确定 用姓名查找并删除或是用身份证号查找并删除,及全部删除
2.遍历所有节点,找到与用户输入相和的节点的上一个节点的地址
3.将这个节点的next储存为下下个节点的地址
4.删除中间的节点
数据分析
1.遍历所有节点
2.依次辨别性别,年龄段
3.在储存总人数,男生人数,女生人数,年龄段的数据上添加人数
保存信息至文件
1.遍历每个节点
2.将每个节点的信息储存到文件中
3.每储存一个count便加一
4.打印储存数据的个数
从文件中读取数据
1.将文件中的数据依次添加到新的节点上
退出程序
将菜单的while(running)循环,running=0
三.详细设计
信息添加
struct IdCard
{
char num[20];
char phone[11];
int sex;
char city[20];
char name[20];
long age;
struct IdCard *next;
};
struct IdCard *head=NULL;//声明一个头节点作为全局变量,且使他为空
动态生成节点,并往节点中添加信息,生成动态链表
while(strcmp(pid1->num,str)!=0){
n++;
if(n==1) head=pid1;
else pid2->next=pid1;
pid2=pid1;
pid1=(struct IdCard*)malloc(sizeof(struct IdCard));
printf("请输入身份证号(按0退出):");
char str[]="0";//用来辨别
scanf("%s",pid1->num);
if(strcmp(pid1->num,str)==0) break;
在此处通过身份证号计算相应的年龄,性别,将这些信息添加到该节点上。
效果图如下
菜单样式
通过printf打印选项
在while中循环,使菜单一直刷新存在
在while中的最后加system(“pause”)使每个键盘信息能被显示出来
效果图如下:
显示信息
struct IdCard *pid;//遍历节点
pid=head;
通过遍历节点打印出所有节点的信息
效果图如下:
查询信息
int num;
printf("按1,身份证号查询\n按2,姓名查询:\n");
获取用户的选择
声明字符串变量来储存用户输入的姓名或身份证号
遍历所有节点,找到与用户相符合的那个节点,并打印
struct IdCard *pid;
pid=head;
while(pid){
if(strcmp(pid->num,num)==0){
printf("------------------------------显示所有信息---------------------------------------\n");
printf("身份证号 姓名 性别 省份 手机号 年龄\n");
printf("%18s ",pid->num);
printf("%-16s",pid->name);
printf("%-13s",pid->sex==1?"男":"女");
printf("%-14s",pid->city);
printf("%11s",pid->phone);
printf(" %d\n",pid->age);
printf("---------------------------------------------------------------------------------\n");
}
pid=pid->next;
}
效果图如下:
修改信息
获取用户的选择
ystem("cls");
char name[20];
printf("请输入要修改的名字(20个字节):\n");
while(1!=scanf("%s",name)){
printf("你的输入有误,请重新输入(20个字节):");
fflush(stdin);
选择相应的修改方式
遍历节点选到与用户输入相符的节点,并修改
struct IdCard *pid,*ptmp;
pid=head;
while(pid){
if(strcmp(pid->name,name)==0){
printf("请输入你要重写的身份证号:\n");
while(1!=scanf("%s",pid->num)||strlen(pid->num)!=18){
printf("你的输入有误,请重新输入(18位):");
fflush(stdin);
}
效果图如下:
保存信息至文件
以只写的二进制方式打开一个文件
FILE *pf = fopen("FILENAME", "wb");
遍历节点
struct IdCard *pid = head;
if(!pf)
{
printf("打开待写入的文件失败!\n");
return;
}
while(pid)
{
fwrite(pid, 1, sizeof(struct IdCard), pf);//把每位学生信息写入文件
i++;
pid = pid->next;
}
fclose(pf);
printf("\t\t\t成功写入%d信息",i);
将每个节点写入文件中,用frwite函数
声明一个变量来计算写入的信息数
效果图如下:
从文件中读取信息
以只读的二进制方式打开文件夹
FILE *pf;
struct IdCard *pid;
if((pf = fopen("FILENAME", "rb")) == NULL)
{
printf("文件还没有创建,请手工输入学生信息并保存吧!\n");
return;
}
申请新的空间将地址赋给节点
struct IdCard *pid1,*pid2;
pid1=pid2=(struct IdCard*)malloc(sizeof(struct IdCard));
fread(pid1,1,sizeof(struct IdCard),pf);
while(!feof(pf)){
i++;
if(head==NULL){
head=pid1;
}else{
pid2->next=pid1;
}
pid2=pid1;
pid1 = (struct IdCard*)malloc(sizeof(struct IdCard));
fread(pid1,1, sizeof(struct IdCard), pf);
}
fclose(pf);
printf("文件读取完毕!新增学生信息%d条。\n",i);
将文件信息写入节点中
将节点添加进动态链表中
声明一个变量来记录读出信息数量
效果图如下:
数据分析
遍历每个节点
int ManCount=0,
WomanCount=0,
age1Count=0,
age2Count=0,
count=0;
struct IdCard *pi;
pi=head;
while(pi){
count++;
if(pi->sex==1){
ManCount++;
}else{
WomanCount++;
}
if(pi->age>10&&pi->age<20)
age1Count++;
if(pi->age>20&&pi->age<40)
age2Count++;
pi=pi->next;
}
printf("\n");
printf("总共有%d个身份证\n男的占%d个\n女的占%d个\n年龄段在10到20岁之间的有%d个\n年龄段在20到40岁之间的有%d个\n",count,ManCount,WomanCount,age1Count,age2Count);
辨别每个节点的性别,年龄段
在相应的变量上加减
于是统计出了总信息数量,男生数量,女生数量,各年龄段数量
效果图如下:
四.测试结果
程序开始运行
回车键后显示菜单
添加信息
当身份证号输入的位数不够18位时,会报错,当手机号不够11位时,会报错重新输入
查询信息
删除一个信息
删除所有信息
修改信息
保存信息至文件
从文件中读取信息
显示所有信息
数据分析
五.用户使用说明
信息添加:
可以输入相应的身证号,名字与手机号。当身份证号与手机号的位数输入错误时,会有相应的提示,此时你可以重新输入。在输入信息结束时,可以按0
保存信息至文件
如果想要在下一次打开此程序时,还能看到相应的信息,一定要记得保存信息至文件,但此次保存文件会覆盖上一次的信息
从文件中读取信息
从文件中读取的信息会添加到你新写的信息后面,当显示所有信息时,会以链表形式逐个打印出来
查询信息
当你输入的信息查找不到时,此时不会打印任何信息,可按任意键回到菜单。
同样输入手机号和身份证号会检查你的位数对不对,不对的话,将提示你重新输入
修改信息
当你输入相应的身份证号或名字时,会让你把这个人的信息全部输入一次
删除所有信息
该选项将会删除你所有的信息,谨慎!
删除一个信息
可以选择你想删除的身份证号或名字,删除掉其中一个信息,不会影响其他信息
数据分析
会统计出总信息数量,男生数量,女生数量,各年龄段数量
退出程序
按0会退出程序,此次使用身份证信息管理系统结束
Hu118391 徊 c语言课程设计
希望我的回答,你能喜欢