帮忙设计一个C语言的学生信息管理系统

具体要求如下:
1、 在主程序中,先显示如下菜单:
简易学生信息管理系统
*****系统功能菜单*****
----------------------------------
1. 录入学生信息
2. 按成绩排序
3. 增加学生信息
4. 按学号删除信息
5. 显示学生信息
6. 退出系统
----------------------------------
请选择(1-6):
2、 当用户选择了1时,调用函数input。运行时先提示“输入待录入的学生数:”,该数应小于定义的数组长度;然后提示“输入学生信息(学号,姓名,分数):”,输入完指定数目后,提示“输入完毕”。返回主程序后,重新显示菜单,用户可以继续选择功能。注意:录入多个学生信息时,若录入的学号与前面相同,应显示“已有该学号,请检查后重新录入”。
3、 当用户选择了2时,调用函数sort。实现按照成绩从高到低排列,排序完成后,提示“排序完毕”。返回主程序后,重新显示菜单,用户可以继续选择功能。
4、 当用户选择了3时,先提示输入待增加的学生数,再按“1”的要求增加学生信息。输入完成后,提示“输入完毕”。返回主程序后,重新显示菜单,用户可以继续选择功能。
5、 当用户选择了4时,调用函数delete。运行时先提示“输入待删除学生的学号:”,然后从数组中找到指定的信息,进行删除,并提示“删除完毕”。若输入的学号不存在,则显示“该学号不存在”。返回主程序后,重新显示菜单,用户可以继续选择功能。
6、 当用户选择了5时,调用函数print。运行时先提示“当前学生信息如下:”,然后输出数组中存储的所有学生信息,一行只显示一名学生的信息。返回主程序后,重新显示菜单,用户可以继续选择功能。
7、 当用户选择了6时,显示“谢谢您使用本系统!”,程序结束。
提示:应定义一个全局变量,指示当前数组中的学生数,实现各功能模块的函数以存储学生信息的数组及当前存储的学生数作为参数。
这是大学作业题来的,不会啊!!

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "conio.h"

struct subject{ //科目信息结构体
float Chinese; //语文
float Math; //数学
float English; //英语
};

struct student{
int no; //学号
char name[20]; //姓名
char sex; //性别
char address[20]; //地址
char telephone[20];//电话
subject score; //3门科目的成绩
float avg; //3门平均成绩
}stud[50]; //结构体数组

int count=0; //计数变量,记录学生人数

void add(){ //增加学生信息函数
student a; //临时结构体变量a
char x,j; //Yes or No输入字符变量

//循环输入学生信息
for(int i=0;i<50;i++){
system("cls"); //清屏函数
int t=0;
printf("请输入学生的学号:");
scanf("%d",&a.no);

//寻找学号是否已存在
for(int k=0;k<count;k++){
if(stud[k].no==a.no){
t=1;
}
}

//存在与否,分别输出
if(t==1)
printf("输入的学号已存在,请重新输入\n");
else{
printf("请输入学生的姓名:");
scanf("%s",a.name);
printf("请输入学生的性别(m代表男,f代表女):");
scanf("%c",&a.sex);
scanf("%c",&a.sex);
printf("请输入学生的地址:");
scanf("%s",a.address);
printf("请输入学生的电话:");
scanf("%s",a.telephone);
printf("请输入学生的语文成绩:");
scanf("%f",&a.score.Chinese);
printf("请输入学生的数学成绩:");
scanf("%f",&a.score.Math);
printf("请输入学生的英语成绩:");
scanf("%f",&a.score.English);
a.avg=(a.score.Chinese+a.score.English+a.score.Math)/3;

//判定是否要增加该记录
printf("确定要增加该记录吗?(y/n)");
scanf("%c",&x);
scanf("%c",&x);
if(x=='y'){
stud[count]=a;
count++;
}
}

//判定是否要继续增加记录
printf("要继续增加记录吗?(y/n)");
scanf("%c",&j);
scanf("%c",&j);
if(j=='n')
break;
}
printf("\n按任意键返回主菜单:");
getch(); //从键盘接收任意一个字符就返回
}

void show(){ //显示所有学生信息函数
system("cls");
//循环显示
for(int i=0;i<count;i++){
printf("学号:%-8d姓名:%-16s性别:%c\n",stud[i].no,stud[i].name,stud[i].sex);
printf("地址:%s\n电话:%s\n",stud[i].address,stud[i].telephone);
printf("语文成绩:%-8.1f数学成绩:%-8.1f英语成绩:%-8.1f平均成绩:%.1f\n",stud[i].score.Chinese,
stud[i].score.Math,stud[i].score.English,stud[i].avg);
printf("---------------------------------------------------------------------\n");
}
printf("\n按任意键返回主菜单:");
getch();
}

void sort(){ //根据学生的学号由小到大进行排序
system("cls");
//冒泡排序法
for(int i=0;i<count-1;i++){
for(int j=0;j<count-1-i;j++){
if(stud[j].no>stud[j+1].no){
student t=stud[j];
stud[j]=stud[j+1];
stud[j+1]=t;
}
}
}
printf("排序已完成,按任意键返回主菜单:");
getch();
}

void query1(){ //根据学号查询并显示单个学生信息
int x; //输入学生学号整型变量
char k; //Yes or No输入字符变量
while(true){
system("cls");
int t=-1; //要查询的学生学号所对应的数组下标,-1代表在数组中没对应下标
printf("请输入要查询的学生学号:");
scanf("%d",&x);

//循环寻找结构体数组中符合变量x的数据,并把该数据所在的下标值赋给变量t
for(int i=0;i<count;i++){
if(stud[i].no==x)
t=i;
}

//判定信息是否存在,分别输出
if(t==-1)
printf("您所查询的学生信息不存在,");
else{
printf("学号:%-8d姓名:%-16s性别:%c\n",stud[t].no,stud[t].name,stud[t].sex);
printf("地址:%s\n电话:%s\n",stud[t].address,stud[t].telephone);
printf("语文成绩:%-8.1f数学成绩:%-8.1f英语成绩:%-8.1f平均成绩:%.1f\n",stud[t].score.Chinese,
stud[t].score.Math,stud[t].score.English,stud[t].avg);
printf("---------------------------------------------------------------------\n");
}

//判定是否要继续查询
printf("是否继续查询?(y/n)");
scanf("%c",&k);
scanf("%c",&k);
if(k=='n')
break;
}
printf("\n按任意键返回主菜单:");
getch();
}

void query2(){ //根据姓名查询并显示单个学生信息
char x[20]; //输入学生姓名字符串变量
char k; //Yes or No输入字符变量
while(true){
system("cls");
student a[50]; //要查询的学生姓名所对应的数组下标,-1代表在数组中没对应下标
int t=0;
printf("请输入要查询的学生姓名:");
scanf("%s",x);

//循环寻找结构体数组中符合变量x的数据,并把该数据所在的下标值赋给变量t
for(int i=0;i<count;i++){
if(strcmp(stud[i].name,x)==0){
a[t]=stud[i];
t++;
}
}

//判定信息是否存在,分别输出
if(t==0)
printf("您所查询的学生信息不存在,");
else{
for(int i=0;i<t;i++){
printf("学号:%-8d姓名:%-16s性别:%c\n",a[i].no,a[i].name,a[i].sex);
printf("地址:%s\n电话:%s\n",a[i].address,a[i].telephone);
printf("语文成绩:%-8.1f数学成绩:%-8.1f英语成绩:%-8.1f平均成绩:%.1f\n",a[i].score.Chinese,
a[i].score.Math,a[i].score.English,a[i].avg);
printf("---------------------------------------------------------------------\n");
}
}

//判定是否要继续查询
printf("是否继续查询?(y/n)");
scanf("%c",&k);
scanf("%c",&k);
if(k=='n')
break;
}
printf("\n按任意键返回主菜单:");
getch();
}

void good(){ //显示平均成绩和单科成绩最高的学生资料
system("cls");

//寻找平均成绩中的最高值
float max1=stud[0].avg;
for(int i=1;i<count;i++)
if(stud[i].avg>max1)
max1=stud[i].avg;

//输出平均成绩中最高值的学生信息
for(int i=0;i<count;i++){
if(max1==stud[i].avg){
printf("平均成绩最高的学生信息:\n\n");
printf("学号:%-8d姓名:%-16s性别:%c\n",stud[i].no,stud[i].name,stud[i].sex);
printf("地址:%s\n电话:%s\n",stud[i].address,stud[i].telephone);
printf("语文成绩:%-8.1f数学成绩:%-8.1f英语成绩:%-8.1f平均成绩:%.1f\n",stud[i].score.Chinese,
stud[i].score.Math,stud[i].score.English,stud[i].avg);
printf("---------------------------------------------------------------------\n");
}
}

//寻找语文成绩中的最高值
float max2=stud[0].score.Chinese;
for(int i=1;i<count;i++)
if(stud[i].score.Chinese>max2)
max2=stud[i].score.Chinese;

//输出语文成绩中最高值的学生信息
for(int i=0;i<count;i++){
if(max2==stud[i].score.Chinese){
printf("语文成绩最高的学生信息:\n\n");
printf("学号:%-8d姓名:%-16s性别:%c\n",stud[i].no,stud[i].name,stud[i].sex);
printf("地址:%s\n电话:%s\n",stud[i].address,stud[i].telephone);
printf("语文成绩:%-8.1f数学成绩:%-8.1f英语成绩:%-8.1f平均成绩:%.1f\n",stud[i].score.Chinese,
stud[i].score.Math,stud[i].score.English,stud[i].avg);
printf("---------------------------------------------------------------------\n");
}
}

//寻找数学成绩中的最高值
float max3=stud[0].score.Math;
for(int i=1;i<count;i++)
if(stud[i].score.Math>max3)
max3=stud[i].score.Math;

//输出数学成绩中最高值的学生信息
for(int i=0;i<count;i++){
if(max3==stud[i].score.Math){
printf("数学成绩最高的学生信息:\n\n");
printf("学号:%-8d姓名:%-16s性别:%c\n",stud[i].no,stud[i].name,stud[i].sex);
printf("地址:%s\n电话:%s\n",stud[i].address,stud[i].telephone);
printf("语文成绩:%-8.1f数学成绩:%-8.1f英语成绩:%-8.1f平均成绩:%.1f\n",stud[i].score.Chinese,
stud[i].score.Math,stud[i].score.English,stud[i].avg);
printf("---------------------------------------------------------------------\n");
}
}

//寻找英语成绩中的最高值
float max4=stud[0].score.English;
for(int i=1;i<count;i++)
if(stud[i].score.English>max4)
max4=stud[i].score.English;

//输出英语成绩中最高值的学生信息
for(int i=0;i<count;i++){
if(max4==stud[i].score.English){
printf("英语成绩最高的学生信息:\n\n");
printf("学号:%-8d姓名:%-16s性别:%c\n",stud[i].no,stud[i].name,stud[i].sex);
printf("地址:%s\n电话:%s\n",stud[i].address,stud[i].telephone);
printf("语文成绩:%-8.1f数学成绩:%-8.1f英语成绩:%-8.1f平均成绩:%.1f\n",stud[i].score.Chinese,
stud[i].score.Math,stud[i].score.English,stud[i].avg);
printf("---------------------------------------------------------------------\n");
}
}
printf("\n按任意键返回主菜单:");
getch();
}

void update(){
int x; //输入学生学号整型变量
student a; //临时结构体变量a
char k,j; //Yes or No输入字符变量

while(true){
system("cls");
int t=-1; //要查询的学生学号所对应的数组下标,-1代表在数组中没对应下标
printf("请输入要修改的学生学号:");
scanf("%d",&x);

//循环寻找结构体数组中符合变量x的数据,并把该数据所在的下标值赋给变量t
for(int i=0;i<count;i++){
if(stud[i].no==x)
t=i;
}

//判定信息是否存在,分别输出
if(t==-1)
printf("您所要修改的学生信息不存在,");
else{
//输出要修改学生的原信息
printf("学号:%-8d姓名:%-16s性别:%c\n",stud[t].no,stud[t].name,stud[t].sex);
printf("地址:%s\n电话:%s\n",stud[t].address,stud[t].telephone);
printf("语文成绩:%-8.1f数学成绩:%-8.1f英语成绩:%-8.1f平均成绩:%.1f\n",stud[t].score.Chinese,
stud[t].score.Math,stud[t].score.English,stud[t].avg);
printf("---------------------------------------------------------------------\n");

//判定是否要修改
printf("确定要修改该记录吗?(y/n)");
scanf("%c",&k);
scanf("%c",&k);

//确定要修改后,输入新信息
if(k=='y'){
printf("请输入新的学生的学号:");
scanf("%d",&a.no);
printf("请输入新的学生的姓名:");
scanf("%s",a.name);
printf("请输入新的学生的性别:");
scanf("%c",&a.sex);
scanf("%c",&a.sex);
printf("请输入新的学生的地址:");
scanf("%s",a.address);
printf("请输入新的学生的电话:");
scanf("%s",a.telephone);
printf("请输入新的学生的语文成绩:");
scanf("%f",&a.score.Chinese);
printf("请输入新的学生的数学成绩:");
scanf("%f",&a.score.Math);
printf("请输入新的学生的英语成绩:");
scanf("%f",&a.score.English);
a.avg=(a.score.Chinese+a.score.English+a.score.Math)/3;
stud[t]=a;
printf("修改成功,");
}
}

//判定是否继续
printf("是否继续修改?(y/n)");
scanf("%c",&j);
scanf("%c",&j);
if(j=='n')
break;
}
printf("\n按任意键返回主菜单:");
getch();
}

void del(){
int x; //输入学生学号整型变量
char k,j; //Yes or No输入字符变量
while(true){
system("cls");
int t=-1; //要查询的学生学号所对应的数组下标,-1代表在数组中没对应下标
printf("请输入要删除的学生学号:");
scanf("%d",&x);

//循环寻找结构体数组中符合变量x的数据,并把该数据所在的下标值赋给变量t
for(int i=0;i<count;i++){
if(stud[i].no==x)
t=i;
}

//判定信息是否存在,分别输出
if(t==-1)
printf("您所要删除的学生信息不存在,");
else{
//输出要删除学生的原信息
printf("学号:%-8d姓名:%-16s性别:%c\n",stud[t].no,stud[t].name,stud[t].sex);
printf("地址:%s\n电话:%s\n",stud[t].address,stud[t].telephone);
printf("语文成绩:%-8.1f数学成绩:%-8.1f英语成绩:%-8.1f平均成绩:%.1f\n",stud[t].score.Chinese,
stud[t].score.Math,stud[t].score.English,stud[t].avg);
printf("---------------------------------------------------------------------\n");

//判定是否删除
printf("确认要删除吗?(y/n)");
scanf("%c",&k);
scanf("%c",&k);

//确定要删除后,删除该信息
if(k=='y'){
for(int i=t;i<count-1;i++)
stud[i]=stud[i+1];
printf("删除成功,");
count--;
}
}

//判定是否继续
printf("是否继续删除?(y/n)");
scanf("%c",&j);
scanf("%c",&j);
if(j=='n')
break;
}
printf("\n按任意键返回主菜单:");
getch();
}

void grt(){
system("cls");
printf("\t\t\t顾韧霆制作\n\t\t\t2008年12月13日\n");
printf("\n按任意键返回主菜单:");
getch();
}

void grt1()
{
int choice=0; //保存用户输入的选择项
do{
system("cls"); //清屏函数
printf("\t----------------学生信息管理系统----------------\n\n");
printf("\t\t在菜单中选择以下的操作类型\n");
printf("\t\t1.增加记录\n\t\t2.显示所有学生信息\n\t\t3.信息排序\n\t\t4.根据学号查询单个学生信息\n\t\t5.根据姓名查询单个学生信息\n");
printf("\t\t6.平均成绩和单科成绩最高的学生资料\n\t\t7.修改记录\n\t\t8.删除记录\n\t\t9.退出程序\n\t\t0.制作人\n");
printf("\t\t请输入你的选择:");
scanf("%d",&choice);
switch(choice)
{
case 1:
add();
break;
case 2:
show();
break;
case 3:
sort();
break;
case 4:
query1();
break;
case 5:
query2();
break;
case 6:
good();
break;
case 7:
update();
break;
case 8:
del();
break;
case 0:
grt();
break;
}
}while(choice!=9);
}

