实验一 (创新性)利用指针实现小学生数学四则运算小软件
1.实验内容
利用函数指针、指针函数、数组指针以及指针数组完成小学生数学四则运算小软件,具体要求如下:
1)要具有自动批改功能。
2)要具有统计已完成题目数量和正确率功能。
3)要具有错题记录和回放功能。
4)参与运算的数据范围可以由使用者设定
5)参与运算的数据在使用者设定范围后随机生成。
2.教学要求:
1)实验前须复习的课程内容:
(1)实验指导书指针变量的定义和使用;
(2)数组指针和指针数组;
(3)函数指针和指针函数;
(4)随机数生成方法;
(5)随机数范围设定方法;
2)实验预习报告要求:
实验预习报告应包括:随机数生成方法和范围设定方法的详细描述,提炼出本软件的各个功能,并给出各个接口和说明。
3)实验要求:
(1)利用函数指针做函数的形式参数,达到统一接口的目的。
(2)利用指针数组记录错题。
(3)利用软件设计中的多文件分离思想完成项目。
(4)熟悉进行数值型数据与字符串数据之间的转换。
(5)采用学校标准实验报告纸撰写实验报告,包括以下四个内容:实验目的、实验内容、实验结果与调试过程、实验小结。
实验代码
#include "stdio.h"
#include "stdlib.h"
typedef struct question//定义题目结构体,组建链表
{
int a; //运算数据一
char b;//运算符号
int c;//运算数据一
int d;//用户输入的答案
int e;//正确答案
int f;// 题目序号
struct question *next;//链表地址
}que;
int suijishu(int a,int b)//创建随机运算数据
{
int c;
if(a<b) c=a,a=b,b=c;
return rand()%(a-b+1)+b;//创建一个符合出题范围的随机数
}
que *create(int a,int b,int n)//创建题目链表
{
int i=0,h;
que *q,*p,*head;
head=(que*)malloc(sizeof(que));
q=head;
while(i<n)//随机出题
{
p=(que*)malloc(sizeof(que));
p->a=suijishu(a,b);
p->c=suijishu(a,b);
p->f=i+1;
h=(rand()%4);
if(h==0 && p->a==p->c &&p->a==0) continue;
switch(h)
{
case 1:
{
p->b='+';
p->d= p->a+ p->c;
break;
}
case 2:
{
p->b='-';
p->d= p->a- p->c;
break;
}
case 3:
{
p->b='*';
p->d= p->a* p->c;
break;
}
case 0:
{
while(p->c==0||p->a< p->c||p->a% p->c!=0)
{
p->a=suijishu(a,b);
p->c=suijishu(a,b);
}
p->b='/';
p->d=p->a/ p->c;
break;
}
}
q->next=p;
q=p;
i++;
}
q->next=NULL;
return head;
}
void print(que*head)//输出题目
{
while(head=head->next,head)
printf("(%d)%d%c%d=\n",head->f,head->a,head->b,head->c);
}
void answer(que*head)//输入答案
{
printf("\n请根据题号输入答案\n");
while(head=head->next,head)
{
printf("(%d)",head->f);
scanf("%d",&head->e);
}
}
int sum(que*head)
{
int i=0;
while(head=head->next,head) i++;
return i;
}
que *check(que*head)//创建错题链表,用于错题回放
{
que*p,*q,*wrong;
wrong=(que*)malloc(sizeof(que));
q=wrong;
while( head=head->next,head)
if(head->d!=head->e)
{
p=(que*)malloc(sizeof(que));
p->a=head->a;
p->b=head->b;
p->c=head->c;
p->d=head->d;
p->e=head->e;
p->f=head->f;
q->next=p;
q=p;
}
q->next=NULL;
return wrong;
}
void cheak_again(que *wrong)//错题订正
{
que *p,*q;
p=wrong->next;
while(p!=NULL)
{
if(p->d==p->e)
{
q=wrong->next;
wrong->next=p->next;
p=wrong->next;
free(q);
}
else
{
p=p->next;
wrong=wrong->next;
}
}
}
void main()
{
int a,b,n,l,k;
que *head,*wrong;
printf("\t\t\t请输入出题范围\n");
scanf("%d%d",&a,&b);
printf("请输入出题数量\n");
scanf("%d",&n);
head=create(a,b,n);//创建题目链表
print(head);//输出题目
answer(head);//储存输入的答案
wrong=check(head);//创建错题链表
k=sum(wrong);
printf("正确率为%d/%d\n",n-k,n);
while(k)//只要错题率不为0
{
printf("你做错的题目有:\n");
print(wrong);
printf("退出请输入0,否则输入1开始订正\n");
scanf("%d",&l);
if(l)
{
answer(wrong);
cheak_again(wrong);
k=sum(wrong);
printf("订正后的正确率为%d/%d\n",n-k,n);
}
else
{
printf("不订正了那就一边玩去吧\n");
break;
}
if(!k)
printf("恭喜你终于全做对了\n");
}
}
附带一个用数组完成的简单方式(emm)ps…没做完
#include "stdio.h"
#include "stdlib.h"
void main()
{
double question_get(int min,int max,int type,int x[],int y[],int timu,char c[],int m[]);
double answer;
double temp;
int flag;
int cuo=0;
int timu=0;
int max,min;
int type;
int i;
int x[100],y[100],z[100],m[100];
char c[100];
printf("\t\t\t 小学数学四则运算刷题系统\n");
printf("\n请输入出题范围最小值:\n");
scanf("%d",&min);
printf("\n请输入出题范围最大值:\n");
scanf("%d",&max);
while(max<min)
{
printf("\n最大值不能小于最小值\n请重新输入最大值:\n");
scanf("%d",&max);
}
while(1)
{
type=rand()%4;
answer=question_get(min,max,type,x,y,timu,c,m);/* 通过函数调用返回计算机算出的正确答案 */
printf("\n 请输入你的答案:\n");
scanf("%lf",&temp);//学生输入自己的答案
if(temp!=answer)/*判断学生的答案是否与正确的答案相同,若不同则给出正确答案*/
{
printf("\n 答案错误\n");
printf("\n 正确的答案为%.1lf:\n",answer);
cuo++;
z[timu]=0;
}
else
{
printf("\n 答案正确,很好\n");
z[timu]=1;
}
timu++;
printf("\n 继续测试请按 1,退出测试请按 0 : \n");
scanf("%d",&flag);
if(flag==0)break;
}
printf("\n你总共完成了%d道题\n错误了%d道\n正确率为%lf%%\n",timu,cuo,(timu-cuo)*100.0/timu);
printf("\n其中的错题为:\n");
for(i=0;x[i];i++)
{
if(!z[i])printf("%d%c%d=%d\n",x[i],c[i],y[i],m[i]);
}
}
double question_get(int min,int max,int type,int x[],int y[],int timu,char c[],int m[])/* 此函数作用为为小学生出题,并返回计算机算出的正确答案 */
{
int a,b;
if(type==0)
{
do
{a=rand()%(max+1);}
while(a<min);
do
{b=rand()%(max+1);}
while(b<min);
printf("\n%d+%d=? ",a,b);
x[timu]=a,y[timu]=b;
c[timu]='+';
m[timu]=a+b;
return(a+b);
}
else if(type==1)
{
do
{a=rand()%(max+1);}
while(a<min);
do
{b=rand()%(max+1);}
while(b<min);
printf("\n%d-%d=? ",a,b);
x[timu]=a,y[timu]=b,c[timu]='-',m[timu]=a-b;
return(a-b);
}
else if(type==2)
{
do
{a=rand()%(max+1);}
while(a<min);
do
{b=rand()%(max+1);}
while(b<min);
printf("\n%d*%d=? ",a,b);
x[timu]=a,y[timu]=b,c[timu]='*',m[timu]=a*b;
return(a*b);
}else
{do
{a=rand()%(max+1);}
while(a<min);
do
{b=rand()%(max+1);}
while(!b || b>a);
printf("\n%d/%d=? ",a,b);
x[timu]=a,y[timu]=b,c[timu]='/',m[timu]=a*1.0/b;
return(a*1.0/b);
}
}