建立一个包含学号、姓名、年龄、性别、成绩的学生信息文件,然后按照菜单完成各类操作|数据结构

本文介绍了一个学生信息管理系统的设计与实现,包括使用归并排序对学生成绩进行排序,顺序查找按性别筛选学生,以及二分查找按学号查询学生信息。系统通过菜单提供多种操作选项,如排序、查找和退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先建立一个包含学号、姓名、年龄、性别、成绩的学生信息文件,然后按照菜单完成各类操作,结果在屏幕上显示:
(1)用归并排序算法对成绩排序;
(2)用顺序查找算法对性别进行查询(要求找到所有符合条件的记录);
(3)用二分法查找算法对学号进行查询;
(4)退出

1.建立一个txt文件
在这里插入图片描述
2.存入数据
在这里插入图片描述
注意编码格式,不然会乱码。

3.结果截图

  • 输入读入的数据个数
    在这里插入图片描述

  • 菜单选择在这里插入图片描述

  • 用归并排序算法对成绩排序;
    在这里插入图片描述

  • 用顺序查找算法对性别进行查询(要求找到所有符合条件的记录)
    在这里插入图片描述

  • 用二分法查找算法对学号进行查询
    在这里插入图片描述

  • 退出
    在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#define MAX 16
int n=0;
typedef struct
{
	//学号、姓名、年龄、性别、成绩
	long Sno;
	char Sname[10];
	int Sage;
	char Ssex[4];
	float score;
}rectype;

void main()
{
	void read_file(rectype R[]);
	void print_data(rectype R[]);
	void ShellSort(rectype R[]);
	void QuickSort(rectype R[],int low,int high);
	void HeapSort(rectype R[]);
	void menu(rectype R[]);
	void SeqFind(rectype R[],char* sex);
	rectype R[MAX];
	read_file(R);
	//SeqFind(R,"女");
	menu(R);
	//print_data(R);
	
}

void read_file(rectype R[])
{
	
	FILE *fp1;
	int i;
	fp1=fopen(".\\data1.txt","r");
	printf("Please input select numbers(n<=15):");
	scanf("%d",&n);
	//fscanf(fp1,"%ld,%s,%d");
	for(i=1;i<=n;i++)
	{
		//学号、姓名、年龄、性别、成绩
		fscanf(fp1,"%d %s %d %s %f",&R[i].Sno,R[i].Sname,&R[i].Sage,R[i].Ssex,&R[i].score);
	}
	fclose(fp1);
}

void print_data(rectype R[])
{
	int i;
	//printf("\nSorted datas is:\n");
	printf("    学号     姓名     成绩\n");
	for(i=1;i<=n;i++)
	{
		printf("%d %s %d %s %f\n",R[i].Sno,R[i].Sname,R[i].Sage,R[i].Ssex,R[i].score);
	}
	printf("\n");
}

void Merge(rectype R[],int low,int high,int mid)
{
	int i,j,k;
	rectype T[MAX+1];
	i=low;
	j=mid+1;
	k=low;
	while(i<=mid && j<=high)
	{
			if(R[i].score<=R[j].score)
				T[k++]=R[i++];
			else
				T[k++]=R[j++];
	}
	while(i<=mid)
	{
		T[k++]=R[i++];
	}
	while(j<=high)
	{
		T[k++]=R[j++];
	}
	for(i=low;i<=high;i++)
	{
		R[i]=T[i];
	}
}

void SeqFind(rectype R[],char *sex)
{
	int i;
	int flag=0;
	printf("\n");
	for(i=1;i<=n;i++)
	{
		if(strcmp(R[i].Ssex,sex) == 0)
		{
			printf("%d %s %d %s %f\n",R[i].Sno,R[i].Sname,R[i].Sage,R[i].Ssex,R[i].score);
			flag=1;
		}
	}
	if(flag==0)
	{
		printf("没有找到!\n");
	}
}

void MergeSort(rectype R[],int low,int high)
{
	int mid;
	if(low<high)
	{
		mid=(low+high)/2;
		MergeSort(R,low,mid);
		MergeSort(R,mid+1,high);
		Merge(R,low,high,mid);
	}

}

