C语言程序求改错,并说明。

#include<stdio.h>#include<string.h>#include<time.h>#include<stdlib.h>voidmenu();chars... #include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
void menu( );
char start( );
void quit( );
void time( );
char dazi( );
void count( );
int main(void)
{
menu( );
start( );
quit( );
}

void menu( )
{
char ch;
printf("打字练习\n");
printf("请选择:\n");
printf("a.english\tb.all types\tESC.quit\n");
scanf("%c",&ch);
ch=='ESC'?quit( ):start(ch);
}

char start(char ch)
{
char ch1;
FILE *fp;
printf("是否开始游戏(y/n)\n");
scanf("%c",&ch1);
ch1=='n'?quit( ):printf("开始游戏!!!\n");
ch=='a'?fp=fopen("english.txt","r"):fp=fopen("all types.txt","r");
if(fp==NULL)
{
printf("文件打开失败\n");
quit( );
}
else puts(fp);
dazi(fp);
}

char dazi(char fp[]);
{
int n=0,i,j;
float avg;
char inputtypes[];
char ch;
gets(inputtypes);
i=strlen(fp);
j=strlen(inputtypes);
printf("本文共%d个字符\n",i);
printf("您打了%d个字符\n",j);
if(i!=j)
n=i>j?i-j:j-i;
for(j=0;j<i;j++)
fp[i]!=inputtypes[i]?n++:;
printf("其中正确%d个\t错误%d个\n",i-n,n);
avg=(float)i/(float)(i-n);
printf("正确率为%.2f%%\n",avg);
avg>=80?printf("Well done!!!\n"):printf("What a bad grade!!!\n");
printf("Do you want to play again?(y/n)\n");
ch=='y'?menu( );quit( );
}

void quit()
{
char ch;
printf("Do you want to exit(y/n)\n");
scanf("%c",ch);
ch=='y'?exit(0):menu( );
}
展开
 我来答
风若远去何人留
推荐于2016-01-09 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20403 获赞数:450142
专业C/C++软件开发

向TA提问 私信TA
展开全部
基本上改成这样能用了 缺陷还是不少
有几个优化建议
1.数据随机产生,而不是从文件中读取
2.多行无限输出 直到获取终止键为止
3.每行判断数据正确性,统计更准确

从你的程序中可以看出来你很喜欢用?:语句,这不是个好习惯
除了对指定变量赋值用这个语句可以减少行数,其他情况下,只会降低运行效率 同时降低可读性

