求助C语言高手,跪求一个关于成绩统计程序.希望哪位大侠帮帮忙,感激不尽!!!

4.成绩统计程序。
学号 导论 离散 c语言 英语 数学
1 45 78 90 67 56
2 76 87 89 96 66
3 77 83 67 45 74
4 55 67 66 87 51
5 67 78 98 64 35
6 66 78 93 76 65

各科平均: 64.33333333 78.5 83.83333333 72.5 57.83333333
各科最高: 77 87 98 96 74
各分数段人数:
90-100 80-90 70-80 60-70 60-
导论
离散
语言
英语
数学
查找:各科在平均分以上的人的学号
*用棒图显示结果

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int login(char p[16])//登录,密码判断,
{
int w;
char login[16];
printf("请输入密码\n");
gets(login);//输入字符串作为密码
w=strcmp(p,login);//判断两字符串是否相同,若相同则返回0
return w;//返回密码判断的值
}
void display()//菜单
{
printf("*——————————————————————————————————————*\n");
printf("|请选择您所需的操作: |\n");
printf("|——————————————————————————————————————|\n");
printf("|1.输入成绩 2.顺序输出成绩 3.查找最高分 4.查找最低分|\n");
printf("|5.查找特定成绩 6.降序排序成绩 7.求总成绩和平均成绩 |\n");
printf("|8.查找低于特定分数的成绩 9.分段成绩人数及位置 10.增加成绩 |\n");
printf("|11.更改成绩 12.删除单个成绩 13.删除全部成绩 14.修改密码 |\n");
printf("|0.退出 |\n");
printf("*——————————————————————————————————————*\n");
}
int input(double score[200])//输入数据
{
int p,q,i=1;
printf("请输入学生人数\n");
scanf("%d",&p);
for(q=0;q<p;q++)
{
printf("请输入第%d个人成绩\n",i);
scanf("%lf",&score[q]);
i++;
}
printf("输入完毕\n");
return p;//返回总人数
}
void output(double score[200],int x)//顺序输出学生成绩
{
int i=0;
if(x!=0)
while(i!=x)
{
printf("第%d个人的成绩为%lf\n",i+1,score[i]);
i++;
}
else
printf("数据为空,请先输入数据\n");//容错,当数组中没有数据时提示用户先输入数据
}
void max(double score[200],int x)//查询最大成绩
{
int m,n;
double max;
if(x!=0)
{
max=score[0];n=1;
for(m=1;m<x;m++)//循环判断最大成绩与其所在位置,所在位置为下标加1
{
if(max<score[m])
{
max=score[m];
n=m+1;
}
}
printf("最高成绩为%lf,是第%d个\n",max,n);
}
else printf("数据为空,请先输入数据\n");//容错
}
void min(double score[200],int x)//查询最低成绩
{
int m,n;
double min;
if(x!=0)
{
min=score[0];n=1;
for(m=1;m<x;m++)//循环判断最低成绩与其所在位置,所在位置为下标加1
{
if(min>score[m])
{
min=score[m];
n=m+1;
}
}
printf("最低成绩为%lf,是第%d个\n",min,n);
}
else printf("数据为空,请先输入数据\n");//容错
}
void spe(double score[200],double m,int n)//查询特定成绩
{
int i,x=0;
int location[200];
for(i=0;i<n;i++)//循环
if(score[i]==m)//判断是否为所查询的成绩
{
location[x]=i+1;
x++;
}
if(x!=0)
{
printf("您所查询的成绩为%lf,在以下位置出现\n",m);//输出所查询的成绩
for(i=0;i<x;i++)
printf("%d ",location[i]);//输出所查询成绩的所在位置,此位置为下标加1
printf("\n");
}
else
printf("此成绩不存在\n");//容错,当所查询的成绩不存在是输出
}
void down(double score[200],int x)//降序排列
{
int m,n;
double temp;
if(x!=0)
{
for(m=0;m<x;m++)//选择排序,控制第一个数
for(n=m+1;n<x;n++)//选择排序,控制第二个数
if(score[m]<score[n])//判断,当后面的数比前面的小时两数交换位置
{
temp=score[m];
score[m]=score[n];
score[n]=temp;
}
printf("降序排列为\n");
n=1;
for(m=0;m<x;m++)//输出控制,每行只输出4个数
{
printf("%lf ",score[m]);
n++;
if(n==5)//输出控制,用于判断回车符的输出
{
n=1;
printf("\n");
}
}
}
else printf("数据为空,请先输入数据\n");//容错
}
double ave(double score[200],int x)//输出总分与平均分
{
double sum=0,ave0;
int i;
if(x!=0)
{
for(i=0;i<x;i++)//累加求和,求出总分
sum=sum+score[i];
ave0=sum/x;//求出平均分
printf("总成绩为%lf\n",sum);
return ave0;
}
else
{
printf("数据为空,请先输入数据\n");//容错
return 0;
}

}
void fil(double score[200],double w,int x)//输出小于特定分数的成绩所在位置,位置为下标加1
{
int i,m;
int location[200];
for(i=0;i<x;i++)
if(score[i]<w)
{
location[m]=i+1;
m++;
}
if(m!=0)
{
printf("所查询的成绩在以下位置出现\n");
for(i=0;i<m;i++)
printf("%d ",location[i]);
}
else
printf("此成绩不存在\n");
}
void sec(double score[200],int x)//成绩分段并输出各段人数与位置,位置为下标加1
{
int s,i=0,m=0,n=0,s80[200],s60[200],s0[200],f=1;
if(x!=0)
{
for(s=0;s<x;s++)//循环判断各成绩所在段
{
if(score[s]>=80)
{
s80[i]=s+1;
i++;
}
else
if(score[s]>=60)
{
s60[m]=s+1;
m++;
}
if(score[s]<60)
{
s0[n]=s+1;
n++;
}
}
printf("80分至100分的人数为%d,在以下位置出现\n",i);//输出各段的人数
for(s=0;s<i;s++)
{
printf("%d ",s80[s]);
if(f==10)
{
printf("\n");
f=1;
}
}
printf("\n60分至80分的人数为%d,在以下位置出现\n",m);
f=1;
for(s=0;s<m;s++)
{
printf("%d ",s60[s]);
if(f==10)
{
printf("\n");
f=1;
}
}
printf("\n60分以下的人数为%d,在以下位置出现\n",n);
f=1;
for(s=0;s<n;s++)
{
printf("%d ",s0[s]);
if(f==10)
{
printf("\n");
f=1;
}
}
}
else
printf("数据为空,请先输入数据\n");//容错
}
int add(double score[200],int x,double y,int z)
{
int i;
for(i=z;i>=x;i--)
score[i]=score[i-1];
score[x-1]=y;
printf("增加成功\n");
return 1;
}
void rejigger(double score[200],int x,double y)
{
score[x-1]=y;
printf("更改成功\n");
}
void del(double score[200],int x,int y)
{
int i;
for(i=x;i<y;i++)
score[i-1]=score[i];
score[y]=0;
}
int format(double score[200])
{
int i;
char validate;
printf("是否确认删除所有数据Y/N\n");
scanf("%c",&validate);
scanf("%c",&validate);
if(validate=='Y'||validate=='y')
{
for(i=0;i<200;i++)
score[i]=0;
printf("删除成功\n");
return 1;
}
else
{
printf("取消删除\n");
return 0;
}
}

