跪求一段程序 题目是:用c语言设计实现一个学生管理系统

要包括1)学生信息与成绩(假设有5门课程)的录入;2)学生信息保存到文件;3)学生信息文件的载入;4)根据学号查询课程成绩;5)统计各课程的平均成绩

你看看这个行不行。 就是没有界面
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct{
char name[30]; //姓名
char sex[10]; //性别
char Class[15]; //班级
char number[10]; //学号
int age; //年龄
int scores; //成绩
int hage; //年龄的上限
int hscores; //成绩的上限
}Student; //学生类型

typedef struct node{
Student student;
struct node *next;
}Student_List; //学生表结点类型

Student_List *T; //学生表头指针

typedef struct{
char name[30];
Student_List *s; //学生信息的地址
}Name_List;

Name_List nl[100]; //姓名索引表

typedef struct{
char Class[15];
Student_List *s;
}Class_List;

Class_List cl[100]; //班级索引表

typedef struct{
int scores;
Student_List *s;
}Scores_List;

Scores_List sl[100]; //成绩索引表

typedef struct{
int age;
Student_List *s;
}Age_List;

Age_List al[100]; //年龄索引表

typedef struct{
Student_List *se[70];
int n;
}Sex_List;

Sex_List sexl[2]; //性别索引表

int In_List(Student_List *T,char number[10]){
//如果表T中已存在S的信息则返回1,否则返回0
Student_List *x;
x=T;
while(x!=NULL){
if(strcmp(x->student.number,number)==0)
return 1;
x=x->next;
}
return 0;
}

int Length(Student_List *T){
//返回学生表里学生的数量
Student_List *x;
int i=0;
x=T;
while(x!=NULL){
i++;
x=x->next;
}
return i;
}

int Student_List_Insert(Student S){
//将元素S插入到学生表T中,如果表中已存在S的信息则返回0,否则返回1
Student_List *x,*p,*y;
int i,l;
if(In_List(T,S.number))
return 0;
else{
//维护学生表
p=NULL;
x=T;
y=(Student_List *)malloc(sizeof(Student_List));
y->student.age=S.age;
strcpy(y->student.Class,S.Class);
strcpy(y->student.name,S.name);
strcpy(y->student.number,S.number);
y->student.scores=S.scores;
strcpy(y->student.sex,S.sex);
while(x!=NULL&&strcmp(S.number,x->student.number)>0){
p=x;
x=x->next;
}
if(p==NULL){
y->next=x;
T=y;
}
else{
y->next=p->next;
p->next=y;
}
//维护姓名索引表
l=Length(T);
for(i=l-1;i>=l&&strcmp(S.name,nl[i].name)<0;i--){
strcpy(nl[i+1].name,nl[i].name);
nl[i+1].s=nl[i].s;
}
strcpy(nl[i+1].name,S.name);
nl[i+1].s=y;
//维护班级表
for(i=l-1;i>=1&&strcmp(S.Class,cl[i].Class)<0;i--){
strcpy(cl[i+1].Class,cl[i].Class);
cl[i+1].s=cl[i].s;
}
strcpy(cl[i+1].Class,S.Class);
cl[i+1].s=y;
//维护成绩表
for(i=l-1;i>=1&&S.scores<sl[i].scores;i--){
sl[i+1].scores=sl[i].scores;
sl[i+1].s=sl[i].s;
}
sl[i+1].scores=S.scores;
sl[i+1].s=y;
//维护年龄表
for(i=l-1;i>=1&&S.age<al[i].age;i--){
al[i+1].age=al[i].age;
al[i+1].s=al[i].s;
}
al[i+1].age=S.age;
al[i+1].s=y;
//维护性别表
if(strcmp(S.sex,"男")==0){
sexl[1].n++;
sexl[1].se[sexl[1].n]=y;
}
else{
sexl[2].n++;
sexl[2].se[sexl[2].n]=y;
}
}
return 1;
}

