您的位置:首页 > 理论基础 > 数据结构算法

数据结构课程设计

2015-12-31 16:20 344 查看
头文件:

<pre name="code" class="cpp">#define N 20struct 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
.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
.num,r
.name,r
.mark1,r
.mark2,r
.mark3,r
.term,r
.sum,r
.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
.num,r
.name,&r
.mark1,&r
.mark2,&r
.mark3,&r
.term,&r
.sum,&r
.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
.num,r
.name,r
.mark1,r
.mark2,r
.mark3,r
.term,r
.sum,r
.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
.num,r
.name,r
.mark1,r
.mark2,r
.mark3,r
.term,r
.sum,r
.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
.num,r
.name,r
.mark1,r
.mark3,r
.mark3,r
.term,r
.sum,r
.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
.num,r
.name,&r
.mark1,&r
.mark2,&r
.mark3,&r
.term,&r
.sum,&r
.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
.num,r
.name,r
.mark1,r
.mark2,r
.mark3,r
.term,r
.sum,r
.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
.num,r
.name,&r
.mark1,&r
.mark2,&r
.mark3,&r
.term,&r
.sum,&r
.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
.num,r
.name,r
.mark1,r
.mark2,r
.mark3,r
.term,r
.sum,r
.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
.num,r
.name,r
.mark1,r
.mark2,r
.mark3,r
.term,r
.sum,r
.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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: