某小学要进行口算比赛,针对不同年级要出不同类型的题目,现要求你编写 程序完成题目的随机生成,并有你来参加这个比赛。
功能:
(1)随机生成 20 道口算题,写入文件;
(2)从文件依次读取题目并作答,最终写入新文件,并以当前时间(年月 日时分秒)作为文件名;
(3)计算做题时间及得分;
(4)题目难度分类(只考虑 2 个操作数的情况,要求操作数和结果都不为 负数)(操作数的范围为2 31 ~0)
1)两个操作数为 2 31 以内的加减法;
2)结果为 100 以内的四则运算;
3)分子分母均小于 10 的分数的四则运算,要求操作数和结果均为不可 约的情况,即 2/6 应该花简称 1/3,6/3 应化简成 2。
难度一
1.c
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<math.h>
FILE *fp; //文件指针
int i,j;
int x1,x2,x3,x4,x5,x6;
void intt1()
{
time_t time1; //以时间命名文件 11-18
char name[30];
time1 = time(0);
strftime(name,27,"%Y年%m月%d日%H时%M分%S秒",localtime(&time1));
srand(time(0));
char name2[30];
strcpy(name2,name);
strcat(name2,".txt"); //链接形成文件路径
for(i = 0; i < 20 ;i ++) //生成20个式子
{
fp = fopen("hello.txt","a"); //打开文件,若文件不存在则创建文件
if(fp==NULL)
{
printf (" ");
printf("无法打开文件");
exit(0); //退出文件
}
int len = 2;
int *num2=NULL;
int *num1=NULL;
num1 = (int*)malloc(len); //动态申请内存
num2 = (int*)malloc(len-1); //动态申请内存
char hh[5];
num2[0]=rand()%2; //产生0,1两种随机数作为buffer[]的下坐标
num1[0]=rand()%10;
num1[1]=rand()%10;
char buffer[3]; //生成运算符号
buffer[0]='+';
buffer[1]='-';
if(num2[0]==1&&num1[0]<num1[1]) //防止出现负数,前面的数较小就交换二者
{
int ex = num1[0];
num1[0] = num1[1];
num1[1] = ex;
}
hh[0] = num1[0]+'0'; //生成式子
hh[1] = buffer[num2[0]];
hh[2] = num1[1]+'0';
hh[3] = '=';
hh[4] = '\0';
fprintf(fp,"%s\n",hh); //存式子
free(num1);
free(num2); //释放空间
fclose(fp);
}
printf (" ");
printf("题目准备就绪,准备答题:\n");
FILE*fin,*fbn;
double start,finish; //时间参数
int deit2 = 0,cj = 0;
start = clock(); //开始的时间
if((fin=fopen(name2,"a"))==NULL) //打开源文件
{
printf("打开文件出错!\n");
}
if((fbn=fopen("hello.txt","r"))==NULL) //打开源文件
{
printf("打开文件出错!\n");
}
int chan = 20;
while(chan--) //计算20道题的答案
{
int answer; //暂时储存用户的答案
int c1,c2,c3;
char buf2[128]; //存题目
memset(buf2,'\0',128);
fseek(fbn,deit2,SEEK_SET); //每次运行返回指针返回文件开头,然后在偏移deit2位
fread(buf2,sizeof(unsigned char),4,fbn);
printf (" ");
printf("题目:%s\n",buf2);
c1 = buf2[0]-'0';
c2 = buf2[2]-'0';
if(buf2[1]=='*') //乘法的情况
{
c3 = c1*c2;
}
else if(buf2[1]=='+') //加法的情况
{
c3 = c1+c2;
}
else if(buf2[1]=='-') //减法
{
c3 = c1 - c2;
}
else
{
c3 = c1/c2;
}
printf (" ");
printf("输入你的答案:\n");
printf (" ");
scanf("%d",&answer);
if(answer==c3) //答案对比
{
cj=cj+1;
}
fprintf(fin,"%d\n",answer); //存入文件
printf("\n");
deit2 = deit2+6;
}
finish = clock();
fclose(fin);
fclose(fbn);
printf (" ");
printf("成绩为:%d\n",cj*5);
printf (" ");
printf("%.2f seconds\n",(finish - start) / CLOCKS_PER_SEC);
printf("清空文件夹<1>\n"); //清空文件
int n2;
scanf("%d",&n2);
if(n2==1) remove("hello.txt");
}
难度二
2.c
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<math.h>
FILE *fp; //文件指针
int i,j;
int x1,x2,x3,x4,x5,x6;
int gcd(int a,int b) //最大公约数
{
return b?gcd(b,a%b):a;
}
void intt2()
{
time_t time1;
char name[30];
time1 = time(0);
strftime(name,27,"%Y年%m月%d日%H时%M分%S秒",localtime(&time1));
srand(time(0));
char name2[30];
strcpy(name2,name);
strcat(name2,".txt");
srand(time(0));
for(j = 0; j < 20 ; j ++)
{
fp = fopen("hello.txt","a"); //打开文件,若文件不存在则创建文件
if(fp==NULL)
{
printf("无法打开文件");
exit(0);//退出文件
}
int len = 2;
int *num2=NULL; //同1
int *num1=NULL;
num1 = (int*)malloc(len); //动态申请空间
num2 = (int*)malloc(len-1); //动态申请内存
char h[20]; //每个式子将会是一个长度为12的字符串,0到4位预留保存第一个数字如果数字位数不够5位就在数字后面加空格
num2[0]=rand()%4; //随机产生 0 1 2 3 作为buffer[]函数的下坐标
char buffer[4];
buffer[0]='*'; //乘法
buffer[1]='+'; //加法
buffer[2]='/'; //除法
buffer[3]='-'; //减法
if(buffer[num2[0]]=='-') //减法的情况
{
int t,t1=0,t2=0;
int x1,x2;
num1[0] = rand()%1200; //可以不取模
num1[1] = rand()%1200; //取0到1199的数
if(num1[0]<num1[1]) //防止出现负数,前者小于后者就进行交换
{
t = num1[0];
num1[0] = num1[1];
num1[1] = t;
}
if((num1[0]-num1[1])>=100) //防止出现大于等于100的情况
{
num1[1] = num1[0]-rand()%100; //如果出现,第二个数字变成第一个数字再减去随机生成的1到100的数
}
x1 = num1[0],x2 = num1[1];
while(x1) //计算生成的随机数的位数
{
t1++;
x1 = x1/10; //累除求位数
}
while(x2) //同上
{
t2++;
x2 = x2/10;
}
x1 = num1[0];
x2 = num1[1];
for(i = 0; i < t1; i ++) //将0到4数字转化成字符串
{
h[i] =(int) (x1/pow(10,t1-i-1))%10 + '0'; //从高位到低位
}
for(i = t1; i < 5; i ++) //如果数字的位数不够5位数就在其后加空格,
{
h[i] = 32;//32是空格的acll码
}
for(i = 6; i <6+ t2; i ++) //将数字转化成字符串 6到10位置上的元素
{
h[i] =(int)(x2/pow(10,t2+6-i-1))%10 + '0'; //循环取模,数字每个数位的数,比如十位上的
}
for(i = 6+t2; i < 11; i ++)