int Student_List_Delete(char number[10]){
//删除学号为number的学生的信息,如果该学生不在表中返回0,否则返回1
Student_List *x,*p;
int i,l,j;
if(!In_List(T,number))
return 0;
else{
//维护学生表信息
p=NULL;
x=T;
while(x!=NULL&&strcmp(x->student.number,number)!=0){
p=x;
x=x->next;
}
if(p==NULL)
T=x->next;
else
p->next=p->next->next;
//维护姓名索引表
l=Length(T);
for(i=1;i<=l+1&&nl[i].s!=x;i++);
for(;i<=l;i++){
strcpy(nl[i].name,nl[i+1].name);
nl[i].s=nl[i+1].s;
}
//维护班级索引表
for(i=1;i<=l+1&&cl[i].s!=x;i++);
for(;i<=l;i++){
strcpy(cl[i].Class,cl[i+1].Class);
cl[i].s=cl[i+1].s;
}
//维护成绩索引表
for(i=1;i<=l+1&&sl[i].s!=x;i++);
for(;i<=l;i++){
sl[i].scores=sl[i+1].scores;
sl[i].s=sl[i+1].s;
}
//维护年龄索引表
for(i=1;i<=l+1&&al[i].s!=x;i++);
for(;i<=l;i++){
al[i].age=al[i+1].age;
al[i].s=al[i+1].s;
}
//维护性别索引表
for(j=1;j<=2&&sexl[j].se[i]==x;j++)
for(i=1;i<=sexl[j].n&&sexl[j].se[i]!=x;i++);
for(i=1;i<sexl[j].n;i++)
sexl[j].se[i]=sexl[j].se[i+1];
sexl[j].n--;
}
return 1;
}

int Is_Name(char a[],char b[],int al,int bl){
//如果a和b有6个以上的连续字串则返回1,否则返回0
int i,j,max;
int m[30][30];
for(i=0;i<=al;i++){
j=0;
m[i][j]=0;
}
for(j=0;j<=bl;j++){
i=0;
m[i][j]=0;
}
max=0;
for(j=1;j<=bl;j++){
for(i=1;i<=al;i++){
if(a[i-1]==b[j-1]){
m[i][j]=m[i-1][j-1]+1;
if(m[i][j]>max)
max=m[i][j];
}
else
m[i][j]=0;
}
}
if(max==bl)
return 1;
else
return 0;
}

int Student_List_Search(Student S,Student_List *buf[100]){
//查询与学生S信息相似的所有学生信息,如果不存在返回0,否则返回查找到的学生数量
Student_List *x,*m[100];
int n=0;
int i,l,k,j,c;
l=Length(T);
if(strcmp(S.number,"null")!=0){
x=T;
while(x!=NULL&&strcmp(S.number,x->student.number)!=0)
x=x->next;
if(x==NULL)
return 0;
buf[1]=x;
return 1;
}
else{
if(strcmp(S.name,"null")!=0){
for(i=1;i<=l;i++){
if(Is_Name(nl[i].name,S.name,strlen(nl[i].name),strlen(S.name)))
buf[++n]=nl[i].s;
}
if(n==0)
return 0;
}
if(strcmp(S.Class,"null")!=0){
k=0;
for(i=1;i<=l&&strcmp(S.Class,cl[i].Class)!=0;i++);
for(;i<=l&&strcmp(S.Class,cl[i].Class)==0;i++)
m[++k]=cl[i].s;
if(n==0){
for(i=1;i<=k;i++)
buf[i]=m[i];
n=k;
}
else{
c=0;
for(i=1;i<=n;i++){
for(j=1;j<=k;j++)
if(buf[i]==m[j]){
buf[++c]=buf[i];
break;
}
}
n=c;
}
if(n==0)
return 0;
}
if(S.scores!=0){
k=0;
for(i=1;i<=l&&sl[i].scores<S.scores;i++);
for(;i<=l&&sl[i].scores<=S.hscores;i++)
m[++k]=sl[i].s;
if(n==0){
for(i=1;i<=k;i++)
buf[i]=m[i];
n=k;
}
else{
c=0;
for(i=1;i<=n;i++){
for(j=1;j<=k;j++)
if(buf[i]==m[j]){
buf[++c]=buf[i];
break;
}
}
n=c;
}
if(n==0)
return 0;
}
if(S.age!=0){
k=0;
for(i=1;i<=l&&al[i].age<S.age;i++);
for(;i<=l&&al[i].age<=S.hage;i++)
m[++k]=al[i].s;
if(n==0){
for(i=1;i<=k;i++)
buf[i]=m[i];
n=k;
}
else{
c=0;
for(i=1;i<=n;i++){
for(j=1;j<=k;j++)
if(buf[i]==m[j]){
buf[++c]=buf[i];
break;
}
}
n=c;
}
if(n==0)
return 0;
}
if(strcmp(S.sex,"null")!=0){
k=0;
if(strcmp(S.sex,"男")==0){
for(i=1;i<=sexl[1].n;i++)
m[i]=sexl[1].se[i];
k=sexl[1].n;
}
else{
for(i=1;i<=sexl[2].n;i++)
m[i]=sexl[2].se[i];
k=sexl[2].n;
}
if(n==0){
for(i=1;i<=k;i++)
buf[i]=m[i];
n=k;
}
else{
c=0;
for(i=1;i<=n;i++){
for(j=1;j<=k;j++)
if(buf[i]==m[j]){
buf[++c]=buf[i];
break;
}
}
n=c;
}
if(n==0)
return 0;
}
}
return n;
}

void Student_List_Print(Student_List *T,Student_List *buf[100],int n){
//如果n为-1,输出学生表中所有学生,否则输出查找到得信息
Student_List *x;
int i;
x=T;
if(n==-1){
if(T==NULL)
printf("表中没有学生信息\n");
else{
printf("_______________________________________________________________\n");
printf(" 学号 姓名 性别 班级 年纪 成绩\n");
while(x!=NULL){
printf("%10s%15s%6s%11s%11d%10d\n",x->student.number,x->student.name,x->student.sex,x->student.Class,x->student.age,x->student.scores);
x=x->next;
}
}
}
else{
if(n==0)
printf("没有符合要求的学生\n");
else{
printf("_______________________________________________________________\n");
printf(" 学号 姓名 性别 班级 年纪 成绩\n");
for(i=1;i<=n;i++)
printf("%10s%15s%6s%11s%11d%10d\n",buf[i]->student.number,buf[i]->student.name,buf[i]->student.sex,buf[i]->student.Class,buf[i]->student.age,buf[i]->student.scores);
}
}
}

int Is_a_b(char a[]){
//判断字符串是否为a-b的格式
int i;
for(i=0;a[i]!='\0'&&a[i]!='-';i++){
if(a[i]<'0'||a[i]>'9')
return 0;
}
if(a[i]=='\0')
return 1;
for(i++;a[i]!='\0';i++){
if(a[i]<'0'||a[i]>'9')
return 0;
}
return 1;
}

void a_b_to_Int(char a[],int *b,int *c){
//将一个a-b格式的字符串转换为两个int型变量,并赋给b和c
int i,sum;
sum=0;
for(i=0;a[i]!='-'&&a[i]!='\0';i++){
sum=10*sum+a[i]-'0';
}
*b=sum;
sum=0;
if(a[i]=='\0')
*c=*b;
else{
for(i++;a[i]!='\0';i++){
sum=10*sum+a[i]-'0';
}
*c=sum;
}
}

int sum(Student_List *buf[100],int n){
//求总成绩
int sum=0;
int i;
for(i=1;i<=n;i++)
sum+=buf[i]->student.scores;
return sum;
}

void MaxanMin_Scores(Student_List *buf[100],int *max,int *min,int n){
//求buf中的最高分和最低分
int i;
*max=0;
*min=65535;
for(i=1;i<=n;i++){
if(buf[i]->student.scores>(*max))
*max=buf[i]->student.scores;
if(buf[i]->student.scores<(*min))
*min=buf[i]->student.scores;
}
}

void Number_Sort(Student_List *buf[100],int n){
//按学号排序
int i,j;
Student_List *k;
for(i=2;i<=n;i++){
k=buf[i];
j=i-1;
while(j>0&&strcmp(k->student.number,buf[j]->student.number)<0){
buf[j+1]=buf[j];
j--;
}
buf[j+1]=k;
}
}

void Scores_Sort(Student_List *buf[100],int n){
//按成绩排序
int i,j;
Student_List *k;
for(i=2;i<=n;i++){
k=buf[i];
j=i-1;
while(j>0&&k->student.scores<buf[j]->student.scores){
buf[j+1]=buf[j];
j--;
}
buf[j+1]=k;
}
}

