打字练习课程设计分析_第1页
打字练习课程设计分析_第2页
打字练习课程设计分析_第3页
打字练习课程设计分析_第4页
打字练习课程设计分析_第5页
已阅读5页,还剩23页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页打字练习课程设计分析打字练习的课程设计分析以及代码

打字练习课程设计

单位电气与电子工程分院(系)专业电气与电子工程学号同学姓名指导老师

完成日期年月日

打字练习的课程设计分析以及代码

一个好的打字员也需要经过指法练习的磨练才能成才,同样,一个好的指法练习系统对一个打字员也是必不可少的工具。以下是用C语言编写的指法练习系统软件的设计报告。

一.系统功能

本程序完成简约的指法练习全程,实现测试打字过程中返回正确错误个数的功能,并显示用户测试成果。部分功能通过类似window界面实现,完全符合课程设计的要求。

二.系统总框图及函数定义及说明

系统总框图:

打字练习的课程设计分析以及代码

三.设计分析

程序主要以函数为模块,一个函数实现一个功能或一个设置项,为了阅读的方便,函数里又包含了自定义函数,最末主函数调用自定义的函数,整个过程清楚,各个函数独立性强。算法方面主要是产生随机字符这块要讨论一下,其他的大略也没什么好讨论的,基本都是输入输出操作。随机字符的产生我利用了数组的下标和random()函数,数组先给赋值了,三个数组就三种状况,达到了设计的要求。还有就是倒计时的实现,由于C语言不能同时执行两条语句,故在打字的过程中和倒计时不能同时实现,为了解决这个问题,我用了kbhit()假如键盘没输入就退出这次输入循环,让倒计时继续执行,当有键盘的输入这次的输入循环也就结束,也是让倒计时继续执行,问题解决。

四.程序存在的问题

由于本人水平有限,本程序存在一些问题,主要有以下几个方面:

1.在打字过程中,当打错了字时不能删掉重新输入,只能继续打下去,由于这个过程用的

是循环输入,当每入一字就结束了这个字的输入不能修改。

2.部分界面的输入没考虑用户各种输入的状况,当用户非正常输入时,系统可能会中止。3.没有考虑当用户选择背景字体颜色都一样时的状况〔这种状况导致界面没有东西显示,

主要就是背景和字体用了一样的颜色〕,只是用提示语句提示用户。

五.心得体会

经过两周的课程设计,对C语言有了更深刻的了解,学到了许多以前没了解过的函数和算法。一贯以来就认为C语言就是学编程的基础但用不上场,现在觉得它的确也能用上场了,可以编写软件。虽然只有短短的两周时间,却让我感悟许多。只要肯上心去做每件事情,最终的结果都会让人满足的。

六.程序源代码#includebios.h#includeconio.h#includestdio.h#includestdlib.h#includetime.h#defineLEFT0*4b00#defineRIGHT0*4d00#defineDOWN0*5000#defineUP0*4800

打字练习的课程设计分析以及代码

#defineESC0*011b#defineENTER0*1c0d#defineF10*3B00#defineF20*3C00#defineF30*3D00voidwelcome();

voidmenu();/*初始化界面*/voidSelectitem();/*定义菜单*/

voidEnter(intm,intn);/*菜单项选择项的详细功能*/voidDrawFrame(intleft,intup,intright,intdown,intte*tcolor,intbackgroundcolor);/*画边框*/

voidDrawSelectitem();/*显示主菜单*/

voidBlackTe*t(int*,inty,char*z);/*选中菜单*/voidMoveMl(intn,int*);/*菜单项选择项的掌握*/voidrun();/*详细操作*/voidStart();charchoosec[1];int*,y;

intfirst,second;voidUser();

charuname[15]=quan;intzz=300;voidBgcolor();

charbgcol[1]={'1',};voidCcolor();

charccol[1]={'7',};voidTime();intm=60;

voidRecore();FILE*fp;charhis[20];voidHelp();voidAbout();voidE*it();

intte*t*,te*ty;/*光标坐标,*行,y列*/structmenustruct/*菜单用的结构体*/{charname[12];/*主菜单名*/charstr[10][20];/*选项*/intn;}ml[3];/*选项数*/intkey;/*按键变量*/inti,j;

charsave[4096];/*保存文本区域空间*/charc[4096];/*清屏专用空间*/

打字练习的课程设计分析以及代码

/***主函数****/main(){

welcome();menu();run();}

voidwelcome(){

te*tbackground(BLUE);te*tcolor(7);

window(1,1,80,25);clrscr();goto*y(20,8);

printf(\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1);goto*y(20,9);

printf(\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1);goto*y(20,10);

printf(\1\1\1\1\1\1);goto*y(20,11);

printf(\1\1\1\1\1\1);goto*y(20,12);

printf(\1\1\1WELCOMETOMYTYPESYSTEM!\1\1\1);goto*y(20,13);

printf(\1\1\1Copyright(c)2022byQuan\1\1\1);goto*y(20,14);

printf(\1\1\1\1\1\1);goto*y(20,15);

printf(\1\1\1\1\1\1);goto*y(20,16);

printf(\1\1\1\1\1\1);goto*y(20,17);

printf(\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1);goto*y(20,18);

printf(\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1);goto*y(3,19);

printf(Pressanykeytocontine);getch();}

打字练习的课程设计分析以及代码

/*画window的界面*/voidmenu(){

te*tbackground(BLUE);window(1,1,80,25);clrscr();goto*y(1,2);

printf(%c,218);/*画左上角*/for(i=0;i78;i++)

printf(%c,196);/*画水平直线*/printf(%c,191);/*画右上角*/for(i=3;i=23;i++){

goto*y(1,i);

printf(%c,179);/*画垂直线*/goto*y(80,i);printf(%c,179);}

printf(%c,192);/*画左下角*/for(i=0;i78;i++)printf(%c,196);

printf(%c,217);/*画右下角*/goto*y(1,1);te*tcolor(7);for(i=0;i80;i++)

cprintf(%c,219);/*用符号实现画主菜单的灰色背景区*/Selectitem();/*调用选项函数*/DrawSelectitem();/*画选项*/

gette*t(2,3,78,23,c);/*保存当前文本区域*/goto*y(3,5);

printf(namerightrate);

if((fp=fopen(recore.t*t,r))==NULL){

goto*y(3,6);

printf(cannotopenfile);return;}

fread(his,20,1,fp);goto*y(3,6);

printf(%s,his);sleep(2);

window(1,1,80,25);

打字练习的课程设计分析以及代码

/*定义菜单*/

voidSelectitem(){

strcpy(ml[0].name,File(F1));/*下面的详细选项补空格是为了各菜单黑色背景相同*/

strcpy(ml[0].str[0],Start);strcpy(ml[0].str[1],E*it);

ml[0].n=2;/*strcpy(ml[1].name,setting(F2));

strcpy(ml[1].str[0],User);strcpy(ml[1].str[1],Bgcolor);strcpy(ml[1].str[2],Charcolor);strcpy(ml[1].str[3],Time);strcpy(ml[1].str[4],Recore);ml[1].n=5;

strcpy(ml[2].name,Help(F3));/*strcpy(ml[2].str[0],Helptopic);strcpy(ml[2].str[1],About);ml[2].n=2;}

/*显示主单名*/

voidDrawSelectitem(){

for(i=0;i3;i++)

RedTe*t(i,1,ml[i].name);/*}

/*正常显示菜单*/

RedTe*t(int*,inty,char*z){

te*tbackground(7);/*goto*y(3+**20,y);for(j=0;z[j];j++){

if(j==0)

te*tcolor(RED);/*else

te*tcolor(BLACK);

cprintf(%c,z[j]);/*}}

保存菜单的项数*/系统援助*/显示主菜单名,且首字母为红色*/设置背景颜色为浅灰色*/第一个字母显示红色*/输出菜单名*/

打字练习的课程设计分析以及代码

/*显示选中菜单*/

voidBlackTe*t(int*,inty,char*z){

te*tbackground(14);te*tcolor(15);

goto*y(3+20**,y);/*定位坐标*/

cputs(z);/*输出菜单名字符串*/}

/*画边框函数*/

voidDrawFrame(intl,intu,intr,intd,inttcolor,intbcolor){

te*tbackground(bcolor);/*背景颜色*/te*tcolor(bcolor);/*文本颜色*/for(i=l;i=r;i++)/*输出背景区域*/{

for(j=u;j=d;j++){

goto*y(i,j);

printf(%c,219);/*输出背景字符*/}}

te*tcolor(tcolor);/*边框颜色*/

for(i=u+1;id;i++)/*在背景区域内输出边框线*/{

goto*y(l,i);

cprintf(%c,179);/*垂直线*/goto*y(r,i);

cprintf(%c,179);}

for(i=l+1;ir;i++){

goto*y(i,u);

cprintf(%c,196);/*水平线*/goto*y(i,d);

cprintf(%c,196);}

goto*y(l,u);

cprintf(%c,218);/*左上角*/goto*y(r,u);

cprintf(%c,191);/*右上角*/goto*y(l,d);

cprintf(%c,192);/*左下角*/

打字练习的课程设计分析以及代码

goto*y(r,d);

cprintf(%c,217);/*右下角*/

/*gette*t(l+1,u+1,r-1,d-1,save1);*//*保存边框内区域*/}

/*显示详细下拉选择项目*/voidDrawMl(intn){

gette*t(1,1,80,25,save);/*保存被掩盖的地方*/BlackTe*t(n,1,ml[n].name);/*反选显示主菜单*/DrawFrame(3+20*n-1,2,3+20*n+19,3+ml[n].n,0,7);/*下拉菜单的边框*/for(i=3;i3+ml[n].n;i++)/*输出所选菜单各选项*/{

if(i==3)

BlackTe*t(n,i,ml[n].str[i-3]);/*默认选中第一项*/else

RedTe*t(n,i,ml[n].str[i-3]);/*其余各项首字符红色显示*/}

goto*y(79,1);

MoveMl(n,3);/*菜单项选择项的掌握*/}

/*菜单项选择项的掌握,n决断水平项,*决断下拉的选项*/voidMoveMl(intn,int*){

intflag=1;while(flag){

goto*y(79,1);

key=bioskey(0);/*接收按键*/goto*y(79,1);switch(key){

caseESC:/*退出循环*/

putte*t(1,1,80,25,save);/*复原打开菜单前的样子*/flag=0;break;

caseLEFT:/*移到左边的选项*/

putte*t(1,1,80,25,save);/*复原打开菜单前的样子*/

if(n==0)/*往左移动越界的话移到最末一个选项*/DrawMl(2);else

DrawMl(n-1);flag=0;

打字练习的课程设计分析以及代码

break;

caseRIGHT:/*移动右边的选项*/

putte*t(1,1,80,25,save);/*复原打开菜单前的样子*/if(n==2)/*往右移动越界的话移到第一个选项*/DrawMl(0);else

DrawMl(n+1);flag=0;break;

caseUP:/*详细选项往上移动*/

RedTe*t(n,*,ml[n].str[*-3]);/*输出红色字体*/if(*==3)/*移到最上面再按上键,就移到最下面*/*=3+ml[n].n-1;else

*--;/*移动到新的要显示的内容*/

BlackTe*t(n,*,ml[n].str[*-3]);/*输出黑色字体*/flag=1;break;

caseDOWN:/*详细选项往下移动*/RedTe*t(n,*,ml[n].str[*-3]);

if(*==(3+ml[n].n-1))/*移动到最底下再按下键就移到最上面*/*=3;else

*++;/*移动到新的要显示的内容*/BlackTe*t(n,*,ml[n].str[*-3]);flag=1;break;caseENTER:

putte*t(1,1,80,25,save);/*复原打开菜单前的样子*/Enter(n,*-3);/*菜单项选择项的详细功能*/flag=0;break;}

goto*y(79,1);}}

/*菜单项选择项的详细功能*/voidEnter(intm,intn){

switch(m){

case0:switch(n)/*选择了Start菜单项选择项*/{

打字练习的课程设计分析以及代码

case0:Start();break;/*开始打字测试*/case1:E*it();break;/*结束*/}break;/*退出系统*/

case1:switch(n)/*选择了Setting菜单项选择项*/{

case0:User();break;/*定义用户*/

case1:Bgcolor();break;/*转变背景颜色*/case2:Ccolor();break;/*转变字体*/

case3:Time();break;/*转变测试时间*/case4:Recore();/*显示全部用户记录*/}break;

case2:switch(n)/*选择了援助菜单项选择项*/{

case0:Help();break;case1:About();

}break;/*退出系统*/}}

/*按键操作过程*/voidrun(){

while(1){

goto*y(te*ty,te*t*);

key=bioskey(0);/*接收按键*/switch(key){

caseESC:

caseF1:DrawMl(0);break;/*file*/

caseF2:DrawMl(1);break;/*显示下拉菜单setting*/caseF3:DrawMl(2);break;/*显示下拉菜单help*/}}}

/*开始打字*/voidStart()

{intj,i,total=0;

floatright=0.0,wrong=0.0;

charch1[]=abcdefghijklmnopqrstuvw*yz;

charch2[]=ABCDEFGHIJKLMNOPQRSTUVW*YZabcdefghijklmnopqrstuvw*yz;

打字练习的课程设计分析以及代码

char

ch3[]=ABCDEFGHIJKLMNOPQRSTUVW*YZabcdefghijklmnopqrstuvw*yz1234567890~!@#$%^*()_+`./-=[]?,{}\|;':;chargch[300],out[300];charkey;

charrename[10];

floatrerate;clock_tbegin,end;

te*tbackground(bgcol[0]);te*tcolor(ccol[0]);window(2,3,79,23);clrscr();randomize();goto*y(1,1);

switch(choosec[0]){

case'1':

{for(j=0;jzz;j++){

i=random(26);if(j%77==0)

printf(\n\n\263);printf(%c,ch1[i]);out[j]=ch1[i];}}break;case'2':

{for(j=0;jzz;j++){

i=random(52);if(j%77==0)

printf(\n\n\263);printf(%c,ch2[i]);out[j]=ch2[i];}}break;case'3':

{for(j=0;jzz;j++){

i=random(94);if(j%77==0)

printf(\n\n\263);printf(%c,ch3[i]);

打字练习的课程设计分析以及代码

out[j]=ch3[i];}}break;default:

{for(j=0;jzz;j++){

i=random(26);if(j%77==0)

printf(\n\n\263);printf(%c,ch1[i]);out[j]=ch1[i];}}}

goto*y(2,4);begin=clock();first=time(NULL);j=0;do{

*=where*();y=wherey();

second=time(NULL);

if(difftime(second,first)==1){

goto*y(12,19);printf(%3d,m);m--;

first=second;}

goto*y(3,19);

printf(Resttime:);if(total!=0)

{goto*y(18,19);

printf(Rightrate:%4.4f%%\t\tpressentertoe*it,right/(right+wrong));}goto*y(3,20);

printf(Yourname:);goto*y(12,20);

printf(%s,uname);goto*y(27,20);

printf(right:%3.0fwrong:%3.0ftotal:%3d,right,wrong,total);goto*y(*,y);if(kbhit()!=0){

gch[j]=getch();

打字练习的课程设计分析以及代码

putchar(gch[j]);if((j+1)%77==0)

printf(\n\n\263);line:if(gch[j]=='\015')

{te*tbackground(RED);te*tcolor(GREEN);window(20,14,60,20);clrscr();goto*y(1,1);

printf(\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1);

goto*y(1,2);

printf(\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1);

goto*y(1,3);

printf(\1\1\1\1\1\1);goto*y(1,4);

printf(\1\1\1\1\1\1);goto*y(1,5);

printf(\1\1\1\1\1\1);goto*y(1,6);

printf(\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1);

goto*y(1,7);

printf(\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1);

goto*y(8,4);

printf(Areyousuretoe*it?(Y/N));goto*y(1,27);key=0;

while(key!='Y'key!='y'key!='N'key!='n'){key=getch();putchar(key);getch();

if(key=='N'||key=='n'){

te*tbackground(bgcol[0]);clrscr();

te*tbackground(bgcol[0]);te*tcolor(7);

打字练习的课程设计分析以及代码

window(2,3,79,23);goto*y(*,y);gch[j]=getch();putchar(gch[j]);if(gch[j]==out[j])right++;

elsewrong++;wrong--;}

if(key=='Y'||key=='y')e*it(0);}

gotoline;}

if(gch[j]==out[j])right++;else{

wrong++;sound(140);

delay(90000000);nosound();}j++;

total=right+wrong;}

end=clock();}

while((j!=zz)(m!=0));goto*y(27,20);printf(right:%3.0fwrong:%3.0fusetime:%3.0fS,right,wrong,total,(end-begin)/CLK_TCK);if((fp=fopen(recore.t*t,w))==NULL){goto*y(4,18);

printf(cannotopenfile);return;}

fscanf(fp,%c%5.4f,rename,rerate);if(strcmp(uname,rename)==0)

if(rerate(right/(right+wrong)))

fprintf(fp,%c5.4f%,uname,right/(right+wrong));else

fprintf(fp,%c5.4f%,uname,right/(right+wrong));fclose(fp);

window(1,1,80,25);

total:%3d

打字练习的课程设计分析以及代码

}

/*输入名字,模式,字数*/voidUser(){

te*tbackground(GREEN);te*tcolor(7);

window(2,3,79,23);clrscr();goto*y(2,3);

printf(Pleaseenteryourname:);goto*y(25,3);gets(uname);goto*y(2,4);

printf(Instruction:1.(veryeasy)OnlyLowercase.);goto*y(2,5);

printf(2.(easy)LowercaseandUppercase.);goto*y(2,6);

printf(3.(hard)Mi*turewithLowercase,Uppercase,NumberandSymbol.);goto*y(2,7);

printf(Pleasechoosethete*tmode(1-3):);goto*y(34,7);gets(choosec);goto*y(2,8);

printf(Pleaseenterthecount(1-300):);scanf(%d,zz);goto*y(2,9);

printf(Thete*tmodeyouchooesis:%s,choosec);goto*y(2,10);

printf(Yournameis:);printf(%s,uname);goto*y(2,11);

printf(Thecountyouchooseis:%d,zz);window(1,1,80,25);}

/*背景颜色*/voidBgcolor(){bgcol[0]=1;

te*tbackground(GREEN);te*tcolor(7);

window(2,3,79,23);clrscr();

打字练习的课程设计分析以及代码

goto*y(2,3);

printf(Colorinstruction:);goto*y(2,4);

printf(0-BLACK);goto*y(2,5);

printf(1-BLUE);goto*y(2,6);

printf(2-GREEN);goto*y(2,7);

printf(3-CYAN);goto*y(2,8);

printf(4-RED);goto*y(2,9);

printf(5-MAGENTA);goto*y(2,10);

printf(6-BROWN);goto*y(2,11);

printf(7-LIGHTGRAY);goto*y(2,12);

printf(Note:Te*tcolorandte*tbackgroundmustbedifferent!!!!!);goto*y(2,13);

printf(Pleaseenterthete*tbackground(0-7):);*=where*();y=wherey();

bgcol[0]=getch();if(bgcol[0]!='\033')putchar(bgcol[0]);

line1:if(bgcol[0]=='\033'){

goto*y(50,21);

printf(Areyousuree*it?(Y/N));goto*y(73,21);key=0;

while(key!='Y'key!='y'key!='N'key!='n'){key=getch();putchar(key);getch();

if(key=='N'||key=='n'){goto*y(50,21);

printf();goto*y(*,y);

bgcol[0]=getch();putchar(bgcol[0]);}

打字练习的课程设计分析以及代码

if(key=='Y'||key=='y')e*it(0);}gotoline1;}

goto*y(2,15);

printf(TheTe*tbackgroundyouchooseis:%c,bgcol[0]);window(1,1,80,25)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论