C语言简单运用链表实验代码

实验一 (创新性)利用指针实现小学生数学四则运算小软件
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);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_43554428/article/details/85260016