C语言程序设计:“编辑单词本”功能编写

概述

索引文章中我们提到过,编辑单词本功能,包括实现增加、修改、删除、补充单词等功能,因此需要先编写一个菜单子函数,用来进行功能选择,然后再编写对应的子程序,具体代码如下:

菜单函数

void Vocabulary()
{
	int i;
	do{
			printf("1.增加单词\n");
	        printf("2.查找单词\n");
	        printf("3.删除单词\n");
			printf("0.返回主菜单\n");
			printf("请输入你的选择:");
			scanf("%d",&i);
			getchar();
			switch(i)
			{
			case 1: 
				addword();  //跳转对应增加单词的子函数
				break;
			case 2:
				findword();//跳转对应查找单词的子函数
				break;
			case 3: delword();	//delword()为删除单词对应子函数
				break;
			case 0:
				system("cls");
				Menu();
				break;
			default:printf("请输入正确选项!\n");
			}

	}while(i);
}

“删除单词”子函数

void delword()
{
	int ch=0,count=0,count1=0;  //定义整形数
	char del[500];              //定义字符数组,用来存储用户输入的(需要删除的)内容
	typedef struct stu          //定义结构体
	{
		int j;
		char px[500];
		char zw[500];
	}dcxx;
	dcxx dcsj[1000];            //定义结构体数组,用来存储单词数据
	int i=0;
	FILE *fp1,*fp2;               //定义文件指针
	fp1=fopen("D:\\Ctext\\danciben.txt","r+");   //两个文件指针分别指向两个文件
	fp2=fopen("D:\\Ctext\\danciben1.txt","w+");  //以“w+”的形式打开,若没有此文件则自动创建
	if(!fp1)                    //判断文件是否成功打开
	{
		printf("file error\n");
		exit(1);
	};
	if(!fp2)
	{
		printf("file error\n");
		exit(1);
	};
	fscanf(fp1,"%d%s%s",&dcsj[i].j,dcsj[i].px,dcsj[i].zw);  //将文件中的单词数据读出并存储到结构体数组
	while(!feof(fp1))
	{
		i++;
		fscanf(fp1,"%d%s%s",&dcsj[i].j,dcsj[i].px,dcsj[i].zw);
	}
	fclose(fp1);   //关闭文件
	count=i;        //记录单词总数
	printf("请输入你要删除的单词(中文或英文):\n");
	scanf("%s",del);  //读取用户需要删除的单词
	for (i=0;i<count+1;i++)  //判断文件中有没有用户想要删除的单词
    {
		if(!strcmp(del,dcsj[i].px))  //进行英文比对
          {
           ch=1;  //改变ch的值,便于之后判断是否找到该单词
           printf("已找到该单词并删除!\n");
		   count1=i;    //记录单词在结构体数组中的位置
		   break;       //若找到单词则退出for循环
		  }
		if(!strcmp(del,dcsj[i].zw))  //进行中文比对
			{
           ch=1;
           printf("已找到该单词并删除!\n");
		   count1=i;
		   break;
		  }
	}
	if(ch==0) //若找不到该单词,则运行此步骤
	{
		printf("查不到该单词!\n");
		return 0;
		//Menu();
	}
	dcsj[count].j=0;   //对结构体数组进行赋值,便于之后for循环的终止
	strcpy(dcsj[count+1].px,"###");
	strcpy(dcsj[count+1].zw,"###");
	for(i=count1;i<count;i++)  //从要删除的单词的位置开始,进行for循环,依次将单词“往前移”,覆盖要删除的单词
	{
		dcsj[i]=dcsj[i+1];
	}
	i=0;  //对i进行重新赋值
	printf("更新后的单词表为:\n");
	while(dcsj[i].j!=0)   //输出更新后的单词表,并将更新后的单词写入单单词本副本文件中
	    {
		  fprintf(fp2,"%d %s %s\n",i+1,dcsj[i].px,dcsj[i].zw);
		  printf("%d %s %s\n",i+1,dcsj[i].px,dcsj[i].zw);
		  i++;
	    };
    if (remove("D:\\Ctext\\danciben.txt") != 0)  //删除原来存储单词的文件,并判断是否成功删除
    printf("文件删除失败!\n");
	fclose(fp2); //关闭文件
	rename("D:\\Ctext\\danciben1.txt","D:\\Ctext\\danciben.txt");  //将单词本副本文件重命名为单词本文件
}

效果图

菜单栏

编辑菜单

选择“删除单词”功能

删除功能

删除“happy”单词

删除“happy”

单词本前后对比

删除前:
单词本(删除前)
删除后:
单词本(删除后)
易知“删除单词”子函数实现了删除单词并更新单词本的功能。

后记

(1)“删除单词”功能的实现思路是先将单词本中所有信息读取到结构体中,然后通过循环实现单词定位,对结构体进行“删除单词”操作后,结构体中存储的即为按要求操作后的最新单词本;此时编写程序实现将结构体中的单词本信息写入一个新的文件(“danciben1”),将旧的“danciben”文件删除,再将“danciben1”文件重命名为“danciben”文件,即实现了单词删除功能。
(2)增加单词、修改单词等功能的实现与“删除单词”功能的实现原理一样,笔者在此不再赘述,有需要的伙伴根据需要对上述代码进行稍微修改即可。
(3)上述界面并没有很美观,有需要的伙伴可以参考前文提到的“printInfo()”界面美化函数对上述代码进行修改。

猜你喜欢

转载自blog.csdn.net/weixin_46269688/article/details/106662436