1. 程式人生 > >C語言簡單運用連結串列實驗程式碼

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);
	}
}