附录* 综合实例——学生成绩查询系统
这是一个用c语言编写的小软件——学生成绩查询系统,同学们可以将其作为一个综合实例,对其进行仔细的阅读和研究,体验编程处理问题的过程,加深对编程语言的理解,提高处理问题的综合能力。
1、程序的功能:
1)可以根据用户输入的输入、输出文件名,读入学生成绩,完成数据的初始化。
2)可以查询指定学生的成绩,可以是指定科目的成绩,也可以是全部科目的成绩。
3)友好退出。
2、使用说明:
1)将输入文件放到指定的目录下(即../student/)
图1
2)启动管理程序student.exe
3)在程序的使用界面,首先输入输入文件名和输出文件名,完成程序的初始化,操作如下图所示
图2
然后,按照按照提示,输入学生姓名和需要程序的成绩(此软件暂时只设置了五成成绩,同学们可以按照需要扩展)科目代码,也可以输入查询所有成绩的代码。程序成绩,如下图所示
图3
4)输入代码“q”退出程序。
3、程序代码
#include
#include
#include
FILE *f1,*f2;
char file1[20],file2[20],name[200][20],name1[15];
int n,m,data[200][10];
void init(){
int i,j;
char ch=' ';
printf("%20c欢迎使用班级成绩管理系统\n\n",ch);
printf("请输入输入和输出文件名(中间用一个空格隔开):\n");
scanf("%s %s",file1,file2);// 1)该条语句的功能是什么?
f1=fopen(file1,"r");
f2=fopen(file2,"w");
fscanf(f1,"%d%d",&n,&m); // 2)该条语句的功能是什么?
for(i=1;i<=n;i++)
{
fscanf(f1,"%s",name[i]); // 3)该条语句的功能是什么?
data[i][0]=0; // 4)该条语句的功能是什么?没有这条语句可不可以?
for(j=1;j<=m;j++)
{
fscanf(f1,"%d",&data[i][j]);
data[i][0]+=data[i][j]; // 5)该条语句的功能是什么?
}
}
fprintf(f2,"name\tyuwen\tshuxue\tyingyu\twuli\thuaxue\tzongfen\n ");
for(i=1;i<=n;i++)
{
fprintf(f2,"%s\t",name[i]);
for(j=1;j<=m;j++)
fprintf(f2,"%d\t",data[i][j]);
fprintf(f2,"%d\n",data[i][0]);
}
fclose(f1);// 6)问什么可以在这关闭输入文件?
fclose(f2);
}
void search(char na[],char num){
int i=1,j;
while((i<=n)&&(strcmp(na,name[i])!=0))i++;
if(i<=n){
switch(num){
case '1':printf("%s的语文成绩为%d!\n",na,data[i][1]);break;
case '2':printf("%s的数学成绩为%d!\n",na,data[i][2]);break;
case '3':printf("%s的英语成绩为%d!\n",na,data[i][3]);break;
case '4':printf("%s的物理成绩为%d!\n",na,data[i][4]);break;
case '5':printf("%s的化学成绩为%d!\n",na,data[i][5]);break;
case 'a':
printf("%s的各科成绩为:\n",name[i]);
printf("语文\t数学\t英语\t物理\t化学\t总成绩\n");
for(j=1;j<=m;j++)
printf("%d\t",data[i][j]);
printf("%d\n",data[i][0]);
break;
default: printf("没有这种查询方式,请确认后再次输入!\n");
}
}
else printf("查无此人,请确认后再次查询!\n");
printf("\n\n");
}
main(){
init();//数据初始化
printf("数据初始化结束!\n\n");
printf("------------------------------------------------\n\n");
char na[20];
char num;
while(1){ // 7)该条语句的功能是什么?
//scanf("%s%c%c",na,&num,&num); // 8)此处的输入可不可以用这条语句?
printf("请输入学生的姓名和要查询成绩的科目代码(中间用一个空格隔开):\n(1 语文 2 数学 3 英语 4 物理 5 化学 a 所有科目成绩 q 退出)\n");
scanf("%s",na);
if(strcmp(na,"q")==0)break; // 9)问什么要用这条语句strcmp(na,"q")==0?
scanf("%c%c",&num,&num); // 10)为什么用了两次&num?
search(na,num);
printf("------------------------------------------------\n\n");
printf("\n请输入新的查询:\n\n");
}
system("pause");
}
这是我以前的一个程序,你改改吧,应该很好改
#include "stdafx.h"
#include "windows.h" //用sleep()函数的头文件
#include
#include
#define m_UserID "system" //账号
#define m_Password "123456" //密码
using namespace std;
struct Grade //成绩结构体
{
int m_maths; //高数
int m_english;//英语
int m_computer;//计算机
int m_physics;//大物
};
class Student //学生节点类
{
public:
Student() //构造函数
{
m_Student_ID="##";
m_Student_NAME="##";
m_Student_GRADE.m_computer=0;
m_Student_GRADE.m_english=0;
m_Student_GRADE.m_maths=0;
m_Student_GRADE.m_physics=0;
m_Student_SEX="##";
m_Student_AGE=0;
m_next=NULL;
};
~Student(){};//析构函数
string GetStudentID(){return m_Student_ID;};//得到学生学号
string GetStudentNAME(){return m_Student_NAME;};//得到学生姓名
string GetStudentSEX(){return m_Student_SEX;};//得到学生性别
int GetStudentAGE(){return m_Student_AGE;};//得到学生年龄
Student * GetStudentNEXT(){return m_next;};//得到学生链表下个地址
Grade * GetStudentGRADE(){return &m_Student_GRADE;};//得到学生成绩
void SetStudentID(string id){m_Student_ID=id;};//设置学生学号
void SetStudentNAME(string name){m_Student_NAME=name;};//设置学生姓名
void SetStudentSEX(string sex){m_Student_SEX=sex;};//设置学生性别
void SetStudentAGE(int age){m_Student_AGE=age;};//设置学生年龄
void SetStudentNEXT(Student * next){m_next=next;};//设置学生下个指针
void SetStudentGRADE(Grade * grade)//设置学生成绩
{
m_Student_GRADE.m_computer=grade->m_computer;
m_Student_GRADE.m_english=grade->m_english;
m_Student_GRADE.m_maths=grade->m_maths;
m_Student_GRADE.m_physics=grade->m_physics;
};
private:
string m_Student_ID;//学号
string m_Student_NAME;//姓名
string m_Student_SEX;//性别
int m_Student_AGE;//年龄
Grade m_Student_GRADE;//成绩
Student * m_next;//下个指针
};
class StudentList //学生链表类
{
public:
StudentList()//构造函数
{
m_stu=new Student();
m_temp_stu=m_stu;
m_stu_num=0;
};
~StudentList()//释放资源空间
{
Student * m_del=NULL;
while (m_stu->GetStudentNEXT()!=NULL)
{
m_del=m_stu->GetStudentNEXT();
m_stu->SetStudentNEXT( m_del->GetStudentNEXT());
delete m_del;
}
delete m_stu;
};
int GetStudentNUM(){return m_stu_num;};//得到学生数目
void AddStudent(string id,string name,string sex,int age,Grade * grade)//学生注册
{
Student *temp=new Student();
temp->SetStudentID(id);
temp->SetStudentNAME(name);
temp->SetStudentSEX(sex);
temp->SetStudentAGE(age);
temp->SetStudentGRADE(grade);
m_temp_stu->SetStudentNEXT(temp); //当前指针往后移
m_temp_stu=temp;
m_stu_num++; //学生数目++;
cout<<"注册成功!"<
Student * SearchStudent(string str,int choise)//学生查询
{
Student *resoult=NULL;
Student *temp=m_stu;
switch(choise)
{
case 1 : //学号
while (temp->GetStudentNEXT()!=NULL)
{
temp=temp->GetStudentNEXT();
if (temp->GetStudentID()==str)
{
resoult=temp;
break;
}
}
break;
case 2 : //姓名
while (temp->GetStudentNEXT()!=NULL)
{
temp=temp->GetStudentNEXT();
if (temp->GetStudentNAME()==str)
{
resoult=temp;
break;
}
}
break;
default:
break;
}
return resoult;
};
Student * GetPreStudent(Student * stu)//得到前一个指针
{
Student *temp=m_stu;
Student * resoult=NULL;
while (temp->GetStudentNEXT()!=NULL)
{
if (temp->GetStudentNEXT()==stu)
{
resoult=temp;
break;
}
temp=temp->GetStudentNEXT();
}
return resoult;
};
void DeleteStudent(string str,int choise)//删除
{
if (m_stu_num<1)
{
cout<<"还没有学生"<
}
Student *del=SearchStudent(str,choise);
Student *resoult=NULL;
if (del==NULL)
{
cout<<("没有找到该学生!")<
}
else
{
resoult=GetPreStudent(del);
if (resoult==NULL)
{
cout<<"ERROR"<
}
resoult->SetStudentNEXT(del->GetStudentNEXT());
if (del->GetStudentNEXT()==NULL)
{
m_temp_stu=resoult;
}
else
{
m_temp_stu=del->GetStudentNEXT();
}
delete del;
m_stu_num--;
cout<<"删除成功"<
};
void PrintAllStudent()//打印全部
{
if (m_stu_num<1)
{
cout<<"还没有学生"<
}
Student * temp=m_stu;
int index=0;
while (temp->GetStudentNEXT()!=NULL)
{
temp=temp->GetStudentNEXT();
index++;
cout<<"***************************第"<
};
void PrintStudent(string str,int choise)//打印某个学生
{
Student *resoult=SearchStudent(str,choise);
if (resoult==NULL)
{
cout<<"没有找到该学生!"<
}
else
{
cout<<"***************************学生信息**************************"<
};
private:
Student * m_stu;//头指针
Student * m_temp_stu;//当前指针
int m_stu_num;//学生数目
};
void PrintMenu()//打印菜单
{
cout<<"*********************菜单*********************"<
void AddStudent(string &id,string &name,string &sex,int &age,Grade &grade)//注册
{
cout<<"输入学号(字符串):"<
};
void SearchStudent(string &str,int &choise)//查询
{
while (1)
{
cout<<"***************"<
{
cout<<"输入学号(字符串):"<
}
else
{
if(choise==2)
{
cout<<"输入姓名(字符串)"<
}
else
cout<<"无效命令"<
if (choise==1||choise==2)
{
break;
}
}
};
void DeleteStudent(string &str,int &choise)//删除
{
while (1)
{
cout<<"***************"<
{
cout<<"输入学号(字符串):"<
}
else
{
if(choise==2)
{
cout<<"输入姓名(字符串)"<
}
else
cout<<"无效命令"<
if (choise==1||choise==2)
{
break;
}
}
};
int Login()
{
string uid,password;
int state=0;
while (1)
{
cout<<"~~~~~~~~LOGIN~~~~~~~~~~~~"<
{
cout<<"账号不存在"<
else
{
if (password!=m_Password)
{
cout<<"密码不正确"<
else
{
cout<<"登陆成功"<
state=1;
break;
}
}
}
return 1;
};
int main(int argc, char* argv[])
{
StudentList m_student_list;
string id,name,sex,str;
int m_key,age,choise;
Grade grade;
cout<<"************************欢迎使用学生管理系统*************************"<
while (1)
{
PrintMenu();
cin>>m_key;
switch(m_key)
{
case 1 :
AddStudent(id,name,sex,age,grade);
m_student_list.AddStudent(id,name,sex,age,&grade);
break;
case 2 :
SearchStudent(str,choise);
m_student_list.PrintStudent(str,choise);
break;
case 3 :
if (m_student_list.GetStudentNUM()<1)
{
cout<<"还没有没有学生"<
else
{
DeleteStudent(str,choise);
m_student_list.DeleteStudent(str,choise);
}
break;
case 4 :
m_student_list.PrintAllStudent();
break;
case 5 :
break;
default:
cout<<"无效字符"<
}
if (m_key==5)
break;
}
return 0;
}
#include
#include
//记录总数
int num=0;
//结构体定义
struct Student
{
char id[10];
char name[20];
float mark1;//语文
float mark2;//数学
float mark3;//外语
float average;//平均
}stu[1000];
//显示学生记录
void fp_show(int i)
{
printf("\t学号\t姓名\t语文\t数学\t外语\t平均成绩\n");
printf("-------------------------------------------------------------\n");
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",stu[i].id,stu[i].name,
stu[i].mark1,stu[i].mark2,stu[i].mark3,stu[i].average);
}
//1增加学生记录
void fp_add()
{
while(1)
{
printf("\n请输入学号:\n");
scanf("%s",stu[num].id);
printf("\n请输入姓名:\n");
scanf("%s",stu[num].name);
printf("\n请输入语文成绩:\n");
scanf("%f",&stu[num].mark1);
printf("\n请输入数学成绩:\n");
scanf("%f",&stu[num].mark2);
printf("\n请输入英语成绩:\n");
scanf("%f",&stu[num].mark3);
stu[num].average=(stu[num].mark1+stu[num].mark2+stu[num].mark3)/3;
num++;
getchar();
printf("\n是否继续添加(y/n)\n");
if(getchar()=='n') break;
}
}
//2修改学生记录
void fp_modify()
{ char a[20];
int i,t;
while(1)
{
printf("\n请输入学生学号:\n");
scanf("%s",a);
for(t=0;t
if(strcmp(stu[t].id,a)==0)
i=t;
}
if(i>=0){
fp_show(i);
printf("\n请输入修改后的学号\n");
scanf("%s",stu[i].id);
printf("\n请输入修改后的姓名\n");
scanf("%s",stu[i].name);
printf("\n请输入修改后的语文\n");
scanf("%f",&stu[i].mark1);
printf("\n请输入修改后的数学\n");
scanf("%f",&stu[i].mark2);
printf("\n请输入修改后的外语\n");
scanf("%f",&stu[i].mark3);
stu[i].average=(stu[i].mark1+stu[i].mark2+stu[i].mark3)/3;}
else
printf("失败");
getchar();
printf("\n是否继续修改(y/n)?\n");
if(getchar()=='n') return;
}
}
//3删除学生记录
void fp_delete()
{int i,t,a[20];
while(1){
printf("\n请输入删除的学生学号:\n");
scanf("%s",a);
for(t=0;t
if(strcmp(stu[t].id,a)==0)
i=t;
}
if(i>=0)
{
fp_show(i);
getchar();
printf("\n是否真的要删除?(y/n)\n");
if(getchar()=='y')
{
for(t=i;t
num--;
}
}
else
printf("失败");
getchar();
printf("\n是否继续删除(y/n)?\n");
if(getchar()=='n') return;
}
}
//4按姓名查询学生记录
void fp_search()
{ void fp_show(int);
char a[20];
int i,t;
while(1)
{
printf("\n请输入学生姓名:\n");
scanf("%s",a);
for(i=0;i
if(strcmp(stu[i].name,a)==0)
t=i;
}
if(t>=0)
fp_show(t);
else
printf("失败");
getchar();
printf("\n返回/继续 y/n\n");
if(getchar()=='y') break;
}
}
//5按成绩排序
void fp_grades()
{int i,j;
struct Student temp;
for(i=0;i
{ temp=stu[i];
stu[i]=stu[i+1];
stu[i+1]=temp;
}
//输出成绩排序
printf("\t学号\t姓名\t语文\t数学\t外语\t平均成绩\n");
printf("-------------------------------------------------------------\n");
for(i=num-1;i>=0;i--){
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",stu[i].id,stu[i].name,
stu[i].mark1,stu[i].mark2,stu[i].mark3,stu[i].average);
}
getchar();
printf("\n请输入y返回\n");
if(getchar()=='y') return;
}
//打开文件
void fp_open()
{ FILE *fp;
int i;
if((fp=fopen("database.txt","rb"))==NULL)
{
printf("打开文件失败;\n");
return;
}
if(fread(&num,sizeof(int),1,fp)!=1)
{
num=0;
}else
{
for(i=0;i
}
fclose(fp);
}
//写进数据
void fp_write()
{
FILE *fp;
int i;
if((fp=fopen("database.txt","wb"))==NULL)
{
printf("打开文件失败;\n");
return;
}
if(fwrite(&num,sizeof(int),1,fp)!=1)
{
printf("写入错误;\n");
}
{for(i=0;i
printf("写入错误\n");
}
fclose(fp);
}
//主程序
int main()
{ int choice;
//打开文件
fp_open();
while(1)
{
printf("\n\n◇◇◇◇◇◇◇◇成 绩 管 理 小 程 序◇◇◇◇◇◇◇◇\n\n\n");
printf("\t☆\t1. 增加学生信息\t☆\n");
printf("\t☆\t2. 修改学生信息\t☆\n");
printf("\t☆\t3. 删除学生信息\t☆\n");
printf("\t☆\t4. 查询学生信息\t☆\n");
printf("\t☆\t5. 平均成绩排序\t☆\n");
printf("\t☆\t6. 保存 并退出\t☆\n\n");
printf("◇请选择(1-6)◇ \n");
scanf("%d",&choice);
switch(choice)
{
case 1 : fp_add(); break;
case 2 : fp_modify(); break;
case 3 : fp_delete(); break;
case 4 : fp_search(); break;
case 5 : fp_grades(); break;
default: exit(0);break;
}
//关闭并写入数据
fp_write();
}
return 0;
}
运行结果:
◇◇◇◇◇◇◇◇成 绩 管 理 小 程 序◇◇◇◇◇◇◇◇
☆ 1. 增加学生信息 ☆
☆ 2. 修改学生信息 ☆
☆ 3. 删除学生信息 ☆
☆ 4. 查询学生信息 ☆
☆ 5. 平均成绩排序 ☆
☆ 6. 保存 并退出 ☆
◇请选择(1-6)◇
1
请输入学号:
12
请输入姓名:
张三
请输入语文成绩:
78
请输入数学成绩:
89
请输入英语成绩:
71
是否继续添加(y/n)
y