int Partion(rectype R[],int low,int high)
{
	int i,j;
	i=low;
	j=high;
	R[0]=R[i];
	do
	{
		if((R[j].Sno>=R[0].Sno)&&(j>i))
			j--;
		R[i]=R[j];
		if((R[low].Sno<=R[0].Sno)&&(i<j))
			i++;
		R[j]=R[i];
	}while(i!=j);
	R[i]=R[0];
	return i;
}

void QuickSort(rectype R[],int low,int high)
{
	int i;
	if(low<high)
	{
		i=Partion(R,low,high);
		QuickSort(R,low,i-1);
		QuickSort(R,i+1,high);
	}
}

void BinSearch(rectype R[],int sno)
{
	int low,high,mid;
	low=1;
	high=n;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(R[mid].Sno>sno)
			high=mid-1;
		else
			low=mid+1;
	}
	if(R[high].Sno==sno)
	{
		printf("%d %s %d %s %f\n",R[high].Sno,R[high].Sname,R[high].Sage,R[high].Ssex,R[high].score);
	}
	else
	{
		printf("没有找到!\n");
	}
}
void gotoxy(int x,int y)
{
	 COORD Pos;
	 HANDLE hCon;
	 hCon = GetStdHandle(STD_OUTPUT_HANDLE);
	 Pos.X = x;
	 Pos.Y = y;
	 SetConsoleCursorPosition(hCon,Pos);
}

void menu(rectype R[])
{
	int i;
	int j;
	int sno;
	//System("cls");
	do
	{
		system("cls");
		gotoxy(30,3);
		printf("1.用归并排序算法对成绩排序");
		gotoxy(30,5);
		printf("2.用顺序查找算法对性别进行查询");
		gotoxy(30,7);
		printf("3.用二分法查找算法对学号进行查询");
		gotoxy(30,9);
		printf("4.退出");
		printf("\n");

		printf("请输入您的选择:\n");
		scanf("%d",&i);
		getchar();
		switch(i)
		{
		case 1:
			print_data(R);
			MergeSort(R,1,n);
			printf("##");
			//write_file(R,".//after_shellsort.txt");
			printf("用归并排序算法对成绩排序:\n");
			print_data(R);
			getchar();
			break;
		case 2:
			print_data(R);
			printf("用顺序查找算法对性别进行查询:\n");
			printf("请输入性别1(女)2(男)");
			scanf("%d",&j);
			if(j==1)
				SeqFind(R,"女");
			if(j==2)
				SeqFind(R,"男");
			//print_data(R);
			getchar();
			getch();
			break;
		case 3:
			print_data(R);
			QuickSort(R,1,n);
			printf("用快速排序对学号进行排序:\n");
			print_data(R);
			printf("用二分法查找算法对学号进行查询:\n");
			printf("请输入查找的学号:\n");
			scanf("%d",&sno);
			BinSearch(R,sno);
			getch();
			break;
		case 4:
			//cls();
			printf("bye-bye");
			getchar();
			exit(1);
		default:
			printf("again!");
		}

	}while(i!=0);
}

当你需要存储一组包含学生信息的数据,比如学号姓名性别年龄等,可以使用文本文件(如students.dat)来保存数据。这种数据通常会采用键值对或者结构化的格式,例如CSV(逗号分隔值),每行代表一个学生信息,字段之间用特定字符(通常是逗号或制表符)分隔。 以下是操作步骤的一个简要概述: 1. **编或创建文件**: - 使用编程语言(如Python、Java、C++等)的文件操作功能,打开`students.dat`文件,并选择以追加模式(`"a"`)入,以便在已有内容的基础上添加新的学生记录。 2. **构造学生信息**: - 对于每个新学生,创建一个包含学号姓名性别年龄的字典(Python)、元组或其他类似的数据结构。 3. **文件**: - 将学生信息作为字符串(按照固定的格式,如CSV)格式化,然后入到文件中。例如,在Python中你可以这样做: ```python with open('students.dat', 'a') as file: file.write(f'{student_id},{name},{gender},{age}\n') ``` 4. **读取文件**: - 当你需要从文件中读取学生信息时,可以再次打开文件,然后逐行读取并解析: ```python with open('students.dat', 'r') as file: for line in file: data = line.strip().split(',') # 假设以逗号分隔 student_id, name, gender, age = data process_student_info(student_id, name, gender, int(age)) # 解析并处理数据 ``` 5. **处理数据**: - 根据需求,将读取的`data`转换为对应的类实例(如有必要),然后进一步处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值