⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2.cpp

📁 校际运动会管理系统
💻 CPP
字号:
#include<stdio.h>
#include<string.h>
#include <conio.h>
#include<stdlib.h>

#define DIS   4
#define SIZE  5
#define IN    6

int i,j;
FILE *fp;

struct student
{
	char num[10];
	char name[8];
	int score[3];
	double ave;
}stu[IN],temp;

void save() //学生数据输入时的保存函数
{
	int sum;
	printf("输入数据,对文件进行初始化!\n");
	
    for(i=0;i<SIZE;i++)
	{
		printf("\nInput  date  of student %d:\n",i+1);
		
		printf("NO.: ");
		scanf("%s",stu[i].num);
		
		printf("name: ");
		scanf("%s",stu[i].name);
		
		sum=0;
		
		for(j=0;j<3;j++)
		{
			printf("score %d: ",j+1);
			scanf("%d",&stu[i].score[j]);
			sum+=stu[i].score[j];
		}
		
		stu[i].ave=sum/3.0;
	}
	
	fp=fopen("stud","w");
	
	for(i=0;i<SIZE;i++)
		if (fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
			printf("\nFile   write error!\n");
		
		fclose(fp);
		
		printf("\nThe date of students is flowing:\n");
		printf("NO.     name    score[1]    score[2]    score[3]     ave\n");
		
		fp=fopen("stud","r");
		for(i=0;i<SIZE;i++)
		{
			fread(&stu[i],sizeof(struct student),1,fp);
			printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
			
		}
		fclose(fp);
}

void search() //查找函数
{	
	
	fp=fopen("stud","r");//1.将w改为了r,这里只是读文件
	
	int flag;
	char chs[11];
	
	printf("请输入你要查找的学生的学号或者姓名: ");
	scanf("%s",&chs);//2.将c改为了s,这里读的是字符串而不是字符
	
	for(i=0,flag=1;flag&&i<SIZE;i++)
	{ 
		if(strcmp(stu[i].num,chs)==0)
		{
			printf("你需要的学生数据已找到:\n");//增加了\n,为了美观
			printf("NO.     name    score[1]    score[2]    score[3]     ave\n");
			printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
			flag=0;
			break;//如果找到了,就要停止查找,不然会增加查找的时间
		}
		else if(strcmp(stu[i].name,chs) == 0)//要加else,否则会出错的
			
		{
			printf("你需要的学生数据已找到:\n");
			printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
			flag=0;
			break;//如果找到了,就要停止查找,不然会增加查找的时间
		}
	}
	if(flag==1)
		printf("没有找到你所需要的数据!");
	
	fclose(fp);
	
}

void paixu()  //排序函数
{
	fp=fopen("stud","r");//只读文件
	char chr;
	
	printf("\n请选择你要的排序方式,'x'以学号方式排序,'$'以平均分排序。\n");
	chr=getch();//不用chr=getchar();???
	
	if(chr=='x')//不能用chr='x'
	{
		for(i=0;i<SIZE;i++)
			for(j=i+1;j<SIZE;j++)
				if(strcmp(stu[i].num,stu[j].num)>0)//如果前一个学生号比后一个学生号大,进行交换
				{
					temp=stu[i];//temp一开始就被定义为数组了,所以可以这样进行交换
					stu[i]=stu[j];
					stu[j]=temp;
				}
	}
	
	else if(chr=='$')//else不能少,否则会出错
	{
		for(i=0;i<SIZE;i++)
			for(j=i+1;j<SIZE;j++)
				if(stu[i].ave<stu[j].ave)//如果是int或float,可以直接进行比较大小
				{
					temp=stu[i];//temp一开始就被定义为数组了,所以可以这样进行交换
					stu[i]=stu[j];
					stu[j]=temp;
				}
	}
	
	printf("现在的排序如下:\n");
	
	for(i=0;i<SIZE;i++)
	{
		fwrite(&stu[i],sizeof(struct student),1,fp);
		printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);//加“-”表示与左边对齐,这样便于看
	}
	
	fclose(fp);
}

void delet() //删除操作
{
	char chl[8];
	int flag;
	
	fp=fopen("stud","r");
	printf("\n原始数据:\n");
	
	for(i=0;i<SIZE;i++)
	{
		fread(&stu[i],sizeof(struct student),1,fp);
		printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
	}
	
	printf("输入你要删除的学生名字:");
	scanf("%s",chl);//输入字符串时不用加&
	for(i=0,flag=1;flag&&i<SIZE;i++)
	{
		if(strcmp(stu[i].name,chl)==0)
		{
			
			for(j=i;j<DIS;j++)
				stu[j]=stu[j+1];//将后面一个学生的数据覆盖掉前一个学生的数据
			flag=0;			
		}
	}
	if(flag==1)  //当输入的学生不存在时的错误提示
		printf("此学生不存在,无法进行删除操作!");
	fclose(fp);
	
		  printf("删除后的数据:\n");//显示删除后的学生数据
		  fp=fopen("stud","r");	
		  for(i=0;i<DIS;i++)
		  {
			  fwrite(&stu[i],sizeof(struct student),1,fp);
			  printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
		  }
		  fclose(fp);
}

