记单词

本文详细记录了改进单词小助手的过程,包括增加数据验证、排行功能和错词记忆功能。在数据验证方面,设计了判断英文输入的函数;排行功能通过用户结构体和文件存储实现;错词记忆则要求用户反复输入直至正确。同时,作者在调试过程中遇到的问题,如scanf的使用、switch语句的限制以及文件流操作的注意事项,也进行了总结和分享。
摘要由CSDN通过智能技术生成

一、题目分析
(1)题目描述:
单词小助手,要求完成以下任务:
1.改写程序为良好程序风格(文档注释,函数注释,语句注释)。
2.将单词测试中的功能完善,可针对做错的单词重复记忆。
3.查询单词的功能添加英文词查询,中文查询的功能完善(考虑如何显示同样中文意义,不同的英文单词)
提高要求:可将程序中的不足(如数据验证,排名功能)等根据自己的能力与理解完成。

(2)分析:
单词小助手:首先题目已经给出了基本的代码,也实现了基本的功能,比如说添加单词,修改,删除,查询,以及单词小测试等功能,还需要做的就是改善其中的功能,更进一步添加新的功能,比如说改善其中的数据验证,添加排行功能,错词重复记忆功能。

数据验证:
数据验证就是进行输入检查,包括进行输入菜单选择时的验证和输入单词的正确性检查。输入菜单选择时,用户选错的提示,因为scanf指定输入格式后,只能输入固定的格式,否则就会出现报错现象。当输入英文的时候,我们需要判断用户输入的是否为英文字母,如果是数字或者其他的什么字符就应该提醒,在此处我们需要加入一个判断函数--------if(a[i]>='a'&&a[i]<='z'||a[i]=='\0||a[i]==' '),专门判断英文输入正确性。

排行功能:
这里,可以添加一个专门存放排行榜用户信息的文件,建立一个用户的结构体,在单词小测试后输入用户名,将用户的错词,答对的词数以及成绩存入一个文件,并进行排序和显示出来。

错词记忆:
用户答错词时,用户需根据提示,重新输入词,直到输入正确为止。

二、算法构造
添加单词算法的流程图:
在这里插入图片描述
N–S盒图
在这里插入图片描述
排行榜的流程图:
在这里插入图片描述
排行榜的盒图:
在这里插入图片描述

三、算法实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_CHAR  20  // 最大字符
#define MAX_NUM  200  // 单词的最大个数
#define MAX_U 20       //用户人数 
 struct word
//单词的结构体
{
   
   char  en[MAX_CHAR]; // 英文形式
   char  ch[MAX_CHAR];   //中文形式
}  s[MAX_NUM]; //单词数组
 struct rankinglist
//用户名单结构体 
{
   
	char user[20];
	int c,d;       //c为单词错误数,d为单词正确数 
	int core;     //成绩 
}r[MAX_U];         
int   num;           //单词个数
int   num1=0;          //用户数 
int select=1;//select 为是否退出系统的标记
int d=0,c=0;
int core;    //成绩 
//帮助
void help()
{
   
    printf("\n本系统主要实现英语单词学习的功能。用户可对词典文件中的单词进行预览,增删改查。");
	printf("\n同时还可进行中译英、英译中测试。本系统还提供了测试成绩的显示功能。");
	printf("\n经过改善本系统添加了新的排行榜功能期待你来挑战第一名!另:还有错词循环记忆让你记忆不愁。"); 
}
//检查数据选项
int panduan()
{
   
	char c[50];
	scanf("%s",c); 
    if(c[1]=='\0'){
   
    	if(c[0]>='0'&&c[0]<='9')
    	return c[0]-'0';
	}
	else return 0;
} 
//数据验证(英文)
int panduan1(char a[]){
        //返回0不是英文单词,返回1是 
	int i;  
	for(i=0;i<20;i++){
         //判断条件是i不是a[i]啊啊啊 
		if(a[i]>='a'&&a[i]<='z'||a[i]=='\0') continue;
		else{
   
			printf("亲,这边建议您输入英文呢!");
			return 0;
		}      
	}
	return 1;
}
//从文件中读取单词的信息
void  readfile()
{
   
   FILE *fp;
   int i=0;
   fp=fopen("data.txt","r");   //“r”方式打开不允许改写文件 
   if(!fp)                     //说明没有文件 
   {
   
	   printf("\n打开文件data.txt失败!");

   }
   while(fscanf(fp,"%s %s ",s[i].en,s[i].ch)==2)  //以空格符,换行符等为结束标志,返回值为实际读取的字符串个数 
   {
                 
	   i++;                                       //读取下一个单词 
   }
   num=i;
   if(0==i)            
	   printf("\n文件为空,请选择词典维护增加词条!");
   else
	   printf("\n");
   fclose(fp);                                    //读取完毕,关闭文件 
 
}
//从文件中写入单词的信息
void  writefile()
{
   
   FILE *fp;
   int i=0;
   fp=fopen("data.txt","w");                     //初次写入的函数,所以用 “w"方式写入 
   if(!fp)
   {
   
	   printf("\n打开文件data.txt失败!");

   }
   for(i=0;i<num;i++)
   {
   
	   fprintf(fp,"\n%s %s ",s[i].en,s[i].ch);  //写入字符串(单词) 
   }
   printf("\n");
   fclose(fp);
}
 //实现排序对成绩
 void sort0()
 {
   
 	int i,j;
	char temp[20];
	int t; 
	for(i=0;i<num1-1;i++)
	{
   
		for(j=num1-1;j>i;j--)
			if(r[j-1].core<r[j].core)        //一个内循环实现将最高的成绩放在第一个位置 
			{
   
				strcpy(temp,r[j-1].user);            //用户名交换 
				strcpy(r[j-1].user,r[j].user);
				strcpy(r[j].user,temp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值