数据结构课程设计—同学录管理系统(c语言)

数据结构课程设计—同学录管理系统(c语言)



前言

计算机相关专业在学习数据结构这门课程时会有课程设计,我被分配到的是同学录管理系统。


提示:本程序采用的数据结构是线性表,主菜单为:

--------欢迎使用同学录管理系统V1.0--------
☆☆☆☆☆☆主菜单栏☆☆☆☆☆☆☆
★1.录入同学信息
★2.显示同学信息
★3.查找某同学
★4.修改某同学信息
★5.删除某同学信息
★6.同学录排序
★7.统计当前同学录总人数
★0.退出同学录管理系统


一、需求分析

1.问题描述:
实现同学录管理的几个操作功能(录入、查找、删除、排序、写入文件、从文件中读取、屏幕输出等功能)。同学录中可存储的学生信息包括姓名、年龄、性别、联系电话、QQ号码、邮箱、联系地址等。

2.问题要求:
要求编写一程序,选择适当的数据结构,解决上述问题。要求:(1)输入输出界面友好,可视化程度强;(2)程序的可读性较强;(3)程序具有较强的健壮性;(4)程序能够自动把用户操作之后的顺序表中信息写入到tong_xue_lu.txt文件中,并在运行程序时自动从tong_xue_lu.txt文件中读取同学的信息并建立顺序表;

二、总体设计

1.设计思路:
本程序采用顺序表来存储同学信息。先定义一个结构体类型someone,结构体包括六个字符数组变量,一个整形变量,用来存储每个人的姓名、年龄、性别、手机号码、QQ号码、邮箱、联系地址。再定义一个结构体类型classmate,结构体包括一个someone型指针变量(用来存储顺序表的首地址)和一个整型变量length(用来存储顺序表的长度)。然后通过对顺序表的取值、删除、查找、排序、修改、输出等算法来实现对同学录管理系统中的录入同学信息、删除某同学信息、查找某同学、对同学录进行排序、修改某同学的信息等功能。

三、代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100
#define OK 1
#define ERROR -1
char a[5]="序号";
char b[5]="姓名";
char c[5]="年龄";
char d[5]="性别";
char e[10]="手机号码";
char f[10]="QQ号码";
char g[6]="邮箱";
char h[10]="联系地址"; 
typedef struct mate
{
	char name[6];
	int age;
	char sex[3];
	char iphonenumber[20];
	char QQnumber[20];
	char mail[20];
	char location[30];
 } someone;