void insert()//插入函数
{
	fp=fopen("stud","r");
	int sum=0;//用于平均分计算
	
	printf("\n输入插入的学生的数据:\n ");
	printf("NO.:  ");
	scanf("%s",stu[SIZE].num);
	
	printf("name: ");
	scanf("%s",stu[SIZE].name);
	
	for(j=0;j<3;j++)
	{
		
		printf("score %d: ",j+1);
		scanf("%d",&stu[SIZE].score[j]);
		sum+=stu[SIZE].score[j];
	}
	
	stu[SIZE].ave=sum/3.0;
	
	printf("原始数据:\n");//写出原始数据
	for(i=0;i<SIZE;i++)
	{
		fread(&stu[i],sizeof(struct student),1,fp);
		printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
		
	}
	
	fwrite(&stu[SIZE],sizeof(struct student),1,fp);//将插入的学生的数据写入文件
	fclose(fp);//关闭文件,同时保存插入学生的数据
	
    for(i=0;i<IN;i++)//进行排序操作
		for(j=i+1;j<IN;j++)
			if(stu[i].ave<stu[j].ave)
			{
				temp=stu[i];
				stu[i]=stu[j];
				stu[j]=temp;
			}
			
			printf("插入后的学生数据是:\n");
			fp=fopen("stud","r");
			for(i=0;i<IN;i++)
			{
				fwrite(&stu[i],sizeof(struct student),1,fp);
				printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
			}
			
			fclose(fp);
}

void alter()//修改函数
{
	char ch2[8],c;
    char num[10],name[8];
	int score;
	int flag,n;
	
	fp=fopen("stud","r");
    printf("\n原始数据:\n");
	
	for(i=0;i<SIZE;i++)
	{
		fread(&stu[i],sizeof(struct student),1,fp);
		printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
	}

	printf("请输入你要修改的学生姓名:");
	scanf("%s",ch2);

	for(i=0,flag=1;flag&&i<SIZE;i++)
		
	{if(strcmp(stu[i].name,ch2)==0)
	
	{printf("1. 修改学号\n2. 修改姓名\n3. 修改成绩\n");
	
	 c=getch();
	
	 switch(c)
	 {

	  case '1':
		{printf("请输入你所修改后的学生的学号:");
		 scanf("%s",num);
	       strcpy(stu[i].num,num);
		   break;
		}
		
	  case '2':
		{printf("请输入所修改后的学生姓名:");
		 scanf("%s",name);
	       strcpy(stu[i].name,name);//将后一个数据复制给前一个数据
		   break;
		}
		
	  case '3':
		{printf("请输入你所要修改的是第几门功课的成绩:1. 第一门  2. 第二门  3. 第三门\n");
		 n=getch();
		
		 switch(n)
		 {case '1'://修改第i个学生的第一门功课的成绩
		
		 {  
			 printf("请输入你要修改的第一门功课的成绩:");
		     scanf("%d",&score);
		     stu[i].score[0]=score;
		     break;
		 }
		  case '2'://修改第i个学生的第二门功课的成绩
			
			{printf("请输入你要修改的第二门功课的成绩:");
			scanf("%d",&score);
			stu[i].score[1]=score;
			break;
			}
		case '3'://修改第i个学生的第三门功课的成绩
			
			{printf("请输入你要修改的第三门功课的成绩:");
			scanf("%d",&score);
			stu[i].score[2]=score;
			break;
			}
		default:
			printf("你的输入有误!\n");
		}
		stu[i].ave=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;//将修改后的数据再求依次平均分
		}
	 }
	flag=0;
	}
	}

	if(flag==1)  //当输入的学生不存在时的错误提示
		printf("此学生不存在,无法进行删除操作!");
	fclose(fp);
	printf("修改后的学生数据是:\n");//显示修改后的学生的数据
	fp=fopen("stud","r");
	for(i=0;i<SIZE;i++)
	{
		fwrite(&stu[i],sizeof(struct student),1,fp);
		printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
	}
	
	fclose(fp);
}	 


void main()//主函数
{
	char ch1,ch2;
	
	save();//先进行输入工作
	
	printf("\n要进行其他操作,根据屏幕提示:\n");
L:	printf("  1.  查找\n");
	printf("  2.  排序\n");
	printf("  3.  删除\n");
	printf("  4.  插入\n");
	printf("  5.  修改\n");
	printf("  6.  退出\n");
	
	ch1=getch();
	
	switch(ch1)
	{
	 case '1':
		search();
		break;
	 case '2':
		paixu();
		break;
	 case '3':
		delet();
		break;
	 case '4':
		insert();
		break;
	 case '5':
		alter();
		break;
	 case '6':
        exit(0);
     default:
		printf("未进行任何操作!");
		
	}
	
	printf("\n想要继续操作请按“y”\n");//让程序能够重复执行
	ch2=getch();
	if(ch2=='y')  goto L;//注意要“==”,而不是“=”
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -