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