用C语言编写一个学生管理系统。
概述
单纯只用多个数组管理学生成绩信息,不使用结构体,该程序最主要的难点是依据学号或总成绩对学生银培信息进行排序,借助了临时数组来标记排好序的下标。
运行结果如下:
输入数据:
根据总成绩排序:
根据学号删除学生信息:
贴上代码(有点多)
#include stdio.h
#include stdlib.h //exit函数头文件
#include string.h //字符串相关操作头文件
#define MAX_STUDENT 30 //最大学生数
//函数声明,本程序共10个子函数,每个函数对应一个操作
void student_scanf(int n);
void student_printf(int n);
int student_find_name(int n);
int student_find_num(int n);
void student_sort_num(int n);
void student_sort_sum(int n);
int student_alter_num(int n);
int student_alter_name(int n);
int student_delete_num(int n);
int student_delete_name(int n);
//全局数组变量,用于存储学生信息
char names[MAX_STUDENT][50];
int math[MAX_STUDENT];
int english[MAX_STUDENT];
int computer[MAX_STUDENT];
int sum[MAX_STUDENT];
int num[MAX_STUDENT];
//以下变量用于学生信息数组排序,作为临时数组
int temp_num[MAX_STUDENT];
char temp_names[MAX_STUDENT][50];
int temp_math[MAX_STUDENT];
int temp_english[MAX_STUDENT];
int temp_computer[MAX_STUDENT];
int temp_sum[MAX_STUDENT];
//sort数组存储排好序的学号或姓名下标
int sort[MAX_STUDENT];
//循环全局变量
int i, j;
//main主函数
int main(void)
{
int choice,n;
while (1)
{
printf(“*************************************\n”);
printf(“欢迎使用学生成绩管理系统\n”);
printf(“[1] 输入所有学生信息\n”);
printf(“[2] 输出所有学生成绩\n”);
printf(“[3] 按学号查找某个学生信息\n”);
printf(“[4] 按姓名查找某个学生信息\n”);
printf(“[5] 按学号对学生排序\n”);
printf(“[6] 按总成绩对学生排序\n”);
printf(“[7] 按学号修改某个学生信息\n”);
printf(“[8] 按姓名修改某个学生信锋谨唯息\n”);
printf(“[9] 按学号删除某个学生信息\n”);
printf(“[10] 按姓名删除某个学生信息\n”);
printf(“[0] 退出程序\n”);
printf(“请输入您的选择(0 – 9):”);
scanf(“%d”,choice);
printf(“**************************************)\n”);
switch (choice)
{
case 1://录入;
printf(“请输入录入的学生信息数: “);
scanf(“%d”,n);
student_scanf(n);
break;
case 2://输出晌芹;
student_printf(n);
break;
case 3://根据学号查找
student_find_num(n);
break;
case 4://根据姓名查找
student_find_name(n);
break;
case 5://按学号排序
student_sort_num(n);
break;
case 6://按姓名排序
student_sort_sum(n);
break;
case 7://按学号修改
student_alter_num(n);
break;
case 8://按姓名修改
student_alter_name(n);
break;
case 9://按学号删除
student_delete_num(n);
n–;
break;
case 10://按姓名删除
student_delete_name(n);
n–;
break;
case 0://退出程序
printf(“退出程序\n”);
printf(“程序结束,谢谢使用!\n”);
exit(0);
default:
printf(“您输入的菜单有误。请重新输入!\n”);
}
}
return 0;
}
//1.输入信息
void student_scanf(int n)
{
for (i = 0; in; ++i)
{
printf(“\n请输入第%d个学生的信息:\n”, i + 1);
printf(“\n学号:”);
scanf(“%d”, num[i]);
printf(“\n姓名:”);
scanf(“%s”, names[i]);
printf(“\n数学成绩:”);
scanf(“%d”, math[i]);
printf(“\n英语成绩:”);
scanf(“%d”, english[i]);
printf(“\n计算机成绩:”);
scanf(“%d”, computer[i]);
//计算总成绩
sum[i] = math[i] + english[i] + computer[i];
}
}
//2.打印信息
void student_printf(int n)
{
printf(“\n学号\t姓名\t数学成绩\t英语成绩\t计算机成绩\t总成绩\n”);
printf(“———————————————————-\n”);
for (i = 0; in; ++i)
{
printf(“%d\t%s\t%d\t\t%d\t\t%d\t\t%d\n”, num[i], names[i], math[i], english[i], computer[i], sum[i]);
}
printf(“——————————————————-\n”);
}
//3.按学号查找
int student_find_num(int n)
{
int nums;
int result;
printf(“请输入待查找的学生学号:”);
scanf(“%d”,nums);
result= -1;
for (i = 0; in; ++i)
{
if (nums == num[i])
{
result = i;
break;
}
}
//最后判断q值
if (result == -1)
{
printf(“没有该学生信息!\n”);
return 0;
}
else
{
//先打印表头
printf(“\n学号\t\t姓名\t\t数学成绩\t英语成绩\t计算机成绩\t总成绩\n”);
//再打印数据
printf(“%d\t\t%s\t\t%d\t\t%d\t\t%d\t%d\n”, num[result], names[result], math[result], english[result], computer[result], sum[result]);
printf(“打印出查找结果!\n”);
}
return 1;
}
//4.用姓名查找成绩
int student_find_name(int n)
{
char name[200];
int result;
printf(“请输入待查找的学生姓名:”);
scanf(“%s”, name);
result = -1;
for (i = 0; in; ++i)
{
if (strcmp(name, names[i]) == 0)
{
result = i;
break;
}
}
if (result == -1)
{//未找到结果
printf(“没有该学生信息!\n”);
return 0;
}
else//找到结果
{
printf(“\n学号\t姓名\t数学成绩\t英语成绩\t计算机成绩\t总成绩\n”);
printf(“%d\t%s\t%d\t\t%d\t\t%d\t\t%d\n”, num[result], names[result], math[result], english[result], computer[result], sum[result]);
printf(“已完成查找!\n”);
}
return 1;
}
//5.按学号排序
void student_sort_num(int n)
{
int min,max;
for(i=0; in; ++i) //复制临时数组
{
temp_num[i] = num[i];
}
max = 0; //查找学号最大值,将其下标存至sort数组的最后一个值中
for(j=1; jn; j++)
{
if(temp_num[max]temp_num[j])
max = j;
}
sort[n-1] = max; //sort数组的最后一个数
for(i=0; in-1; ++i)
{
min = i; //查找学号最小值
for(j=0; jn; ++j)
{
if(temp_num[min]temp_num[j])
min = j;
}
//sort数组记录排序的学生信息的下标
sort[i] = min;
temp_num[min] = temp_num[max]; //利用临时数组将查找过的学生信息的学号设为最大值,排除查找干扰
}
for(i=0; in; ++i) //再复制一次临时数组
{
temp_num[i] = num[i];
strcpy(temp_names[i],names[i]);
temp_math[i] = math[i];
temp_english[i] = english[i];
temp_computer[i] = computer[i];
temp_sum[i] = sum[i];
}
for(i=0; in; i++) //按照下标对原数组进行修改
{
num[i] = temp_num[sort[i]];
strcpy(names[i],temp_names[sort[i]]);
math[i] = temp_math[sort[i]];
english[i] = temp_english[sort[i]];
computer[i] = temp_computer[sort[i]];
sum[i] = temp_sum[sort[i]];
}
printf(“排序完毕,请按菜单键2查看排序结果!\n”);
return ;
}
//6.按总成绩排序
void student_sort_sum(int n)
{
int min,max;
for(i=0; in; ++i) //复制临时数组
{
temp_sum[i] = sum[i];
}
max = 0; //查找总成绩最大值,将其下标存至sort数组的最后一个值中
for(j=1; jn; j++)
{
if(temp_sum[max]temp_sum[j])
max = j;
}
sort[n-1] = max; //sort数组的最后一个数
for(i=0; in-1; ++i)
{
min = i; //查找总成绩最小值
for(j=0; jn; ++j)
{
if(temp_sum[min]temp_sum[j])
min = j;
}
//sort数组记录排序的学生信息的下标
sort[i] = min;
temp_sum[min] = temp_sum[max]; //利用临时数组将查找过的学生信息的总成绩设为最大值,排除查找干扰
}
for(i=0; in; ++i) //再复制一次临时数组
{
temp_num[i] = num[i];
strcpy(temp_names[i],names[i]);
temp_math[i] = math[i];
temp_english[i] = english[i];
temp_computer[i] = computer[i];
temp_sum[i] = sum[i];
}
for(i=0; in; i++) //按照下标对原数组进行修改
{
num[i] = temp_num[sort[i]];
strcpy(names[i],temp_names[sort[i]]);
math[i] = temp_math[sort[i]];
english[i] = temp_english[sort[i]];
computer[i] = temp_computer[sort[i]];
sum[i] = temp_sum[sort[i]];
}
printf(“排序完毕,请按菜单键2查看排序结果!\n”);
return ;
}
//7.按学号修改学生信息
int student_alter_num(int n)
{
int nums;
int result;
printf(“请输入待修改的学生学号:”);
scanf(“%d”,nums);
result= -1;
for (i = 0; in; ++i)
{
if (nums == num[i])
{
result = i;
break;
}
}
//最后判断q值
if (result == -1)
{
printf(“没有该学生信息!\n”);
return 0;
}
else //修改信息值
{
printf(“请重新输入该学生信息:\n”);
printf(“学号:\n”);
scanf(“%d”,num[result]);
printf(“姓名:\n”);
scanf(“%s”,names[result]);
printf(“数学成绩:\n”);
scanf(“%d”,math[result]);
printf(“英语成绩:\n”);
scanf(“%d”,english[result]);
printf(“计算机成绩:\n”);
scanf(“%d”,computer[result]);
sum[result] = math[result] + english[result] + computer[result];
}
return 1;
}
//8.按姓名修改学生信息
int student_alter_name(int n)
{
char name[50];
int result;
printf(“请输入待修改的学生姓名:”);
scanf(“%s”,name);
result= -1;
for (i = 0; in; ++i)
{
if (strcmp(name,names[i])==0)
{
result = i;
break;
}
}
//最后判断q值
if (result == -1)
{
printf(“没有该学生信息!\n”);
return 0;
}
else //修改信息值
{
printf(“请重新输入该学生信息:\n”);
printf(“学号:\n”);
scanf(“%d”,num[result]);
printf(“姓名:\n”);
scanf(“%s”,names[result]);
printf(“数学成绩:\n”);
scanf(“%d”,math[result]);
printf(“英语成绩:\n”);
scanf(“%d”,english[result]);
printf(“计算机成绩:\n”);
scanf(“%d”,computer[result]);
sum[result] = math[result] + english[result] + computer[result];
}
return 1;
}
//9.按学号删除学生信息
int student_delete_num(int n)
{
int nums;
int result;
printf(“请输入待删除的学生学号:”);
scanf(“%d”,nums);
result= -1;
for (i = 0; in; ++i)
{
if (nums == num[i])
{
result = i;
break;
}
}
//最后判断q值
if (result == -1)
{
printf(“没有该学生信息!\n”);
return 0;
}
else //删除当前学生信息即为将数组从result的位置依次前挪一个位置
{
for(i=result; in-1; ++i) //最后在main函数中,要将n的值减1
{
num[i] = num[i+1];
strcpy(names[i],names[i+1]);
math[i] = math[i+1];
english[i] = english[i+1];
computer[i] = computer[i+1];
sum[i] = sum[i+1];
}
}
return 1;
}
//10.按姓名删除学生信息
int student_delete_name(int n)
{
char name[50];
int result;
printf(“请输入待删除的学生姓名:”);
scanf(“%s”,name);
result= -1;
for (i = 0; in; ++i)
{
if (strcmp(name,names[i])==0)
{
result = i;
break;
}
}
//最后判断q值
if (result == -1)
{
printf(“没有该学生信息!\n”);
return 0;
}
else //删除当前学生信息即为将数组从result的位置依次前挪一个位置
{
for(i=result; in-1; ++i) //最后在main函数中,要将n的值减1
{
num[i] = num[i+1];
strcpy(names[i],names[i+1]);
math[i] = math[i+1];
english[i] = english[i+1];
computer[i] = computer[i+1];
sum[i] = sum[i+1];
}
}
return 1;
}
用c语言编写学生信息管理系统
#includestdio.h
#includestdlib.h
#includestring.h
#includeconio.h
#define N 200
int input(struct Student stu[N]);
void save(struct Student stu[N],int n);
int load(struct Student stu[N]);
void output(struct Student stu[N],int n);
int insert(struct Student stu_save[],int n);
void sort(struct Student stu_save[],int n);
void find(struct Student stu_save[],int n);
int delete_stu(struct Student stu_save[],int n);
typedef struct Student
{
char num[20];
char name[20];
char sex;
int age;
float score[3];
float tolscore;
float ave;
}STU;
int main()
{
int total=0,a;
STU stu[N];
printf(“☆☆☆☆☆学籍管理系统☆☆☆☆☆\n\n”);
do{
printf(“\n**********************************\n”);
printf(“1-导入学生信息\n2-加载学生信息\n3-保存学生尘源信息\n4-按学号插入学生\n5-给学生排序\n6-查找学生\n7-删除学生\n8-输出当前学生数据\n9-退出\n”);
printf(“**********************************\n”);
printf(“请按键选择:”);
scanf(“%d”,a);
switch(a)
{
case 1:
total=input(stu);
break;
case 2: total=load(stu);break;
case 3:save(stu,total);break;
case 4: total+=insert(stu,total);break;
case 5:sort(stu,total);break;
case 6:find(stu,total);break;
case 7:total-=delete_stu(stu,total);break;
case 8:output(stu,total);break;
case 9:exit(0);break;
default:printf(“输入错误,请重新输入!\n”);break;
}
//system(“cls”);
}while(1);
}
int input(struct Student stu[])
{
int i,j,n;
float sum;
printf(“请输入要导入的学生人数\n”);
scanf(“%d”,n);
printf(“请输入学生的学号、姓名、性别、年龄及三门课成绩\n”);
for(i=0;in;i++)
{
scanf(“%s”,stu[i].num);
scanf(“%s”,stu[i].name);
scanf(” %c”,stu[i].sex); //%c前的空格用于接收上一个字蚂汪符串后的空格、回车、制表符,etc
scanf(“%d”,stu[i].age);
sum=0;
for(j=0;j3;j++)
{
scanf(“%f”,stu[i].score[j]);
sum+=stu[i].score[j];
}
stu[i].tolscore=sum;
stu[i].ave=sum/3.0f;
}
return (n);
}
void save(struct Student stu[],int n)
{
FILE *fp;
int i;
char filename[20];
printf(“请派物态输入文件名:”);
scanf(“%s”,filename);
if(strchr(filename,’.’)==NULL)
strcat(filename,”.dat”);
if((fp=fopen(filename,”wb”))==NULL)
{
printf(“Cannot open this file\n”);
system(“pause”);
return;
}
fwrite(n,sizeof(int),1,fp);
for(i=0;in;i++)
fwrite(stu[i],sizeof(struct Student),1,fp);
fclose(fp);
printf(“保存成功!”);
system(“pause”);
return;
}
int load(struct Student stu_save[])
{
FILE *fp;
int i,n;
char filename[20];
printf(“请输入要加载的文件名: “);
//getchar();
scanf(“%s”,filename);
// gets(filename);
if(strchr(filename,’.’)==NULL)
strcat(filename,”.dat”);
if((fp=fopen(filename,”rb”))==NULL)
{
printf(“Cannot open this file\n”);
system(“pause”);
return 0;
}
fread(n,sizeof(int),1,fp);
for(i=0;in;i++)
fread(stu_save[i],sizeof(struct Student),1,fp);
fclose(fp);
system(“cls”);
printf(“文件加载成功!数据如下”);
output(stu_save,n);
return n;
}
void output(struct Student stu_save[],int n)
{
int i,j;
// system(“cls”);
printf(“\n学号\t姓名\t性别\t年龄\t成绩一\t成绩二\t成绩三\t总分\t平均分\n”);
for(i=0;in;i++)
{
printf(“%s\t”,stu_save[i].num);
printf(“%s\t”,stu_save[i].name);
printf(“%c\t”,stu_save[i].sex);
printf(“%d\t”,stu_save[i].age);
for(j=0;j3;j++)
printf(“%g\t”,stu_save[i].score[j]);
printf(“%g\t”,stu_save[i].tolscore);
printf(“%.2f”,stu_save[i].ave);
putchar(10);
}
system(“pause”);
return;
}
int insert(struct Student stu_save[],int n)
{
int i,j,num=0;
float sum=0;
struct Student s;
char flag;
if(n200)
{
printf(“空间已满,无法插入!\n”);
return 0;
}
// load(stu_save,n-1);
do{
printf(“\n请依次输入学号、姓名、性别、年龄及三门课成绩\n”);
scanf(“%s”,s.num);
scanf(“%s”,s.name);
scanf(” %c”,s.sex); //%c前的空格用于接收上一个字符串后的空格、回车、制表符,etc
scanf(“%d”,s.age);
for(j=0;j3;j++)
scanf(“%f”,s.score[j]);
sum=0;
for(j=0;j3;j++)
sum+=s.score[j];
s.tolscore=sum;
s.ave=sum/3;
num++;
for(i=n+num-1;strcmp(stu_save[i-1].num,s.num)0i0;i–)
stu_save[i]=stu_save[i-1];
stu_save[i]=s;
printf(“插入成功!”);
fflush(stdin);
do
{
printf(“继续插入?(y/n)”);
flag=getch();
}while(flag!=’y’flag!=’n’);
}while(flag==’y’);
system(“pause”);
//save(stu_save,n);
return num;
}
void sort(struct Student stu_save[],int n)
{
int a,i,j;
struct Student t;
system(“cls”);
printf(“\n1-按序号排序\n2-按成绩排序\n请选择:”);
scanf(“%d”,a);
while(a!=1a!=2)
{
printf(“输入有误,请重新输入!\n”);
scanf(“%d”,a);
}
//load(stu_save,n);
if(a==1)
{
for(i=0;in-1;i++)
for(j=0;jn-i-1;j++)
{
if(strcmp(stu_save[j].num,stu_save[j+1].num)0)
{
t=stu_save[j];
stu_save[j]=stu_save[j+1];
stu_save[j+1]=t;
}
}
}
else
{
for(i=0;in-1;i++)
for(j=0;jn-i-1;j++)
{
if(stu_save[j].avestu_save[j+1].ave)
{
t=stu_save[j];
stu_save[j]=stu_save[j+1];
stu_save[j+1]=t;
}
}
}
// save(stu_save,n);
printf(“排序成功!\n”);
output(stu_save,n);
return;
}
void find(struct Student stu_save[],int n)
{
char ch;
do{
int i,j,w=1;
char search[20];
//load(stu_save,n);
printf(“请输入学生的学号或姓名”);
scanf(“%s”,search);
for(i=0;in;i++)
{
if(strcmp(stu_save[i].num,search)==0||strcmp(stu_save[i].name,search)==0)
{
printf(“查找成功,该学生的信息为:\n”);
printf(“%s\t”,stu_save[i].num);
printf(“%s\t”,stu_save[i].name);
printf(“%c\t”,stu_save[i].sex);
printf(“%d\t”,stu_save[i].age);
for(j=0;j3;j++)
printf(“%g\t”,stu_save[i].score[j]);
printf(“%g\t”,stu_save[i].tolscore);
printf(“%.2f”,stu_save[i].ave);
putchar(10);
w=0;
break;
}
}
if(w)
printf(“查找失败\n”);
do
{
printf(“\n按Y继续查找,按N返回上级菜单\n”);
ch=getch();
}while(ch!=’y’ch!=’n’);
if(ch==’n’)
return;
}while(ch==’y’);
}
int delete_stu(struct Student stu_save[],int n)
{
int i,w=1;
char search[20];
// load(stu_save,n);
printf(“\n请输入要删除学生的姓名或学号\n”);
scanf(“%s”,search);
for(i=0;in;i++)
if(strcmp(stu_save[i].num,search)==0||strcmp(stu_save[i].name,search)==0)
{
w=0;
break;
}
if(w)
{
printf(“无此学生!\n”);
return 0;
}
for(;in-1;i++)
stu_save[i]=stu_save[i+1];
printf(“删除成功!\n”);
// save(stu_save,n-1);
return 1;
}
之前随便写的 忘了有没有调试 有问题再私信找我 采纳哦~~
c语言学生信息管理系统代码
代码如下:
#includestdio.h
#includemalloc.h
#includestdlib.h
#includestring.h
#includeconio.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();
}
回答于 2022-12-11
C语言 学生管理系统
#include
#include
#include
#include
#define max 20
typedef struct student //学生
{
char sno[max]; // 学号
char sname[max]; //姓名
char sex[max]; //性别
char age[max]; //年龄
char depart[max]; //系
char classs[max]; //班
char grade[max]; //年级
struct student* next;
} student;
student* head;
int LogOn() //登录模块消埋,已实现输入密码不回显,如果中途发现输错某几位,可退格键重输
{
char username[max],password[max];
printf(“\n请输入用户名:”);
scanf(“%s”,username);
printf(“\n请输入密码(最多15位):”);
//开始以不回显且支持退格方式获取输入密码
int i=0;
while((i=0)(password[i++]=getch())!=13)//条件i=0是用于限制带枝退格的范围
{
if(password[i-1]==’\b’)//对退格键的处理
{
printf(“%c%c%c”,’\b’,’\0′,’\b’);
i=i-2;
}
else
printf(“*”);
}
password[–i]=’\0′;
//已获取密码。验证用户身份
if(!strcmp(username,”zhang”)!strcmp(password,”8147086″))
{
printf(“\n登录成功!”);
return 1;
}
else
return 0;
}
void regist()
{
char ch;
student *s,*ptr; //s用来建新结点,ptr用来暂存头结点
do
{
s=(student*)malloc(sizeof(student)); // 新建一个学生结点
printf(“\n开始注册…”); //开始注册
printf(“\n请输入该学生的学号:”);
scanf(“%s”,s-sno);
printf(“\n请输入该学生的姓名:”);
scanf(“%s”,s-sname);
printf(“\n请输入该学生的性别:”);
scanf(“%s”,s-sex);
printf(“\n请输入该学生的年龄:”);
scanf(“%s”,s-age);
printf(“\n请输入该学生的系:”);
scanf(“%s”,s-depart);
printf(“\n请输入该学生所在的班:”);
scanf(“%s”,s-classs);
printf(“\n请输入该学生所在的年级”);
scanf(“%s”,s-grade);
ptr=head;
head=s;//将新结点插入队头
s-next=ptr;
fflush(stdin);
printf(“\n请问是否继续注册?(Y/N)”);
scanf(“%c”,ch);
}while(ch==’Y’||ch==’y’);
return;
}
void ElePrint(char str[]) //输出单个元素
{
if(str==NULL) exit(0);
printf(“%s”,str);
for(unsigned int i=0;i12-strlen(str);i++) printf(” “);//为了对齐输出,需插入一些空格
return;
}
int LinePrint(student *ptr) //输出一行
{
if(ptr==NULL) /拿行蚂/检查传进来的指针
return 0;
printf(“\n”);
ElePrint(ptr-sno);
ElePrint(ptr-sname);
ElePrint(ptr-age);
ElePrint(ptr-sex);
ElePrint(ptr-depart);
ElePrint(ptr-classs);
ElePrint(ptr-grade);
return 1;
}
void print() //输出全部学生信息
{
student *ptr=head;
printf(“\n学号 姓名 年龄 性别 系 班 年级 “);
while(ptr)
{
LinePrint(ptr);
ptr=ptr-next;
}
printf(“\n”);
return;
}
void search()//查询模块
{
int method;//查询方式
char no[max],name[max],departm[max],clss[max],grades[max]; //用来接收查询关键字
while(1)
{
printf(“\n请选择查询方式”);
printf(“\n1.按学号查询”);
printf(“\n2.按姓名查询”);
printf(“\n3.按所在系查询”);
printf(“\n4.按所在班级查询”);
printf(“\n5.按所在年级查询”);
printf(“\n6.打印全部学生信息”);
printf(“\n7.返回主菜单\n”);
scanf(“%d”,method);
student *p=head,*temp;
switch(method)
{
case 1:
printf(“\n请输入要查询的学号:”);
scanf(“%s”,no);
while(p)
{
if(!strcmp(p-sno,no))
break;
else
{
temp=p;
p=p-next;
}
}
printf(“\n学号 姓名 年龄 性别 系 班 年级 “);
LinePrint(p);
break;
case 2:
printf(“\n请输入要查询的姓名:”);
scanf(“%s”,name);
printf(“\n学号 姓名 年龄 性别 系 班 年级 “);
while(p)
{
if(!strcmp(p-sname,name))
LinePrint(p);
p=p-next;
}
break;
case 3:
printf(“\n请输入学生所在的系:”);
scanf(“%s”,departm);
printf(“\n学号 姓名 年龄 性别 系 班 年级 “);
while(p)
{
if(!strcmp(p-depart,departm))
LinePrint(p);
p=p-next;
}
break;
case 4:
printf(“\n请输入学生所在的班:”);
scanf(“%s”,clss);
printf(“\n请输入学生所在的年级:”);
scanf(“%s”,grades);
printf(“\n学号 姓名 年龄 性别 系 班 年级 “);
while(p)
{
if(!strcmp(p-classs,clss)!strcmp(p-grade,grades))
LinePrint(p);
p=p-next;
}
break;
case 5:
printf(“\n请输入学生所在的年级:”);
scanf(“%s”,grades);
printf(“\n学号 姓名 年龄 性别 系 班 年级 “);
while(p)
{
if(!strcmp(p-grade,grades))
LinePrint(p);
p=p-next;
}
break;
case 6:
print();
break;
case 7:
return;
default:
printf(“很抱歉,暂无此查询方式!”);
break;
}
}
}
void modify()//修改学生信息
{
char num[max];
student *p=head;
printf(“\n请输入要修改的学生的学号:”);
scanf(“%s”,num);
while(p)
{
if(!strcmp(p-sno,num))
break;
else
p=p-next;
}
if(p==NULL)
{
printf(“\n错误:没有此学生的信息!\n”);
return;
}
LinePrint(p);
printf(“\n请输入要修改的该学生的信息:”);
printf(“\n1.姓名”);
printf(“\n2.性别”);
printf(“\n3.年龄”);
printf(“\n4.所在的系”);
printf(“\n5.所在的班”);
printf(“\n6.所在的年级”);
char name1[max],sex1[max],age1[max],depart1[max],class1[max],grade1[max];
int select;
fflush(stdin);
scanf(“%d”,select);
printf(“\n请输入新的信息:”);
switch(select)
{
case 1:
scanf(“%s”,name1);
strcpy(p-sname,name1);
break;
case 2:
scanf(“%s”,sex1);
strcpy(p-sex,sex1);
break;
case 3:
scanf(“%s”,age1);
strcpy(p-age,age1);
break;
case 4:
scanf(“%s”,depart1);
strcpy(p-depart,depart1);
break;
case 5:
scanf(“%s”,class1);
strcpy(p-classs,class1);
break;
case 6:
scanf(“%s”,grade1);
strcpy(p-grade,grade1);
break;
default:
printf(“\nError!”);
break;
}
LinePrint(p);
return;
}
void del()// 删除某学生的信息
{
student *p=head,*temp=head,*s;
char num1[max];
printf(“\n请输入要删除的学生的学号:”);
scanf(“%s”,num1);
while(p)//查找该学生所在的结点
{
if(!strcmp(p-sno,num1))
break;
else
{
temp=p;
p=p-next;
}
}//while
if(!p)
{
printf(“\n不存在此学生的信息.”);
return;
}
LinePrint(p);//输出该学生的信息
printf(“\n请问真的要删除该学生的信息吗?(Y/N)”);
char ch;
fflush(stdin);
scanf(“%c”,ch);
if(ch==’Y’||ch==’y’)
{
s=p-next;
temp-next=s;
free(p);
printf(“\n已经删除该学生的信息.”);
}
return;
}
void sort() //排序模块。将学生记录按学号从小到大排列。用起泡排序算法实现
{
student *ptr,*s=head,*p;
int count=0,count1;
while(s)//统计链表结点个数
{
count++;
s=s-next;
}
for(int i=1;icount;i++)
{
ptr=head;
p=NULL;
count1=count-i; //用来控制每轮起泡排序的终点,即每次把学号最小的结点移到倒数第i个结点
while(ptrptr-next(count1–))
{
if(strcmp(ptr-sno,ptr-next-sno)0)
{
s=ptr-next;
ptr-next=s-next;
if(p==NULL) //ptr处于队头时
head=s;
else
p-next=s;
s-next=ptr;
p=s;
}
else
{
ptr=ptr-next;
if(p==NULL) //ptr处于队头时
p=head;
else
p=p-next;
}
}
}
return;
}
void quit()
{
char ch;
printf(“\n真的要退出?(Y/N)”);
fflush(stdin);
scanf(“%c”,ch);
if(ch==’Y’||ch==’y’)
exit(0);
return;
}
int main()
{
int option;
printf(“\nCopyright@2005 KongXinCai All rights reserved.”);
printf(“\n欢迎使用学生信息管理系统!\n”);
//登录模块
int icheck=0;
while(icheck3)
{
if(LogOn()==0)
icheck++;
else
break;
}
if(icheck==3)
{
printf(“\n连续登录三次不成功,退出!”);
exit(0);
}
//系统界面
while(1)
{
printf(“\n\n请选择需要的服务:”);
printf(“\n1.注册”);
printf(“\n2.查询”);
printf(“\n3.修改”);
printf(“\n4.删除”);
printf(“\n5.排序”);
printf(“\n7.求平均”);
printf(“\n6.退出\n”);
scanf(“%d”,option);
switch(option)
{
case 1:
regist();
break;
case 2:
search();
break;
case 3:
modify();
break;
case 4:
del();
break;
case 5:
sort();
break;
case 6:
quit();
break;
}
}
return 0;
}