寒假作業2:編程題


這個作業屬於哪個課程 2020年面向對象程序設計
這個作業要求在哪里 面向對象程序設計寒假作業2
這個作業的目標 1.繼續完成作業一的編程題。
2.優化架構,一般要求每個函數長度不超過15行。
3.優化規范,尤其是命名規范。
4.制作一個編譯腳本,運行該腳本可以編譯你的代碼,可選的腳本語言,python(2.7),windows批處理,powershell,shell。
作業正文 如下所示
其他參考文獻 在鏈接中體現

編程題

這回編程對上一次進行了大幅度的優化絕對不是因為上一次寫的太爛回爐重造了嗚嗚嗚
在學習C++的過程中發現好像用C++編寫這道題目還是蠻香的??於是直接改造原代碼寫了一個C++版本的代碼
對比於C,C++對於string的處理多了很多好用的函數,而且從安全性上也比C有提高
還是跟上次一樣,對函數進行聲明,對基本漢字進行了定義

int find (string& zhao);
void find (int num);
//find函數重載

void dingyi (int& money, string& wen);//初始化錢包
void jianfa (int& money, string& wen);//減法操作
void jiafa(int& money, string& wen);//加法操作
//功能函數

const char shu[11][3] = { "零","一", "二","三","四","五","六","七","八","九","十" };
//對基本的漢字進行定義

這邊應用了函數重載來提高函數的使用效率,並且盡可能的使用C++中的引用來減少內存的占用
上一次C語言版本把一大堆的代碼都放在了while中,這樣顯得長長的一大堆看着很亂,也不利於后期的修改,於是全部改成函數
首先是用於檢索漢字對應數字及輸出數字對應漢字的函數

int find(string &zhao) {
	int len = zhao.length();
	int sum = 0;
	int i, flag = 0;
	//三個漢字
	if (len == 6) {
		for (i = 0; i < 11; i++) {
			if (zhao.compare(0, 2, shu[i]) == 0) {
				sum += 10 * i;
				flag = 1;
				break;
			}
			if (flag == 0 && i == 10) return -1;
		}
		flag = 0;
		for (i = 0; i < 11; i++) {
			if (zhao.compare(4, 2, shu[i]) == 0) {
				sum += i;
				flag = 1;
				break;
			}
			if (flag == 0 && i == 10) return -1;
		}
		return sum;
	}
	//兩個漢字
	else if (len == 4) {
		sum = 1;
		for (i = 0; i < 11; i++) {
			if (zhao.compare(0, 2, shu[i]) == 0) {
				flag = 1;
				break;
			}
		}
		if (i == 10) {
			for (i = 0; i < 11; i++) {
				if (zhao.compare(2, 2, shu[i]) == 0) {
					flag = 1;
					break;
				}
			}
			sum = 10 + i;
			return sum;
		}
		else if (i < 10 && i>0) {
			sum = i * 10;
			return sum;
		}
		else if (flag == 0 && i == 10) return -1;
	}
	//一個漢字
	else if (len == 2) {
		for (i = 0; i < 11; i++) {
			if (zhao.compare(0, 2, shu[i]) == 0) {
				sum += i;
				flag = 1;
				break;
			}
			if (flag == 0 && i == 10) return -1;
		}
		return sum;
	}
	else return -1;//如果異常則拋出-1
}

void find(int num) {
	if (num <= 10 && num >= 0) {
		cout << shu[num] << endl;
	}
	else if (num % 10 == 0) {
		cout << shu[num / 10] << "十" << endl;
	}
	else if (num % 10 == 1) {
		cout << "十" << shu[num % 10] << endl;
	}
	else if (num > 10 && num < 100) {
		cout << shu[num / 10] << "十" << shu[num % 10] << endl;
	}
}

這回的代碼解決了上一次只能處理十以下數字的問題,並且對一些特殊的數字進行特殊處理
如十一,四十之類的,不會輸出一十一,四十零,並且分別對一個字,兩個字,三個字分開處理
這邊因為需要討論的情況不是特別的多,於是選擇分開進行處理
然后是錢包的初始化,錢包的加減法

void dingyi(int& money,string &wen) {
	//printf("1");
	int len = wen.length();
	string temp = wen.substr(15, len);
	if (find(temp) != -1) {
		money = find(temp);
	}
	else {
		printf("非法輸入\n");//異常處理
	}
}

void jianfa(int& money, string &wen) {
	//printf("4");
	int len = wen.length();
	string temp = wen.substr(10, len);
	if (find(temp) != -1) {
		money -= find(temp);
	}
	else {
		printf("非法輸入\n");//異常處理
	}
}

void jiafa(int& money, string& wen) {
	//printf("3");
	int len = wen.length();
	string temp = wen.substr(10, len);
	if (find(temp) != -1) {
		money += find(temp);
	}
	else {
		printf("非法輸入\n");//異常處理
	}
}

以下是完整代碼

#include <iostream>
#include <string>
using namespace std;

int find (string& zhao);
void find (int num);
//find函數重載

void dingyi (int& money, string& wen);//初始化錢包
void jianfa (int& money, string& wen);//減法操作
void jiafa(int& money, string& wen);//加法操作
//功能函數

const char shu[11][3] = { "零","一", "二","三","四","五","六","七","八","九","十" };
//對基本的漢字進行定義

