結對程式設計(c語言)

茶菹不是沮發表於2024-04-17

作業要求:

  1. 小學老師要每週給同學出300道四則運算練習題。
    選擇c語言進行實現
    –兩個運算子,100 以內的數字,不需要寫答案。
    –需要檢查答案是否正確,並且保證答案在 0..100 之間
    –儘可能地多設定一些條件
  2. 也可以讓同學們自選一個小應用程式進行結對程式設計的開發
  3. 請兩位同學以結對編碼(一個同學coding,另一個同學在旁邊稽核程式碼,之後再交換角色)的方式完成本次實驗,並把程式、運算結果、部落格體會等截圖發到其中一位同學的部落格上,並在部落格中體現另一位同學的學號(僅學號不體現姓名)

另一位結對同學:2252601

程式碼的編寫過程:

  1. 編譯出隨機生成四則運算的基本程式碼,程式碼的構想為透過do while函式隨機生成數字和運算子,構成表示式
  2. 編譯使用者回答以及判斷使用者答案是否正確或退出的程式碼。
  3. 完善程式碼,檢查漏洞,如除數不可為0,減法不能出現負數,程式碼結果在0-100以內,清除緩衝區字元等。
  4. 構造程式介面,改變字型顏色,讓程式變得更美觀。



遇到的問題:
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;
}

相關文章