头文件:
<pre name="code" class="cpp">#define N 20
struct Student //结构体
{
int term;//学期
int num;//学号
char name[12];//姓名
float mark1;//成绩
float mark2;
float mark3;
float sum;//总分
float average;//平均分
};
int num=0;
void input(Student *r); //输入
void output(Student *r); //输出
void searchnum(Student *r); //按学号及学期查找
void searchname(Student *r); //按姓名及学期查找
void change(Student *r); //按学号及学期修改信息
Student *insert(Student *r); //插入信息
void shanchu(Student *r); //按学号及学期删除信息
void maopao(Student *r); //按数据结构降序(冒泡)排序
void xuanze(Student *r); //按总分降序(选择)排序
void tongji(Student *r); //统计各科总分和平均分信息
代码:
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>//主要是对cin,cout之类的一些操纵运算,是I/O流控制头文件。
#include <conio.h> //文件和标准控制台的输入输出
#include<stdio.h>
<pre name="code" class="cpp">void main()
{
cout<<"输入学生的个数:";
cin>>num;
Student *p=(Student *)new Student[num];//定义指针数组,存放学生个数
int m;
do{
cout<<endl;
cout<<endl;
cout<<"\t*************************菜单栏**********************************\n"<<endl;
cout<<"\t* 1 输入学生信息并保存到文件 2 读取文件并输出学生信息 *"<<endl;
cout<<"\t* 3 按学号及学期查询 4 按姓名及学期查询 *"<<endl;
cout<<"\t* 5 按学号及学期修改信息 6 插入信息 *"<<endl;
cout<<"\t* 7 按学号及学期删除信息 8 按数据结构降序(冒泡)排序 *"<<endl;
cout<<"\t* 9 按总分降序(选择)排序 10 统计各科成绩的总分和平均分 *"<<endl;
cout<<"\t* 11 退出 *"<<endl;
cout<<"\t*****************************************************************\n"<<endl;
cout<<"请选择:";
cin>>m;
switch(m){
case 1:
input(p);
break;
case 2:
output(p);
break;
case 3:
searchnum(p);
break;
case 4:
searchname(p);
break;
case 5:
change(p);
break;
case 6:
p=insert(p);
break;
case 7:
shanchu(p);
break;
case 8:
maopao(p);
break;
case 9:
xuanze(p);
break;
case 10:
tongji(p);
break;
case 11:
break;
}
}while(m!=11);
}
void input(Student *r) //输入信息
{
FILE *fp;
int n=0;
int i;
int t=0; //t为控制标量,1为找到,0为未找到
cout<<endl<<"========>> 请输入学生信息 <<========"<<endl;
for(i=0;i<num;i++){
cout<<"请输入学期:";
cin>>r[i].term;
cout<<"请输入第"<<i+1<<"个人的学号:";
cin>>r[i].num;
if(i>=1){
for(n=0;n<i;n++){
if(r[n].num==r[i].num){
cout<<"该学号已存在!!"<<endl;
t=1;
}
}
}
if(t==1){//表示有重复
i--;
t=0;
continue;
}
cout<<"请输入姓名:";
cin>>r[i].name;
cout<<"请输入 高等数学 成绩:";
cin>>r[i].mark1;
cout<<"请输入 数据结构 成绩:";
cin>>r[i].mark2;
cout<<"请输入 组成原理 成绩:";
cin>>r[i].mark3;
r[i].sum=r[i].mark1+r[i].mark2+r[i].mark3;
r[i].average=(r[i].mark1+r[i].mark2+r[i].mark3)/3;
}
if((fp=fopen("student.txt","w"))==NULL) {
cout<<"文件不能打开"<<endl;
exit(0);
}
for(n=0;n<i;n++){
fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已经写入"<<endl;
}
void output(Student *r) //输出信息
{
int m;
system("cls");
if(num>0){
FILE *fp;
if((fp=fopen("student.txt","r"))==NULL) {
cout<<"文件不能打开"<<endl;
exit(0);
}
for(int n=0;n<num;n++){ fscanf(fp,"%d%s%f%f%f%d%f%f",&r[n].num,r[n].name,&r[n].mark1,&r[n].mark2,&r[n].mark3,&r[n].term,&r[n].sum,&r[n].average);
}
fclose(fp);
cout<<"文件已经读入"<<endl;
cout<<"******************************学生信息如下**********************************"<<endl;
cout<<"学号"<<setw(6)<<"姓名"<<setw(10)<<"高等数学"<<setw(10)<<"数据结构"<<setw(10)<<"组成原理"<<setw(6)<<"学期"<<setw(6)<<"总分"<<setw(8)<<"平均分"<<endl;
cout<<"---------------------------------------------------------------"<<endl;
for(m=0;m<num;m++){ cout<<r[m].num<<setw(6)<<r[m].name<<setw(7)<<r[m].mark1<<setw(10)<<r[m].mark2<<setw(10)<<r[m].mark3<<setw(8)<<r[m].term<<setw(6)<<r[m].sum<<setw(6)<<r[m].average<<endl;
}
cout<<"\0\0"<<endl;
}
else
cout<<"未输入任何信息!!"<<endl;
}
void searchnum(Student *r) //按学号及学期查找
{
int n,k;
system("cls");
if(num>0){
cout<<"请输入要查找学生的学号:";
cin>>n;
cout<<"请输入学期号:";
cin>>k;
for(int m=0;m<num;m++){
if(r[m].num==n&&r[m].term==k){//如果找到了输出并跳出循环
cout<<endl;
cout<<"---------------------------要查找的信息如下--------------------------------"<<endl;
cout<<"学号"<<setw(6)<<"姓名"<<setw(10)<<"高等数学"<<setw(10)<<"数据结构"<<setw(10)<<"组成原理"<<setw(6)<<"学期"<<setw(6)<<"总分"<<setw(8)<<"平均分"<<endl; cout<<r[m].num<<setw(6)<<r[m].name<<setw(7)<<r[m].mark1<<setw(10)<<r[m].mark2<<setw(10)<<r[m].mark3<<setw(8)<<r[m].term<<setw(6)<<r[m].sum<<setw(8)<<r[m].average<<endl;
break;
}
}
if(r[m].num!=n&&r[m].term!=k) //若没找到提示不存在
cout<<"该学号不存在,或没有这个学期的成绩!"<<endl;
}
else
cout<<"未输入任何信息!!"<<endl;
}
void searchname(Student *r) //按姓名及学期查找
{
char n[12];
int k;
system("cls");
if(num>0){ //如果没输入就查找提示
cout<<"请输入要查找学生的姓名:";
cin>>n;
cout<<"请输入学期号:";
cin>>k;
for(int m=0;m<num;m++){
if(r[m].name[0]==n[0]&&r[m].term==k){ //如果找到了输出并跳出循环
cout<<endl;
cout<<"---------------------------要查找的信息如下--------------------------------"<<endl;
cout<<"学号"<<setw(6)<<"姓名"<<setw(10)<<"高等数学"<<setw(10)<<"数据结构"<<setw(10)<<"组成原理"<<setw(6)<<"学期"<<setw(6)<<"总分"<<setw(8)<<"平均分"<<endl; cout<<r[m].num<<setw(6)<<r[m].name<<setw(7)<<r[m].mark1<<setw(10)<<r[m].mark2<<setw(10)<<r[m].mark3<<setw(8)<<r[m].term<<setw(6)<<r[m].sum<<setw(8)<<r[m].average<<endl;
break;
}
}
if(r[m].name[0]!=n[0]&&r[m].term!=k) //若没找到提示不存在
cout<<"该姓名不存在,或没有这个学期的成绩!"<<endl;
}
else
cout<<"未输入任何信息!!"<<endl;
}
void change(Student *r)//修改信息
{
FILE *fp;
int n=0;
char chiose='Y';
if(num>0){
int n,k;
int t=0;
system("cls");
cout<<"输入要修改成绩的学生学号:";
cin>>n;
cout<<"所需修改的学期:";
cin>>k;
for(int m=0;m<num;m++){
if(r[m].num==n&&r[m].term==k){
int j;
cout<<endl;
cout<<"---------------------------修改前的信息如下--------------------------------"<<endl;
cout<<"学号"<<setw(6)<<"姓名"<<setw(10)<<"高等数学"<<setw(10)<<"数据结构"<<setw(10)<<"组成原理"<<setw(6)<<"学期"<<setw(6)<<"总分"<<setw(8)<<"平均分"<<endl;
cout<<r[m].num<<setw(6)<<r[m].name<<setw(7)<<r[m].mark1<<setw(10)<<r[m].mark2<<setw(10)<<r[m].mark3<<setw(8)<<r[m].term<<setw(6)<<r[m].sum<<setw(8)<<r[m].average<<endl;
cout<<endl;
while (chiose=='Y'||chiose=='y'){
cout<<"\t\t\t*********可以修改的项目如下*******\n"<<endl;
cout<<"\t\t\t 1.修改学生的 高等数学 成绩记录\n"<<endl;
cout<<"\t\t\t 2.修改学生的 数据结构 成绩记录\n"<<endl;
cout<<"\t\t\t 3.修改学生的 组成员理 成绩记录\n"<<endl;
cout<<"请选择:";
cin>>j;
switch(j){
case 1:
cout<<"输入新的 高等数学 成绩:";
cin>>r[m].mark1;
break;
case 2:
cout<<"输入新的 数据结构 成绩:";
cin>>r[m].mark2;
break;
case 3:
cout<<"输入新的 组成原理 成绩:";
cin>>r[m].mark3;
break;
}
t=1;
printf("是否要继续修改此学生的其他成绩记录呢?(Y/N)");
fflush(stdin);//清空输入缓冲区,通常是为了确保不影响后面的数据读取
scanf("%c",&chiose);
}
}
}
}
else
cout<<"未输入任何信息!!"<<endl;
if((fp=fopen("student.txt","w"))==NULL) {
cout<<"文件不能打开"<<endl;
exit(0);
}
for(n=0;n<num;n++){
fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已修改并写入"<<endl;
}
Student *insert(Student *r) //插入
{
FILE *fp;
int m;
char n;
do{
if((fp=fopen("student.txt","r"))==NULL) {
cout<<"文件不能打开"<<endl;
exit(0);
}
for(int o=0;o<num;o++){ fscanf(fp,"%d%s%f%f%f%d%f%f",&r[o].num,r[o].name,&r[o].mark1,&r[o].mark2,&r[o].mark3,&r[o].term,&r[o].sum,&r[o].average);
}
Student *y=(Student *)new Student[num+1]; //定义另一个数组,用于存放新添加的记录
for(m=0;m<num;m++){
y[m]=r[m];
}
r=y;
cout<<"请输入学期:";
cin>>r[num].term;
cout<<"请输入学号:";
cin>>r[num].num;
cout<<"请输入姓名:";
cin>>r[num].name;
cout<<"请输入 高等数学 成绩:";
cin>>r[num].mark1;
cout<<"请输入 数据结构 成绩:";
cin>>r[num].mark2;
cout<<"请输入 组成原理 成绩:";
cin>>r[num].mark3;
r[num].sum=r[num].mark1+r[num].mark2+r[num].mark3;//计算总分
r[num].average=(r[num].mark1+r[num].mark2+r[num].mark3)/3;
num++;
cout<<"是否继续输入?(继续,输入y,否则输入其他)"<<endl;
cin>>n;
}while(n=='y');
if((fp=fopen("student.txt","w"))==NULL){
cout<<"文件不能打开"<<endl;
exit(0);
}
for(n=0;n<num;n++){
fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已经写入"<<endl;
return r;
}
void shanchu(Student *r) //删除
{
FILE *fp;
if(num>0){
if((fp=fopen("student.txt","r"))==NULL) {
cout<<"文件不能打开"<<endl;
exit(0);
}
for(int o=0;o<num;o++){ fscanf(fp,"%d%s%f%f%f%d%f%f",&r[o].num,r[o].name,&r[o].mark1,&r[o].mark2,&r[o].mark3,&r[o].term,&r[o].sum,&r[o].average);
}
int n,k,t=0;
cout<<"请输入要删除学生的学号:";
cin>>n;
cout<<"请输入要删除成绩的学期:";
cin>>k;
for(int m=0;m<num;m++)
if(r[m].num==n&&r[m].term==k){
for(int k=m;k<num;k++){ //循环把后一位的信息提前一位
r[k]=r[k+1];
}
num--; //整体数量减一
t=1; //标志变量 1为找到0为未找到
}
if((fp=fopen("student.txt","w"))==NULL) {
cout<<"文件不能打开"<<endl;
exit(0);
}
for(n=0;n<num;n++){
fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark3,r[n].mark3,r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已经写入"<<endl;
if(t==0)
cout<<"该学号不存在!!"<<endl;
}
else
cout<<"未输入任何信息!!"<<endl;
}
void maopao(Student *r) //按数据结构成绩冒泡降序排序
{
FILE *fp;
if(num>0){
if((fp=fopen("student.txt","r"))==NULL) {
cout<<"文件不能打开"<<endl;
exit(0);
}
for(int n=0;n<num;n++){ fscanf(fp,"%d%s%f%f%f%d%f%f",&r[n].num,r[n].name,&r[n].mark1,&r[n].mark2,&r[n].mark3,&r[n].term,&r[n].sum,&r[n].average);
}
for(int k=0;k<num-1;k++){
for(int m=0;m<num-k;m++){
Student max;
if(r[m].mark2<r[m+1].mark2) {
max=r[m+1];
r[m+1]=r[m];
r[m]=max;
}
}
}
cout<<"排序完毕"<<endl;
if((fp=fopen("student.txt","w"))==NULL) {
cout<<"文件不能打开"<<endl;
exit(0);
}
for(n=0;n<num;n++){
fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已经写入"<<endl;
}
else
cout<<"未输入任何信息!!"<<endl;
}
void xuanze(Student *r) //按总分选择降序排序
{
FILE *fp;
if(num>0){
if((fp=fopen("student.txt","r"))==NULL) {
cout<<"文件不能打开"<<endl;
exit(0);
}
for(int n=0;n<num;n++){ fscanf(fp,"%d%s%f%f%f%d%f%f",&r[n].num,r[n].name,&r[n].mark1,&r[n].mark2,&r[n].mark3,&r[n].term,&r[n].sum,&r[n].average);
}
for(int i=0;i<num;i++){
int max=i;
for(int j=i;j<num;j++){
if(r[max].sum<r[j].sum){
max=j;
}
}
Student temp;
temp=r[max];
r[max]=r[i];
r[i]=temp;
}
cout<<"排序完毕"<<endl;
if((fp=fopen("student.txt","w"))==NULL) {
cout<<"文件不能打开"<<endl;
exit(0);
}
for(n=0;n<num;n++){
fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已经写入"<<endl;
}
else
cout<<"未输入任何信息!!"<<endl;
}
void tongji(Student *r) //统计各科总分及平均分
{
float summark1=0,summark2=0,summark3=0;
float avemark1=0,avemark2=0,avemark3=0;
FILE *fp;
system("cls");
if(num>0){
for(int m=0;m<num;m++){
summark1=summark1+r[m].mark1;
summark2=summark2+r[m].mark2;
summark3=summark3+r[m].mark3;
}
avemark1=summark1/num;
avemark2=summark2/num;
avemark3=summark3/num;
cout<<endl;
cout<<"高等数学 总分为:"<<summark1<<"平均分为:"<<avemark1<<endl;
cout<<endl;
cout<<"数据结构 总分为:"<<summark2<<"平均分为:"<<avemark2<<endl;
cout<<endl;
cout<<"组成原理 总分为:"<<summark3<<"平均分为:"<<avemark3<<endl;
cout<<endl;
if((fp=fopen("student.txt","w"))==NULL) {
cout<<"文件不能打开"<<endl;
exit(0);
}
for(int n=0;n<num;n++){
fprintf(fp,"%d %s %.1f %.1f %.1f %d %.1f %.1f",r[n].num,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,r[n].term,r[n].sum,r[n].average);
fprintf(fp,"\n");
}
fprintf(fp,"高等数学 总分为%.2f",summark1);
fprintf(fp,"\n");
fprintf(fp,"数据结构 总分为%.2f",summark2);
fprintf(fp,"\n");
fprintf(fp,"组成原理 总分为%.2f",summark3);
fclose(fp);
}
else
cout<<"未输入任何信息!!"<<endl;
}