typedef struct
{
	someone *elem;
	int length;
}classmate;
//初始化线性表
int init_class(classmate &L)
{
	L.elem=new someone[MAXSIZE];
	if(!L.elem)
	{
		return ERROR;
	}
	L.length=0;
	return OK;
}
//打印顺序表函数
void print_class(classmate L) 
{
	int choose,i;
	if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
	else
	{
		while(1)
		{
			printf("********************************************\n");
			puts("●1.输出姓名列");
			puts("●2.输出所有列信息");
			puts("●0.返回主菜单");
			printf("********************************************\n");
			puts("请输入你的操作指令:");
			scanf("%d",&choose);
			while(choose<0||choose>2)
			{
				printf("您输入的查找指令有误,请重新输入:");
				scanf("%d",&choose); 
			}
			if(choose==0) break;
			switch(choose)
			{
				case 1:
					printf("-----------------------------------------------------------------------------------------------\n");
					printf("%-6s",a);
					printf("%-8s",b);
					printf("\n");
					printf("-----------------------------------------------------------------------------------------------\n");
					for(i=0;i<L.length;i++)
					{
						printf("%-6d",i+1);
						printf("%-8s",L.elem[i].name);
						printf("\n");
					}
					printf("-----------------------------------------------------------------------------------------------\n");
					break;
				
				case 2:
					printf("-----------------------------------------------------------------------------------------------\n");
					printf("%-6s",a);
					printf("%-8s",b);
					printf("%-9s",c);
					printf("%-6s",d); 
					printf("%-16s",e);
					printf("%-16s",f);
					printf("%-21s",g);
					printf("%-21s",h);
					printf("\n");
					printf("-----------------------------------------------------------------------------------------------\n");
					printf("\n");
					for(i=0;i<L.length;i++)
					{
						printf("%-6d",i+1);
						printf("%-8s",L.elem[i].name);
						printf("%-9d",L.elem[i].age);
						printf("%-6s",L.elem[i].sex);
						printf("%-16s",L.elem[i].iphonenumber);
						printf("%-16s",L.elem[i].QQnumber);
						printf("%-21s",L.elem[i].mail);
						printf("%-21s",L.elem[i].location);
						printf("\n\n");
					}
					printf("-----------------------------------------------------------------------------------------------\n");
					printf("***************************************************");
					printf("\n");
					break;
				}
	
		}

	}
}
//录入同学录内容
void put_class(classmate &L)
{
	void save(classmate L); 
	int i,l,j;
	printf("请输入要录入的同学人数(0~%d):",MAXSIZE-L.length);
	scanf("%d",&l);
	while(l<1||l>(MAXSIZE-L.length))
	{
		printf("输入人数范围有误,请重新输入同学人数(1~%d):",MAXSIZE-L.length);
		scanf("%d",&l);
	 }  
	for(i=L.length,j=0;j<l;j++,i++)
	{
		printf("***************************************************\n");
		printf("请输入第%d个同学的姓名(最大长度6):",i+1);
		scanf("%s",L.elem[i].name);
		printf("请输入%s的年龄:",L.elem[i].name);
		scanf("%d",&L.elem[i].age);
		printf("请输入%s的性别(最大长度3):",L.elem[i].name);
		scanf("%s",L.elem[i].sex);
		printf("请输入%s的手机号(长度11):",L.elem[i].name);
		scanf("%s",L.elem[i].iphonenumber);
		while(strlen(L.elem[i].iphonenumber)!=11)
		{
			printf("您输入的号码长度不合法,请重新输入");
			scanf("%s",L.elem[i].iphonenumber);
		}
		printf("请输入%s的QQ号码(最大长度20):",L.elem[i].name);
		scanf("%s",L.elem[i].QQnumber);
		printf("请输入%s的邮箱(最大长度20):",L.elem[i].name);
		scanf("%s",L.elem[i].mail);
		printf("请输入%s的联系地址(最大长度30):",L.elem[i].name);
		scanf("%s",L.elem[i].location);
		printf("***************************************************\n");
		printf("\n");
	}
	L.length=L.length+l;
	save(L);
 }  
 //查找函数菜单 
 void chazhao(classmate L)
 {
 	int i,b,e,choose; 
 	void chazhao_print_title();
 	int chazhao_print(classmate L,int i);
 	char seek[20];
 	if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
 	else
 	{
		while(1)
		{
			int count=0;
			printf("********************************************\n");
			puts("●1.按名字查找");
			puts("●2.按地址查找");
			puts("●3.按年龄段查找"); 
			puts("●0.返回主菜单");
			printf("********************************************\n");
			puts("请输入你的查找指令:");
			scanf("%d",&choose);
			while(choose<0||choose>3)
			{
				printf("您输入的查找指令有误,请重新输入:");
				scanf("%d",&choose); 
			}
			if(choose==0) break;
			switch(choose)
			{
				case 1:
					printf("请输入你要查询人的名字:");scanf("%s",seek);
					for(i=0;i<L.length;i++)
	  				{
	  					if(strcmp(seek,L.elem[i].name)==0)
	  					{
	  						printf("查找成功,在第%d个位置\n",i+1);
	  						chazhao_print_title();
	  						chazhao_print(L,i);
	  						count++;
					  	}
					}
					if(count==0) printf("%s不存在!\n",seek);
					break;
				case 2:
					printf("请输入你要查询人的地址:");
					scanf("%s",seek);
					chazhao_print_title();
					for(i=0;i<L.length;i++)
	  				{
	  					if(strcmp(seek,L.elem[i].location)==0)
	  					{
	  						chazhao_print(L,i);
	  						count++;
					  	}
					}
					if(count==0) printf("您要查询的人不存在!\n");
					break;
				case 3:
					printf("请输入升序年龄范围,用短横杠隔开(例如1-10)\n");
	  				scanf("%d-%d",&b,&e);
	  				printf("年龄在%d-%d之间的人有:\n",b,e);
	  				chazhao_print_title();
	  				for(i=0;i<L.length;i++)
	  				{
	  					if((b<=L.elem[i].age)&&(L.elem[i].age<=e))
	  					{
	  						chazhao_print(L,i);
	  						count++;
					  	}
				  	}
				  	if(count==0) printf("年龄在%d-%d人不存在!\n",b,e);
					break;
			}
		}
	}
  }  
 //查找时打印表头
 void chazhao_print_title()
 {
	printf("-----------------------------------------------------------------------------------------------\n");
	printf("%-6s",a);
	printf("%-8s",b);
	printf("%-9s",c);
	printf("%-6s",d); 
	printf("%-16s",e);
	printf("%-16s",f);
	printf("%-21s",g);
	printf("%-21s",h);
	printf("\n");
	printf("-----------------------------------------------------------------------------------------------\n");
	printf("\n");
  } 
  //查找时单独打印函数
  int chazhao_print(classmate L,int i)
  {
	printf("%-6d",i+1);
	printf("%-8s",L.elem[i].name);
	printf("%-9d",L.elem[i].age);
	printf("%-6s",L.elem[i].sex);
	printf("%-16s",L.elem[i].iphonenumber);
	printf("%-16s",L.elem[i].QQnumber);
	printf("%-21s",L.elem[i].mail);
	printf("%-21s",L.elem[i].location);
	printf("\n");
	printf("-----------------------------------------------------------------------------------------------\n");
	printf("\n");
   }  
