打字练习课程设计分析

更新时间:2023-04-21 06:08:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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

打字练习课程设计

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

完成日期 年 月 日

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

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

一.系统功能

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

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

系统总框图:

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

三.设计分析

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

四.程序存在的问题

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

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

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

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

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

五.心得体会

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

六.程序源代码 #include <bios.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800

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

#define ESC 0x011b #define ENTER 0x1c0d #define F1 0X3B00 #define F2 0X3C00 #define F3 0X3D00 void welcome();

void menu();/*初始化界面*/ void Selectitem();/*定义菜单*/

void Enter(int m,int n);/*菜单选项的具体功能*/ void DrawFrame(int left,int up,int right,int down,int textcolor,int backgroundcolor);/*画边框*/

void DrawSelectitem();/*显示主菜单*/

void BlackText(int x,int y,char *z);/*选中菜单*/ void MoveMl(int n,int x);/*菜单选项的控制*/ void run();/*具体操作*/ void Start(); char choosec[1]; int x,y;

int first,second; void User();

char uname[15]="quan"; int zz=300; void Bgcolor();

char bgcol[1]={'1',}; void Ccolor();

char ccol[1]={'7',}; void Time(); int m=60;

void Recore(); FILE *fp; char his[20]; void Help(); void About(); void Exit();

int textx,texty; /*光标坐标,x行,y列*/ struct menustruct /*菜单用的结构体*/ { char name[12]; /*主菜单名*/ char str[10][20]; /*选项*/ int n; }ml[3]; /*选项数*/ int key; /*按键变量*/ int i,j;

char save[4096]; /*保存文本区域空间*/ char c[4096]; /*清屏专用空间*/

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

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

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

void welcome() {

textbackground(BLUE); textcolor(7);

window(1,1,80,25); clrscr(); gotoxy(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"); gotoxy(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"); gotoxy(20,10);

printf("\1\1\1 \1\1\1"); gotoxy(20,11);

printf("\1\1\1 \1\1\1"); gotoxy(20,12);

printf("\1\1\1 WELCOME TO MY TYPE SYSTEM! \1\1\1"); gotoxy(20,13);

printf("\1\1\1 Copyright(c)2004 by Quan \1\1\1"); gotoxy(20,14);

printf("\1\1\1 \1\1\1"); gotoxy(20,15);

printf("\1\1\1 \1\1\1"); gotoxy(20,16);

printf("\1\1\1 \1\1\1"); gotoxy(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"); gotoxy(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"); gotoxy(3,19);

printf(" Press any key to contine......"); getch(); }

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

/*画window的界面*/ void menu() {

textbackground(BLUE); window(1,1,80,25); clrscr(); gotoxy(1,2);

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

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

gotoxy(1,i);

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

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

printf("%c",217); /*画右下角*/ gotoxy(1,1); textcolor(7); for(i=0;i<80;i++)

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

gettext(2,3,78,23,c); /*保存当前文本区域*/ gotoxy(3,5);

printf("name rightrate");

if((fp=fopen("recore.txt","r"))==NULL) {

gotoxy(3,6);

printf("cannot open file"); return; }

fread(&his,20,1,fp); gotoxy(3,6);

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

window(1,1,80,25);

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

/*定义菜单*/

void Selectitem() {

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

strcpy(ml[0].str[0],"Start "); strcpy(ml[0].str[1],"Exit ");

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],"Help topic "); strcpy(ml[2].str[1],"About "); ml[2].n=2; }

/*显示主单名*/

void DrawSelectitem() {

for(i=0;i<3;i++)

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

/*正常显示菜单*/

RedText(int x,int y,char *z) {

textbackground(7); /* gotoxy(3+x*20,y); for(j=0;z[j];j++) {

if(j==0)

textcolor(RED); /* else

textcolor(BLACK);

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

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

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

/*显示选中菜单*/

void BlackText(int x,int y,char *z) {

textbackground(14); textcolor(15);

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

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

/*画边框函数*/

void DrawFrame(int l,int u,int r,int d,int tcolor,int bcolor) {

textbackground(bcolor); /*背景颜色*/ textcolor(bcolor); /*文本颜色*/ for(i=l;i<=r;i++) /*输出背景区域*/ {

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

gotoxy(i,j);

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

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

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

gotoxy(l,i);

cprintf("%c",179); /*垂直线*/ gotoxy(r,i);

cprintf("%c",179); }

for(i=l+1;i<r;i++) {

gotoxy(i,u);

cprintf("%c",196); /*水平线*/ gotoxy(i,d);

cprintf("%c",196); }

gotoxy(l,u);

cprintf("%c",218); /*左上角*/ gotoxy(r,u);

cprintf("%c",191); /*右上角*/ gotoxy(l,d);

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

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

gotoxy(r,d);

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

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

/*显示具体下拉选择项目*/ void DrawMl(int n) {

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

if(i==3)

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

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

gotoxy(79,1);

MoveMl(n,3); /*菜单选项的控制*/ }

/*菜单选项的控制,n决定水平项,x决定下拉的选项*/ void MoveMl(int n,int x) {

int flag=1; while(flag) {

gotoxy(79,1);

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

case ESC: /*退出循环*/

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

case LEFT: /*移到左边的选项*/

puttext(1,1,80,25,save); /*恢复打开菜单前的样子*/

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

DrawMl(n-1); flag=0;

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

break;

case RIGHT:/*移动右边的选项*/

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

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

case UP:/*具体选项往上移动*/

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

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

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

case DOWN:/*具体选项往下移动*/ RedText(n,x,ml[n].str[x-3]);

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

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

puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/ Enter(n,x-3);/*菜单选项的具体功能*/ flag=0; break; }

gotoxy(79,1); } }

/*菜单选项的具体功能*/ void Enter(int m,int n) {

switch(m) {

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

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

case 0:Start();break;/*开始打字测试*/ case 1:Exit();break;/*结束*/ } break;/*退出系统*/

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

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

case 1: Bgcolor();break;/*改变背景颜色*/ case 2: Ccolor();break;/*改变字体*/

case 3: Time();break;/*改变测试时间*/ case 4: Recore();/*显示所有用户记录*/ } break;

case 2:switch(n) /*选择了帮助菜单选项*/ {

case 0:Help();break; case 1:About();

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

/*按键操作过程*/ void run() {

while(1) {

gotoxy(texty,textx);

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

case ESC:

case F1: DrawMl(0);break;/*file*/

case F2:DrawMl(1);break;/*显示下拉菜单setting*/ case F3:DrawMl(2);break;/*显示下拉菜单help*/ } } }

/*开始打字*/ void Start()

{int j,i,total=0;

float right=0.0,wrong=0.0;

char ch1[]="abcdefghijklmnopqrstuvwxyz";

char ch2[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

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

char

ch3[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$%^&*()_+`.<>/-=[]?,{}\|;':"; char gch[300],out[300]; char key;

char rename[10];

float rerate; clock_t begin,end;

textbackground(bgcol[0]); textcolor(ccol[0]); window(2,3,79,23); clrscr(); randomize(); gotoxy(1,1);

switch(choosec[0]) {

case '1':

{for(j=0;j<zz;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;j<zz;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;j<zz;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;j<zz;j++) {

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

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

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

x=wherex(); y=wherey();

second=time(NULL);

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

gotoxy(12,19); printf("%3d",m); m--;

first=second; }

gotoxy(3,19);

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

{ gotoxy(18,19);

printf("Rightrate:%4.4f%%\t\tpress enter to exit",right/(right+wrong));} gotoxy(3,20);

printf("Yourname:"); gotoxy(12,20);

printf("%s",uname); gotoxy(27,20);

printf("right:%3.0f wrong:%3.0f total:%3d ",right,wrong,total); gotoxy(x,y); if(kbhit()!=0) {

gch[j]=getch();

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

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

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

{textbackground(RED); textcolor(GREEN); window(20,14,60,20); clrscr(); gotoxy(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");

gotoxy(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");

gotoxy(1,3);

printf("\1\1\1 \1\1\1"); gotoxy(1,4);

printf("\1\1\1 \1\1\1"); gotoxy(1,5);

printf("\1\1\1 \1\1\1"); gotoxy(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");

gotoxy(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");

gotoxy(8,4);

printf("Are you sure to exit?(Y/N)"); gotoxy(1,27); key=0;

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

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

textbackground(bgcol[0]); clrscr();

textbackground(bgcol[0]); textcolor(7);

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

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

else wrong++; wrong--; }

if(key=='Y'||key=='y') exit(0); }

goto line; }

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

wrong++; sound(140);

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

total=right+wrong; }

end=clock(); }

while((j!=zz)&&(m!=0)); gotoxy(27,20); printf("right:%3.0f wrong:%3.0f usetime:%3.0fS",right,wrong,total,(end-begin)/CLK_TCK); if((fp=fopen("recore.txt","w"))==NULL) {gotoxy(4,18);

printf("cannot open file"); return;}

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

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

fprintf(fp,"%c 5.4f%",uname,right/(right+wrong)); else

fprintf(fp,"%c 5.4f%",uname,right/(right+wrong)); fclose(fp);

window(1,1,80,25);

total:%3d

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

}

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

textbackground(GREEN); textcolor(7);

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

printf("Please enter your name:"); gotoxy(25,3); gets(uname); gotoxy(2,4);

printf("Instruction:1.(very easy)Only Lowercase."); gotoxy(2,5);

printf(" 2.(easy)Lowercase and Uppercase."); gotoxy(2,6);

printf(" 3.(hard)Mixture with Lowercase,Uppercase,Number and Symbol."); gotoxy(2,7);

printf("Please choose the textmode(1-3):"); gotoxy(34,7); gets(choosec); gotoxy(2,8);

printf("Please enter the count(1-300):"); scanf("%d",&zz); gotoxy(2,9);

printf("The textmode you chooes is:%s",choosec); gotoxy(2,10);

printf("Your name is:"); printf("%s",uname); gotoxy(2,11);

printf("The count you choose is:%d",zz); window(1,1,80,25); }

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

textbackground(GREEN); textcolor(7);

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

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

gotoxy(2,3);

printf("Color instruction:"); gotoxy(2,4);

printf(" 0-BLACK"); gotoxy(2,5);

printf(" 1- BLUE"); gotoxy(2,6);

printf(" 2- GREEN"); gotoxy(2,7);

printf(" 3- CYAN"); gotoxy(2,8);

printf(" 4- RED"); gotoxy(2,9);

printf(" 5- MAGENTA"); gotoxy(2,10);

printf(" 6- BROWN"); gotoxy(2,11);

printf(" 7- LIGHTGRAY"); gotoxy(2,12);

printf("Note:Textcolor and textbackground must be different!!!!!"); gotoxy(2,13);

printf("Please enter the textbackground(0-7):"); x=wherex(); y=wherey();

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

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

gotoxy(50,21);

printf("Are you sure exit?(Y/N)"); gotoxy(73,21); key=0;

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

if(key=='N' || key=='n') { gotoxy(50,21);

printf(" "); gotoxy(x,y);

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

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

if(key=='Y'||key=='y') exit(0); } goto line1; }

gotoxy(2,15);

printf("The Textbackground you choose is:%c",bgcol[0]); window(1,1,80,25); }

/*字体颜色*/ void Ccolor() {

ccol[1]=2;

textbackground(GREEN); textcolor(7);

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

printf("Color instruction:"); gotoxy(2,4);

printf(" 0-BLACK"); gotoxy(2,5);

printf(" 1- BLUE"); gotoxy(2,6);

printf(" 2- GREEN"); gotoxy(2,7);

printf(" 3- CYAN"); gotoxy(2,8);

printf(" 4- RED"); gotoxy(2,9);

printf(" 5- MAGENTA"); gotoxy(2,10);

printf(" 6- BROWN"); gotoxy(2,11);

printf(" 7- LIGHTGRAY"); gotoxy(2,12);

printf("Note:Textcolor and textbackground must be different!!!!!"); gotoxy(2,13);

printf("Please enter the textcolor(0-7):"); x=wherex(); y=wherey();

ccol[0]=getch();

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

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

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

gotoxy(50,21);

printf("Are you sure exit?(Y/N)"); gotoxy(73,21); key=0;

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

if(key=='N' || key=='n') { gotoxy(50,21);

printf(" "); gotoxy(x,y); ccol[0]=getch(); putchar(ccol[0]); }

if(key=='Y'||key=='y') exit(0); }

goto line1; }

gotoxy(2,15);

printf("The Textcolor you choose is:%c",ccol[0]); window(1,1,80,25); }

/*设时间*/ void Time() {

textbackground(GREEN); textcolor(7);

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

printf("Please enter the test time:"); scanf("%d",&m); gotoxy(1,3);

printf("The test time you choose is:%3d",m); window(1,1,80,25);

本文来源:https://www.bwwdw.com/article/d1hq.html

Top