数据结构 背单词
作者:互联网
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define MAX_CHAR 20 // 最大字符 5 #define MAX_NUM 200 // 单词的最大个数 6 #define MAX_U 20 //用户人数 7 struct word 8 //单词的结构体 自定义类型 9 { 10 char en[MAX_CHAR]; // 英文形式 11 char ch[MAX_CHAR]; //中文形式 12 } s[MAX_NUM]; //单词数组 13 struct rankinglist 14 //用户名单结构体 15 { 16 char user[20]; 17 int c,d; //c为单词错误数,d为单词正确数 18 int core; //成绩 19 }r[MAX_U]; 20 int num; //单词个数 21 int num1=0; //用户数 22 int select=1;//select 为是否退出系统的标记 23 int d=0,c=0; 24 int core; //成绩 25 //检查数据选项 26 int panduan() 27 { 28 char c[50]; 29 scanf("%s",c); 30 if(c[1]=='\0'){ 31 if(c[0]>='0'&&c[0]<='9') 32 return c[0]-'0'; 33 } 34 else return 0; 35 } 36 //数据验证(英文) 37 int panduan1(char a[]){ //返回0不是英文单词,返回1是 38 int i; 39 for(i=0;i<20;i++){ //判断条件是i不是a[i]啊啊啊 40 if(a[i]>='a'&&a[i]<='z'||a[i]=='\0') continue; 41 else{ 42 printf("亲,这边建议您输入英文呢!"); 43 return 0; 44 } 45 } 46 return 1; 47 } 48 //从文件中读取单词的信息 49 void readfile() 50 { 51 FILE *fp; 52 int i=0; 53 fp=fopen("data.txt","r"); //“r”方式打开不允许改写文件 54 if(!fp) //说明没有文件 55 { 56 printf("\n打开文件data.txt失败!"); 57 58 } 59 while(fscanf(fp,"%s %s ",s[i].en,s[i].ch)==2) //以空格符,换行符等为结束标志,返回值为实际读取的字符串个数 60 { 61 i++; //读取下一个单词 62 } 63 num=i; 64 if(0==i) 65 printf("\n文件为空,请选择词典维护增加词条!"); 66 else 67 printf("\n"); 68 fclose(fp); //读取完毕,关闭文件 69 70 } 71 //从文件中写入单词的信息 72 void writefile() 73 { 74 FILE *fp; 75 int i=0; 76 fp=fopen("data.txt","w"); //初次写入的函数,所以用 “w"方式写入 77 if(!fp) 78 { 79 printf("\n打开文件data.txt失败!"); 80 81 } 82 for(i=0;i<num;i++) 83 { 84 fprintf(fp,"\n%s %s ",s[i].en,s[i].ch); //写入字符串(单词) 85 } 86 printf("\n"); 87 fclose(fp); 88 } 89 //实现排序对成绩 90 void sort0() 91 { 92 int i,j; 93 char temp[20]; 94 int t; 95 for(i=0;i<num1-1;i++) 96 { 97 for(j=num1-1;j>i;j--) 98 if(r[j-1].core<r[j].core) //一个内循环实现将最高的成绩放在第一个位置 99 { 100 strcpy(temp,r[j-1].user); //用户名交换 101 strcpy(r[j-1].user,r[j].user); 102 strcpy(r[j].user,temp); 103 t=r[j-1].c; //错误单词交换 104 r[j-1].c=r[j].c; 105 r[j].c=t; 106 t=r[j-1].d; //正确单词交换 107 r[j-1].d=r[j].d; 108 r[j].d=t; 109 t=r[j-1].core; //成绩交换 110 r[j-1].core=r[j].core; 111 r[j].core=t; 112 } 113 } 114 115 } 116 //读取用户的成绩 117 void readuser() 118 { 119 FILE *fp; 120 int i=0; 121 fp=fopen("ranklist.txt","r"); //“r”方式打开不允许改写文件 122 if(!fp) //说明没有文件 123 { 124 printf("\n打开文件ranklist.txt失败!"); 125 } 126 while(fscanf(fp,"%s %d %d %d ",r[i].user,&r[i].d,&r[i].c,&r[i].core)==4) //以空格符,换行符等为结束标志,返回值为实际读取的字符串个数 127 { 128 i++; //读取下一个单词 129 } 130 num1=i; 131 if(0==i) 132 printf("\n文件为空,请先创建用户名并参加测试单词!"); 133 else 134 printf("\n"); 135 fclose(fp); //读取完毕,关闭文件 136 } 137 //文件写入用户信息 138 void writeuser() 139 { 140 printf("留下你的名字:"); 141 scanf("%s",r[num1].user); 142 FILE *fp; 143 int i=num1; 144 fp=fopen("ranklist.txt","a"); // 145 r[i].c=c; 146 r[i].d=d; 147 r[i].core=10*d-10*c; 148 fprintf(fp,"\n%s %d %d %d ",r[i].user,r[i].d,r[i].c,r[i].core); 149 printf("\n"); 150 d=0; 151 c=0; //初始化为0,为下个用户所用 152 num1++; //用户加一 153 sort0(); 154 fclose(fp); 155 } 156 void sort()/*按字典排序*/ 157 { 158 int i,j; 159 char temp[MAX_CHAR]; 160 for(i=0;i<num-1;i++) 161 { 162 for(j=num-1;j>i;j--) 163 if(strcmp(s[j-1].en,s[j].en)>0) //一个内循环实现将最短的单词放在第一个位置 164 { 165 strcpy(temp,s[j-1].en); //英文交换 166 strcpy(s[j-1].en,s[j].en); 167 strcpy(s[j].en,temp); 168 strcpy(temp,s[j-1].ch); //中文交换 169 strcpy(s[j-1].ch,s[j].ch); 170 strcpy(s[j].ch,temp); 171 } 172 } 173 } 174 //添加单词信息 175 void add() 176 { 177 int i=num,j,flag=1; 178 while(flag) 179 { 180 flag=0; 181 printf("\n请输入单词的英文形式:"); 182 scanf("%s",s[i].en); // 183 if(panduan1(s[i].en)==0) { 184 flag=1; //continue之后不会结束 185 continue; 186 } 187 for(j=0;j<i;j++) //遍历一遍文件里的单词,检查有没有重复的单词 188 if(strcmp(s[i].en,s[j].en)==0) 189 { 190 printf("已有该单词,请检查后重新录入!\n"); 191 flag=1; 192 break; /*如有重复立即退出该层循环,提高判断速度,break只跳出了for循环,让用户再次输入*/ 193 } 194 195 } 196 printf("\n请输入单词的中文形式:"); 197 scanf("%s",s[i].ch); 198 num++; //单词数加1 199 printf("\n您输入的信息为: 英文: %s 中文: %s ",s[i].en,s[i].ch); 200 sort(); 201 } 202 //删除单词信息 203 void del() 204 { 205 int i=0,j=0; 206 char en[MAX_CHAR]; //英文形式 207 printf("\n请输入你要删除的单词英文形式:"); 208 scanf("%s",en); 209 for(i=0;i<num;i++)//先找到该英文形式对应的序号 210 if(strcmp(s[i].en,en)==0) 211 { 212 for(j=i;j<num-1;j++) //单词前移 213 s[j]=s[j+1]; 214 num--; //数量减少 1 215 return; 216 } 217 printf("\n没有这个单词!"); 218 219 } 220 //修改单词信息 221 void modify() 222 { 223 int i=0,choose=0,flag=1;//chooses代表菜单选项标识,flag代表是否找到单词 224 char en[MAX_CHAR]; //英文形式 225 while(flag||choose) 226 { 227 printf("\n请输入你要修改的单词英文形式:"); 228 scanf("%s",en); 229 for(i=0;i<num;i++)//先找到该英文形式对应的序号 230 if(strcmp(s[i].en,en)==0) 231 { 232 printf("\n请输入单词正确的英文形式:"); 233 scanf("%s",en); 234 235 printf("\n请输入此单词正确的的中文形式:"); 236 scanf("%s",s[i].ch); 237 238 printf("\n继续修改请按任意键,返回上一级请选0:"); 239 choose=panduan(); 240 if(choose==0) return; 241 } 242 flag=0; 243 244 } 245 if(!flag) printf("\n没有这个单词!"); //设计的真巧妙! 246 } 247 //查询单词(中文查询) 248 void search0() 249 { 250 int i=0,choose=0,flag=1; 251 char ch[MAX_CHAR]; //中文形式 252 while(choose||flag) 253 { 254 printf("\n请输入你要查询的单词中文形式:"); 255 scanf("%s",ch); 256 for(i=0;i<num;i++)//先找到该中文形式对应的序号 257 if(strcmp(s[i].ch,ch)==0) 258 { 259 printf("\n英文形式: 中文形式: "); 260 printf("\n %-12s%12s",s[i].en,s[i].ch); 261 262 printf("\n继续查询按任意键,返回上一级请选0:"); 263 choose=panduan(); 264 if(choose==0) return; 265 } 266 flag=0; 267 } 268 if(!flag) printf("\n没有这个单词!"); 269 } 270 //查询单词(英文查询) 271 void search1() 272 { 273 int i=0,choose=0,flag=1; 274 char en[MAX_CHAR]; //中文形式 275 while(choose||flag) 276 { 277 printf("\n请输入你要查询的单词英文形式:"); 278 scanf("%s",en); 279 for(i=0;i<num;i++)//先找到该中文形式对应的序号 280 if(strcmp(s[i].en,en)==0) 281 { 282 printf("\n英文形式: 中文形式: "); 283 printf("\n %-12s%12s",s[i].en,s[i].ch); 284 285 printf("\n继续查询请按任意键,返回上一级请选0:"); 286 choose=panduan(); 287 if(choose==0) return; 288 } 289 flag=0; 290 } 291 if(!flag) printf("\n没有这个单词!"); 292 } 293 //查询单词的选项 294 void selectword() 295 { 296 int x; //查询选项 297 int t=1; 298 while(t){ 299 printf("请选择查询类型:\n(1)英文查询 (2)中文查询\n"); 300 x=panduan(); 301 if(x==1){ 302 search1(); 303 t=0; 304 } 305 if(x==2){ 306 search0(); 307 t=0; 308 } 309 if(x!=1&&x!=2){ 310 printf("没有这个选项,请重新输入!"); 311 t=1; 312 } 313 } 314 } 315 //中译英测试 316 void zytest() 317 { 318 char b1[20]; 319 int z; 320 int choose=1; 321 int i; 322 //srand(time(NULL)); 323 while(choose) 324 { 325 i = rand()%num; 326 printf("\n【%s】的英文单词:",s[i].ch); 327 scanf("%s",b1); 328 for(z=0;strcmp(b1,s[i].en)!=0;z=z) 329 { if(c!=0) 330 { 331 printf("\n"); 332 printf("少年请重新来过吧!请记住它!错了2遍以上的单词:"); //对错误的单词进行重复记忆 (完善功能) 333 printf("\n英文形式: 中文形式: "); 334 printf("\n %-12s%12s",s[i].en,s[i].ch); 335 printf("\n"); 336 } 337 printf("\n输入错误!!请重新输入:");scanf("%s",b1);c=c+1; 338 } //错误加一 339 printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1; //正确加一 340 printf("\n继续测试请按任意键,返回上一级请选0:"); 341 choose=panduan(); 342 if(choose==0) return; 343 } 344 } 345 //英译中测试 346 void yztest() 347 { 348 char b1[20]; 349 int z; 350 int choose=1; 351 int i; 352 //srand(time(NULL)); 353 while(choose) 354 { 355 i = rand()%num; 356 printf("【%s】的中文意思:",s[i].en); 357 scanf("%s",b1); 358 for(z=0;strcmp(b1,s[i].ch)!=0;z=z) 359 { if(c!=0) 360 { 361 printf("\n"); 362 printf("少年请重新来过吧!请记住它!错了2遍以上的单词:"); //对错误的单词进行重复记忆 (完善功能) 363 printf("\n英文形式: 中文形式: "); 364 printf("\n %-12s%12s",s[i].en,s[i].ch); 365 printf("\n"); 366 } 367 printf("\n输入错误!!请重新输入:");scanf("%s",b1);c=c+1; 368 } //错误加一 369 printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1; 370 printf("\n继续测试请按任意键,返回上一级请选0:"); 371 choose=panduan(); 372 if(choose==0) return; 373 } 374 } 375 //成绩列表 376 void list() 377 { 378 printf("\n 共计输入错误:%d次 **每次扣10分**\n",c); 379 printf(" 共计输入正确:%d次 **每次加10分**\n",d); 380 printf(" 你的总得分为:%d分\n\n",10*d-10*c); 381 } 382 383 //词典维护 384 void maintain() 385 { 386 int choose;//维护功能选择 387 printf(" ------------------\n"); 388 printf(" 1.增加单词\n"); 389 printf(" 2.修改单词\n"); 390 printf(" 3.删除单词\n"); 391 printf(" 4.查询单词\n"); 392 printf(" 5.退出本菜单\n"); 393 printf(" ------------------\n"); 394 while(1) 395 { 396 printf(" \n请输入维护功能编号(按5退出):"); 397 choose=panduan(); 398 switch(choose) 399 { 400 case 1: 401 system("cls");add();writefile();break; 402 case 2: 403 system("cls");modify();writefile();break; 404 case 3: 405 system("cls");del();writefile();break; 406 case 4: 407 system("cls");selectword();break; 408 case 5: return; 409 default: printf("\n请在1-5之间选择"); 410 } 411 } 412 } 413 //用户界面 414 void menu() 415 { 416 int item; 417 printf("\n"); 418 printf(" *********************************************************\n"); 419 printf("# #\n"); 420 printf("# 英语单词小助手 #\n"); 421 printf("# #\n"); 422 printf("# 版本 : v1.0(改善版) #\n"); 423 printf("# #\n"); 424 printf(" *********************************************************\n"); 425 printf("# #\n"); 426 printf("# (1)词库维护 #\n"); 427 printf("# (2)单词背诵(中译英) #\n"); 428 printf("# (3)单词背诵(英译中) #\n"); 429 printf("# (4)查询成绩 #\n"); 430 printf("# (5)退出系统 #\n"); 431 printf("# #\n"); 432 printf("# 单词旅行开始 #\n"); 433 printf("# #\n"); 434 printf(" **********************************************************\n"); 435 printf("\n"); 436 printf(" 请选择您需要的操作序号(1-5)按回车确认:"); 437 438 item=panduan(); 439 printf("\n"); 440 readfile(); //打开文件好进行下一步操作 441 switch(item) 442 { 443 case 1: 444 system("cls");maintain();break; //单词维护 445 case 2: 446 system("cls");zytest();writeuser();break; //中译英 447 case 3: 448 system("cls");yztest();writeuser();break; //英译中 449 case 4: 450 system("cls");list();break; //查成绩 451 case 5: 452 select = 0;break; //退出 453 default: 454 printf("请在1-5之间选择\n"); 455 } 456 } 457 int main() 458 { 459 system("color FA"); 460 while(select) 461 { 462 menu(); 463 } 464 system("pause"); 465 return 0; 466 }
标签:en,int,MAX,ch,单词,strcpy,数据结构,背单词 来源: https://www.cnblogs.com/lhydbk/p/16476190.html