//删除函数
void shanchu(classmate &L)
{
	void save(classmate L);
	int i,choose,n,j;
	char seek_name[6];
	if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
	else
	{
		while(1)
		{
			int count=0;
			printf("********************************************\n");
			puts("●1.按序号删除");
			puts("●2.按名字删除");
			puts("●0.返回主菜单");
			printf("********************************************\n");
			puts("请输入您的删除指令:");
			scanf("%d",&choose);
			while(choose<0||choose>3)
			{
				printf("您输入的删除指令有误,请重新输入:");
				scanf("%d",&choose); 
			}
			if(L.length==0)
			{
				printf("当前同学录为空,请先录入同学信息\n\n");
				break;
			}
			else
				{
			
				while(choose<0||choose>2)
				{
					printf("您输入的删除指令有误,请重新输入:");
					scanf("%d",&choose); 
			 	} 
				if(choose==0) break;
				switch(choose)
				{
					case 1:
						printf("请输入您要删除的同学的序号:");
						scanf("%d",&n);
						if(n>L.length)
						{
							printf("您要删除的人不存在!\n");
							break;
						}
						printf("序号为%d的同学(%s)已被删除\n",n,L.elem[n-1].name);
						for(i=n;i<L.length;i++)
						{
							L.elem[i-1]=L.elem[i]; 
						}
						L.length--;
						save(L);
						break;
					case 2:
						printf("请输入您要删除的同学的姓名:");
						scanf("%s",seek_name);
						for(i=0;i<L.length;i++)
						{
							if(strcmp(seek_name,L.elem[i].name)==0)
							{
								for(j=i+1;j<L.length;j++)
								{
									L.elem[j-1]=L.elem[j];
								}
								L.length--;
								count++;
							}
						}
						if(count==0)
						{
							printf("您要删除的人不存在!\n");
						}
						else
						{
							printf("%s的信息已删除成功\n",seek_name);
							save(L);
						}
						break; 
				}
			}
		}
	}
 } 
 //排序函数
 void paixu(classmate &L)
{
	void save(classmate L);
	if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
	else
	{
		someone m;
	 	int i,j,t;
	 	int choose,choose1; 
	 	puts("●1.按升序排序");
		puts("●2.按降序排序");
		puts("请输入你的排序指令:");
		scanf("%d",&choose1);
		while(choose1<1||choose1>2)
		{
			printf("您输入的排序指令有误,请重新输入:");
			scanf("%d",&choose1); 
		}
		switch(choose1)
		{
			case 1:
				puts("●1.按名字升序排序");
				puts("●2.按年龄升序排序");
				puts("●3.按地址升序排序");
				puts("●4.按QQ号升序排序");
				puts("请输入你的操作指令:");
				scanf("%d",&choose);
				while(choose<1||choose>4)
				{
					printf("您输入的指令有误,请重新输入:");
					scanf("%d",&choose); 
				}
				switch(choose)
				{
					case 1:
						for(i=0;i<L.length;i++)
			 			{
			 				for(j=i+1;j<L.length;j++)
			 				{
			 					if(strcmp(L.elem[i].name,L.elem[j].name))
			 					{
			 						m=L.elem[i];
			 						L.elem[i]=L.elem[j];
			 						L.elem[j]=m;
								}
						 	}
						}
						puts("按姓名升序排序成功。");
						save(L);
						break;
					case 2:
						for(i=0;i<L.length;i++)
			 			{
			 				for(j=i+1;j<L.length;j++)
			 				{
			 					if(L.elem[i].age>L.elem[j].age)
			 					{
			 						m=L.elem[i];
			 						L.elem[i]=L.elem[j];
			 						L.elem[j]=m;
							 	}
						 	}
					 	}
						puts("按年龄升序排序成功。");
						save(L);
						break;
					case 3:
						for(i=0;i<L.length;i++)
			 			{
			 				for(j=i+1;j<L.length;j++)
			 				{
			 					if(strcmp(L.elem[i].location,L.elem[j].location))
			 					{
				 					m=L.elem[i];
				 					L.elem[i]=L.elem[j];
			 						L.elem[j]=m;
							 	}
						 	}
					 	}
						puts("按地址升序排序成功。");
						save(L);
						break;
					case 4:
						for(i=0;i<L.length;i++)
				 		{
				 			for(j=i+1;j<L.length;j++)
				 			{
				 				if(strcmp(L.elem[i].QQnumber,L.elem[j].QQnumber))
				 				{
				 					m=L.elem[i];
				 					L.elem[i]=L.elem[j];
				 					L.elem[j]=m;
								}
							}
						}
						puts("按QQ号升序排序成功。");
						save(L);
						break;
				}
				break;
				case 2:
				puts("●1.按名字降序排序");
				puts("●2.按年龄降序排序");
				puts("●3.按地址降序排序");
				puts("●4.按QQ号降序排序");
				puts("请输入你的操作指令:");
				scanf("%d",&choose);
				while(choose<1||choose>4)
				{
					printf("您输入的指令有误,请重新输入:");
					scanf("%d",&choose); 
				}
				switch(choose)
				{
					case 1:
						for(i=0;i<L.length;i++)
			 			{
			 				for(j=i+1;j<L.length;j++)
			 				{
			 					if(strcmp(L.elem[i].name,L.elem[j].name)==-1)
			 					{
			 						m=L.elem[i];
			 						L.elem[i]=L.elem[j];
			 						L.elem[j]=m;
								}
						 	}
						}
						puts("按姓名降序排序成功。");
						save(L);
						break;
					case 2:
						for(i=0;i<L.length;i++)
			 			{
			 				for(j=i+1;j<L.length;j++)
			 				{
			 					if(L.elem[i].age<L.elem[j].age)
			 					{
			 						m=L.elem[i];
			 						L.elem[i]=L.elem[j];
			 						L.elem[j]=m;
							 	}
						 	}
					 	}
						puts("按年龄降序排序成功。");
						save(L);
						break;
					case 3:
						for(i=0;i<L.length;i++)
			 			{
			 				for(j=i+1;j<L.length;j++)
			 				{
			 					if(strcmp(L.elem[i].location,L.elem[j].location)==-1)
			 					{
				 					m=L.elem[i];
				 					L.elem[i]=L.elem[j];
			 						L.elem[j]=m;
							 	}
						 	}
					 	}
						puts("按地址降序排序成功。");
						save(L);
						break;
					case 4:
						for(i=0;i<L.length;i++)
				 		{
				 			for(j=i+1;j<L.length;j++)
				 			{
				 				if(strcmp(L.elem[i].QQnumber,L.elem[j].QQnumber)==-1)
				 				{
				 					m=L.elem[i];
				 					L.elem[i]=L.elem[j];
				 					L.elem[j]=m;
								}
							}
						}
						puts("按QQ号降序排序成功。");
						save(L);
						break;
				}
				break;
		}
	}
}
 //修改同学信息
 void xiugai(classmate &L)
 {
 	void save(classmate L);
 	if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
 	else
 	{
	 	int choose,i,t,count=0;
	 	char seekname[6];//存储要修改人的名字 
	 	
	 	printf("你要修改谁的信息,请输入姓名:\t");
	 	scanf("%s",seekname);
		for(i=0;i<L.length;i++)
	  	{
	  		if(strcmp(seekname,L.elem[i].name)==0)
	  		{
	  			t=i;
	  			count++;
				break;
			}
		}
		if(count==0) printf("您要删除的人不存在\n");
		else
		{
			while(1)
			{
				printf("********************************************\n");
				puts("●1.修改姓名");
				puts("●2.修改年龄");
				puts("●3.修改性别");
				puts("●4.修改地址");
				puts("●5.修改QQ号码");
				puts("●6.修改手机号");
				puts("●7.修改邮箱");
				puts("●0.返回主菜单");
				printf("********************************************\n");
				puts("请输入你的修改指令:");
				scanf("%d",&choose);
				while(choose<0||choose>7)
				{
					printf("您输入的修改指令有误,请重新输入:");
					scanf("%d",&choose); 
				}
				if(choose==0) break;
				switch(choose)
				{
					case 1:
						puts("请输入新的姓名:");
						scanf("%s",L.elem[t].name);
						printf("%s的姓名修改成功\n",seekname);
						save(L);
						break;
					case 2:
						puts("请输入新的年龄:");
						scanf("%d",&L.elem[t].age);
						printf("%s的年龄修改成功\n",seekname);
						save(L);
						break;
					case 3:
						puts("请输入新的性别:");
						scanf("%s",L.elem[t].sex);
						printf("%s的性别修改成功\n",seekname);
						save(L);
						break;
					case 4:
						puts("请输入新的地址:");
						scanf("%s",L.elem[t].location);
						printf("%s的地址修改成功\n",seekname);
						save(L);
						break;
					case 5:
						puts("请输入新的QQ号码:");
						scanf("%s",L.elem[t].QQnumber);
						printf("%s的QQ号码修改成功\n",seekname);
						save(L);
						break;
					case 6:
						puts("请输入新的手机号:");
						scanf("%s",L.elem[t].iphonenumber);
						printf("%s的手机号修改成功\n",seekname);
						save(L);
						break;
					case 7:
						puts("请输入新的邮箱:");
						scanf("%s",L.elem[t].mail);
						printf("%s的邮箱修改成功\n",seekname);
						save(L);
						break;
				}
			}
		}
	}
  } 