void main()
{
char password[16]="123456";//定义默认密码
double score[200],m,n,w,z;
int choose,x=3,i,f,b=0,change=1,y;
char *p,validate;
double *a;
int flag = 0;
p = password;
a=score;
f=3;i=0;
while(f)//密码错误次数控制,当错误时重新输入,若连续错误3次则直接退出程序
{
i=login(password);
if(i)
{
x--;
if(x>0)
printf("密码错误,请重新输入,您还有%d次机会\n",x);
else
{
printf("密码错误,程序自动退出\n");
exit(1);
}
f--;//次数控制
continue;
}
else//当密码输入正确时进入下一步
{
flag = 1;
break;
}
}
while(flag)//主循环,控制菜单的循环输出与程序的循环使用
{
display();//输出菜单
scanf("%d",&choose);//功能选择
switch(choose)//功能判断
{
case 1:b=input(score);break;//输入成绩
case 2://顺序输出成绩
output(score,b);
break;
case 3:max(score,b);break;//输出最大值
case 4:min(score,b);break;//输出最小值
case 5://查询特定成绩
if(b!=0)
{
printf("请输入要查询的成绩\n");
scanf("%lf",&m);
spe(score,m,b);
}
else
printf("数据为空,请先输入数据\n");
break;
case 6:down(score,b);break;//降序排列
case 7:n=ave(score,b);printf("平均成绩为%lf\n",n);break;//输出总成绩与平均成绩
case 8://查询低于特定分数的成绩
if(b!=0)
{
printf("请输入分数\n");
scanf("%lf",&w);
fil(score,w,b);
}
else
printf("数据为空,请先输入数据\n");
break;
case 9:sec(score,b);break;//成绩分段
case 10:
if(b!=0)
{
printf("请输入要增加的成绩和所在位置\n");
scanf("%lf%d",&z,&y);
add(score,y,z,b);
b=b+1;
}
else
printf("数据为空,请先输入数据\n");
break;
case 11:
if(b!=0)
{
printf("请输入要修改的位置和修改后的成绩\n");
scanf("%d%lf",&y,&z);
rejigger(score,y,z);
}
else
printf("数据为空,请先输入数据\n");
break;
case 12:
if(b!=0)
{
printf("请输入要删除的位置\n");
scanf("%d",&y);
del(score,y,b);
b=b-1;
}
else
printf("数据为空,请先输入数字\n");
break;
case 13:
y=format(score);
if(y==1) b=0;
break;

case 0:
printf("程序退出后所有数据将消失,确定退出程序?Y/N\n");
scanf("%c",&validate);
scanf("%c",&validate);
if(validate=='Y'||validate=='y') flag=0;//退出
}
}
printf("谢谢使用\n");
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-10
//C++课程设计---学生成绩管理系统
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#include <stdlib.h>
#include <windows.h>
typedef struct studentinfo //结构体定义
{
int num;//学号
char name[64];//姓名
int sex;//性别,1为男性,0为女性
float math;//数学
float english;//英语
float politic;//政治
float chinese;//语文
float total;//总成绩
struct studentinfo *next;
}STUDENT;

#define FILENAME "D:\\1.txt"
//定义默认的数据库文件
#define DELAYTIME 1500
//显示信息,延时
void create_menu();

STUDENT * new_student();
STUDENT* create_linkbyfile(char *);
STUDENT *del_info(STUDENT *);
int save_info(char *,STUDENT *,int);

int find_infile_printf(char *);
int pri_whole_link(STUDENT *);
STUDENT* printf_sort(STUDENT *);
void free_link(STUDENT *);

void main() //主函数
{
create_menu();
}

STUDENT * reverse(STUDENT *head)
//功能:链表反转顺序
//参数:head链表头结点指针
{
STUDENT *ptemp,*p1;
if(head==NULL)
{
return 0;
}
p1=head;//p1使之永远指向排好序的第一个结点,初值为head,head使之永远是已经排好序的最后一个结点

while(head->next!=NULL)//本次循环使ptemp排好序
{
ptemp=head->next;//ptemp指向未排好序的第一个结点
head->next=ptemp->next;//
ptemp->next=p1;//ptemp也排好序了,ptemp变成排好序的第一个结点了
p1=ptemp;//再次让p1成为第一个排好序的结点
}
return p1;//头结点为第一个结点
}
void create_menu()
//功能:输出功能菜单,提供人-机接口
{
char menu_Num;
STUDENT *head=NULL;
char ch;
char file_name[256];
while(1)
{
system("cls");
cout<<"\t\t学生成绩管理系统\n";
cout<<"##########################################\n";
cout<<"#\t\t 1.新增学生信息\t\t #\n";
cout<<"#\t\t 2.加载数据库\t\t #\n";
cout<<"#\t\t 3.删除学生信息\t\t #\n";
cout<<"#\t\t 4.保存学生信息\t\t #\n";
cout<<"#\t\t 5.数据库查询\t\t #\n";
cout<<"#\t\t 6.原序输出\t\t #\n";
cout<<"#\t\t 7.排序输出\t\t #\n";
cout<<"#\t\t 8.退出\t\t\t #\n";
cout<<"##########################################\n";
cout<<"请输入操作编号:";
cin>>menu_Num;
switch (menu_Num)
{
case '1':
free_link(head);//释放链表空间
head=new_student();//新增学生信息
break;
case '2':
free_link(head);//释放链表空间
cout<<"请输入要加载的数据库文件的路径"<<endl;
cin>>file_name;
head=create_linkbyfile(file_name);//读取数据文件
if(head!=NULL)
{
cout<<"数据库"<<file_name<<"已加载"<<endl;
Sleep(DELAYTIME);
}
break;
case '3':
del_info(head);//删除学生信息

break;
case '4'://保存学生信息
if (head==NULL)
{
cout<<"请先生成学生信息"<<endl;
Sleep(DELAYTIME);
}
else
{

cout<<"想将学生信息保存到哪个数据库文件?";
cin>>file_name;

cout<<"请选择保存方式:0追加到文件末尾 1覆盖文件\n";
cin>>menu_Num;
if(save_info(file_name,head,menu_Num-'0')==0)//0表示追加,1表示覆盖
{
cout<<"信息保存失败\n";
}
else
{
cout<<"数据已保存到"<<file_name<<endl;
Sleep(DELAYTIME);
}
}
break;
case '5':
find_infile_printf(FILENAME);//数据库查询

break;
case '6'://原序输出信息
pri_whole_link(head);
cout<<"返回主菜单? Y/N\t";
do
{
cin>>ch;
}while(ch!='Y'&&ch!='y');

break;
case '7'://排序输出信息
do
{

if((head=printf_sort(head))==NULL)
{
cout<<"数据库未加载"<<endl;
Sleep(DELAYTIME);
break;
}
else
{
cout<<"选择其他方式排序? Y/N\t";
cin>>ch;
}
}while(ch=='Y'||ch=='y');

break;

case '8':
free_link(head);//释放链表空间
exit(0);
break;
default:
cout<<"输入有误!请重新输入!"<<endl;
Sleep(DELAYTIME);
break;
}
}
}

STUDENT * new_student()
//功能:创建学生信息(通过链表)
//返回值:头结点指针
{
STUDENT *pnew,*p,*head;
float *pfloat;
char ch;
head=NULL;

do
{
system("cls");
pnew=(STUDENT *)malloc(sizeof(STUDENT)*1);
cout<<"请输入学生的学号(0表示取消): ";
cin>>pnew->num;
if(0>=pnew->num)
{
break;
}
cout<<"请输入学生的姓名:";
cin>>pnew->name;

while(1)
{

cout<<"请输入学生的性别:0/1\t";
cin>>pnew->sex;
if(pnew->sex&&pnew->sex-1)
{
cout<<"性别输入错误,0表示女性,1表示男性,请重新输入"<<endl;
}
else
{
break;
}
}

cout<<"请依次输入学生的数学、英语、政治、语文成绩:"<<endl;

for(pnew->total=0,pfloat=&pnew->math;pfloat<&pnew->math+4;)
{
cin>>*pfloat;
if(*pfloat<0||*pfloat>150)
{
cout<<"成绩输入错误,只能为0~150"<<endl;
}
else
{
pnew->total+=*pfloat;
pfloat++;
}
}

if(head==NULL)
{
head=pnew;
}
else
{
p->next=pnew;
}
p=pnew;
pnew->next=NULL;
cout<<"##########################该学生信息已生成#########################\n";

cout<<"建立另一个学生的信息? Y/N\t";
cin>>ch;
}while(ch=='Y'||ch=='y');

return head;
}

STUDENT* create_linkbyfile(char *filename)
//功能:读取文件,创建链表
//参数:如果filename不为空,则打开该文件,如果filename为空,要求输入文件位置
//创建的链表的所有结点的next全部修改,指向物理地址上的下一个结点
{
system("cls");
FILE *fp;
STUDENT *head,*ptemp,*pnew;

head=NULL;//初始化head为空
if(filename==NULL)//若filename为空,要求输入文件绝对地址
{
char file_name[256];
cout<<"请输入数据库文件的路径:"<<endl;
cin>>file_name;

if(NULL==(fp=fopen(file_name,"rb")))
{
cout<<"数据库连接失败\n";
return 0;
}
}
else
{
if(NULL==(fp=fopen(filename,"rb")))
{
cout<<"数据库连接失败\n";
return 0;
}
}

for(ptemp=NULL;;)
{
pnew=(STUDENT *)malloc(sizeof(STUDENT)*1);
if(fread(pnew,sizeof(STUDENT),1,fp)!=NULL)
{
if(ptemp!=NULL)
{
ptemp->next=pnew;
}
else
{
head=pnew;
}
ptemp=pnew;
}
else
{
if(ptemp!=NULL)
{
ptemp->next=NULL;
}
else
{
head=NULL;
}
free(pnew);
break;
}
}

fclose(fp);

return head;
}

STUDENT *del_info(STUDENT *head)
//根据学号,删除链表的结点
{
system("cls");
STUDENT *p1,*p2;
int num;
if (head==NULL)
{
cout<<"数据库未加载"<<endl;
Sleep(DELAYTIME);
return 0;
}
cout<<"请输入要删除学生的学号:";
cin>>num;
for(p1=head;p1!=NULL;)
{
if(p1->num==num)//找到
{
if(p1==head)//要删除的结点是头结点
{
head=p1->next;
}
else
{
p2->next=p1->next;
}
cout<<"成功删除!!";
}
p2=p1;
p1=p1->next;
}
return head;
}

int save_info(char *filename,STUDENT *head,int flag)
//功能:将链表按Binary写入文件末尾
//参数:
//1.filename文件名,绝对地址
//2.head指向链表的头结点
//3.flag 0追加或1覆盖数据
//返回值:失败则返回0
{
system("cls");
FILE *fp;
STUDENT *p;
char openmethod[8];
if(flag==0)
{
strcpy(openmethod,"ab+");//追加
}
else
{
strcpy(openmethod,"w");//覆盖
}
if(NULL==(fp=fopen(filename,openmethod)))//
{
cout<<"数据库连接失败"<<endl;
Sleep(DELAYTIME);
return 0;
}
else
{
for(p=head;p;p=p->next)
{
if((fwrite(p,sizeof(STUDENT),1,fp))==NULL)
{
cout<<"数据库创建失败"<<endl;
return 0;
}

}
}
fclose(fp);
return 1;
}

int find_infile_printf(char *filename)
//功能:根据学号和姓名来查询某个学生
//参数:filename数据库文件
//返回值:失败返回0
//直接搜索文件,缺点是速度慢
//也可先根据文件创建链表,再搜索链表,缺点是如果文件较大,占用内存多
{
system("cls");
FILE *fp;
STUDENT stu;
int num;
char stu_name[64];
char ch;
if(filename==NULL)
{
return 0;
}

do
{
memset(stu_name,0,sizeof(stu_name));
cout<<"查询学号或查询姓名? 1查询学号 0查询姓名";
//flag=1根据学号来查询,flag=0根据姓名来查询
cin>>num;
if(num==1)
{
cout<<"输入要查询的学号:";
cin>>num;
cout<<"正在为您查询学号为"<<num<<"的学生……"<<endl;
}
else if(num==0)
{
cout<<"输入要查询的姓名:";
cin>>stu_name;
cout<<"正在为您查询姓名为"<<stu_name<<"的学生……"<<endl;
}
else
{
cout<<"输入有误"<<endl;
return 0;
}

if(NULL==(fp=fopen(filename,"rw")))
{
cout<<"数据库连接失败\n";
return 0;
}
else
{
while(fread(&stu,sizeof(STUDENT),1,fp)!=NULL)
{

if(strcmp(stu.name,stu_name)==0||stu.num==num)
{
cout<<"学号\t姓名\t性别\t数学\t英语\t政治\t语文\t总成绩\n";
//输出该学生的所有信息
cout<<stu.num<<"\t"<<stu.name<<"\t"<<stu.sex<<"\t"<<stu.math<<"\t"<<stu.english<<"\t"<<stu.politic<<"\t"<<stu.chinese<<"\t"<<stu.total<<endl;

//不加break;可支持多个相同数据的索引
}
}
}
cout<<"##########################查询完毕#########################\n";

cout<<"查询另一个学生的信息? Y/N\t";
cin>>ch;
}while(ch=='Y'||ch=='y');

fclose(fp);
return 1;
}

int pri_whole_link(STUDENT *head)
//功能:显示整条链表的学生信息
//参数:head 头结点指针,如果head为空,返回空
{
system("cls");
STUDENT* p;
if (head==NULL)
{
cout<<"数据库未加载"<<endl;
Sleep(DELAYTIME);
return 0;
}
cout<<"学号\t姓名\t性别\t数学\t英语\t政治\t语文\t总成绩\n";
for(p=head;p;p=p->next)
{
cout<<p->num<<"\t"<<p->name<<"\t"<<p->sex<<"\t"<<p->math<<"\t"<<p->english<<"\t"<<p->politic<<"\t"<<p->chinese<<"\t"<<p->total<<endl;
}

return 1;
}

STUDENT* printf_sort(STUDENT *head)
//功能:根据学号|某科目成绩|总成绩对链表进行排序,然后输出
//参数:head链表头指针,如果head为空,返回空
//返回值:返回新的链表的头结点指针
{
system("cls");
STUDENT *p1,*p2,*ptemp,*pfinished=NULL;
char num;
char flag;

if (head==NULL)
{
return 0;
}
cout<<"选择排序依据 0.数学成绩1.英语成绩2.政治成绩3.语文成绩4.总成绩\n";
while(1)
{
cin>>num;
if(num>'4'||num<'0')
{
cout<<"输入有误,请重新输入 0~4"<<endl;
}
else
{
break;
}
}

cout<<"升序/降序输出? 0.降序1.升序";
while(1)
{
cin>>flag;
if(flag>'1'||flag<'0')
{
cout<<"输入有误,请重新输入 0~1"<<endl;
}
else
{
break;
}
}

for(p1=head;p1->next!=pfinished;)//对链表进行从大到小排序(这里用冒泡法)
//p1使之总是指向头结点,pfinished使之总是指向已排序好的最前面的结点
//ptemp作为中介,保存p2的上一个结点
{
for(p2=p1;p2->next!=pfinished;)
{
if(*(&(p2->math)+num-'0')<*(&(p2->next->math)+num-'0'))//p2的值小于p2->next的值,交换 ptemp p2 p2->next
{
if(p2==p1)//头结点要交换
{
p1=p2->next;
p2->next=p1->next;
p1->next=p2;
ptemp=p1;
}
else
{
ptemp->next=p2->next;
ptemp=p2->next;
p2->next=ptemp->next;
ptemp->next=p2;
}
}
else//不需要交换,则p2、ptemp前进1位
{
ptemp=p2;
p2=p2->next;
}
}
pfinished=p2;
}

if(flag=='1')
{
p1=reverse(p1);
}
pri_whole_link(p1);

cout<<"##########################信息显示完毕#########################\n";

return p1;
}

void free_link(STUDENT *head)
//释放链表空间,如果head,什么都不做
{
STUDENT *p1,*p2;
for(p1=head;p1;p1=p2)
{
p2=p1->next;//先保存,否则
free(p1);//free后 p1->next数据丢失
}
}追问

我要的是只是一个成绩统计程序,而不是一个系统,而且要求上面都有。

第2个回答  2011-09-10
网上很多“学生管理系统”,一般做的就是这些,有些改改就行了
第3个回答  2011-09-11
网上很多,自己做也不难
相似回答