C語言簡單運用連結串列實驗程式碼
阿新 • • 發佈:2018-12-26
實驗一 (創新性)利用指標實現小學生數學四則運算小軟體
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); } }