学生信息管理系统(C语言)
好久没更新了,这段都在写学生信息管理系统QAQ
程序描述
这个学生管理系统只用到了一个链表,在功能一录入信息时建立链表。没有用到结构体数组。
主函数为菜单页,通过输入调用其他函数,每个函数对应一个功能。函数调用完会回到主函数。通过清屏来实现界面的跳转,每次清屏顺便清理一下缓存区。
注意!!!此程序包含一些输入的容错(把所有数据设置为字符数组,通过调用容错函数检查这个字符数组是不是纯数字、或者包含汉字等)还有很多不足的地方,我写的这个只能作于参考。
用到的函数与结构体
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
struct student
{
char num[20];//学号
char name[20];//姓名
char sex[20];//性别
char room[20];//宿舍号码
char tel[20];//电话号码
char CHN[20];//语文
char MATH[20];//数学
char ENG[20];//英语
char PE[20];//体育
char PRO[20];//专业
char average_score[20];//平均分
struct student *next;
};
int n;//节点数
struct student *creat();//信息录入
void score(struct student *head);//成绩录入
void findinformation(struct student *head);//信息查询
void findscore(struct student *head);//成绩查询
struct student *del(struct student *head);//信息删除
struct student *insert(struct student *head);//信息插入
void update(struct student *head);//修改分数
void Oscore(struct student*head);//排序输出
void swap(struct student*p1,struct student*p2);//交换数据
void fenduan(struct student*head);//分段输出
int checknum(char ch[]);//检查纯数字的数据里是否混入了非数字的非法输入
int transformint(char ch[]);//纯数字整数(字符串转向int类型)
void save(struct student *head); //文件存储
void export1();//文件输出
struct student *import();//文件导入
int checkscore(char ch[]);//检查分数是否为0-99的纯数字
int IncludeChinese(char *str); //检查性名、性别是否包含汉字
主函数部分
int main()
{
struct student *head=NULL;
char choose[20];
menu://设置主菜单的点
printf("\n");
printf("\t\t\t\t\t\t【学生管理系统2.0】\t\t\t\t\t\n");
printf("\t\t★————————————————————————————————————————★\n\n");
printf("\t\t\t | 1. 信息录入\t\t2. 成绩录入\t\t3. 信息查询 |\n\n");
printf("\t\t\t | 4. 成绩查询\t\t5. 删除信息\t\t6. 信息追加 |\n\n");
printf("\t\t\t | 7. 更改分数\t\t8. 查看排名\t\t9. 成绩分段 |\n\n");
printf("\t\t\t | 10.保存文件\t\t11.文件输出\t\t12.文件导入 |\n\n");
printf("\t\t★————————————————按0并回车退出——————————————————★\n");
printf("请输入执行数字:");
while(scanf("%s",choose)&&checknum(choose)==0)//检查到不是纯数字 让用户重新输入
{
printf("输入无效,重新输入:");
}
switch(transformint(choose))
{
case 1:
head=creat();
break;
case 2:
score(head);
break;
case 3:
findinformation(head);
break;
case 4:
findscore(head);
break;
case 5:
head=del(head);
break;
case 6:
head=insert(head);
break;
case 7:
update(head);
break;
case 8:
Oscore(head);
break;
case 9:
fenduan(head);
break;
case 10:
save(head);
break;
case 11:
export1();
break;
case 12:
head=import();
break;
}
if(transformint(choose)<0||transformint(choose)>12)//输入了不在执行数字范围内的数字返回主菜单的点
{
system("cls");//清理屏幕和缓冲区
fflush(stdin);
goto menu;
}
if(transformint(choose)!=0)//输入不是0,继续回到主菜单
{
goto menu;
}
system("cls");//结束时清理屏幕和缓冲区,打印下方的校徽
fflush(stdin);
printf("\n感谢使用!\n");
printf("\n *\n");
printf(" * *** ****\n");
printf(" *** **** ****\n");
printf(" **** **** **** ****\n");
printf(" **** **** **** ****\n");
printf(" **** **** **** ****\n");
printf(" **** **** **** ****\n");
printf(" **** **** **** ****\n");
printf(" **** ******* ****\n");
printf(" *************\n");
printf(" *****\n");
system("pause");
return 0;
}
校徽有内味了
1.信息录入
struct student *creat()//录入信息,创建链表
{
system("cls");
fflush(stdin);
printf("*****************************************************信息录入***********************************************************\n");
printf("依次键入学号、姓名、性别、宿舍号码、电话号码,用一个【空格】隔开各数据,每一条输入完成后按回车键进行下一条输入。 \n");
printf(" 【退出请输入'0'并回车】 \n");
printf("样例:\n541913460230 张三 男 1717 66666\n在此输入:\n");
n=0;
struct student *head,*p1,*p2;
head = NULL;
p1=p2=(struct student*)malloc(LEN);
while(scanf("%s",p1->num)&&checknum(p1->num)==0)
{
printf("输入错误的学号,重新输入:\n");
}
if(transformint(p1->num)==0)//输入了0退出函数调用,传回去表头指针head给主函数的head
{
system("cls");
fflush(stdin);
return(head);
}
while(scanf("%s",p1->name)&&IncludeChinese(p1->name)==0)//这几行while(scanf)都是具有容错的输入,整个程序中都存在输入容错!!!
{
printf("输入错误的名字,重新输入:\n");
}
while(scanf("%s",p1->sex)&&IncludeChinese(p1->sex)==0)
{
printf("输入错误的性别,重新输入:\n");
}
while(scanf("%s",p1->room)&&checknum(p1->room)==0)
{
printf("输入错误的宿舍号码,重新输入:\n");
}
while(scanf("%s",p1->tel)&&checknum(p1->tel)==0)
{
printf("输入错误的手机号码,重新输入:\n");
}
printf("\n");
while(transformint(p1->num)!=0)//输入每个节点的学号不是0的时候开始循环。
{
n+=1;//节点+1
if(n==1) //PS:此处为建立链表常规过程(参考了谭浩强C程序设计第九章链表,红皮那本)
{
head=p1;//第一个节点 表头指向上面开辟的第一个节点 p1 p2 head都指向此处此时
}else
{
p2->next=p1;//后面的节点,p2的next指向p1将两个节点连接到一起
p2=p1;//p2再跟p1
}
p1=(struct student*)malloc(LEN);