//保存到文件函数
void save(classmate L)
{
	FILE *fp;
	int i;
	fp=fopen("tong_xue_lu.txt","w");
	fprintf(fp,"%d\n",L.length);
	for(i=0;i<L.length;i++)
	{
		fprintf(fp,"%s %d %s %s %s %s  %s\n",L.elem[i].name,L.elem[i].age,L.elem[i].sex,L.elem[i].iphonenumber,L.elem[i].QQnumber,L.elem[i].mail,L.elem[i].location);
		
	 } 
	fclose(fp);

 } 
 void read(classmate &L)
 {
 	FILE *fp;
	int i;
	fp=fopen("tong_xue_lu.txt","r");
	int count;
	fscanf(fp,"%d\n",&count);
	for(i=0;i<count;i++)
	{
		fscanf(fp,"%s %d %s %s %s %s %s\n",L.elem[i].name,&L.elem[i].age,L.elem[i].sex,L.elem[i].iphonenumber,L.elem[i].QQnumber,L.elem[i].mail,L.elem[i].location);
		L.length++;
	 } 
	fclose(fp);
 }
 void num(classmate L)
 {
 	printf("-----------------------------------------------------------------------------------------------\n");
 	printf("当前同学录共有%d人\n",L.length);
 	printf("-----------------------------------------------------------------------------------------------\n");
 }
