背单词小程序.docx
《背单词小程序.docx》由会员分享,可在线阅读,更多相关《背单词小程序.docx(38页珍藏版)》请在冰豆网上搜索。
背单词小程序
软件工程专业
C++课程设计报告
一.课程设计目的及要求
1.设计目的
1.提高和加强计算机应用与软件开发能力,由初学者向专业的程序员过渡。
2.培养独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。
3.学习和掌握C++程序设计方法以及上机调试技巧,为今后学习其它专业课程打好基础。
2.设计要求(题目)
1)背单词小程序
2)学生选课系统
二.课程设计的具体实现
1)背单词小程序
1.总体设计
本程序主要有以下功能:
添加新词顺序测验和随即测验记录没背过的词查找单词的汉语或英语意思(输入中文查对应的英语意思,输入英文查
对应汉语意思)
各模块
执行完
3.未
4.英
3.已
进入程序,显
主要流
V6.
1•添
随
英
机
译
背单
背单
顺
汉
序
译
汉互
2•详细设计
具体实现包括十个模块和一个头文件。
分别是:
First.cpp,Main.cpp.
Menu.cpp,Partl.cpp,Part2.cpp,Part3.cpp,Part4.cpp,Part5.cpp,Part6.cpp五大功能粗实现.cpp,HEAD.H。
Meun函数
主要功能:
用户进入系统首先执行的就是主函数,然后进入主菜单函数,它将显示主界面,并提示用户选择所需的功能。
其中改变了屏幕和字体的颜色来构造一种欢快的气氛来学习。
主功能:
1.添加单词;2.进入检测;3.
已背单词;4.未背单词;5.英汉互译;6.退出。
请选择:
system("cls");//清屏
Add_word();、、调用添词函数cin>>j;
system("cls");
if(j==1)
{Add();}
elseif(j==2)
{
system("cls");
Frame();
}
else//尽量避免在使用程序时因操作引起的失误
{
cout«"认真一点!
(v_)#"<cout<<"回答问题决定您的方向:
"<cout<<"您是否对我的程序满意:
Y/N"<charch;
cin>>ch;
if(ch=='Y'||ch=='y')
{system("cls");Frame();}
else
{exit(0);}
}
}
elseif(i==2)
{
system("cls");
Test();
cin>>j;
if(j==1)
{
Test_ByOrder();
cout<<"任意键返回主目录!
"<charch;
cin>>ch;
if(ch=='b'||ch=='B')
{system("cls");Frame();}
else
{system("cls");Frame();}
}
elseif(j==2)
{
Test_Bylmmediately();
cout«"任意键返回主目录!
"<cin>>ch;
if(ch=='b'||ch=='B')
{system("cls");Frame();}
else
{system("cls");Frame();}
}
elseif(j==3)
添加单词
主要功能:
用户在主界面选择功能1后即执行添加单词模块。
它将提示用户输入添加单词,之前可以显示已存在的单词,利用while循环实现不定
量输入单词,最后保存到单词库
请选择:
主要使用技术:
文件指针(FILE*fp)while判断循环关键代码:
charch='Q';〃用来判断是否继续输入单词
if((fp=fopen("dictionary.txt","ab+"))==NULL)
{
cout«"文件无法打开!
"<//特别有成
}for(i=0;fread(&Word[i],sizeof(WoRD),1,fp)!
=0;i++){cout<就感的地方!
把以前的单词输出来展示
j=i;
while(ch=='q'||ch=='Q')//while循环支持不断向文件载入内容
{
coutvv"目前单词库单词存储量为:
"vvjvvendl;cout«"请分别输入新增单词的编号、单词、中文翻译和背
诵记录(tt/ff):
"<j++;
cin>>Word[j].num>>Word[j].E_word>>Word[j].C_word>>Word|j].TF;
fwrite(&Word[j],sizeof(WoRD),1,fp);
coutvv"添加成功!
是否继续增添单词,继续则输入
Q/q"«endl;
cin>>ch;
}
检测功能
主要功能:
用户在主界面选择功能2后即执行该模块。
在此模块中可以实现顺序检测和随机检测。
用户输入正确或错误都会给与提示!
并且可以输入想要检测的单词数量,量力而行。
主要技术:
文件的读出与写入,取随机数,if语句
关键代码:
if((fp=fopen("dictionary.txt","ab+"))==NULL)
{
cout<<"文件无法打开!
"<exit(0);
}for(i=0;ifread(&Word[i],sizeof(WoRD),1,fp);
cout<<"随即检测开始!
:
"<cout<<"请输入这次测试的单词量:
"<intp;
cin>>p;
if(p>=t)
for(i=0;i{
charword[10];
intj;
j=rand()%t;//产生随机数cout<cin>>word;if(strcmp(word,Word[j].E_word)==0)
{
cout<<"回答正确!
"<chartf[3]="tt";
strcpy(Word[i].TF,tf);//将信息记录在案!
}else
{
cout<<"回答错误!
"<chartf[3]="ff";strcpy(Word[i].TF,tf);
}
}
else
for(i=0;i
{
charword[10];
intj;
j=rand()%p;//产生随机数cout«Word[j].C_wordvv""<<"___"cin>>word;
if(strcmp(word,Word[j].E_word)==0)
{_cout«"回答正确!
"<chartf[3]="tt";
strcpy(Word[i].TF,tf);
}
else
{
coutvv"回答错误!
"<strcpy(Word[i].TF,tf);
}
关键代码:
if((fp=fopen("dictionary.txt","ab+"))==NULL)//打开文件并判断文件是否存在
{
cout<<"文件无法打开!
"<}for(i=0;ifread(&Word[i],sizeof(WoRD),1,fp);//将文件信息读出cout<<"已背过的单词:
"<for(i=0;i{
charch[5]="tt";
charcf[5]="TT";
if(strcmp(Word[i].TF,ch)==0||strcmp(Word[i].TF,cf)==0)//和英汉互译差不多的操作判断后输出
{
cout<}
}
未背单词
主要功能:
用户在主界面选择功能3后即执行该模块,能够显示尚未背诵的单词。
主要技术:
该模块只是调用和显示,主要用到了if函数和字符串处理和文件的读出技术。
-
-
-
-
关键代码:
if((fp=fopen("dictionary.txt","ab+"))==NULL){
cout«"文件无法打开!
"<exit(0);
}
for(i=0;i{
fread(&Word[i],sizeof(WoRD),1,fp);
}
cout«"未背过的单词:
"<for(i=0;i{
charch[5]="ff";
charcf[5]="FF";
if(strcmp(Word[i].TF,ch)==0||strcmp(Word[i].TF,cf)==0)
cout<"v英汉互译
主要功能:
用户在主界面选择功能5后即执行该模块,能够进行英汉互译功能。
主要技术:
该模块只是调用和显示,主要用到了if函数和字符串处理和文件的读出技术。
关键代码:
charE[20];〃用数组是为了下面的地址
WoRDWord[100];
if((fp=fopen("dictionary.txt","ab+"))==NULL)
{
cout«"文件无法打开!
"<exit(0);
}
for(i=0;ifread(&Word[i],sizeof(WoRD),1,fp);
cout«"输入其英文:
"<cin>>E;
for(i=0;i{cout<"<cin>>ch;
if(ch=='b'||ch=='B')
{system("cls");Frame();}else
{system("cls");Frame();}
头文件
本套程序一共有一个头文件。
HEAD.h用于定义单词结构体,共有“单词编号”,“单词英文”,“单词中文意思”,“标注”几项。
代码如下:
structWoRD//没有用WORD时因为#includevwindows.h>里有叫
WOR的O_Ob汗!
{
intnum;//单词编号
charE_word[20];//单词英文
charC_word[30];//单词中文意思
charTF[3];//用来标注是否背过
};
3.调试及问题解决
本套程序的调试中遇到过许多问题。
尤以以下几个最具代表性和启发性:
1.程序无法循环使用。
刚开始程序完成一项功能后就自动退出程序,总是不能再返回主菜单,这样程序也就显得特无力。
后来通过他人指导利用函数间相互调用完成了界面间自由往来!
而且利用清屏功能让程序显得干净明了!
voidFrame()
{
inti,j;
Menu();
cin>>i;
if(i==1)
{
system("cls");
Add_word();
cin>>j;
system("cls");
if(j==1)
{Add();}
elseif(j==2)
{
system("cls");
Frame();
}
else//尽量避免在使用程序时因操作引起的失误
{cout«"认真一点!
(J_)#"<"<Y/N"<>ch;
if(ch=='Y'||ch=='y')
{system("cls");Frame();}
else
{exit(0);}
}
}
2.文件的调入后的数据更新。
每次进行单词添加的时候都只能显示10个单词,但是我渴望的是把以前的单词输出来,再把这次添加的单词也输出来。
。
。
。
后来我利用一个数组把文件里的单词信息记录了一下,再把那个全局变量记录一共多少单词数,这样就使得程序对单词信息很清晰,单词更新也不再是问题!
voidFirst()//这个函数实现了文件信息的更新每次开始它
都可以将以前的文件内容跟现在串起来!
是我花费最长时间的地方!
T_T{
WoRDWord[100];
FILE*fp;
inti,j;
if((fp=fopen("dictionary.txt","ab+"))==NULL)
{
cout<<"文件无法打开!
"<exit(0);
}for(i=0;fread(&Word[i],sizeof(WoRD),1,fp)!
=0;i++)
{}
t=i;//将上次单词数赋给现在需要使用的t记录下来!
}
3.显示背诵过和为背诵过的单词不能实现
试过用bool,但是失败了!
。
一。
b汗后来我从int换到char又换到字符串!
利用字符串处理函数strcmp(str1,str2)==0实现了。
有时候就是一个很简单的问题,但是就是弄不好!
挺可恶!
if(strcmp(Word[i].TF,ch)==0||strcmp(Word[i].TF,cf)==0)//条件符合就输
出
{cout<}
4.关于重名
在用#include包含一些系统自带的头文件时会遇到自己的构造体或变量明和系统冲突,虽然这个知识点在课本一开始就知道了,但是真正在实战中还挺难发现。
必有WOR就在“windows.h”中存在。
5.一些遗憾对于文件流相关知识的不熟悉让我感觉很受挫!
不过没关系,我可以利用下一个程序去熟悉去掌握!
这个小程序中仍旧存在的种种问题让我也压力挺大的,但是迫于时间和考试只好将修改作罢了~~不过因此我也理解了那些已经在一线奋斗的前辈的苦恼,软件真的没有那么简单!
!
!
以下是附带代码:
•背单词的小程序
//头文件HEAD.H
structWoRD//没有用WORD时因为#include{
intnum;//单词编号
charE_word[20];//单词英文
charC_word[30];//单词中文意思
charTF[5];//用来标注是否背过
};
//FIRST.CPP
#include
#include
#include
#include"HEAD.H"
voidFrame();
#include
intt;
voidFirst()//这个函数实现了文件信息的更新每次开始它都可以将以前的文
件内容跟现在串起来!
是我花费最长时间的地方!
T_T
{
WoRDWord[100];
FILE*fp;
inti,j;
if((fp=fopen("dictionary.txt","ab+"))==NULL)
{
cout<<"文件无法打开!
"<exit(0);
}for(i=0;fread(&Word[i],sizeof(WoRD),1,fp)!
=0;i++)
{}
t=i;//将上次单词数赋给现在需要使用的t记录下来!
}
//MAIN.CPP
#include
#include"HEAD.H"
#include
voidFirst();
voidFrame();
voidmain()
{
system("color3E");//屏幕及字体颜色
SetConsoleTitle("英语也疯狂
老邓制作!
");//屏幕标题
First();
Frame();//Gamebegin!
}
MENU.CPP
#include
#include
#include
#include"HEAD.H"
externintt;//全局变量
voidAdd_word();
voidAdd();
voidTest();
voidTest_ByOrder();
voidTest_ByImmediately();
voidReview();
voidDone();
voidPreview();
voidDoing();
voidTranslate();
voidTransluate_EC();
voidTransluate_CE();
voidQuit();
voidMenu()//主菜单
{
\(A3A)/
"<cout<<"背单词cout<<""<cout<<"
①添加新词
"<cout<<"
"<cout<<"
②进入检测
"<cout<<"
"<cout<<"
③已背单词
"<cout<<"
"<cout<<"
④未背单词
"<cout<<"
"<cout<<"
⑤英汉互译
"<cout<<"
"<cout<<"
⑥返回现实
"<cout<<"
cout<<"请选择:
";}
voidFrame()
"<{
inti,j;
Menu();
cin>>i;
if(i==1)
{
system("cls");
Add_word();
cin>>j;
system("cls");
if(j==1)
{
Add();
}
elseif(j==2)
{system("cls");Frame();
}
else//尽量避免在使用程序时因操作引起的失误
cout<<"认真一点!
()#"<cout<<"回答问题决定您的方向:
"<cout<<"您是否对我的程序满意:
Y/N"<charch;
cin>>ch;
if(ch=='Y'||ch=='y')
{system("cls");Frame();}
else
{exit(0);}
}
}
elseif(i==2)
{
system("cls");
Test();
cin>>j;
if(j==1)
{
Test_ByOrder();
cout<<"任意键返回主目录!
"<charch;
cin>>ch;
if(ch=='b'||ch=='B')
{system("cls");Frame();}
else
{system("cls");Frame();}
}
elseif(j==2)
{
Test_ByImmediately();
cout<<"任意键返回主目录!
"<charch;
cin>>ch;
if(ch=='b'||ch=='B')
{system("cls");Frame();}
else
{system("cls");Frame();}
}elseif(j==3)
{
system("cls");
Frame();
}
else//尽量避免在使用程序时因操作引起的失误
{
cout<<"认真一点!
()#"<cout<<"回答问题决定您的方向:
"<cout<<"您是否对我的程序满意:
Y/N"<charch;
cin>>ch;
if(ch=='Y'||ch=='y')
{system("cls");Frame();}
else
{exit(0);}
}
}
elseif(i==3)
{
system("cls");
Review();
cin>>j;
if(j==1)
{
Done();
cout<<"任意键返回主目录!
"<charch;
cin>>ch;
if(ch=='b'||ch=='B')
{system("cls");Frame();}
else
elseif(j==2)
{system("cls");Frame();
}
else//尽量避免在使用程序时因操作引起的失误
{
cout<<"认真一点!
()#"<cout<<"回答问题决定您的方向:
"<cout<<"您是否对我的程序满意:
Y/N"<charch;
cin>>ch;if(ch=='Y'||ch=='y')
{system("cls");Frame();}
else
{exit(0);}
}
}
elseif(i==4)
{system("cls");
Preview();
cin>>j;if(j==1){
Doing();cout<<"任意键返回主目录!
"<cin>>ch;
if(ch=='b'||ch=='B')
{system("cls");Frame();}else
}elseif(j==2)
{
system("cls");
Frame();
}
else
{
cout<<"
//尽量避免在使用程序时因操作引起的失误
认真一点!
(J_)#”<cout<<"回答问题决定您的方向:
"<cout<<"您是否对我的程序满意:
Y/N"<cin>>ch;
if(ch=='Y'||ch=='y')
{system("cls");Frame();}
else
{exit(0);}
}
}elseif(i==5)
{
system("cls");
Translate();
cin>>j;
if(j==1)
{
Transluate_EC();
cout<<"任意键返回主目录!
"<cin>>ch;if(ch=='b'||ch=='B')
{system("cls");Frame();}else
elseif(j==2