方法一:
1、创建一个c语言项目。然后右键头文件,创建一个Stu的头文件。
2、然后编写头文件的代码。再将数据结构的增删改查和结构体写入头文件。
3、然后在源文件中创建main源文件和Stu源文件。再main文件中写入intmian()代码。
4、然后在mian主函数中,写入while语句无限循环。再写入Init函数。
5、在Stu源文件的Init函数用printf语句,将学生管理系统输出。再创建链表的头节点head。
6、然后用switch函数对操作进行判断。再执行数据结构的增删改查功能。这样一个学生管理系统的基本框架就完成了。
方法二:
1、新建一个学生实体类,用于存放学生的各项信息。
2、新建一个链表节点类,每个节点存放一个学生信息及下一个节点的引用。
3、添加一个主操作类,并添加本系统的菜单方法。
4、定义链表的头节点,当前最后一个节点,以及主控制逻辑信息。
5、使用io流逐行读取存有学生信息的文本文件,对每行字符串,采用\t分割后得到一个字符串数组,数据各项即为一个学生的具体信息。然后新建一个节点加入到链表。
6、运行结果:
#include
#include
struct student
{
long int num;
char name[20];
int age;
char sex[4];
char b[30];
char p[15];
};
int n=0;
struct student stu[100];
struct student *p;
void lr();
void ll();
void cx();
void xg();
void sc();
void main()
{
int z;
printf("+---------------------------+\n");
printf("| 欢迎使用学生信息管理系统 |\n");
printf("+---------------------------+\n");
printf("提示:为保证您的操作得到保存,请按正常顺序退出系统^_^\n");
do
{
printf("\n\t\t\t--------------------------------\n");
printf("\t\t\t+ 主菜单 |\n");
printf("\t\t\t--------------------------------\n");
printf("\t\t\t+ [1]----录入学生信息 |\n");
printf("\t\t\t+ [2]----浏览学生信息 |\n");
printf("\t\t\t+ [3]----查询学生信息 |\n");
printf("\t\t\t+ [4]----删除学生信息 |\n");
printf("\t\t\t+ [5]----修改学生信息 |\n");
printf("\t\t\t+ [0]----退出系统 |\n");
printf("\t\t\t--------------------------------\n");
printf("请输入您的选择:");
scanf("%d", &z);
switch(z)
{
case 0 : break;
case 1 :lr();break;
case 2 :ll();break;
case 3 :cx();break;
case 4 :sc();break;
case 5 :xg();break;
default:printf("\n无效选项!");
}
}
while(z!= 0);
}
void lr()/*录入函数*/
{
int y;
if(n==0)
p=stu;
do
{
printf("--------------------\n");
printf("请输入学生的学号:");
scanf("%ld",&p->num);
printf("请输入学生的姓名:");
scanf("%s",p->name);
printf("请输入学生的年龄:");
scanf("%d",&p->age);
printf("请输入学生的性别:");
scanf("%s",p->sex);
printf("请输入学生的地址:");
scanf("%s",p->b);
printf("请输入学生的电话:");
scanf("%s",p->p);
n++;
p++;
printf("\n1.继续输入.\n0.输入完毕.\n");
printf("请选择:");
scanf("%d",&y);
}
while(y==1);
printf("提示:输入完毕!你一共输入%d个\n",n);
}
void ll()/*浏览函数*/
{
int i,j;
if(n!=0)
{ printf("学生总数:%d\n", n);
printf("学号\t姓名\t年龄\t性别\t地址\t\t电话\n");
printf("-----------------------------------------------------\n");
for(i=0;i
}
else printf("提示:无学生数据,请输入数据!");
}
void cx()/*查询函数*/
{
int c;
int w,i,j=0;
char name[20];
if(n!=0)
{
do{ printf("\n");
printf("+--------------------+\n");
printf("| 按学号查询 请按 1 |\n");
printf("| 按姓名查询 请按 2 |\n");
printf("| 取消 请按 0 |\n");
printf("+--------------------+\n");
printf("请输入您的选择:");
scanf("%d", &c);
switch(c)
{
case 0:break;
case 1:
printf("请输入学生的学号;");
scanf("%ld", &w);
printf("\n");
for(i=0;i
{
printf("\n学号\t姓名\t年龄\t性别\t地址\t\t电话\n");
printf("%ld\t%s\t%d\t%s\t%s\t\t%s\n",stu[i].num,stu[i].name,stu[i].age,stu[i].sex,stu[i].b,stu[i].p);
j=1;
}
if(j==0)
printf("提示:没有该学生记录,请核对!");
break;
case 2:
printf("请输入学生的姓名:");
scanf("%s", name);
printf("\n");
for(i=0;i
{
printf("\n学号\t姓名\t年龄\t性别\t地址\t\t电话\n");
j=1;
printf("%ld\t%s\t%d\t%s\t%s\t\t%s\n",stu[i].num,stu[i].name,stu[i].age,stu[i].sex,stu[i].b,stu[i].p);
}
if(j==0)
printf("提示:没有该学生记录,请核对!");
break;
default:
printf("\n提示:无效选项!");
break;
}
}while(c!= 0);
}else printf("提示:无学生数据,请输入数据!");
return;
}
void xg()/*修改函数*/
{
long int num;
int i,j,c;
if(n!=0)
{
printf("请输入您要修改的学生的学号:");
scanf("%ld", &num);
printf("\n");
for(i=0;i
j=i;
do{
printf("请选择您要修改的学生的信息内容:\n");
printf("+----------------------+\n");
printf("| 姓名 请按 1 |\n");
printf("| 年龄 请按 2 |\n");
printf("| 性别 请按 3 |\n");
printf("| 学号 请按 4 |\n");
printf("| 地址 请按 5 |\n");
printf("| 电话 请按 6 |\n");
printf("| 取消 请按 0 |\n");
printf("+----------------------+\n");
printf("请输入您的选择:");
scanf("%d", &c);
printf("\n");
switch(c)
{
case 0:break;
case 1:printf("请输入新姓名:");
scanf("%s",stu[j].name);
break;
case 2:printf("请输入新年龄:");
scanf("%d",&stu[j].age);
break;
case 3:printf("请输入新性别:");
scanf("%s",stu[j].sex);
break;
case 4:printf("请输入新学号:");
scanf("%ld",&stu[j].num);
break;
case 5:printf("请输入新地址:");
scanf("%s",stu[j].b);
break;
case 6:printf("请输入新电话:");
scanf("%s",stu[j].p);
break;
default:
printf("\n无效选项!");
break;
}
}while(c!= 0);
}else printf("提示:无学生数据,请输入数据!");
}
void sc()/*删除函数*/
{
long int num;
int i,j,e;
if(n!=0)
{
printf("学号\t姓名\t年龄\t性别\t地址\t\t电话\n");
printf("-----------------------------------------------------\n");
for(i=0;i
printf("请输入您要删除的学生的学号:");
scanf("%ld", &num);
printf("\n");
for(i=0;i
j=i;
if(j!=(n-1))
{
for(e=i-1;e
stu[j].num=stu[j+1].num;
strcpy(stu[j].name,stu[j+1].name);
strcpy(stu[j].sex,stu[j+1].sex);
stu[j].age=stu[j+1].age;
strcpy(stu[j].b,stu[j+1].b);
strcpy(stu[j].p,stu[j+1].p);
n--;p--;
}
}else {n--;p--;}
printf("提示:删除完毕!");
}else printf("提示:无学生数据,请输入数据!");
}
一.需求分析
用动态链表储管理姓名、电话、住址、身份证等信息和具备添加、删除等编辑功能
可以通过身份证号码识别性别,省份,年龄
可以统计总人数,男生人数,女生人数,同一年龄段人数
可以通过姓名,身份证号查询与修改数据
具备较美观的界面与汉字提示
具备保存信息至文件,及从文件中读取信息的功能
用动态链表来储存数据,便于管理
二.概要设计
流程图
添加信息
声明一个结构体来储存数据,并通过声明指针来动态添加信息
显示信息
声明一个结构体指针,让指针等于头指针,并遍历所有节点,打印每个节点的信息
查询信息
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语言课程设计
希望我的回答,你能喜欢