资源描述
学号
- 第2学期
《高档语言程序设计》
课程设计报告
题目:
文本编辑器设计
专业:
计算机科学与技术
班级:
14计科一班
姓名:
彭鑫
指引教师:
王峻
成绩:
计算机学院
4月24日
目 录
1 设计内容及规定 2
1.1设计内容 2
1.2详细规定 2
2 概要设计 2
2.1系统功能简介 2
2.2系统功能模块图 3
2.3各个模块之间重要关系 3
3 详细设计 4
3.1文献操作 4
3.2编辑操作 9
3.3工具操作 17
4 程序运营成果与调试 19
4.1 在调试过程中浮现某些问题 19
4.2 实验成果 20
5 课程设计总结与感想 24
参照文献 24
源代码 25
1 设计内容及规定
1.1设计内容
该文本编辑器运营后弹出文本编辑器主界面,由键盘输入或以打开方式输入或显示文本文献内容。其中程序编辑项可对当前文本进行撤销、删除、剪切、复制、粘贴、在文本里显示当前时间、全选、清除、查找、替代、记录等功能。程序文献项可以对电脑上txt,c++等格式文献打开、对当前文本保存和另存、对当前文本新建以及退出文本编辑系统。程序工具项为背景音乐,为顾客提供了优美动听音乐,仅在顾客编辑疲倦乏力时候尽情享用。最后在程序协助项有对该小型文本编辑器关于,用来简介该程序,尚有访问链接百度,访问114网页大全,为顾客提供查找资料等功能服务。
1.2详细规定
基本规定:编辑器应具备对文本文献打开、保存、新建、查找、插人、删除、修改、字符串替代、记录字数,记录行数等功能,对于超过一屏长文献,应可以分页显示。设计顾客接口命令,实现对文本编辑
2 概要设计
2.1系统功能简介
输入一页文字,程序实现文字、数字、空格记录;可以删除一行信息;查找定位单词;定行位置插入;文献存盘;装入文献;并能显示输入及其她功能。
2.2系统功能模块图
文本编辑器
文献
编辑
工具
协助
新建
打开
保存
另存
退出
复制
粘贴
剪切
清空
删除
清空
撤销
查找
替代
记录
全选
背景音乐
关于
连接百度
连接114
运营所需环境:win7及如下各版本windows,visual C++6.0。
2.3各个模块之间重要关系
该系统功能重要是实现文本输入,并对文本相应信息进行操作。各个模块之间关系是互相联系。一方面,主函数包括了所有子函数。主函数是整个系统核心。子函数之间也是有联系,对文本信息显示、删除、记录、查找、插入,存储,装入,必要是在文本信息输入状况下进行。因而对文本输入是非常重要。在文本删除、记录、查找、插入、存储、装入、保存所有子函数之间是没有多大联系。
3 详细设计
3.1文献操作
(1)文献新建实现:
int ret=MessageBox(NULL,TEXT("与否把更改保存到新建文本文档!!!"),TEXT("温馨提示"),MB_YESNO | MB_ICONQUESTION);
if(ret==IDYES) //依照选取如果保存
{
OPENFILENAME ofn; //文献对象
char szFile[MAX_PATH];//文献大小,最大
ZeroMemory(&ofn,sizeof(ofn));//文献初始化
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = TEXT('\0');
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0C++\0*.cpp\0"); //保存 文献类型
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.hwndOwner = hwnd;
ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
ofn.lpstrTitle=TEXT("保存");
if (GetSaveFileName(&ofn))
{
FILE *fp;
fp=fopen(szFile,"w"); //打开文献
if(fp==NULL)
{
MessageBox(NULL,TEXT("文献无法保存"),TEXT("呜呜"),MB_OK);
}
TCHAR str[10000];
TCHAR end[10000];
memset(end,0,10000);
GetDlgItemText(hwnd,IDC_EDIT1,str,sizeof(str));
fputs(str,fp);
fclose(fp);
}
SetDlgItemText(hwnd,IDC_EDIT1,"");
}
else
{
SetDlgItemText(hwnd,IDC_EDIT1,"");
}
(2)文献打开实现:
case ID_MENUITEMOPEN: //文本打开
{
OPENFILENAME ofn;
char szFile[MAX_PATH]; //保存途径变量
ZeroMemory(&ofn,sizeof(ofn));
在这里咱们使用ZeroMemory“函数”,ZeroMemory其实并不是函数,看一下ZeroMemory定义:
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szFile;
//szFile是一种字符数组,那么szFile这个名字就代表这个字符数组首地址
这是一种指针应用,把接受选取文献名数组地址传递到GetOpenFileName函数中。
ofn.lpstrFile[0] = TEXT('\0');
ofn.lpstrFile[0] = TEXT('\0');效果等价于ZeroMemory(szFile,sizeof(szFile)/sizeof(char));
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.txt\0");
文献过滤器
*.*就表达所有文献
*.txt就表达所有文本文献
abc*.*就表达所有以abc开头文献
abc*.txt就表达所有以abc开头文本文献(txt)
ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0");用“\0”分割出几种段,每两段是一组过滤器,每组第一种段代表过滤器显示值,而第二段表达真正过滤器
ofn.nFilterIndex = 1; //选取一种过滤器
ofn.lpstrFileTitle = NULL;
windows一种惯例:构造体指针类型别名普通是LP+构造体名字
GetOpenFileName(&ofn)而不是GetOpenFileName(ofn),由于GetOpenFileName函数要是OPENFILENAME指针
(8)只要顾客还没关闭对话框,那么GetOpenFileName函数是停住,同步模式PlaySound以及getchar、scanf是同样。
顾客关闭对话框,GetOpenFileName函数返回,返回值是BOOL,等于TRUE表达顾客选取了文献,如果等于FALSE就表达顾客选取了【取消】按钮
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.hwndOwner = hwnd;
ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if(GetOpenFileName(&ofn))
{
FILE *fp;
fp=fopen(szFile,"r");
if(fp==NULL)
{
MessageBox(NULL,TEXT("文献打开错误!"),TEXT("记事本"),MB_OK);
}
TCHAR line[256];
TCHAR end[10000];
memset(line,0,256);
memset(end,0,256);
while(!feof(fp))
{
fgets(line,sizeof(line),fp);
lstrcat(end,line);
int w=strlen(end);
end[w-1]='\0';
lstrcat(end,"\r\n");
}
SetDlgItemText(hwnd,IDC_RICHEDIT1,end);
fclose(fp); //关闭文献
}
break;
}
break;
(3)文献保存实现:
case ID_MENUITEMSAVE: //文本保存
{
OPENFILENAME ofnb;
char bcFile[MAX_PATH];
ZeroMemory(&ofnb,sizeof(ofnb));
ofnb.lStructSize = sizeof(ofnb);
ofnb.lpstrFile = bcFile;
ofnb.lpstrFile[0] = TEXT('\0');
ofnb.nMaxFile = sizeof(bcFile);
ofnb.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.txt\0");
ofnb.nFilterIndex = 1;
ofnb.lpstrFileTitle = NULL;
ofnb.nMaxFileTitle = 0;
ofnb.lpstrInitialDir = NULL;
ofnb.hwndOwner = hwnd;
ofnb.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST|OFN_OVERWRITEPROMPT;
if (GetSaveFileName(&ofnb))
{
FILE * fp = fopen (".txt","w"); //保存所有文献都为txt格式
TCHAR baoc [100000]; //保存最大容量为100000
GetDlgItemText(hwnd,IDC_RICHEDIT1,baoc,sizeof(baoc));
fputs(baoc,fp);
fclose(fp);
}
}
break;
(4)退出文本编辑器实现:
int ret=MessageBox(NULL,TEXT("与否把更改保存到新建文本文档!!!"),TEXT("温馨提示"),MB_YESNO | MB_ICONQUESTION);
if(ret==IDYES)
{
OPENFILENAME ofn;
char szFile[MAX_PATH];
ZeroMemory(&ofn,sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = TEXT('\0');
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0C++\0*.cpp\0");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.hwndOwner = hwnd;
ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
ofn.lpstrTitle=TEXT("保存");
if (GetSaveFileName(&ofn))
{
FILE *fp;
fp=fopen(szFile,"w");
if(fp==NULL)
{
MessageBox(NULL,TEXT("文献无法保存"),TEXT("呜呜"),MB_OK);
}
TCHAR str[10000];
TCHAR end[10000];
memset(end,0,10000);
GetDlgItemText(hwnd,IDC_EDIT1,str,sizeof(str));
fputs(str,fp);
fclose(fp);
}
MessageBox(NULL,TEXT("文献保存成功!放心关闭!!!"),TEXT("嘻嘻"),MB_OK);
}
EndDialog(hwnd,0);
3.2编辑操作:
(1)剪切实现:
case ID_MENUITEMCUT: //剪切
{ SendDlgItemMessage(hwnd,IDC_RICHEDIT1,WM_CUT,0,0);
//传递对话框中内容一方面获取RichEdit中内容,WM_CUT,传递要进行操作内容,0,0为两个WPARAM和LPARAM是商定消息参数类型。
break;
}
(2)复制实现:
case ID_MENUITEMCOPY: //复制
{ SendDlgItemMessage(hwnd,IDC_RICHEDIT1,WM_COPY,0,0);
//传递对话框中内容一方面获取RichEdit中内容,WM_COPY,,传递要进行操作内容,0,0为两个WPARAM和LPARAM是商定消息参数类型。
break;
}
(3)粘贴实现:
case ID_MENUITEMPASTE: //粘贴
{ SendDlgItemMessage(hwnd,IDC_RICHEDIT1,WM_PASTE,0,0);
break;
}
(4)清除实现:
case ID_MENUITEMEMPTY: //清除
{
SetDlgItemText(hwnd,IDC_RICHEDIT1,"");
break;
}
(5)撤销实现:
case ID_MENUITEMUNDO: //“撤销”菜单
{
SendDlgItemMessage(hwnd,IDC_RICHEDIT1,EM_UNDO,0,0);
break;
}
(6)删除实现:
case ID_MENUITEMDELETE: //删除
{
SendMessage(GetDlgItem(hwnd,IDC_RICHEDIT1),WM_CLEAR,0,0);
}
break;
(7)全选实现:
case ID_MENUITEMSELECTALL: //全选
{
SendMessage(GetDlgItem(hwnd,IDC_RICHEDIT1),EM_SETSEL,0,-1);
}
break;
(8)系统时间实现:
VOID CALLBACK MyTimerFun(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime)
{
SYSTEMTIME strLocal; //当前时间
GetLocalTime(&strLocal);
TCHAR str[256];
wsprintf(str,"%04d-%02d-%02d %02d:%02d:%02d",strLocal.wYear,strLocal.wMonth,
strLocal.wDay,strLocal.wHour,strLocal.wMinute,strLocal.wSecond);
SetDlgItemText(hwnd,IDC_EDIT2,str);
}
(9)查找功能实现:
int count=0;
int Line_count=1;
int Row_count=1;
int num=0;
int flag=0;
TCHAR str1[256];
TCHAR temp1[5000];
TCHAR temp2[5000];
memset(temp1,0,5000);
memset(temp2,0,5000);
memset(str1,0,256);
GetDlgItemText(hwnd,IDC_EDIT_FINDWORD,str1,sizeof(str1));
if(strlen(str1)==0)
{
MessageBox(NULL,TEXT("查找内容为空,请输入内容后再查找!!!"),TEXT("呜呜"),MB_OK);
}
else
{
int i=0;
int j=0;
while(str2[i]!='\0' )
{
if((str2[i]=='\n') || (Row_count==63))
{
Line_count++;
Row_count=0;
}
if(str2[i]==str1[j])
{
i++;
j++;
Row_count++;
if(str1[j]=='\0')
{
j=0;
count++;
wsprintf(temp2,"<%i>你要寻找内容在第:%i 行,第:%i 列至第:%i 列!!!",count,Line_count,(Row_count-strlen(str1)),(Row_count-1));
strcat(temp1,temp2);
strcat(temp1,"\r\n");
flag=1;
}
}
else
{
i=i-j+1;
j=0;
Row_count++;
}
if(str2[i]=='\0' && flag==1)
{
SetDlgItemText(hwnd,IDC_EDIT2,temp1);
MessageBox(NULL,temp1,TEXT("嘿嘿"),MB_OK);
}
if(str2[i]=='\0' && flag==0)
{
MessageBox(NULL,TEXT("没有你想要找内容,请重新输入查找内容"),TEXT("呜呜"),MB_OK);
break;
}
}
}
}
break;
通过简朴字符串比配算法实现其功能。
(10)替代功能实现:
TCHAR *change::D_change(TCHAR S[],TCHAR T1[] ,TCHAR T2[]) //替代功能主算法
{
int i=0;
int j=0;
int k=0;
int l=0;
TCHAR *S1;
while((S[i]!='\0'))
{
if(S[i]==T1[j])
{
i++;
j++;
count1=i;
}
else
{
i=i-j+1;
j=0;
count1=i;
}
if(T1[j]=='\0')
{
i=i-j;
if(strlen(T1)==strlen(T2))
{
int num1=strlen(T1);
for(k=i;k<i+num1;k++)
{
S[k]=T2[l];
l++;
}
j=0;
l=0;
}
else if(strlen(T1)>strlen(T2))
{
int num2=strlen(T1)-strlen(T2);
int lengthT2=strlen(T2);
for(k=i;k<strlen(S)-num2;k++)
{
S[k]=S[k+num2];
}
for(k=(strlen(S)-num2);k<=strlen(S);k++)
{
S[k]='\0';
}
for(k=i;k<(i+lengthT2);k++)
{
S[k]=T2[l];
l++;
}
j=0;
l=0;
}
else if(strlen(T1)<strlen(T2))
{
int num3=strlen(T2)-strlen(T1);
S1=new TCHAR[strlen(S)+num3];
for(int k=0;k<i;k++)
{
S1[k]=S[k];
}
for(int k2=i;k2<strlen(T2)+i;k2++)
{
S1[k2]=T2[k2-i];
}
for(int k3=i+strlen(T1);k3<strlen(S);k3++)
{
S1[k3+num3]=S[k3];
}
S1[k3+num3]='\0';
if(S[i]=='\0')
{
return S1;
}
else
{
strcpy(S,S1);
j=0;
}
}
}
}
return S;
}
也通过字符算比配,一一找到后,一一替代,最后返回替代后文本内容;
(11)记录功能实现:
void Total_OnCommand(HWND hwnd,int id,HWND hwndCtl,UINT codeNotify)
{
int Line_count=1;
int Row_count=0;
int Total_count=0;
int English_count=0;
int math_count=0;
int other_count=0;
int space_count=0;
int punct_count=0;
TCHAR temp1[256];
TCHAR temp2[256];
memset(temp1,0,256);
memset(temp2,0,256);
int i=0;
while(total2[i]!='\0')
{
if((total2[i]!=' ') && (total2[i]!='\r') && (total2[i]!='\n'))
{
Total_count++;
}
if((total2[i]>='a' && total2[i]<='z') || (total2[i]>='A' && total2[i]<='Z'))
{
English_count++;
}
if(total2[i]>='0' && total2[i]<='9')
{
math_count++;
}
if(total2[i]==33 || total2[i]==34 || total2[i]==39 || total2[i]==44 || total2[i]==46 || total2[i]==58 || total2[i]==59 || total2[i]==63)
{
punct_count++;
}
if(total2[i]==' ')
{
space_count++;
}
if((total2[i]=='\n') || (Row_count==62))
{
Line_count++;
Row_count=0;
}
else
{
Row_count++;
}
i++;
}
other_count=Total_count-English_count-math_count-punct_count;
wsprintf(temp2,"<1>文本行数为:%i !",Line_count-1);
strcat(temp1,temp2);
strcat(temp1,"\r\n");
memset(temp2,0,256);
wsprintf(temp2,"<2>文本总字符数为:%i !",Total_count);
strcat(temp1,temp2);
strcat(temp1,"\r\n");
memset(temp2,0,256);
wsprintf(temp2,"<3>文本英文字符数为:%i !",English_count);
strcat(temp1,temp2);
strcat(temp1,"\r\n");
memset(temp2,0,256);
wsprintf(temp2,"<4>文本数字字符数为:%i !",math_count);
strcat(temp1,temp2);
strcat(temp1,"\r\n");
memset(temp2,0,256);
wsprintf(temp2,"<5>文本空格数为:%i !",space_count);
strcat(temp1,temp2);
strcat(temp1,"\r\n");
memset(temp2,0,256);
wsprintf(temp2,"<6>文本标点符号数为:%i !",punct_count);
strcat(temp1,temp2);
strcat(temp1,"\r\n");
memset(temp2,0,256);
wsprintf(temp2,"<7>文本其他字符数为:%i !",other_count);
strcat(temp1,temp2);
strcat(temp1,"\r\n");
memset(temp2,0,256);
SetDlgItemText(hwnd,IDC_EDIT1,temp1);
}
通过传参,把文本信息传到副对话框中。然后对文本进行各项简朴记录
3.3工具操作:
(1)北京音乐实现:
case ID_MENU_MUSIC:
{
TCHAR shortPath[MAX_PATH];
GetShortPathName("C:\\Documents and Settings\\user\\桌面\\edit\\邓紫棋 - 寂寞星球玫瑰.mp3",shortPath,sizeof(shortPath)); //获取音乐途径
TCHAR cmd[MAX_PATH+10];
wsprintf(cmd,"play %s",shortPath);
mciSendString(cmd," ",0,NULL);
int ret = MessageBox(NULL,TEXT("你当前正在享有音乐!!!与否要退出"),TEXT("嘻嘻"),MB_YESNO | MB_ICONQUESTION);
if(ret==IDYES)
{
MessageBox(NULL,TEXT("还好听吧!欢迎再欣赏!再会!!!"),TEXT("嘿嘿"),MB_OK);
mciSendString("CLOSE cmd"," ",0,NULL);
break;
}
else
{
break;
}
break;
}
重要是通过mciSendString()API函数使用。
3.4关于操作:
(1)关于对话框弹出实现:
case ID_MENU_ABOUT:
{
HINSTANCE hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
DialogBox(hInstance,MAKEINTRESOURCE(IDD_ABOUT),NULL,Main_Proc);
break;
}
用DialogBox()函数实现对话框弹出。
(2)访问百度实现:
case IDM_百度: //访问百度网
{
ShellExecute(hwnd,TEXT("open"),TEXT("www.百度.com"),NULL,NULL,SW_SHOWNORMAL);
break;
}
(3)访问114实现:
case IDM_GOOGLE:
{
ShellExecute(hwnd,TEXT("open"),TEXT(""),NULL,NULL,SW_SHOWNORMAL);
break;
}
都是ShellExecute()函数使用。
4 程序运营成果与调试
4.1在调试过程中浮现某些问题
(1)输入语句中没有加取地址符号&
(2)误把取地址运算符&当作逻辑与&&
(3)误把赋值=当恒等==
(4)条件语句(if)后误加分号
(5)循环语句中变化了循环变量
(6)作为输出成果变量没有赋初值
4.2 实验成果
(1)记事本主界面
(2)编辑器中操作项
(3)编辑器中编辑项
(4)编辑器中工具项
(5)编辑器中协助项
(6)打开文献测试
(7)查找项测试
(8)替代项测试
(9)替代项测试
5 课程设计总结与感想
通过本次课程设计,我学到了诸多:增强了查阅有关参照资料能力;独立分析解决问题能力;创新精神;自己上机动手能力;自己对课程设计理解,得到诸多启示,懂得了后来要加强哪一方面,尚有哪一方面有用,课程设计为咱们提供了一种即动手又动脑、独立实践机会,将课本上知识理论和实际有机结合起来,锻炼了咱们分析解决实际问题能力。提高离咱们适应实际,实践编程能力。
参照文献:
[1] 谭浩强 《c++面向对象程序设计》 清华大学出版社
[2] 王红梅、胡明、王涛 《数据构造(C++版)》 清华大学出版社
[3] 如鹏网 《c语言也能看大事 》 如鹏网
源代码
int ret=MessageBox(NULL,TEXT("与否把更改保存到新建文本文档!!!"),TEXT("温馨提示"),MB_YESNO | MB_ICONQUESTION);
if(ret==IDYES) //依照选取如果保存
{
OPENFILENAME ofn; //文献对象
char szFile[MAX_PATH];//文献大小,最大
ZeroMemory(&ofn,sizeof(ofn));//文献初始化
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = TEXT('\0');
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0C++\0*.cpp\0"); //保存文献类型
展开阅读全文