課程設計題目 |
小學生數學測試系統設計 |
|||||||
姓名 |
|
學號 |
|
專業班級 |
|
|||
課程設計目的 |
1、培養學生綜合運用所學的知識,通過上機實踐,提高分析和解決問題的能力。 2、通過實踐訓練,提高學生在理論計算、結構設計、查閱設計資料、運用標准與規范編程能力。 |
|||||||
課程設計環境 |
硬件:裝有Windows操作系統的計算機 軟件:Visual C++6.0 |
|||||||
課程設計任務和要求 |
面向小學生隨機選擇兩個整數形成四則運算算式要求學生解答,最后生成作答試卷保存到文本文件。 1、電腦隨機出10道題,每題10分,程序結束時顯示學生得分; 2、每道題學生有三次機會輸入答案,當學生輸入錯誤答案時,提醒學生重新輸入,如果三次機會結束則給出正確答案; 3、對於每道題,學生第一次輸入正確答案得10分,第二次輸入正確答案得7分,第三次輸入正確答案得5分,否則不得分; 4、總成績90以上顯示“SMART”,80-90顯示“GOOD”,70-80顯示“OK”,60-70顯示“PASS”,60以下“TRY AGAIN”。 |
|||||||
參考 文獻 |
1) 劉欣亮,李敏 主編.C語言程序設計.第二版.北京:電子工業出版社,2018. 2)譚浩強主編.C程序設計學習輔導.第五版.北京:清華大學出版社,2017. 3) 張衛國,朱寧洪 主編.C語言程序設計實踐教程.西安:西安電子科技大學出版社,2019. |
|||||||
時 間 進 度 安 排 |
||||||||
序號 |
起止日期 |
工 作 內 容 |
||||||
1 |
5.11-5.15 |
學習結構體、結構體數組的知識,學習文件的概念、文件的打開、關閉以及各種讀寫操作的知識。 |
||||||
2 |
5.18-5.22 |
學生熟悉題目背景,查閱資料;學生進行功能模塊設計、實現算法的程序設計。 |
||||||
3 |
5.25-5.29 |
編碼、測試、綜合調試程序、程序驗收。 |
||||||
4 |
5.30-6.07 |
根據設計內容形成課程設計文檔,撰寫課程設計報告. |
||||||
5 |
6.08 |
上交課程設計報告。 |
代碼如下:
#include <stdio.h>
#include <stdlib.h> //生成隨機數用
#include <time.h> //利用時間生成種子
int a, b, c; //兩個整數和結果
void formula(); //隨機生成1道題
int calculateScore(int a, int b, int c); //計算得分
void printScore(int score); //打分
int main() {
int n = 10; // 10道題
int i;
int score = 0; //設置學生初始得分為零
for (i = 0; i < n; i++) {
formula();
score += calculateScore(a, b, c);
}
printScore(score);
printf("\nscore = %d\n", score); //根據情況注釋掉
return 0;
// formula();
}
void formula() {
int sign;
srand(time(NULL)); //生成種子
a = rand() % 10;
b = rand() % 10;
sign = rand() % 4;
printf("%d ", a);
switch (sign) {
case 0:
c = a + b;
printf("+");
break;
case 1:
c = a - b;
printf("-");
break;
case 2:
c = a * b;
printf("*");
break;
case 3:
c = a / b;
printf("/");
break;
default:
break;
}
printf(" %d = ?\n", b);
}
int calculateScore(int a, int b, int c) {
int i = 3, answer;
for (i = 0; i < 3; i++) {
scanf("%d", &answer);
if (answer == c)
break;
printf("You are error!\n");
}
switch (i) {
case 0:
return 10;
case 1:
return 7;
case 2:
return 5;
default:
return 0;
}
}
void printScore(int score) {
if (score >= 90) {
printf("SMART\n");
} else if (score >= 80) {
printf("GOOD\n");
} else if (score >= 70) {
printf("OK\n");
} else if (score >= 60) {
printf("PASS\n");
} else {
printf("TRY AGAIN\n");
}
}
目錄
1、設計題目 2
2、設計目的 2
3、問題描述 2
4需求分析 2
5功能介紹 3
6、運行環境 4
7、概要設計 4
8詳細設計 9
9、調試分析 15
10、總結 23
附錄:源程序清單 23
1、 設計題目
小學生數學測試系統設計
2、 設計目的
1、培養學生綜合運用所學的知識,通過上機實踐,提高分析和解決問題的能力。
2、通過實踐訓練,提高學生在理論計算、結構設計、查閱設計資料、運用標准與規范編程能力。
3、問題描述
本系統對加、減、乘、除測試以選擇題、填空題和計算題的形式分別對用戶進行測試,借此來進一步提高數學能力,節省傳統測試的一系列不必要的開支和麻煩。
4需求分析
面向小學生隨機選擇兩個整數形成四則運算算式要求學生解答,最后生成作答試卷保存到文本文件。
1、電腦隨機出10道題,每題10分,程序結束時顯示學生得分;
2、每道題學生有三次機會輸入答案,當學生輸入錯誤答案時,提醒學生重新輸入,如果三次機會結束則給出正確答案;
3、對於每道題,學生第一次輸入正確答案得10分,第二次輸入正確答案得7分,第三次輸入正確答案得5分,否則不得分;
4、總成績90以上顯示“SMART”,80-90顯示“GOOD”,70-80顯示“OK”,60-70顯示“PASS”,60以下“TRY AGAIN”。
5功能介紹
1、出題:電腦隨機出題。
2、答題:用戶答題,每個用戶有三次機會。如果三次都沒有回答正確,則系統顯示正確答案。
3、評分:系統根據用戶的答題情況,自動對其打分,並根據其成績將其歸類。
6、運行環境
Microsoft VC++6.0及以上
7、概要設計
1、總體設計思路
【新建】建立一個新的題庫,題為兩位數以內加減法,並給出答案,十道題后結束,並給出評語。
【題庫】建立題庫,並給出答案。
【輸入】每個學生有三次輸入機會,並判斷對錯
【評分】根據評分細則,學生第一次輸入正確答案得10分,第二次輸入正確答案得7分,第三次輸入正確答案得5分
【評語】將各題分數相加,總成績90以上顯示“SMART”,80-90顯示“GOOD”,70-80顯示“OK”,60-70顯示“PASS”,60以下“TRY AGAIN”
【輸出】輸出評語和總成績。
【保存】保存當前成績到“試卷”文件中。
【退出】退出小學生數學測試系統設計系統。
2主函數
程序采用結構化,模塊化設計。主函數是程序的入口,各模塊相互獨立,並且可以 分塊調試,均由主函數控制調用。
3出題函數
主要完成對數字的隨機抽取以及隨機進行四則運算。
3、 計分檢查函數
5、評判函數
6、保存函數
保存當前成績到“試卷”文件中。
FILE *fpt;
fprintf(fpt,"%d",);
fclose(fpt,char*format,char*arg-list);
8詳細設計
1、預編譯部分
#include <stdio.h>
#include <stdlib.h> //生成隨機數用
#include <time.h> //利用時間生成種子
4、 出題函數
隨機出題,是試卷的題庫。
void formula()
{
int sign;
srand(time(NULL)); //生成種子
a = rand() % 50;
b = rand() % 50;
sign = rand() % 3;
printf("%d ", a);
switch (sign)
{
case 0:
c = a + b;
printf("+");
fprintf(fpt,"%d+%d=?\n",a,b);
break;
case 1:
c = a - b;
printf("-");
fprintf(fpt,"%d-%d=?\n",a,b);
break;
case 2:
c = a * b;
printf("*");
fprintf(fpt,"%d*%d=?\n",a,b);
break;
case 3:
c = a / b;
printf("/");
fprintf(fpt,"%d/%d=?\n",a,b);
break;
default:
break;
}
printf(" %d = ?\n", b);
}
5、 計分檢查函數
實現檢查和打分的功能,模擬評卷人。
int calculateScore(int a, int b, int c)
{
int i = 3, answer;
for (i = 0; i < 3; i++)
{
scanf("%d", &answer);
if (answer == c)
{
fprintf(fpt,"%d\n",c);
break;
}
if(answer!=c)
printf("You are error!\n");
fprintf(fpt,"%d\n",answer);
fprintf(fpt,"You are error!\n");
}
if(i==3)
{
printf("正確答案是%d\n",c);
fprintf(fpt,"正確答案是%d\n",c);
}
switch (i)
{
case 0:
return 10;
case 1:
return 7;
case 2:
return 5;
default:
return 0;
}
}
4、評判函數
根據所得的分數,選出優劣之分。
void printScore(int score)
{
if (score >= 90)
{
printf("SMART\n");
fprintf(fpt,"SMART");
}
else if (score >= 80)
{
printf("GOOD\n");
fprintf(fpt,"GOOD");
}
else if (score >= 70)
{
printf("OK\n");
fprintf(fpt,"OK");
}
else if (score >= 60)
{
printf("PASS\n");
fprintf(fpt,"PASS");
}
else
{
printf("TRY AGAIN\n");
fprintf(fpt,"TRY AGAIN");
}
}
5、主函數
程序采用結構化,模塊化設計。主函數是程序的入口,各模塊相互獨立,並且可以 分塊調試,均由主函數控制調用。
int main()
{
int n = 10; // 10道題
int i;
int score = 0; //設置學生初始得分為零
fpt = fopen("試卷.txt","w");
for (i = 0; i < n; i++)
{
formula();
score += calculateScore(a, b, c);
}
printScore(score);
printf("\nscore = %d\n", score); //根據情況注釋掉
fprintf(fpt,"總成績為%d",score);
fclose(fpt);
return 0;
// formula();
}
9、調試分析
以下為程序運行的界面
此時的程序答題有4次機會,且全部回答錯誤后,沒有顯示正確答案。故程序此時有問題。
此時答題機會只有一次,不符合要求,仍需調試。需要修改檢查函數的部分參數。
回答機會只有一次,且給出的答案也不對。
此時每次回答正確,均會顯示正確答案,仍不符合要求。
此時雖會顯示正確答案,但有4次機會。不符合要求。且不能保存。
此時回答錯誤直接給出正確答案,沒有給答題者改正的機會。但不能實現保存功能。因此還需要添加fprintf函數和文件指針。
此次調試解決了回答次數和正確答案顯示的問題。但不能實現保存功能。
試卷可以自動保存在文本里。
文本內容和程序執行完成后的內容一致,調試完成。
10、總結
C語言是計算機程序設計的重要理論基礎,在我們以后的學習和工作中都有着十分重要的.地位。要學好這種語言,僅僅學習課本上的知識是不夠的,還要經常自己動手,有較強的實踐能力。
只有多動手,經常編寫程序,才能發現我們學習上的漏洞和自己的不足,並在實踐中解決這些問題,不斷提高自己轉化知識的能力。在我們小組有解決不了的問題時,我們會主動查閱相關的資料,或向其他同學詢問,這不僅豐富了我們的知識,還增進了我們同學之間的友誼。課時不注重對文件的運用,所以在這方面有較大的困難。我先將書本認認真真地看了一-遍,又做了一下課后習題來驗證和增進自己的理解,終於,經過我們的不懈努力,我們小組的程序有了突破。
課程設計到此算是基本結束,在程序設計中 暴露出的我自身的問題卻是非常明顯。
首先,基礎掌握不牢固。許多基本語法尚沒有熟練掌握,在設計過程中仍需 請教其它同學,更要重新研究課本,設計效率低。 其次,經典算法掌握不牢。在編寫程序的時候常常會停下來求助於書本,查 看各種算法。 再次,程序量過大的時候,頭緒理不清。雜亂無章,無系統性,不便調試和 閱覽,自己也易於出錯。比如說少加分號,大括號,忘了先定義后使用的原則。 回顧這幾天,我感慨頗多,的確,自從拿到題目到完成整個編程,從理論到實踐,
可以學到很多很多的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了 很多在書本上所沒有學到過的知識。通過這次課程設計使我們懂得了理論與實際 相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐 相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動 手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,這 畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設計的過程中發現了自 己的不足之處,對一些前面學過的知識理解得不夠深刻,掌握得不夠牢固,比如 說結構體,指針,文件,函數…通過這次課程設計之后,我們把前面所學過的知識又重新溫故了一遍。
這次課程設計終於順利完成了,在設計中遇到了很多編程問題,最后在老師的辛勤指導下。最后,對給過我幫助的所有同學和指導老師再次表示忠心的感謝!
附錄:源程序清單
#include <stdio.h>
#include <stdlib.h> //生成隨機數用
#include <time.h> //利用時間生成種子
int a, b, c; //兩個整數和結果
void formula(); //隨機生成1道題
int calculateScore(int a, int b, int c); //計算得分
void printScore(int score); //打分
FILE *fpt;
//主函數
int main()
{
int n = 10; // 10道題
int i;
int score = 0; //設置學生初始得分為零
fpt = fopen("試卷.txt","w");
for (i = 0; i < n; i++)
{
formula();
score += calculateScore(a, b, c);
}
printScore(score);
printf("\nscore = %d\n", score); //根據情況注釋掉
fprintf(fpt,"總成績為%d",score);
fclose(fpt);
return 0;
// formula();
}
//出題函數
void formula()
{
int sign;
srand(time(NULL)); //生成種子
a = rand() % 50;
b = rand() % 50;
sign = rand() % 3;
printf("%d ", a);
switch (sign)
{
case 0:
c = a + b;
printf("+");
fprintf(fpt,"%d+%d=?\n",a,b);
break;
case 1:
c = a - b;
printf("-");
fprintf(fpt,"%d-%d=?\n",a,b);
break;
case 2:
c = a * b;
printf("*");
fprintf(fpt,"%d*%d=?\n",a,b);
break;
case 3:
c = a / b;
printf("/");
fprintf(fpt,"%d/%d=?\n",a,b);
break;
default:
break;
}
printf(" %d = ?\n", b);
}
//計分檢查函數
int calculateScore(int a, int b, int c)
{
int i = 3, answer;
for (i = 0; i < 3; i++)
{
scanf("%d", &answer);
if (answer == c)
{
fprintf(fpt,"%d\n",c);
break;
}
if(answer!=c)
printf("You are error!\n");
fprintf(fpt,"%d\n",answer);
fprintf(fpt,"You are error!\n");
}
if(i==3)
{
printf("正確答案是%d\n",c);
fprintf(fpt,"正確答案是%d\n",c);
}
switch (i)
{
case 0:
return 10;
case 1:
return 7;
case 2:
return 5;
default:
return 0;
}
}
//評判函數
void printScore(int score)
{
if (score >= 90)
{
printf("SMART\n");
fprintf(fpt,"SMART");
}
else if (score >= 80)
{
printf("GOOD\n");
fprintf(fpt,"GOOD");
}
else if (score >= 70)
{
printf("OK\n");
fprintf(fpt,"OK");
}
else if (score >= 60)
{
printf("PASS\n");
fprintf(fpt,"PASS");
}
else
{
printf("TRY AGAIN\n");
fprintf(fpt,"TRY AGAIN");
}
}