c语言写学生管理系统统c语言怎么做

你能够拥有梦想,而且梦想能够实现,离你梦想最近的地方!
学生信息管理系统(改简单)c语言写的
由于某些原因,不得不来重新来学一下c语言,就起基本功能而言就很简洁;
用C语言设计一个具有输入学生信息、查询学生信息、修改学生信息、打印学生成绩表功能的综合程序,以巩固和加深对C语言的学习。
设计一个菜单程序,完成功能如下:
1.输入1时完成输入姓名及各科成绩;
2.输入2时完成打印输出总表;
3.输入3时完成学生成绩的查询(按学号或姓名查询);
4.输入4时完成学生成绩的修改;
5. 输入5时,完成退出功能。
#include&stdio.h&
#include&stdlib.h&
#include&string.h&
#include&malloc.h&
#define LEN sizeof(struct Student)
struct Student
//学生信息的结构体声明
//记录学号
char name[20];
//记录姓名
char age[5];
//记录年龄
char sex[10];
//记录性别
char born[20];
//记录出生年月
char poli[20];
//记录政治面貌
char local[20];
//记录籍贯
char addr[100];
//记录家庭住址
char phone[20];
//记录联络电话
char mail[20];
//记录邮箱
struct Student *
//指向下一个结构体的指针
struct Student *head = NULL;
unsigned int kg = 0;
//******************对各功能函数的声明***************************
void show();
//显示函数的声明
struct Student *input();
//新建学生信息的声明
struct Student *insert(struct Student *head,struct Student *stu);
//插入学生信息的声明
struct Student *del(struct Student *head);
//删除学生信息的声明
void alter(struct Student *head);
//修改学生信息的声明
void search(struct Student *head,unsigned int num);
//查询学生信息的声明
void print(struct Student *head,unsigned int num);
//打印学生信息的声明
//***************************************************************
void show()
int n,z = 1,k = 0;
//***********显示提示信息**********
************************学生信息管理系统***********************************\n");
1.输入学生信息
//显示序号1的功能
2.打印学生信息
//显示序号2的功能
3.查询学生信息
//显示序号3的功能
4.修改学生信息
//显示序号4的功能
5.退出系统
//显示序号5的功能
***************************************************************************\n");
作者:luoyujie
制作时间:2016.11
(学生信息管理系统)
//显示关于作者、制作时间以及制作用途的信息
Copyright@$
***************************************************************************\n");
请输入功能序号: ");
//提示用户输入
while(!scanf("%d",&n))
//接受用户输入的功能序号,并且进行排错
输入序号有误,请重新输入: ");
fflush(stdin);
printf("\n");
//输出回车
while((n & 0 || n & 6))
//对用户输入不能实现的功能序号进行处理
抱歉,没有此功能,请重新输入功能序号: ");
//提示用户所输入的功能序号系统不能进行处理
fflush(stdin);
while(!scanf("%d",&n))
//接收用户重新输入的功能序号
输入序号有误,请重新输入: ");
fflush(stdin);
printf("\n");
//输出回车
//对用户信息进行功能函数的调用
head = input();
system("pause");
if (head == NULL) k = 1;
print(head,0);
system("pause");
if (head == NULL) k = 1;
search(head,0);
system("pause");
alter(head);
if (k == 1)
//对于没有对数据进行存盘的情况进行对用户提示以确认是否退出
printf("数据未保存,是否退出? Y.是 N.否 请选择: ");
fflush(stdin);
cho = getchar();
if (cho == 'y' || cho == 'Y')
else if (cho == 'n' || cho == 'N')
无效输入\n
system("pause");
}while(z == 1);
//***************************************************************
struct Student *input()
struct Student *p1,*p2;
unsigned m,n,i;
char filename[20];
head = NULL;
//要求用户选择录入学生信息的方式
请选择录入方式:\n");
1.从当前窗口录入\n");
2.从已有的文件(txt文件)录入\n");
请选择: ");
while(!scanf("%u",&m))
//排除输入错误的情况
输入序号有误,请重新输入: ");
fflush(stdin);
while(m & 1 || m & 2)
//排除输入错误的情况
请重新选择选择录入方式:\n");
1.从当前界面录入\n");
2.从已有文件(txt文件)录入\n");
fflush(stdin);
while(!scanf("%d",&m))
输入序号有误,请重新输入: ");
fflush(stdin);
printf("\n");
if (m == 1)
//当前窗口录入
请输入学生人数: ");
while (!scanf("%u",&n))
//接收录入学生信息的人数,并对输入有误的进行排除
输入有误,请重新输入学生人数: ");
fflush(stdin);
if (n == 0)
//对录入人数为0的情况进行处理
学生个数为0人,建立失败\n
return (head);
head = p2 = p1 = (struct Student *) malloc (LEN);
//开辟内存,用于生成链表
学生个数为:%u个,请按照以下顺序输入\n",n);
//对学生总数的提示,并且提示每个学生信息的输入顺序
学号、姓名、年龄、性别、出生年月、政治面貌、籍贯、家庭住址、电话、E-mail\n"); //每个学生信息的输入顺序
for(i = 0; i & i++)
请输入第%u个学生信息!\n",i+1);
//提示接下来要输入第几个学生的信息
//格式调整,输出三个空格
fflush(stdin);
while(!scanf("%d %s %s %s %s %s %s %s %s %s",&p2-&num,p2-&name,p2-&age,p2-&sex,p2-&born,p2-&poli,p2-&local,p2-&addr,p2-&phone,p2-&mail))
输入有误,请重新输入该学生信息\n
fflush(stdin);
if (n == 1)
//对录入人数为1时的情况进行处理
p2-&next = NULL;
//对录入人数大于1的情况进行录入,并在录入时进行排序,每录入一位学生信息就开辟一个内存空间,用于下一个学生的录入
head = insert(head,p2);
p2 = (struct Student *) malloc (LEN);
//对文件录入的处理
请输入文件名(如student): ");
while(!scanf("%s",filename))
//接收用户输入的文件名,并对其进行排错
输入文件名有误,请重新输入: ");
fflush(stdin);
strcat(filename,".txt");
//合并后缀名
while((read = fopen(filename,"r")) == NULL)
//如果该文件成功打开就进行学生信息的录入,否则继续要求用户输入文件名
未找到此文件,请重新输入文件名: ");
scanf("%s",filename);
strcat(filename,".txt");
if (!fscanf(read,"%u",&n))
//接收从文件中录入的学生人数并进行排错
文件数据有错,结束录入\n
fclose(read);
fflush(stdin);
p2 = p1 = (struct Student *) malloc (LEN);
//开辟内存空间,创建链表
for(i = 0; i & i++)
//循环录入每一个学生的信息
if(!fscanf(read,"%d %s %s %s %s %s %s %s %s %s",&p2-&num,p2-&name,p2-&sex,p2-&born,p2-&sex,p2-&poli,p2-&local,p2-&addr,p2-&phone,p2-&mail))
//当遇到数据有误,释放内存空间,返回NULL
fclose(read);
//释放链表空间
if (p1 != NULL)
}while(p2 != NULL);
数据有误,结束录入\n
return NULL;
//返回NULL
if (n == 1)
//对录入人数为1的情况进行处理
p2-&next = NULL;
//对录入人数大于1的情况进行录入,并在录入时进行排序,开辟内存空间用于下一个学生信息的录入
head = insert(head,p2);
p2 = (struct Student *) malloc (LEN);
fclose(read);
//关闭文件
成功录入学生信息,并且学生信息已经按学号从小到大排列\n");
学生信息如下: \n");
//search(head,1);
//以表格的形式显示所录入的学生信息
// printf("
//返回*head指针的地址
struct Student *insert(struct Student *head,struct Student *stu)
//插入学生信息功能函数定义
struct Student *p1,*p2;
if (stu == NULL)
//对于传入插入学生信息为空时要求用户输入插入的学生信息
请按照学号、姓名、年龄、性别、出生年月、政治面貌、籍贯、家庭住址、电话、E-mail输入\n
//每个学生信息的输入顺序
stu = (struct Student *) malloc (LEN);
while(!scanf("%d %s %s %s %s %s %s %s %s %s",&stu-&num,&stu-&name,stu-&age,stu-&sex,stu-&born,stu-&poli,stu-&local,stu-&addr,stu-&phone,stu-&mail))
输入信息有误,请重新输入\n");
fflush(stdin);
if (head == NULL)
//对于链表为空的情况的处理
head-&next = NULL;
//在链表中插入学生信息
while(stu-&num & p2-&num && p1-&next != NULL)
//查找适合位置的前一个学生
if (p2 == p1)
//插入的学生正好为链表头的情况
if (stu-&num & p2-&num)
//插入在表头前
stu-&next = p2;
//插入在表头后
p2-&next =
stu-&next = NULL;
//插入的学生在链表中的情况
if (stu-&num & p1-&num)
//插入到p1指向的学生前
p2-&next =
stu-&next= p1;
//插入到p1指向的学生后
p1-&next =
stu-&next =
return(head);
struct Student *del(struct Student *head)
//删除学生信息的功能函数定义
unsigned int num,k;
struct Student *p1,*p2;
if (head == NULL)
//对空链表删除的情况处理
没有学生信息,结束删除\n");
return(head);
请输入要删除的学生学号: ");
//求用户输入要删除的学生学号
while(!scanf("%u",&num))
//接收学生序号并进行排错处理
输入有误,请重新输入学生序号: ");
fflush(stdin);
while(num != p1-&num && p1-&next != NULL)
//查找删除位置的前一个学生
if (num == p1-&num)
//对满足要求的学生进行删除
if (num == p1-&num)
if (p1-&next == NULL && p1 == head)
//对只有一个节点的链表进行删除
head = NULL;
else if (p1-&next == NULL)
//删除链表尾节点
p2-&next = NULL;
else if (head == p1)
//删除表头节点
head = p1-&
//删除表中节点
p2-&next = p1-&
成功删除学生信息\n");
//提示删除成功信息
//找不到要删除的学生时的提示
找不到该同学信息\n");
fflush(stdin);
if (head == NULL)
//对空链表删除时的处理
没有学生信息,结束删除\n");
return(head);
//提示用户删除后是否继续
1.继续删除学生信息\n");
2.结束删除\n");
请选择: ");
while(!scanf("%u",&k))
//接收用户选择
输入有误,请重新输入选择的序号: ");
fflush(stdin);
if (k == 1)
//选择继续
请输入要删除的学生学号: ");
while(!scanf("%u",&num))
输入有误,请重新输入学生学号: ");
fflush(stdin);
else if (k != 2)
//对于不是选择2的继续循环提示
}while(k == 1);
return(head);
//返回表头地址
void search(struct Student *head,unsigned int num)
//查询函数的定义
unsigned int cho,t = 0;
struct Student *p1,*p2;
if (head == NULL)
//对查询空链表时的操作
没有学生信息,结束查询\n");
if (num == 0)
//当传入实参 num = 0 需要接受用户需要的查询方式(个别或者全部),不等于0则可以直接查询个别学生信息
1.按学号查询学生信息\n");
2.按姓名查询学生信息\n");
请选择: ");
while(!scanf("%u",&cho))
//对错误输入数据的处理
输入有误,请重新输入序号: ");
fflush(stdin);
while(cho != 1 && cho != 2)
//处理不能处理的功能序号
抱歉,没有此功能,请重新输入功能序号: ");
//提示不能处理的信息,并要求用户重新输入功能序号
while(!scanf("%u",&cho))
//接收用户重新输入的功能序号
输入序号有误,请重新输入序号: ");
fflush(stdin);
printf("\n");
//输出回车
//设置直接查询个别学生的开关
if (kg == 1)
//kg(全局变量)为全部学生查询的开关
kg = 1 打开开关由下面直接进行全部学生查询 kg = 0 关闭开关
switch(cho) //查询类别分支
case 1: //查询个别学生
if (num == 0 || t == 1)
请输入需要查询的学生学号: ");
while(!scanf("%u",&num))
输入有误,请重新输入: ");
fflush(stdin);
//打开开关,该开关为查询完毕后 num不能作为该分支的条件(因为以下的操作会改变num的值)而建立的,并且能够实现当传入num不等于0时,以下询问用户是否继续的分支就不用执行了
cho = 2; //如果传入的实参num不等于0
则该 DO WHILE 循环只做一次
while(p1-&num != num)
//查找查询学生学号
if (p1-&next == NULL)
if (p1-&num == num)
//查找成功一表格方式输出该学生信息
{ // printf("p1-num=%d\n",p1-&num);printf("num=%d\n",num);
//***********************表格头部设计************************
printf("┏ ━━┳━━━┳━━┳━━┳━━━━┳━━━━┳━━━┳━━━━┳━━┳━━┓\n");
printf("┃学号 ┃姓名
┃年龄┃性别┃出生年月┃政治面貌┃籍贯
┃家庭住址┃电话┃邮箱┃\n");
printf("┣ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("┃%-4d┃%-6s┃%-3s ┃%-4s┃%-5s
┃%-8s┃%-8s┃%-6s┃%-4s┃%-4s┃\n",p1-&num,p1-&name,p1-&age,p1-&sex,p1-&born,p1-&poli,p1-&local,p1-&addr,p1-&phone,p1-&mail);
//*********************************************************
else //查找不成功,提示用户找不到该学生
找不到该学生\n");
if (t == 1)
//如果传入的num=0,则此分支有效,询问用户是否继续查询
1.继续查询\n");
2.结束查询\n");
请选择: ");
while(!scanf("%u",&cho))
//对输入序号查错,利用cho = 2时的情况跳出
DO WHILE 循环
输入序号有误,请重新输入: ");
fflush(stdin);
}while (cho == 1);
case 2: //按学生姓名查询信息
char name[20]="";
请输入需要查询的学生姓名: ");
while(!scanf("%s",&name))
输入有误,请重新输入: ");
fflush(stdin);
//打开开关,该开关为查询完毕后 name不能作为该分支的条件(因为以下的操作会改变name的值)而建立的,并且能够实现当传入name不等于0时,以下询问用户是否继续的分支就不用执行了
cho = 2; //如果传入的实参name不等于0
则该 DO WHILE 循环只做一次
// printf("p2-name1 = %s\n",p2-&name); printf("name1=%s\n",name);
while(strcmp(p2-&name,name)!= 0)
//查找查询学生学号
if (p2-&next == NULL) //printf("hello-2 ****");
//printf("p2-name3 = %s\n",p2-&name); printf("name4=%s\n",name);
if (strcmp(p2-&name,name)==0)
//查找成功一表格方式输出该学生信息
//***********************表格头部设计************************
printf("┏ ━━┳━━━┳━━┳━━┳━━━━┳━━━━┳━━━┳━━━━┳━━┳━━┓\n");
printf("┃学号 ┃姓名
┃年龄┃性别┃出生年月┃政治面貌┃籍贯
┃家庭住址┃电话┃邮箱┃\n");
printf("┣ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("┃%-4d┃%-6s┃%-3s ┃%-4s┃%-5s
┃%-8s┃%-8s┃%-6s┃%-4s┃%-4s┃\n",p2-&num,p2-&name,p2-&age,p2-&sex,p2-&born,p2-&poli,p2-&local,p2-&addr,p2-&phone,p2-&mail);
//*********************************************************
else //查找不成功,提示用户找不到该学生
找不到该学生\n");
if (t == 1)
//如果传入的name,则此分支有效,询问用户是否继续查询
1.继续查询\n");
2.结束查询\n");
请选择: ");
while(!scanf("%u",&cho))
//对输入序号查错,利用cho = 2时的情况跳出
DO WHILE 循环
输入序号有误,请重新输入: ");
fflush(stdin);
}while (cho == 1);
if (kg == 1) kg = 0; //关闭查询全部学生的开关,以便下一次使用
void print(struct Student *head,unsigned int num)
//打印函数的定义
unsigned int cho,t = 0;
struct Student *p1;
if (head == NULL)
//对打印空链表时的操作
if (num == 0)
//当传入实参 num = 0 需要直接打印学生信息
//设置直接查询个别学生的开关
if (kg == 1)
//kg(全局变量)为全部学生查询的开关
kg = 1 打开开关由下面直接进行全部学生查询 kg = 0 关闭开关
switch(cho) //打印
case 2: //打印全部信息
//***********************表格头部设计************************
printf("┏ ━━┳━━━┳━━┳━━┳━━━━┳━━━━┳━━━┳━━━━┳━━┳━━┓\n");
printf("┃学号 ┃姓名
┃年龄┃性别┃出生年月┃政治面貌┃籍贯
┃家庭住址┃电话┃邮箱┃\n");
printf("┗ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
//****************表格主体设计以及数据输出******************
while(p1 != NULL)
printf("┣ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("┃%-4d┃%-6s┃%-3s ┃%-4s┃%-5s
┃%-8s┃%-8s┃%-6s┃%-4s┃%-4s┃\n",p1-&num,p1-&name,p1-&age,p1-&sex,p1-&born,p1-&poli,p1-&local,p1-&addr,p1-&phone,p1-&mail);
printf("┗ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
if (kg == 1) kg = 0; //关闭打印全部学生的开关,以便下一次使用
void alter(struct Student *head)
//修改学生信息的功能函数定义
struct Student *p1,*p2;
unsigned int num,cho,k,l=0;
if (head == NULL)
//对空链表的处理
没有学生信息,结束修改\n
system("pause");
请输入需要修改的学生学号: ");
while(!scanf("%u",&num))
//接受用户输入的学号并且进行查错
输入学号有误,请重新输入: ");
fflush(stdin);
while(p1-&num != num)
//查找学生学号
if (p1-&next == NULL)
if (p1-&num == num)
//查找成功
已找到该学生,该学生的信息为: \n");
search(head,num);
if (l == 0)
//开关,当第一次循环时 l=0 执行 IF 语句
选择修改的内容\n");
序号输入错误,请重新选择\n");
//打开开关,以在以下操作用户输入序号超出范围时控制上面的分支语句,进而可以更好地向用户提示信息
1.学号\n");
2.姓名\n");
3.年龄\n");
4.性别\n");
5.出生年月\n");
6.政治面貌\n");
7.籍贯\n");
8.家庭住址\n");
9.全部\n");
请选择序号: ");
fflush(stdin);
while(!scanf("%u",&cho)) //接受序号并查错
输入序号有误,请重新输入: ");
fflush(stdin);
}while(cho & 9 || cho & 1);
switch(cho)
//对序号进行多分支处理
请输入该学生改正的学号信息: ");
while(!scanf("%u",&p1-&num))
输入改正信息有误,请重新输入: ");
fflush(stdin);
请输入该学生改正的姓名信息: ");
while(!scanf("%s",p1-&name))
输入改正信息有误,请重新输入: ");
fflush(stdin);
请输入该学生改正的年龄信息: ");
while(!scanf("%s",p1-&age))
输入改正信息有误,请重新输入: ");
fflush(stdin);
请输入该学生改正的性别信息: ");
while(!scanf("%s",p1-&sex))
输入改正信息有误,请重新输入: ");
fflush(stdin);
请输入该学生改正的出生年月信息: ");
while(!scanf("%s",p1-&born))
输入改正信息有误,请重新输入: ");
fflush(stdin);
请输入该学生改正的政治面貌信息: ");
while(!scanf("%s",p1-&poli))
输入改正信息有误,请重新输入: ");
fflush(stdin);
请输入该学生改正的籍贯信息: ");
while(!scanf("%s",p1-&local))
输入改正信息有误,请重新输入: ");
fflush(stdin);
请输入该学生改正的家庭住址信息: ");
while(!scanf("%s",p1-&addr))
输入改正信息有误,请重新输入: ");
fflush(stdin);
请输入该学生全部要改正的所有信息: ");
while(!scanf("%u %s %s %s %s %s %s %s %s %s",&p1-&num,p1-&name,p1-&age,p1-&sex,p1-&born,p1-&poli,p1-&local,p1-&addr,p1-&phone,p1-&mail))
//%u %s %s %s %s %s %s %s",&p1-&num,p1-&grade,p1-&name,p1-&born,p1-&sex,p1-&poli,p1-&phone,p1-&addr
输入改正信息有误,请重新输入: ");
fflush(stdin);
if (cho == 1 || cho == 9)
//对修改过学号的学生进行重新排序
if (p1 == head) //当该学生在链表头时,删除链表头节点
head = head-&
else if (p1-&next == NULL) //当该学生在链表尾时,删除链表尾节点
p2-&next = NULL;
//当该学生在链表中时,删除该学生对应的节点
p2-&next = p1-&
head = insert(head,p1); //利用插入学生信息功能函数,进行该学生的重新排序
修改成功,该学生改正后的信息为: \n");
search(head,p1-&num);
//显示以下修改后的学生信息
//询问用户是否继续
1.继续修改其他学生信息\n");
2.退出修改\n");
请选择: ");
while(!scanf("%u",&k))
//接受用户输入的序号,并进行排错
输入序号有误,请重新输入: ");
fflush(stdin);
if (k == 1) //接受下一次修改的学生学号
请输入需要修改的学生学号: ");
while(!scanf("%u",&num))
输入修改信息有误,请重新输入: ");
fflush(stdin);
else if (k != 2) //排错
输入有误,请重新输入\n");
//查找不到学生时要求用户进行重新输入学生序号
找不到该学生信息,请重新输入需要修改的学生学号: ");
fflush(stdin);
while(!scanf("%u",&num));
//接受用户重新输入的学号并进行排错
输入修改信息有误,请重新输入: ");
fflush(stdin);
}while(k == 1);
system("pause");
void main()
//调用显示功能函数
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!BOY NEXT DOOR投稿:11粉丝:93分享--dynmicweibozoneqqbaidu将视频贴到博客或论坛视频地址复制嵌入代码复制微信扫一扫分享收藏0硬币--稍后看马克一下~用手机看转移阵地~用或其他应用扫描二维码手机下视频请使用扫码若未安装客户端,可直接扫此码下载应用未经作者授权 禁止转载
看过该视频的还喜欢正在加载...miniOFF 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
学生管理系统c语言 课设报告
下载积分:2000
内容提示:学生管理系统c语言 课设报告
文档格式:PDF|
浏览次数:5|
上传日期: 10:07:46|
文档星级:
全文阅读已结束,如果下载本文需要使用
 2000 积分
下载此文档
该用户还上传了这些文档
学生管理系统c语言 课设报告
关注微信公众号05-1502-1602-1602-1602-1602-1602-1602-1602-1602-16最新范文01-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-01用C语言实现学生信息管理系统设计及源代码_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
用C语言实现学生信息管理系统设计及源代码
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩39页未读,
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 通讯录管理系统c语言 的文章

 

随机推荐