数据结构课程设计

头文件:

<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;
}


 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值