#include <stdio.h>
#include <string.h>
//#include <time.h>//没有用到的头文件
#include <stdlib.h>
void menu( );
void start(char type);//更改函数声明
void quit( );
void time( );
void dazi( );//返回值无用 去掉
void count( );
int main(void)
{
menu( );
//start( ); //menu里面调用了 这里不需要
quit( );
}
//增加两个函数,用于读入数据。原本的不安全,比如gets
char get_key(void)
{
char ch;
ch = getchar();
while(getchar() != '\n');
return ch;
}
void getline(char *buffer, int max)
{
int i = 0;
char ch;
while(1)
{
ch = getchar();
if(ch == '\n') break;
buffer[i ++] = ch;
if(i > max) break;
}
buffer[i] = 0;
}
void menu( )
{
char ch;
while(1)//增加循环 拒绝不正确输入
{
printf("打字练习\n");
printf("请选择:\n");
printf("a.english\tb.all types\tESC.quit\n");
ch = get_key();
if(ch==0x1b)quit( );//‘ESC’的方式是不合法的,如果要读入ESC键,其值为0x1b
if(ch == 'a' || ch == 'b') break;
}
start(ch);
}
void start(char type)
{
char ch1;
char str[1001] = {0};//增加文件内容buffer
FILE *fp;
printf("是否开始游戏(y/n)\n");
ch1 = get_key();
ch1=='n'?quit( ):printf("开始游戏!!!\n");
if(type=='a')fp=fopen("english.txt","r");//这里用?:语句也可以,不过不好。 除非赋值,最好少用?:
else fp=fopen("all types.txt","r");
if(fp==NULL)
{printf("文件打开失败\n");quit( );}
fread(str, 1, 1000, fp);//读出数据并打印,直接打印fp是不可以的
puts(str);
dazi(str);
fclose(fp);//关闭文件 必须!
}
void dazi(char *str)
{
int n=0,i,j, k;
float avg;
char inputtypes[1001]={0};
char ch;
getline(inputtypes, 1000);//使用安全的读入函数
i=strlen(str);
j=strlen(inputtypes);
printf("本文共%d个字符\n",i);
printf("您打了%d个字符\n",j);
if(i > j) printf("少打了%d个字符哦\n", i - j);//增加多打少打判断
else if(i < j) printf("多打了%d个字符哦\n", j - i);
for(k=0;k<i && k < j;k++)
if(str[k]==inputtypes[k])n++;//更改判断函数
printf("其中正确%d个\t错误%d个\n",n,j - n);
avg=(float)n/(float)(i > j ? i : j) * 100;//修改计算值
printf("正确率为%.2f%%\n",avg);
if(avg>=80)
printf("Well done!!!\n");
else
printf("What a bad grade!!!\n");
printf("Do you want to play again?(y/n)\n");//改用英文括号
if(ch=='y')menu( );//同样,函数调用不要用?:
else quit( );
}
void quit()
{
char ch;
printf("Do you want to exit(y/n)\n");
ch = get_key();
ch=='y'?exit(0):menu( );
}
更多追问追答
追问
能不能在这个程序上加一个排行榜系统啊,就像以前那种FC游戏一样,修改后到http://zhidao.baidu.com/question/552821883?quesup2&oldq=1这个知道里随便说句话,两个问题的财富都给你,谢谢
追答
加排行也可以,比如弄一个top 10什么的。
在破记录的时候要求输入名字,然后保存到一个文件里面
xz宏定义
2013-05-23 · TA获得超过1029个赞
知道小有建树答主
回答量:1621
采纳率:100%
帮助的人:242万
展开全部
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
void menu( );
char start(char ch);//char start( );
void quit( );
//void time( );
char dazi(char fp[]);;//char dazi( )
//void count( );
int main(void)
{
    menu( );
    //start( );
    quit( );
}
void menu( )
{
    char ch;
    printf("打字练习\n");
    printf("请选择:\n");
    printf("a.english\tb.all types\tESC.quit\n");
    scanf("%c",&ch);
    ch=='ESC'?quit( ):start(ch);
}
char start(char ch)
{
    char ch1;
    FILE *fp;
    char str[80];
    printf("是否开始游戏(y/n)\n");
    scanf("%c",&ch1);
    ch1=='n'?quit( ):printf("开始游戏!!!\n");
    ch=='a'?fp=fopen("english.txt","r"):fp=fopen("all types.txt","r");
    if(fp==NULL)
    {
        printf("文件打开失败\n");
        quit( );
    }
    else fputs(str,fp);//puts(fp);//不是这么用的
    dazi(str);
    return 0;//要有返回值
}
char dazi(char fp[])//;
{
    int n=0,i,j;
    float avg;
    char inputtypes[1240];//数组未知大小
    char ch;
    gets(inputtypes);
    i=strlen(fp);
    j=strlen(inputtypes);
    printf("本文共%d个字符\n",i); //逗号要英文的
    printf("您打了%d个字符\n",j);
    if(i!=j)
        n=i>j?i-j:j-i;
    for(j=0;j<i;j++)
        fp[i]!=inputtypes[i]?n++:n;//这里少东西
    printf("其中正确%d个\t错误%d个\n",i-n,n);
    avg=(float)i/(float)(i-n);
    printf("正确率为%.2f%%\n",avg);
    avg>=80?printf("Well done!!!\n"):printf("What a bad grade!!!\n");
    printf("Do you want to play again?(y/n)\n");
    ch=='y'?menu( ):quit( );
    return 0;//要有返回值
}
void quit()
{
    char ch;
    printf("Do you want to exit(y/n)\n");
    scanf("%c",ch);
    ch=='y'?exit(0):menu( );
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zqy5891
2013-05-22 · TA获得超过139个赞
知道答主
回答量:119
采纳率:0%
帮助的人:83.8万
展开全部
错的太多 主函数返回值哪去了?ESC是字符串啊~ 吃饭了等会找~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_whales
2013-05-23 · TA获得超过2281个赞
知道大有可为答主
回答量:1814
采纳率:85%
帮助的人:541万
展开全部
1)ch=='ESC'?quit( ):start(ch);
这样修改
#define ESC 27
ch==ESC ? quit( ) : start(ch); ESC 是 控制字符,不是三个字符组成的,10进制ASCII是27

2)
int main(void)
{
menu( );
//start( );这个是多余的。
quit( );
return 0; //虽然不写程序没问题,但是有可能编译出错,或者产生警告!!
}

char start(char ch)
{
char ch1;
FILE *fp;
char *filename=NULL;
char *pbuf=NULL;
size_t fsize=0;
printf("是否开始游戏(y/n)\n");
scanf("%c",&ch1);
ch1=='n' ? quit( ):printf("开始游戏!!!\n");
ch=='a' ? filename="english.txt":"all types.txt","r";
fp=fopen(filename,"rb");

if(fp==NULL)
{
printf("文件打开失败\n");
quit( );
}

puts(filename);

fseek(fp,0,SEEK_END);
fsize = ftell(fp);
pbuf=(char *)malloc (fsize+1);
fread(pbuf,fsize,1,fp);

pbuf [ fsize ] = '\0' ;

fclose(fp);
dazi(pbuf);

}
char dazi(char pbuf[]);
{
int n=0,i,j;
int cc=,ec=0;
float rato=0;
char inputtypes[256];
char ch;
gets(inputtypes);
i=strlen(pbuf);
j=strlen(inputtypes);
printf("本文共%d个字符\n",i);
printf("您打了%d个字符\n",j);
if(i!=j)
n=i>j?i-j:j-i;
for(k=0;k<min(i,j);k++)
if( pbuf[k] != inputtypes [k])ec++ ;
cc= i - ec;
printf("其中正确%d个\t错误%d个\n",cc, ec+n);

rato=(float) (cc) / i*100;
printf("正确率为%.2f%%\n",rato);
rato >=80?printf("Well done!!!\n"):printf("What a bad grade!!!\n");

free(pbuf);
printf("Do you want to play again?(y/n)\n");
ch=='y'?menu( );quit( );
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cauhanbing
2013-05-22 · 超过22用户采纳过TA的回答
知道答主
回答量:77
采纳率:100%
帮助的人:49万
展开全部
满函数在最后,声明也不对吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式