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

📄 student.txt

📁 应用c语言写的学生成绩管理系统
💻 TXT
📖 第 1 页 / 共 2 页
字号:
		printf("请输入要读取的文件名(直接回车选择文件stu_info):");
		gets(fname);
		if(strlen(fname)==0)
			strcpy(fname,"stu_info");
		if((fp=fopen(fname,"rb"))==NULL)
		{
			printf("打不开文件!请重新选择\n");
			return -1;
		}
		printf("\n取文件...\n");
		while(!feof(fp))
		{
			//现在的数组空间不足,需要重新申请空间
			if(numStus>=arraySize)
			{
				records=(StuInfo *)(realloc(records,(arraySize+INCR_SIZE)*sizeof(StuInfo)));
				if(records==NULL)
				{
					printf("memory fail!");
					exit(-1);
				}
				arraySize=arraySize+INCR_SIZE;
			}
			if(fread(&records[numStus],sizeof(StuInfo),1,fp)!=1)
				break;
			//按照addRecord函数的方法,更新名次
			records[numStus].index=getIndex(records[numStus].sum);
			numStus++;
		}
		fclose(fp);
		printf("现在共有%d条记录",numStus);
	}
	return 0;
}

//查找指定的记录
//参数  target:欲查找记录的某一项与target相同
//      targetType表明通过那一项来查找,0为学号,1为姓名,2为名次
//      from:从第from个记录开始找
//返回  找到的记录的序号,若找不到则返回-1

int findRecord(char* target,int targetType,int from)
{
	int i;
	for(i=from;i<numStus;i++)
	{
		if((targetType==0&&strcmp(target,records[i].number)==0)||(targetType==1&&strcmp(target,records[i].name)==0)||(targetType==2&&atoi(target)==records[i].index))
			return i;
	}

	return -1;
}

//查询指定学生的信息
//可以按照学号,姓名或名次来查询
void queryInfo(void)
{
	char str[5];
	char target[20];
	int type;
	int count;

	int i,j;
	if(numStus==0)
	{
		printf("没有可供查询的记录!");
		return;
	}
	while(1)
	{
		printf("请输入查询的方式:(直接输入回车则结束查询)\n");
		printf("\t1.按学号\n");
		printf("\t2.按姓名\n");
		printf("\t3.按名次n");
		gets(str);
		if(strlen(str)==0)
			break;
		if(str[0]=='1')
		{
			printf("请输入欲查询的学生的学号:");
			gets(target);
			type=0;
		}
		else if(str[0]=='2')
		{
			printf("请输入欲查询的学生的姓名:");
			gets(target);
			type=1;
		}
		else
		{
			printf("请输入查询的学生的名次:");
			gets(target);
			type=2;
		}

		i=findRecord(target,type,0);
		if(i==1)
		{
			//打印查询到的学生的信息
			showTable();
		}
		count=0;
		while(i!=-1)
		{
			count++;
			printf("%s\t%s\t%s",records[i].number,records[i].name,records[i].gender);
			for(j=0;j<NUM_SUBJECT;j++)
				printf("\t%.1f",records[i].score[j]);
			printf("\t%.1f\t%.1f\t%d\n",records[i].sum,records[i].average,records[i].index);
			i=findRecord(target,type,i+1);
		}

		if(count==0)
			printf("没有符合条件的学生!\n");
		else
			printf("一共找到了%d名学生的信息\n\n",count);
	}
}

//删除指定的记录
void removeRecord(void)
{
	char str[5];
	char target[20];
	int type;
	int i,j;
	int tmpi;

	if(numStus==0)
	{
		printf("没有可供删除的记录!");
		return;
	}

	while(1)
	{
		printf("请输入如何找到欲删除的记录的方式:");
		printf("(直接输入回车则结束移除操作)\n");
		printf("1.按学号\n");
		printf("2.按姓名\n");
		printf("3.按名次\n");
		gets(str);
		if(strlen(str)==0)
			break;
		if(str[0]=='1')
		{
			printf("请输入该学生的学号:");
			gets(target);
			type=0;
		}
		else if(str[0]=='2')
		{
			printf("请输入该学生的姓名:");
			gets(target);
			type=1;
		}
		else
		{
			printf("请输入该学生的名次:");
			gets(target);
			type=2;
		}

		i=findRecord(target,type,0);
		if(i==-1)
			printf("没有符合条件的学生!\n");

		while(i!=-1)
		{
			showTable();
			printf("%s\t%s\t%s",records[i].number,records[i].name,records[i].gender);
			for(j=0;j<NUM_SUBJECT;j++)
				printf("\t%.1f",records[i].score[j]);
			printf("\t%.1f\t%.1f\t%d\n",records[i].sum,records[i].average,records[i].index);
			printf("确定要删除这个学生的信息吗?(y/N)");
			gets(str);
			if(str[0]=='y'||str[0]=='Y')
			{
				numStus--;
				tmpi=records[i].index;
				//将后面的记录前移
				for(j=i;j<numStus;j++)
				{
					copyRecord(&records[j+1],&records[j]);
				}
				//将名次排在被删除记录后面的记录的名次减1
				for(j=0;j<numStus;j++)
				{
					if(records[j].index>tmpi)
						records[j].index--;
				}
			}
			//取下一个符合条件的记录
			i=findRecord(target,type,i+1);
		}
	}
	savedTag=1;
}