void main()
{
char x[10];
printf("\t----------------学生信息管理系统----------------\n\n");
for(int i=3;i>0;i--){
printf("\t\t\t请输入密码:");
scanf("%s",&x);
if(strcmp(x,"123456")==0){
grt1();
break;
}
else
printf("\t\t\t输入错误,你还有%d次机会\n",i-1);
}

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-12-23
这么大的系统一般都要给RMB做的。这个太费功夫了。
第2个回答  推荐于2016-06-14
#include<stdio.h>
#include<string.h>
#define N 100
struct students{
int num;
char name[10];
int score;
}s[N]={{1,"a",3},{2,"b",4},{3,"c",1}};

int m=3;

int f(int i)
{
int j;
int flag=0;
for(j=0;j<i;j++)
{
if(s[i].num==s[j].num)
{
printf("已有该学号,请检查后重新录入\n");
flag=1;
break;
}
}
return flag;
}

void input()
{
int i;
void menu();
// system("cls");
printf("输入待录入的学生数:");
scanf("%d",&m);
while(m>N)
{
printf("个数太多,重新输入,推出请输入0\n");
scanf("%d",&m);
if(m==0)
menu();
}
printf("输入学生信息(学号,姓名,分数)\n");
for(i=0;i<m;i++)
{
printf("请输入学号:");
scanf("%d",&s[i].num);
while(i>0&&f(i)==1)
{
printf("请重新输入学号:");
scanf("%d",&s[i].num);
}
printf("请输入名字:");
scanf("%s",s[i].name);
printf("请输入成绩:");
scanf("%d",&s[i].score);
}
printf("输入完毕\n");
printf("即将回到菜单\n");
// system("pause");
menu();
}

void sort()
{
void menu();
int i,j,k;
int temp;
char a[10];
for(i=0;i<m-1;i++)
{
k=i;
for(j=i+1;j<m;j++)
if(s[k].score<s[j].score)
k=j;
if(k!=i)
{
temp=s[i].num;
s[i].num=s[k].num;
s[k].num=temp;
temp=s[i].score;
s[i].score=s[k].score;
s[k].score=temp;
strcpy(a,s[i].name);
strcpy(s[i].name,s[k].name);
strcpy(s[k].name,a);

}
}
printf("排序完毕\n");
menu();
}

void add()
{
void menu();
int n;
int i;
printf("请输入要添加的个数");
scanf("%d",&n);
while((n+m)>N)
{
printf("个数太多,重新输入,推出请输入0\n");
scanf("%d",&n);
if(n==0)
menu();
}
printf("输入学生信息(学号,姓名,分数)\n");
for(i=0;i<n;i++)
{
printf("请输入学号:");
scanf("%d",&s[m+i].num);
while(f(m+i)==1)
{
printf("请重新输入学号:");
scanf("%d",&s[m+i].num);
}
printf("请输入名字:");
scanf("%s",s[m+i].name);
printf("请输入成绩:");
scanf("%d",&s[m+i].score);
}
m=m+n;
printf("输入完毕\n");
printf("即将回到菜单\n");
menu();
}

void del()
{
void menu();
int num;
int i;
int j;
printf("请输入要删除的学号:");
scanf("%d",&num);
for(i=0;i<m;i++)
{
if(s[i].num==num)
{
for(j=i+1;j<m;j++)
{
s[j-1].num=s[j].num;
s[j-1].score=s[j].score;
strcpy(s[j-1].name,s[j].name);
}
printf("删除完毕\n");
return;
}
}
printf("不存在该学号\n");
menu();
}

void print()
{
void menu();
int i;
printf("当前学生信息如下:\n");
printf("学号 姓名 成绩\n");
for(i=0;i<m;i++)
{
printf("%d",s[i].num);
printf("%7s",s[i].name);
printf("%9d\n",s[i].score);
}
menu();
}

void shut()
{
printf("谢谢使用本系统。");
// system("pause");
// exit(0);
}

void menu()
{
int key;
// system("cls");
printf("*****学生信息管理系统*****\n");
printf("----------------------------------\n");
printf("1. 录入学生信息\n");
printf("2. 按成绩排序\n");
printf("3. 增加学生信息\n");
printf("4. 按学号删除信息\n");
printf("5. 显示学生信息\n");
printf("6. 退出系统\n");
printf("请输入key;");
scanf("%d",&key);
switch(key)
{
case(1):
input();
break;
case(2):
sort();
break;
case(3):
add();
break;
case(4):
del();
break;
case(5):
print();
break;
case(6):
shut();
break;
default :
printf("你输入有误。");
break;
}
}

void main()
{
menu();
}本回答被提问者采纳
第3个回答  2008-12-23
小力,你太笨了!!!!!
第4个回答  2008-12-23
我有的你要不要,用数组很搓的,有最大数值的限制,没有弹性,现在都是用指针来按要求分配,并用数据结构存储,我保证我的界面肯定比你说的要好多了。百度hi我 或者发邮件我 [email protected]
相似回答