int main()
{
	int choose;
	classmate L;
	init_class(L); 
	read(L);
	while(1)
	{
		printf("--------欢迎使用同学录管理系统V1.0--------\n");
		printf("--------操作指令是选项前的数字序号--------\n");
		printf("********************************************\n");
		printf("☆☆☆☆☆☆主菜单栏☆☆☆☆☆☆☆\n");
		printf("\n");
		puts("★1.录入同学信息");
		puts("★2.显示同学信息");
		puts("★3.查找某同学");
		puts("★4.修改某同学信息");
		puts("★5.删除某同学信息");
		puts("★6.同学录排序");
		puts("★7.统计当前同学录总人数");
		puts("★0.退出同学录管理系统");
		printf("********************************************\n");
		printf("\n");
		printf("-----------------------------------------------------------\n");
		printf("请选择主菜单指令:");
		scanf("%d",&choose);
		while(choose<0||choose>7)
		{
			printf("您输入的主菜单指令有误,请重新输入:");
			scanf("%d",&choose); 
		}
		if(choose==0) break;
		switch(choose)
		{
			case 1:put_class(L);save(L);break;
			case 2:print_class(L);break;
			case 3:chazhao(L);break;
			case 4:xiugai(L);break;
			case 5:shanchu(L);break;
			case 6:paixu(L);break;
			case 7:num(L);break;
		}
	}
	printf("请按任意键退出系统");
	return 0;
} 