//将src指向的一条记录复制给dest指向的记录

void copyRecord(StuInfo* src,StuInfo* dest)
{
	int j;
	strcpy(dest->number,src->number);
	strcpy(dest->name,src->name);
	strcpy(dest->gender,src->gender);
	for(j=0;j<NUM_SUBJECT;j++)
	{
		dest->score[j]=src->score[j];
	}
	dest->sum=src->sum;
	dest->average=src->average;
	dest->index=src->index;
}

//修改指定学生的信息
void modifyRecord(void)
{
	char str[5];
	char target[20];
	int type;
	int i,j;
	int tmpi;
	float sum,mark;
	int count=0;     //总分大于sum的人数

	if(numStus==0)
	{
		printf("没有可供修改的记录!");
		return;
	}

	while(1)
	{
		printf("请输入如何找到欲修改的记录的方式:");
		printf("(直接输入回车则结束移除操作)\n");
		printf("1.按学号\n");
		printf("2.按姓名\n");
		printf("3.按名次\n");
		gets(str);
		if(strlen(str)==0)
			break;
		if(str[0]=='1')
		{
			printf("请输入该学生的学号:");
			gets(target);
			type=0;
		}
		else if(str[0]=='2')
		{
			printf("请输入该学生的姓名:");
			gets(target);
			type=1;
		}
		else
		{
			printf("请输入该学生的名次:");
			gets(target);
			type=2;
		}
		i=findRecord(target,type,0);
		if(i=-1)
			printf("没有符合条件的学生!\n");
		while(i!=-1)
		{
			showTable();
			printf("%s\t%s\t%s",records[i].number,records[i].name,records[i].gender);
			for(j=0;j<NUM_SUBJECT;j++)
				printf("\t%.1f",records[i].score[j]);
			printf("\t%.1f\t%.1f\t%d\n",records[i].sum,records[i].average,records[i].index);
			printf("确定要修改这个学生的信息吗?(y/N)");
			gets(str);
			if(str[0]=='y'||str[0]=='Y')
			{
				tmpi=records[i].index;
				printf("下面请重新输入该学生的信息:\n");
				printf("请输入学号:");
				gets(records[i].number);
				printf("请输入姓名:");
				gets(records[i].name);
				printf("请输入性别(0为女,1为男):");
				gets(str);
				if(str[0]=='0')
					strcpy(records[i].gender,"女");
				else
					strcpy(records[i].gender,"男");
				sum=0;
				for(j=0;j<NUM_SUBJECT;j++)
				{
					printf("请输入%s成绩:",subject[j]);
					gets(str);
					mark=(float)atof(str);
					records[i].score[j]=mark;
					sum+=mark;
				}
				records[i].sum=sum;
				records[i].average=sum/NUM_SUBJECT;

				//将原来名次排在被修改记录之后,而其sum小于等于
				//修改后记录的sum的记录的名次减1
				//将原来名次排在被修改记录之前或相同,而其sum
				//大于修改后记录的sum的记录的名次增1
				count=0;
				for(j=0;j<numStus;j++)
				{
					if(j==i)
						continue;
					if(records[j].index>tmpi && records[j].sum>sum)
						records[j].index--;
					else if(records[j].index<=tmpi && records[j].sum<sum)
						records[j].index++;
					if(records[j].sum>sum)
						count++;
				}
				records[i].index=count+1;
			}
			i=findRecord(target,type,i+1);
		}
	}
	savedTag=1;
}

//文件操作函数
//参数 void
void sortInfo(void)
{
	char str[5];
	int i,j;
	StuInfo  tmps;
	if(numStus==0)
	{
		printf("没有可供排序的记录!");
		return;
	}

	printf("请输入您希望进行排序的方式:\n");
	printf("\t1.按学号进行升序排序\n");
	printf("\t2.按学号进行降序排序\n");
	printf("\t3.按名称进行升序排序\n");
	printf("\t4.按名称进行降序排序\n");
	printf("\t6.按名次进行降序排序\n");
	printf("\t5.按名次进行升序排序\n");
    printf("\t7.按错了,我并不想进行排序\n");
	gets(str);

	if(str[0]<'1' || str[0]>'6')
		return;

	//进行排序
	for(i=0;i<numStus-1;i++)
	{
		for(j=i+1;j<numStus;j++)
		{
			if((str[0]=='1' && strcmp(records[i].number,records[j].number)>0) ||
			   (str[0]=='2' && strcmp(records[i].number,records[j].number)<0) ||
			   (str[0]=='3' && strcmp(records[i].name,records[j].name)>0)     ||
			   (str[0]=='4' && strcmp(records[i].name,records[j].name)<0)     ||
			   (str[0]=='5' && records[i].index>records[j].index)             ||
			   (str[0]=='6' && records[i].index<records[j].index))
			{
				copyRecord(&records[i],&tmps);
				copyRecord(&records[j],&records[i]);
				copyRecord(&tmps,&records[j]);
			}
		}
	}
	printf("排序已经完成\n");
	savedTag=1;
}


















⌨️ 快捷键说明

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