void Search(){
//查找
Student_List *buf[100];
char a[10];
int b,c,n,k=0;
int Sum,max,min,avg;
Student S;
printf("输入要查找的学号(如果不填请输入null):");
scanf("%s",S.number);
printf("输入要查找的姓名(如果不填请输入null):");
scanf("%s",S.name);
printf("输入要查找的性别(如果不填请输入null):");
scanf("%s",S.sex);
printf("输入要查找的班级(如果不填请输入null):");
scanf("%s",S.Class);
printf("输入要查找的年纪(如果要查找范围请以a-b的格式输入,如果不填输入0):");
scanf("%s",a);
while(!Is_a_b(a)){
printf("输入格式错误,请重新输入:");
scanf("%s",a);
}
a_b_to_Int(a,&b,&c);
S.age=b;
S.hage=c;
printf("输入要查找的成绩(如果要查找范围请以a-b的格式输入,如果不填输入0):");
scanf("%s",a);
while(!Is_a_b(a)){
printf("输入格式错误,请重新输入:");
scanf("%s",a);
}
a_b_to_Int(a,&b,&c);
S.scores=b;
S.hscores=c;
n=Student_List_Search(S,buf);
if(n==0)
printf("没有这个学生\n");
else if(n==1)
Student_List_Print(T,buf,n);
else{
Student_List_Print(T,buf,n);
printf("求总成 绩 输入1\n");
printf("求平均成绩输入2\n");
printf("求最 高 分输入3\n");
printf("求最 低 分输入4\n");
printf("按学号排序输入5\n");
printf("按成绩排序输入6\n");
printf("退 出 输 入 0\n");
Sum=sum(buf,n);
MaxanMin_Scores(buf,&max,&min,n);
while(scanf("%d",&k)!=EOF&&k!=0){
switch(k){
case 1: printf("总成绩为:%d\n",Sum);
break;
case 2: avg=Sum/n;
printf("平均分为:%d\n",avg);
break;
case 3: printf("最高分为:%d\n",max);
break;
case 4: printf("最低分为:%d\n",min);
break;
case 5: Number_Sort(buf,n);
Student_List_Print(T,buf,n);
break;
case 6: Scores_Sort(buf,n);
Student_List_Print(T,buf,n);
break;
default: break;
}
}
}
}

int Login(){
char a[20],b[20];
printf("请输入管理员账号!(输入exit退出):\n");
scanf("%s",a);
if(strcmp("exit",a)!=0){
if(strcmp("admin",a)==0){
printf("请输入密码!(输入exit退出)\n");
scanf("%s",b);
if(strcmp("exit",b)!=0){
while(strcmp("1234",b)!=0){
printf("密码错误,重新输入!(输入exit退出)\n");
scanf("%s",b);
}
return 1;
}
else
return 2;
}
else{
printf("账号不正确!\n");
return 0;
}
}
else
return 2;
}

int main(){
int k=0,admin;
T=NULL;
Student S;
Student_List *buf[100];
admin=Login();
while(admin==0)
admin=Login();
if(admin==2)
return 0;
printf("输入新学 生 信息 输入1:\n");
printf("删 除 学 生 信息 输入2:\n");
printf("修 改 学 生 信息 输入3:\n");
printf("查 找 学 生 信息 输入4:\n");
printf("输 出所有学生信息输入5:\n");
printf("输入0退出程序\n");
while(scanf("%d",&k)!=EOF&&k!=0){
switch(k){
case 1: printf("请输入学号,输入0结束输入:");
while(scanf("%s",S.number)!=EOF&&strcmp(S.number,"0")!=0){
printf("请输入姓名:");
scanf("%s",S.name);
printf("请输入性别:");
scanf("%s",S.sex);
printf("请输入班级:");
scanf("%s",S.Class);
printf("请输入年龄:");
scanf("%d",&S.age);
printf("请输入成绩:");
scanf("%d",&S.scores);
Student_List_Insert(S);
printf("请输入学号,输入0结束输入:");
}
break;
case 2: printf("请输入要删除的学号,输入0结束删除:");
while(scanf("%s",S.number)!=EOF&&strcmp(S.number,"0")!=0){
Student_List_Delete(S.number);
printf("请输入要删除的学号,输入0结束删除:");
}
break;
case 3: printf("请输入要修改的学生的学号:");
scanf("%s",S.number);
if(Student_List_Search(S,buf)){
printf("请输入修改后的的姓名:");
scanf("%s",buf[1]->student.name);
printf("请输入修改后的的性别:");
scanf("%s",buf[1]->student.sex);
printf("请输入修改后的的班级:");
scanf("%s",buf[1]->student.Class);
printf("请输入修改后的的年龄:");
scanf("%d",&buf[1]->student.age);
printf("请输入修改后的的成绩:");
scanf("%d",&buf[1]->student.scores);
}
else
printf("没有这个学生\n");
break;
case 4: Search();
break;
case 5: Student_List_Print(T,buf,-1);
break;
}
printf("输入新学 生 信息 输入1:\n");
printf("删 除 学 生 信息 输入2:\n");
printf("修 改 学 生 信息 输入3:\n");
printf("查 找 学 生 信息 输入4:\n");
printf("输 出所有学生信息输入5:\n");
printf("输入0退出程序\n");
}
return 0;
}追问