四、代码说明

1.抽象数据类型定义:

抽象数据类型包括someone和classmate,someone是一个包含char name[6]; int age; char sex[3]; char iphonenumber[20]; char QQnumber[20]; char mail[20]; char location[30];七个变量的结构体数据类型,classmate是一个包含someone *elem; int length;两个变量的结构体数据类型。
数据关系:通过访问classmate里面的elem可以间接访问someone里面的数据。
基本操作:先定义classmate L;然后进行L.elem.name或者L.length;即可访问到抽象数据类型里的所有内容了。

2.存储结构设计:

本设计采用了顺序表的存储结构,顺序表的默认表长是100。

3.算法设计:

(1)初始化线性表函数【int init_class(classmate &L)】:使用new函数为线性表分配存储空间,用L.elem指向存储空间的首地址,并初始化线性表长度L.length==0;

(2)打印同学录信息【void print_class(classmate L)】:此函数参数是classmate型抽象数据变量。首先定义两个整形变量choose、i,chooose用来作为内部菜单的选择指令,i用来当做循环变量。然后进行判断表长是否为零(即同学录是否为空),此处用一个if判断语句,如果表长为零,则提示用户“当前同学录为空,请先录入同学信息”,直接跳出此函数;反之则显示内部菜单“●1.输出姓名列、●2.输出所有列信息、●0.返回主菜单”(PS:此处用了while循环,可以使用户对此进行多次操作,当用户选择“●0.返回主菜单”操作时,汇银break而结束循环)。为了程序的健壮性,用while(choose<0||choose>2),来判断用户输入的菜单指令是否在“0,1,2”之间,如果不在,则提示用户重新输入操作指令,直到输入正确。接下来用switch选择语句,参数是用户的操作指令choose,如果choose=1,则只输出姓名列,用for循环遍历一遍顺序表L,输出所有的姓名信息,然后用break终止。如果choose==2,则用for循环遍历L.elem中的所有信息并输出,然后用break终止。

(3)录入同学录内容【void put_class(classmate &L)】:先定义三个整型变量“i,l,j”,i和j用来当做for循环的循环变量,而l用来存储每次要录入的学生的个数。为了程序的健壮性,用了while(l<1||l>(MAXSIZE-L.length))来判断要录入的学生个数是否大于等于1且是否大于目前剩余的存储空间,如果l<1||l>(MAXSIZE-L.length),则提示用户重新输入学生个数。待l输入正确后,用for循环来以此录入每个学生的姓名、年龄、性别、手机号、QQ号码、邮箱、联系地址等。相应地循环次数是学生个数l。循环完成后,对表长L.length进行加l。

(4)查找功能【void chazaho(classmate L)】:先定义三个整型变量“i,b,e,count,choose”,i是for循环的循环变量;b和e用来存储使用年龄段查找功能时的年龄段的起始值和末尾值;count赋初值0,用来判断是否查找成功,当count=0时,查找失败;choose用来存储用户的操作指令。在定义一个字符数组变量seek,用来存储查找的关键字,比如按名字查找时的名字、按地址查找时的地址。考虑到程序的健壮性,使用if-else语句先判断线性表(同学录)是否为空,如果为空,则提示用户“当前同学录为空,请先录入同学信息”;如果不为空,则进行后续的查找操作。else内用一个while循环,只有当用户选择“●0.返回主菜单”操作时才会因break而终止。While循环内首先对用户展示内菜单栏“●1.按名字查找、●2.按地址查找、●3.按年龄段查找、●0.返回主菜单”。接下来用swith(choose)语句根据用户选择的查找命令使用不同的方式查找。考虑到程序的健壮性,用while(choose<0||choose>3),来判断用户输入的菜单指令是否在“0,1,2,3”之间,如果不在,则提示用户重新输入操作指令,直到输入正确;接下来用switch(choose)来实现用户命令与查找方式的对应:如果choose==1则进行按名字查找,用for循环遍历顺序表,如果某个人的姓名和关键字相同,则输出这个人的所有信息。同理,当choose==2时,则按地址查找。当choose==3时,则按年龄段查找。如果没有匹配到和关键字相同的同学,此时count==0,提示用户要查找的人不存在。

(5)删除功能【void shanchu(classmate &L)】:先定义四个整型变量“i,choose,j”,i和j是循环变量,choose用来存储用户的操作指令;再定义一个字符数组变量seek_name用来存储使用按姓名删除功能时的姓名关键字。考虑到程序的健壮性,使用if-else语句先判断线性表(同学录)是否为空,如果为空,则提示用户“当前同学录为空,请先录入同学信息”;如果不为空,则进行后续的删除操作。else内用一个while循环,只有当用户选择“●0.返回主菜单”操作时才会因break而终止。While循环内首先对用户展示内菜单栏“●1. 按序号删除、●2. 按名字删除、●0.返回主菜单”(while内定义了一个整型变量count,用来判断当使用姓名删除时,被删除人是否存在)。考虑到程序的健壮性,用while(choose<0||choose>2),来判断用户输入的菜单指令是否在“0,1,2”之间,如果不在,则提示用户重新输入操作指令,直到输入正确;接下来用switch(choose)来实现用户命令与删除方式的对应:如果choose==1则进行按序号删除,如果choose=2则进行按名字删除。删除的算法思路为:把要删除的元素后面的所有元素都向前挪一个位置。当使用按姓名删除时,先匹配到到待删除人的下标,再进行删除。(且当要删除的人不存在时,系统会提示用户“您要删除的人不存在”,删除成功时则会提示用户删除成功)

(6)排序功能【void paixu(classmate &L)】:首先判断顺序表是否为空,为空的话会提示用户先录入同学信息(同时直接返回主菜单),不为空则进行下面的的排序操作。此功能同样采用了内菜单的方式来供用户选择不同的排序方式(首先让用户选择升序还是降序,然后再让用户选择按那个关键字排序)。排序的算法为简单选择排序。同时用到了字符串的比较函数strcmp函数。

(6)修改信息功能【void xiugai(classmate &L)】: 此功能定义了3个整型变量“choose.i.t”两个字符数组变量“seekname[6],change[31]”,choose用来存储用户的操作指令,i是循环变量,t用来存放被修改人的位置下标,seekname存储被修改人的名字。 首先判断顺序表是否为空,为空的话会提示用户先录入同学信息(同时直接返回主菜单),不为空则进行下面的的修改操作。此功能同样采用了内菜单的方式来供用户选择不同的修改方式。首先让用户输入要修改人的名字,根据查找算法来获得此人相应的下标。 然后展示内菜单(考虑到程序的健壮性,用while(choose<0||choose>7),来判断用户输入的菜单指令是否在“0,1,2,3,4,5,6,7”之间,如果不在,则提示用户重新输入操作指令,直到输入正确),让用户选择修改哪一项信息。通过用scanf函数直接修改相应地址的信息。

(7)保存到文件功能【void save(classmate L)】:先创建一个文件指针fp和一个整型变量i,i是循环变量,fp指向要保存到的文本文档“tong_xue_lu.txt”。文件使用方式选择“w”。先把同学录的人数保存到文本文档的第一行,然后用for循环以此将顺序表L中的所有同学信息写入到文本文档tong_xue_lu.txt中,每位同学的信息单独占一行。此系统采用了实时保存功能,即用户每进行一项操作之后,都会自动保存到文件中。

(8)从文件中读取功能【void read(classmate &L)】:先创建一个文件指针fp和两个整型变量i和count,i是循环变量,count用来存储从文本文档中读取到的第一个元素,即同学的人数。fp指向要读取的文本文档“tong_xue_lu.txt”。文件使用方式选择“r”。首先读取同学录的总人数存储到count里面,然后用for循环,循环count次将文本文档tong_xue_lu.txt中的所有同学信息读取到顺序表L中去。

(9)统计同学录人数功能【void num(classmate L)】:此功能实现把顺序表的长度(即同学录中的人数)输出,告知用户当前同学录有多少人。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李小枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值