问题描述
用c语言编写一个程序,但用户输入参数的时候,显示相应的信息,例如:输入t、f或T、F的时候,系统应该判对还是判错呢。若输入t t或者tf的时候,系统又应该判对还是判错呢。若输入回车或空格时,系统应该判错吗?
问题分析
这里为了让这个系统人性化一点,当用户输入大小写的t或f时,我们都判他为正确答案。(不包括他t,f以外的字母,应该没人会在判断题里输入a的吧~~~)当用户不小心多输了空格时,我们也判他为对,但是如果用户输入的格式为t空格t或者是tt,tf亦或者是直接输入回车或只输入空格时我们就应该提示他输入格式有误,给他重新输入一次的机会。(嘿嘿,怎么样?够人性化吧。)
程序代码
好了,废话不多说,直接上源码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<Windows.h>
int main()
{
system("color 04"); //字体颜色为红色。
int a[21]={0},i=1,sum=0,t,q=0,xuehao;
int b[21]={0};
double l; //用来算正确率。
char ti[21][10000]; //设置题库。
char answer[21],name[100],w; //标准答案。
char daan[21][100]; //用户自己输入的答案。
char dian[21][100]; //进一步调整用户输入的答案。
//每设置一个题目,就设置一个答案。
strcpy(ti[1],"The remainder operator (%) can be used only with integer operands.");
answer[1]='t';
strcpy(ti[2],"The expression (x > y || a < b) is true if either x > y is true or a < b is true.");
answer[2]='t';
strcpy(ti[3],"判断两个浮点数是否相同的运算虽然符合C语言规则,但是应该尽量避免。");
answer[3]='t';
strcpy(ti[4],"数组定义中,数组名后是用方括号括起来的常量表达式,不能用圆括号。");
answer[4]='t';
strcpy(ti[5],"在定义数组之后,根据数组中元素的类型及个数,在内存中分配一段连续存储单元用于存放数组中的各个元素。");
answer[5]='t';
strcpy(ti[6],"数组的长度可以是变量。");
answer[6]='f';
strcpy(ti[7],"c语言的数组下标从0开始。");
answer[7]='t';
strcpy(ti[8],"如果函数定义出现在函数调用之前,可以不必加函数原型声明。");
answer[8]='t';
strcpy(ti[9],"在C语言中,可以将主调函数放在被调函数的后面,省略函数的声明。");
answer[9]='t';
strcpy(ti[10],"函数调用得到的值,可以作为另一次函数调用时的参数。");
answer[10]='t';
strcpy(ti[11],"在不返回结果的函数定义中,如果函数类型被省略,则函数类型默认定义为void。");
answer[11]='f';
strcpy(ti[12],"在C语言的函数定义中,如果省略了return语句,函数就无法返回主调函数。");
answer[12]='f';
strcpy(ti[13],"按照C语言的规定,实参和形参的命名不得重复。");
answer[13]='f';
strcpy(ti[14],"按照C语言的规定,在参数传递过程中,既可以将实参的值传递给形参,也可以将形参的值传递给实参,这种参数传递是双向的。");
answer[14]='f';
strcpy(ti[15],"函数的实参和形参都可以是变量、常量和表达式。");
answer[15]='f';
strcpy(ti[16],"可以在一个函数中定义另一个函数 。");
answer[16]='f';
strcpy(ti[17],"c语言每个函数的返回值都是int型的。");
answer[17]='f';
strcpy(ti[18],"语句是 C 语言程序的基本结构模块。");
answer[18]='f';
strcpy(ti[19],"C语言在函数调用时,若形参实参都是普通变量,实参和形参可以共用存储单元。");
answer[19]='f';
strcpy(ti[20],"被调函数中必须有return语句,通过它可以带回一个返回值。");
answer[20]='f';
srand((unsigned int) time(NULL)); //产生随机数种子。
printf("第一大题、判断题,共有二十道题,每题五分,请考生填写't'或'f'。考试中途不可退出。\n");
printf("请输入你的尊姓大名:");
scanf("%s",name);
getchar(); //吸收回车。
printf("请输入你的学号:");
scanf("%d",&xuehao);
getchar();
Sleep(1000); //延时1s
printf("准备好了吗?开始答题了哦。\n");
Sleep(1000);
printf("**********3***********\n");
Sleep(1000);
printf("**********2***********\n");
Sleep(1000);
printf("**********1***********\n");
Sleep(1000);
printf("*******答题开始*******\n");
Sleep(1000);
for(i=1;i<=20;i++)
{
Sleep(2000); //延时2s
system("cls"); //及时清屏,单题作答。
int flag=0,j=0,flag1=0,k;
a:a[i]=rand()%(20)+1; //设置随机数。保证每次生成的随机数都不一样。
for(k=0;k<i;k++)
{
if(a[i]==a[k])
{
goto a; //若生成的随机数有重复,就跳转到生成随机数的那一步。
}
}
printf("第%d题:%s\n请输入你的答案:",i,ti[a[i]]); //随机出题。
//scanf("%s",&daan[i]); //思考一下这里为啥用scanf会有一点小问题呢?
b:gets(daan[i]);
int m=0;
int n=strlen(daan[i]);
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
{
if(daan[i][k]!=' ') //如果输入 T或T 就提示用户输入格式错误。
{
dian[i][j]=daan[i][k];
m++;
}
}
}
if(m==1) //如果剩余的字符个数为一
{
flag=1;
if(flag==1)
{
if(dian[i][0]==answer[a[i]]||dian[i][0]==answer[a[i]]-32) //考生输入t或者T,f或者F,都算对。
{
b[i]=i; //答对一题做一个标记,以便输出答对的题号。
printf("恭喜您,你通过了这道题!请继续回答下一道。\n\n");
sum+=5; //每题五分,总分累加。
q+=1;
}
else
printf("真可惜,这道题你回答错误,答案是%c。请继续回答下一道。\n\n",answer[a[i]]);
}
}
else //如果剩余的字符个数不为一
{
printf("你的输入有误,请重新输入:");
flag=0;
m=0;
goto b; //返回到重新输入答案的步骤。
}
if(i==20)
{
l=1.0*q/20*100;
printf("您的所有问题都已回答完毕,你一共答对%d道题,正确率为%.2lf%%。你的最终得分为%d\n",q,l,sum);
printf("你答对的题目为:");
for(j=1;j<=20;j++)
{
if(b[j])
printf("第%d题,",j); //若该题号已被标记,则说明该题是答对的题目。
}
printf("\n");
printf("你答错的题目为:");
for(j=1;j<=20;j++)
{
if(b[j]==0)
printf("第%d题,",j);
}
}
}
return 0;
}
输出结果
当输入‘t’,‘f’或‘T’,‘F’时,命令行显示效果如下:
若用户不小心多输了空格,或者输入t空格t或者tf,或者直接输入回车时,命令行显示效果如下:
心得体会
在编写程序的时候,需要了解如何生存随机数,并且保证生成的随机数不一样,这可以作为c语言初学者练手的小程序,当然程序中多多少少有错误,望指正!
想了解如何生成随机数的小伙伴们可以去看看http://t.csdn.cn/BOFOk
想知道如何保证生成的随机数不一样的小伙伴可以去看看http://t.csdn.cn/fgsei