
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( );
} 展开
#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( );
} 展开
展开全部
基本上改成这样能用了 缺陷还是不少
有几个优化建议
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( );
}
有几个优化建议
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什么的。
在破记录的时候要求输入名字,然后保存到一个文件里面
展开全部
#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( );
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
错的太多 主函数返回值哪去了?ESC是字符串啊~ 吃饭了等会找~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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( );
}
这样修改
#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( );
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
满函数在最后,声明也不对吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询