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

📄 telefon.c

📁 超级市场中
💻 C
字号:
#include <stdio.h>
#include <string.h>
/* 定义结构体保存订户信息. */
struct subscriber
{
	char name[30];
	char address[50];
	long int telno;
};
addsubs();
modsubs();
delsubs();
querynum();
queryname(); 
viewdir();
acceptdet();

main()
{
	int choice=0;
	/* 循环显示菜单,接受用户输入. */
	while(choice!=7)
	{	printf("\tTELEPHONE DIRECTORY SYSTEM");
		printf("\n\n1. Add new subscriber details");
		printf("\n2. Modify existing subscriber details");
		printf("\n3. Delete existing subscriber details");
		printf("\n4. Display subscriber details based on telephone number");
		printf("\n5. Display subscriber details based on subscriber name"); 
		printf("\n6. View Directory");
		printf("\n7. Quit");
		printf("\n\nEnter choice: ");
		scanf("%d", &choice);

		/* 根据选择调用相应函数 */
		if(choice==1)
			addsubs();
		else if(choice==2)
			modsubs();
		else if(choice==3)
			delsubs();
		else if(choice==4)
			querynum();
		else if(choice==5)
			queryname(); 
		else if(choice==6)
			viewdir();
		else if(choice==7)
			exit(0);
		else
		{	printf("\n\nYou have entered an invalid menu choice. Please reenter.");
			getchar();
		}
	}
}



/* 添加新订户的详细信息 */
addsubs()
{
	FILE *fp;
	int newfilectr=0, i=0, j, readctr=0;
	struct subscriber sub_arr[100], new_sub, temp_sub;
	char flag='n';	
	int size_s=sizeof(struct subscriber);

	/* 如果文件存在则以读写模式打开.如果不存在则以写模式打开创建文件. */

	if((fp=fopen("telefon.dat", "r+"))==NULL)
	{
		if((fp=fopen("telefon.dat", "w"))==NULL)
		{
			printf("\n\nThe telephone directory could not be opened.");
			getchar();
			return;
		}
		else
			/* 记录文件是新建的文件. */
			newfilectr=1;
	}
	printf("\tADD NEW SUBSCRIBER DETAILS");
	getchar();
	/* 调用函数接受新的订户信息. */
	acceptdet(&new_sub);

	if(newfilectr==1) /* 如果为新建文件则直接写信息入文件. */
		fwrite(&new_sub, size_s, 1, fp);
	else 
	{
		i=0;
		/* 循环读文件内容到数组中 */
	    fread(&sub_arr[i], size_s, 1, fp);
		while(!feof(fp))
		{
			/* 核对新输入的订户姓名是否比数组中的姓名小,找到合适位置则插入. */
			if((strcmp(sub_arr[i].name,new_sub.name))>=0 && flag=='n')
			{
				temp_sub=sub_arr[i];
				sub_arr[i]=new_sub;
				i++;
				sub_arr[i]=temp_sub;
				flag='y';
			}
			i++;
		    fread(&sub_arr[i], size_s, 1, fp);
		}

		/* 如果新订户名大于所有订户名,则把新输入信息添加到数组末尾. */

		if(flag=='n')
		{
			sub_arr[i]=new_sub;
			i++;
		}
		rewind(fp);

		/* 写数组内容到文件. */
		for(j=0; j<i; j++)
	    	fwrite(&sub_arr[j], size_s, 1, fp);
	}

	printf("\n\n\tSubscriber details have been added");
	getchar();	
	fclose(fp);
}



/* Function that accepts the new or modified details of a subscriber. */

acceptdet(struct subscriber *accsub)
{
	char check;
	check='n';
	/*输入姓名,不许为空 */
	while(check=='n')
	{
		printf("\n\nEnter Subscriber name (upto 30 chars.): ");
		gets(accsub->name);
		if((strlen(accsub->name))==0)
			printf("\n\tSubscriber name must be entered.");
		else
			check='y';
	}

	check='n';

	/* 输入地址,不许为空 */

	while(check=='n')
	{
		printf("\n\nEnter Subscriber address (upto 50 chars.): ");
		gets(accsub->address);
		if((strlen(accsub->address))==0)
			printf("\n\tSubscriber address must be entered.");
		else
			check='y';
	}

	check='n';

	/* 确认输入的电话号码在4000000和4999999之间. */

	while(check=='n')
	{
		printf("\n\nEnter telephone number: ");
		scanf("%ld", &accsub->telno);
		if(accsub->telno<4000000 || accsub->telno>4999999)
			printf("\n\tSubscriber telephone number must be between 4000000 and 4999999");
		else
			check='y';
	}
}



/* 修改现有订户的详细信息. */

modsubs()
{
	FILE *fp;
	struct subscriber sub_arr[100], new_sub, temp_sub, match_sub;
	char vname[30], flag, flag1;
	int i, j;	
	int size_s=sizeof(struct subscriber);

	/* 如果文件存在则以读写模式打开,如果不存在,提示用户 */

	if((fp=fopen("telefon.dat", "r+"))==NULL)
	{
		printf("\n\nThe telephone directory could not be opened.");
		getchar();
		return;
	}

	printf("\tMODIFY SUBSCRIBER DETAILS");

	/* 输入订户姓名以确定需要修改的记录. */
	
	printf("\n\nEnter Subscriber name (upto 30 chars.): ");
	getchar();
	gets(vname);
	i=0;
	flag='n';
	/* 从文件中读第一个记录. */
	fread(&temp_sub, size_s, 1, fp);

	/* 循环读取直到文件结束. */
	while(!feof(fp))
	{
		/* 检查读取的记录是否需要修改. */
		if((strcmp(temp_sub.name,vname))==0)
		{
			/*如果找到需要修改的记录,则保存到结构体变量中. */
			match_sub=temp_sub;
			flag='y';
		}
		else
		{
			sub_arr[i]=temp_sub;
			i++;
		}
		fread(&temp_sub, size_s, 1, fp);
	}

	
	if(flag=='n')
	{
		printf("\n\n\tSubscriber details not found");
		getchar();
	}
	else
	{

		/* 显示找到的需要修改的记录. */
		printf("\n\tRECORD TO BE MODIFIED");
		printf("\n\nName=%s\nAddress=%s\nTelephone number=%ld", match_sub.name, match_sub.address, match_sub.telno);

		printf("\n\nENTER NEW RECORD DETAILS");
		/* 调用函数输入修改的数据. */
		acceptdet(&new_sub);

		rewind(fp);
		for(j=0, flag1='n'; j<i;)
		{
			if((strcmp(sub_arr[j].name,new_sub.name))>=0 && flag1=='n')
			{
				/* 写修改的记录到文件. */
				fwrite(&new_sub, size_s, 1, fp);
				flag1='y';
			}
			else 
			{
				fwrite(&sub_arr[j], size_s, 1, fp);
				j++;
			}
		}

		/* 如果修改后的订户姓名大于其他所有记录,则写入文件末尾. */
		if(flag1=='n')
		{
			fwrite(&new_sub, size_s, 1, fp);
		}

		printf("\n\n\tSubscriber details have been modified");
		getchar();
	}
	fclose(fp);
}



/* 删除现有订户的详细信息. */

delsubs()
{
	FILE *fp;
	struct subscriber sub_arr[100], temp_sub, match_sub;
	char vname[30], flag;
	int i, j;
	int size_s=sizeof(struct subscriber);

	if((fp=fopen("telefon.dat", "r"))==NULL)
	{
		printf("\n\nThe telephone directory could not be opened for reading.");
		getchar();
		return;
	}
	printf("\tDELETE SUBSCRIBER DETAILS");

	/* 输入要删除的订户姓名. */
	printf("\n\nEnter Subscriber name (upto 30 chars.): ");
	getchar();
	gets(vname);

	i=0;
	flag='n';

	fread(&temp_sub, size_s, 1, fp);
	while(!feof(fp))
	{
		/* 查找需删除的记录 */
		if((strcmp(temp_sub.name,vname))==0)
		{			
			match_sub=temp_sub;
			flag='y';
		}
		else
		{
			/* 存储不匹配的记录到数组中 */
			sub_arr[i]=temp_sub;
			i++;
		}
	    fread(&temp_sub, size_s, 1, fp);
	}
	if(flag=='n') //未找到则提示
	{
		printf("\n\n\tSubscriber details not found");
		getchar();
	}
	else//显示被删除的记录
	{
		printf("\n\tRECORD BEING DELETED");
		printf("\n\nName=%s\nAddress=%s\nTelephone number=%ld", match_sub.name, match_sub.address, match_sub.telno);	
		fclose(fp);

		/* 以写模式打开文件,写入数据. */
		if((fp=fopen("telefon.dat", "w"))==NULL)
		{
			printf("\n\nThe telephone directory could not be opened for writing.");
			getchar();
			return;
		}
		for(j=0; j<i;j++)
		{
			fwrite(&sub_arr[j], size_s, 1, fp);
		}
		printf("\n\n\tSubscriber details have been deleted");
		getchar();
	}
	fclose(fp);
}



/* 显示根据电话号码查出的订户详细信息 */

querynum()
{
	FILE *fp;
	struct subscriber temp_sub;
	char flag;
	long int vtelno;
	int size_s=sizeof(struct subscriber);

	if((fp=fopen("telefon.dat", "r"))==NULL)
	{
		printf("\n\nThe telephone directory could not be opened for reading.");
		getchar();
		return;
	}

	printf("\tVIEW SUBSCRIBER DETAILS");

	/* 输入电话号码. */
	printf("\n\nEnter telephone number: ");
	scanf("%ld", &vtelno);

	flag='n';

	fread(&temp_sub, size_s, 1, fp);
	while(!feof(fp))
	{
		/* 核对读取的电话号码是否和输入的号码匹配. */
		if(temp_sub.telno==vtelno)
		{
			/* 如果号码匹配,设置标记并跳出循环. */
			flag='y';
			break;
		}
		fread(&temp_sub, size_s, 1, fp);
	}
	if(flag=='n') /* 如果未找到匹配的电话号码则提示. */
	{
		printf("\n\n\tSubscriber details not found");
		getchar();
	}
	else
	{
		printf("\n\tREQUESTED SUBSCRIBER DETAILS");
		printf("\n\nName: %s\nAddress: %s\nTelephone number: %ld", temp_sub.name, temp_sub.address, temp_sub.telno);
		getchar();
	}
	fclose(fp);
}



/* 显示根据订户名查出的订户详细信息. */

queryname()
{
	FILE *fp;
	struct subscriber temp_sub;
	char flag, vname[30];
	int size_s=sizeof(struct subscriber);

	if((fp=fopen("telefon.dat", "r"))==NULL)
	{
		printf("\n\nThe telephone directory could not be opened for reading.");
		getchar();
		return;
	}

	printf("\tVIEW SUBSCRIBER DETAILS");

	/* 接收订户名的输入. */

	printf("\n\nEnter Subscriber name: ");
	getchar();
	gets(vname);
	flag='n';
	fread(&temp_sub, size_s, 1, fp);
	while(!feof(fp))
	{
		/* 输入的名字是否和读取的名字相匹配. */
		if((strcmp(temp_sub.name,vname))==0)
		{
			flag='y';
			break;
		}
		fread(&temp_sub, size_s, 1, fp);
	}

	if(flag=='n') /* 未找到匹配名字. */
	{
		printf("\n\n\tSubscriber details not found");
		getchar();
	}
	else
	{
		printf("\n\tREQUESTED SUBSCRIBER DETAILS");
		printf("\n\nName: %s\nAddress: %s\nTelephone number: %ld", temp_sub.name, temp_sub.address, temp_sub.telno);
		getchar();
	}
	fclose(fp);
}



/*查看目录. */

viewdir()
{
	FILE *fp;
	struct subscriber viewsub;
	int i=0;
	int size_s=sizeof(struct subscriber);

	if((fp=fopen("telefon.dat", "r"))==NULL)
	{
		printf("\n\nThe telephone directory could not be opened.");
		getchar();
		return;
	}

	fread(&viewsub, size_s, 1, fp);
	while(!feof(fp))
	{
		i++;
		printf("\nRecord %d\t%s\t%s\t%ld", i, viewsub.name, viewsub.address, viewsub.telno);
		fread(&viewsub, size_s, 1, fp);
	}
	getchar();
	fclose(fp);
}

⌨️ 快捷键说明

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