/*
* Created by C语言应用开发向导 of Egg (Easy Graphical egG)
* Homepage: http://egg.sunner.cn
*
*****************************************************
* Name: 1.c
* Copyright:Free
* Author: 吴德勇
* Organization: 哈尔滨工业大学(Harbin Institute of Technology)
* Date: 2005-11-23 15:43:55
* Version: 1.0
* Description: 为小学生设计的关于操作数在十以内的简单加减乘除法运算的无纸考试程序
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "stack.h"
#define NUMBER '0'
#define MAXVAL 100
int Integer(void);
void Reprint(int a,int *p,int *q,int *m);
void Rewrite(int a,int *m,int *n);
int main(int argc,char *argv[])
{
int a,i,k;
int *p,*q,*m,*n;
char s[MAXVAL];
while(--argc>0)
{
ungets(" ");
ungets(*++argv);
switch (getop(s))
{
case NUMBER:
push(atoi(s));
break;
default:
printf("error:unknown command:%s...\n",s);
argc = 1;
return 0;
}
}
a = pop();
printf("There are %d questions:\n",a);
n = &k;
do
{ //动态申请分配内存
p = (int*)malloc(2*a*sizeof(int)); //保存操作数
q = (int*)malloc(2*a*sizeof(int)); //保存符号随机数和符号本身
m = (int*)malloc(2*a*sizeof(int)); //保存输入的答案和标准答案
} while(p==NULL || q==NULL || m==NULL);
srand((int)time(NULL)); //启动随机数发生器
for (i=0;i<2*a;i++)
*(p+i) = rand()%11; //得到出题的原始数据
for (i=0;i<a;i++)
*(q+i) = rand()%4; //得到随机运算符
for (i=0;i<2*a;i+=2)
{ //把所出的题目打印出来
switch (*(q+i/2))
{
int j;
case 0:
printf("%d %d+%d=?\n",i/2+1,*(p+i),*(p+i+1));
*(m+i/2) = *(p+i) + *(p+i+1);
*(q+a+i/2) = '+';
break;
case 1:
j = *(p+i)+*(p+i+1);
*(p+i) = *(p+i)>=*(p+i+1)?*(p+i):*(p+i+1);
printf("%d %d-%d=?\n",i/2+1,*(p+i),*(p+i+1));
*(m+i/2) = *(p+i) - *(p+i+1);
*(q+a+i/2) = '-';
break;
case 2:
printf("%d %d*%d=?\n",i/2+1,*(p+i),*(p+i+1));
*(m+i/2) = *(p+i) * *(p+i+1);
*(q+a+i/2) = '*';
break;
case 3:
if(*(p+i+1)!=0 && *(p+i)%(*(p+i+1))==0)
{
printf("%d %d/%d=?\n",i/2+1,*(p+i),*(p+i+1));
*(m+i/2) = *(p+i)/(*(p+i+1));
*(q+a+i/2) = '/';
}
else
{
printf("%d %d+%d=?\n",i/2+1,*(p+i),*(p+i+1));
*(m+i/2) = *(p+i) + *(p+i+1);
*(q+a+i/2) = '+';
}
break;
}
}
printf("Please inter your answer,press Enter key to the next one:\n");
for(i=0;i<a;i++)
{
printf("The %d answer:",i+1);
*(m+a+i) = Integer(); //依次保存输入的答案
}
for (i=0,k=0;i<a;i++)
{
if(*(m+a+i)==*(m+i))
k++; //对比标准答案,计算正确率
}
printf("You have got %.0f marks\n",(double)k/a*100);
k = k-a;
while(k!=0)
{
printf("This(These) question(s) you should try again:\n");
Reprint(a,p,q,m); //重做!
Rewrite(a,m,n);
}
printf("Congratulations!You have already passed the exam!\n");
free(p);free(q);free(m); //释放申请的内存空间
return 0;
}
void Reprint(int a,int *p,int *q,int *m) //原题数量 || 数据地址 ......
{
int i;
for (i=0;i<2*a;i+=2) //函数1,用来将做错的题目重新打印出来。
{
if(*(m+i/2)!=*(m+a+i/2))
printf("%d %d%c%d=?\n",i/2+1,*(p+i),*(q+a+i/2),*(p+i+1));
}
}
void Rewrite(int a,int *m,int *n) //原题数量 || 数据地址 ||判断数据
{ //函数2,用来读入重做题目的答案并核对,打印正确率
int i,j,k;
printf("Please inter you answer:\n");
j=0;k=0;
for (i=0;i<2*a;i+=2)
{
if(*(m+i/2)!=*(m+a+i/2))
{
printf("The %d answer:",i/2+1);
*(m+a+i/2) = Integer();
if(*(m+i/2)==*(m+a+i/2))
k++;
j++;
}
}
*n = k-j;
printf("This time you have got %.0f marks!\n",(double)k/j*100);
}