这个运行的时候怎么不可以 好多错误

追答

不会吧 我自己运行的好好的啊。 你用的什么环境啊?

追问

你的这个好像太复杂了 好像不用这么多吧 300行左右就可以了吧 我用的一个学习编译的系统 我也不知道叫什吗 你告诉我该用哪个软件吧

追答

devc或者vc++6.0都可以的吧 要是不用这么复杂楼下的就不错啊

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-27
#include <stdio.h>
#include <string.h>
typedef struct Student
{
int id;
char name[10];
int cscore,mscore,escore;
}STU;
STU stu[3];
int cavg,mavg,eavg;
void init()
{
int i;
for(i=0;i<3;i++)
{
printf("\nEnter Student's ID:");
scanf("%d",&stu[i].id);
printf("\nEnter Student's name:");
scanf("%s",stu[i].name);
printf("\nEnter Student's cscore:");
scanf("%d",&stu[i].cscore);
printf("\nEnter Student's mscore:");
scanf("%d",&stu[i].mscore);
printf("\nEnter Student's escore:");
scanf("%d",&stu[i].escore);
}
}
// 求每科平均分
void avg(STU a[],int n)
{
int i,csum=0,msum=0,esum=0;
for(i=0;i<n;i++)
{
csum=csum+a[i].cscore;
msum=msum+a[i].mscore;
esum=esum+a[i].escore;
}
cavg = csum/n;
mavg = msum/n;
eavg = esum/n;
}
// 学生成绩与平均分比较
void compare(STU a[],int n)
{
int i=0;
printf("超出平均分的学生信息:\n");
for(i=0;i<n;i++)
{
if(a[i].cscore>cavg)
{
printf("语文成绩超出平均分的同学ID:");
printf("%d\t",a[i].id);
printf("姓名:%s\n",a[i].name);
}
if(a[i].mscore>mavg)
{
printf("数学成绩超出平均分的同学ID:");
printf("%d\t",a[i].id);
printf("姓名:%s\n",a[i].name);
}
if(a[i].escore>eavg)
{
printf("英语成绩超出平均分的同学ID:");
printf("%d\t",a[i].id);
printf("姓名:%s\n",a[i].name);
}
}
}
// 冒泡排序
void sort(STU a[],int n)
{
int i,j,temp1;
char temp2[10];
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j].id>a[j+1].id)
{
temp1=a[j].id;
a[j].id=a[j+1].id;
a[j+1].id=temp1;

strcpy(temp2,a[j].name);
strcpy(a[i].name,a[j+1].name);
strcpy(a[j+1].name,temp2);

temp1=a[j].cscore;
a[j].cscore=a[j+1].cscore;
a[j+1].cscore=temp1;

temp1=a[j].mscore;
a[j].mscore=a[j+1].mscore;
a[j+1].mscore=temp1;

temp1=a[j].escore;
a[j].escore=a[j+1].escore;
a[j+1].escore=temp1;
}
}
}
}
void display(STU a[],int n)
{
int i;
printf("所有学生信息:\n");
for(i=0;i<n;i++)
{
printf("%d\t",a[i].id);
printf("%s\t",a[i].name);
printf("%d\t",a[i].cscore);
printf("%d\t",a[i].mscore);
printf("%d\n",a[i].escore);
}
}
void main()
{
init();
printf("排序前:\n");
display(stu,3);
avg(stu,3);
compare(stu,3);
sort(stu,3);
printf("排序后:\n");
display(stu,3);
}
这个比较简单,看下嘛,希望对你有帮助!!!
相似回答