作業要求:
- 小學老師要每週給同學出300道四則運算練習題。
選擇c語言進行實現
–兩個運算子,100 以內的數字,不需要寫答案。
–需要檢查答案是否正確,並且保證答案在 0..100 之間
–儘可能地多設定一些條件 - 也可以讓同學們自選一個小應用程式進行結對程式設計的開發
- 請兩位同學以結對編碼(一個同學coding,另一個同學在旁邊稽核程式碼,之後再交換角色)的方式完成本次實驗,並把程式、運算結果、部落格體會等截圖發到其中一位同學的部落格上,並在部落格中體現另一位同學的學號(僅學號不體現姓名)
另一位結對同學:2252601
程式碼的編寫過程:
- 編譯出隨機生成四則運算的基本程式碼,程式碼的構想為透過do while函式隨機生成數字和運算子,構成表示式
- 編譯使用者回答以及判斷使用者答案是否正確或退出的程式碼。
- 完善程式碼,檢查漏洞,如除數不可為0,減法不能出現負數,程式碼結果在0-100以內,清除緩衝區字元等。
- 構造程式介面,改變字型顏色,讓程式變得更美觀。
遇到的問題:
1.減法出現問題,當x-x的時候答案應該為0,但正確答案卻顯示為負數,這是因為在程式設計中先令result=0,然後才使num1=num2,兩行交換一下就行
2.用來實現輸出居中的Myprintf()不能傳變數,但是調整了一下迴圈就不用全部使用myprintf()就可以實現居中。
3.傳遞程式碼的時候出現中文亂碼的情況,後來用複製處理了
4.未輸出計算結果就清屏了,新增一個system(“pause”)即可
感想:
在四則運算程式碼的編寫過程中,結對程式設計有助於我們一個人在寫程式碼時,另一個人可以很敏銳的檢查出程式碼的錯誤並修改、改進。生成四則運算的基礎程式碼很簡單,但在改進程式碼過程中我們也遇到了一些小坎坷,在結對程式設計中,我們能夠發現對方發現不了的錯誤,讓這些坎坷更容易度過,與此同時也提高了糾錯的能力。此外,結對程式設計還能夠使程式更豐富更完美。
程式碼:
點選檢視程式碼
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
void SetSize(unsigned uCol,unsigned uLine)
{
char cmd[64];
sprintf(cmd,"mode con cols=%d lines=%d",uCol,uLine);
system(cmd);
}
int lenth, lenth2;
int hight, hight2;
void myprintf(boolean b, char *str) {
COORD coord;
if(!b) { //幾句純粹是調一下左右,更好看
lenth =lenth2- strlen(str);
}
coord.X = lenth;
coord.Y = hight = (b ? hight+2 : hight2);
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
printf(str) ; //這個函式沒辦法把可變引數傳進來
}
int main() {
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO scr;
GetConsoleScreenBufferInfo(out, &scr);
lenth2 = lenth = scr.srWindow.Right / 2; //初始化橫向位置
char opera;
int num1, num2, result, answer;
int i;
// 初始化隨機數生成器
srand(time(NULL));
do {
system("color 9E");
myprintf(FALSE,"\033[1;36m");
myprintf(TRUE,"#############################################\n");
myprintf(TRUE,"# 四則運算練習程式 #\n");
myprintf(TRUE,"############輸入101可退出本程式###############\n");
myprintf(TRUE,"\033[0m");
// 隨機生成運算子和數字
num1 = rand() % 100 + 1;
num2 = rand() % 100 + 1;
opera = rand() % 4;
switch (opera) {
case 0:
opera = '+';
result = num1 + num2;
break;
case 1:
opera = '-';
result = num1 - num2;
if (result < 0) { // 確保結果非負
num1 = num2;
result = 0; //bug修正
}
break;
case 2:
opera = '*';
result = num1 * num2;
break;
case 3:
opera = '/';
// 確保不會除以0,且結果為整數
num2 = rand() % (num1 + 1);
if (num2 == 0) num2 = 1; // 防止除以0
while (num1 % num2 != 0) {
num2 = rand() % (num1 + 1);
if (num2 == 0) num2 = 1; // 防止除以0
}
result = num1 / num2;
break;
default:
myprintf(TRUE,"運算子錯誤!\n");
return 1;
}
// 確保結果在0-100範圍內
if (result <0 || result >100) {
continue;
}
myprintf(TRUE,"\033[1;33m");
printf("請計算:%d %c %d = ", num1, opera, num2);
myprintf(TRUE,"\033[0m");
if (!scanf("%d", &answer)) {
// 如果使用者沒有輸入數字,清空輸入緩衝區
scanf("%*s");
answer = -1; // 設定一個不可能的答案,以便於後續判斷
}
// 判斷使用者答案是否正確或退出
if (answer == 101) {
break; // 使用者選擇退出
} else if (answer == result) {
myprintf(TRUE,"\033[1;32m");
myprintf(TRUE,"回答正確!\n");
myprintf(TRUE,"\033[0m");
system("pause") ;
system("cls") ;
} else {
myprintf(TRUE,"\033[1;31m");
printf("回答錯誤,正確答案是:%d\n", result);
myprintf(TRUE,"\033[0m");
system("pause") ; //不加這個就會直接清屏
system("cls") ;
}
// 清除字元
while (getchar() != '\n') {
;
}
myprintf(TRUE,"\033[1;34m");
for (i = 0; i < 40; i++) {
printf("-");
}
myprintf(TRUE,"\n");
myprintf(TRUE,"\033[0m");
} while (1);
myprintf(TRUE,"\033[1;36m");
myprintf(TRUE,"#############################################\n");
myprintf(TRUE,"# 感謝使用本程式! #\n");
myprintf(TRUE,"#############################################\n");
myprintf(TRUE,"\033[0m");
return 0;
}