int main() {
	int money = 0;
	string kankan = "看看 錢包";
	string yuan = "整數 錢包 等於";
	string jia = "錢包 增加";
	string jian = "錢包 減少";
	while (1) {
		string a,temp;
		getline(cin, a);
		//定義錢包初始數額
		if (a.compare(0, 13, yuan, 0, 13) == 0) {
			dingyi(money, a);
		}
		//看看錢包的余額
		else if (a.compare(0,9,kankan,0,9) == 0) {
			find(money);
			break;
		}
		//對余額進行加法操作
		else if (a.compare(0,9,jia,0,9) == 0) {
			jiafa(money, a);
			continue;
		}
		//對余額進行減法操作
		else if (a.compare(0,9,jian,0,9) == 0) {
			jianfa(money, a);
			continue;
		}
		//異常處理
		else {
			printf("非法輸入\n");
			continue;
		}
	}
	return 0;
}

int find(string &zhao) {
	int len = zhao.length();
	int sum = 0;
	int i, flag = 0;
	//三個漢字
	if (len == 6) {
		for (i = 0; i < 11; i++) {
			if (zhao.compare(0, 2, shu[i]) == 0) {
				sum += 10 * i;
				flag = 1;
				break;
			}
			if (flag == 0 && i == 10) return -1;
		}
		flag = 0;
		for (i = 0; i < 11; i++) {
			if (zhao.compare(4, 2, shu[i]) == 0) {
				sum += i;
				flag = 1;
				break;
			}
			if (flag == 0 && i == 10) return -1;
		}
		return sum;
	}
	//兩個漢字
	else if (len == 4) {
		sum = 1;
		for (i = 0; i < 11; i++) {
			if (zhao.compare(0, 2, shu[i]) == 0) {
				flag = 1;
				break;
			}
		}
		if (i == 10) {
			for (i = 0; i < 11; i++) {
				if (zhao.compare(2, 2, shu[i]) == 0) {
					flag = 1;
					break;
				}
			}
			sum = 10 + i;
			return sum;
		}
		else if (i < 10 && i>0) {
			sum = i * 10;
			return sum;
		}
		else if (flag == 0 && i == 10) return -1;
	}
	//一個漢字
	else if (len == 2) {
		for (i = 0; i < 11; i++) {
			if (zhao.compare(0, 2, shu[i]) == 0) {
				sum += i;
				flag = 1;
				break;
			}
			if (flag == 0 && i == 10) return -1;
		}
		return sum;
	}
	else return -1;//如果異常則拋出-1
}

void find(int num) {
	if (num <= 10 && num >= 0) {
		cout << shu[num] << endl;
	}
	else if (num % 10 == 0) {
		cout << shu[num / 10] << "十" << endl;
	}
	else if (num % 10 == 1) {
		cout << "十" << shu[num % 10] << endl;
	}
	else if (num > 10 && num < 100) {
		cout << shu[num / 10] << "十" << shu[num % 10] << endl;
	}
}

void dingyi(int& money,string &wen) {
	//printf("1");
	int len = wen.length();
	string temp = wen.substr(15, len);
	if (find(temp) != -1) {
		money = find(temp);
	}
	else {
		printf("非法輸入\n");//異常處理
	}
}

void jianfa(int& money, string &wen) {
	//printf("4");
	int len = wen.length();
	string temp = wen.substr(10, len);
	if (find(temp) != -1) {
		money -= find(temp);
	}
	else {
		printf("非法輸入\n");//異常處理
	}
}

void jiafa(int& money, string& wen) {
	//printf("3");
	int len = wen.length();
	string temp = wen.substr(10, len);
	if (find(temp) != -1) {
		money += find(temp);
	}
	else {
		printf("非法輸入\n");//異常處理
	}
}

這次也算是用上了剛剛學的C++,在使用過程中確實有不少頭疼的地方,比如自學了一大堆C++關於字符串處理的函數,以及C++字符串的讀入與輸出
C++的cin如果用於讀入字符串是以空格回車等為分隔的,這一點我開頭沒有注意到,在調試過程中才發現。
至於讀入文件的功能,可以利用fstream中包含的函數和方法進行操作
在頭文件中先進行包含

#include  <fstream>

這是修改后的主函數部分

int main() {
	int money = 0;
	string kankan = "看看 錢包";
	string yuan = "整數 錢包 等於";
	string jia = "錢包 增加";
	string jian = "錢包 減少";
	string a, temp;
	ifstream ifs;
	ifs.open("test01.txt", ios::in);
	while (getline(ifs,a)) {
		//定義錢包初始數額
		if (a.compare(0, 13, yuan, 0, 13) == 0) {
			dingyi(money, a);
		}
		//看看錢包的余額
		else if (a.compare(0,9,kankan,0,9) == 0) {
			find(money);
			break;
		}
		//對余額進行加法操作
		else if (a.compare(0,9,jia,0,9) == 0) {
			jiafa(money, a);
			continue;
		}
		//對余額進行減法操作
		else if (a.compare(0,9,jian,0,9) == 0) {
			jianfa(money, a);
			continue;
		}
		//異常處理
		else {
			printf("非法輸入\n");
			continue;
		}
	}
	ifs.close();
	return 0;
}

測試文本如下

運行結果

簡易(lou)版測試腳本如下

@echo off
cd C:\Users\11765\Source\Repos\計算器C++版本\Debug
echo 開始運行
PAUSE
計算器C++版本.exe
echo 運行結束
pause

文件需要保存成ANSI格式,不然不知道為什么會亂碼的樣子

參考文獻

https://www.jb51.net/article/151923.htm
https://www.bilibili.com/video/av41559729?p=144


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM