2020面向對象寒假作業(二)


2020面向對象寒假作業(二)

這個作業屬於哪里 2020面向對象程序設計
這個作業在哪里 2020面向對象寒假作業二
- 1.繼續完成編程題
這個作業目標 2.新建一個github倉庫,並把作業推送到該倉庫
- 3.發布博客
作業正文 2020面向對象寒假作業(二)
參考文獻 2020面向對象程序設計寒假作業2 題解
- Windows批處理(cmd/bat)常用命令教程

1.使用github desktop新建一個github倉庫

(1)下載github desktop

(2)注冊信息,進入如下頁面

(3)點在右上角file,點擊new repository,填入信息建立新倉庫

(4)進入倉庫所在文件夾,把作業相關文件復制到該文件夾,再上傳到倉庫

2.編程題

·繼續完成作業一的編程題。
·優化架構,一般要求每個函數長度不超過15行。
·優化規范,尤其是命名規范。
·制作一個編譯腳本,運行該腳本可以編譯你的代碼,可選的腳本語言,python(2.7),windows批處理,powershell,shell。
·進行單元測試,即測試每一個函數,並制作一個測試腳本,運行該腳本可以進行測試,並顯示測試結果。
·在作業一編程題的基礎上添加以下功能
·通過命令行讀取一個文件

(1)代碼分塊

error塊:提示錯誤信息

對輸入error函數的數據進行判斷,如果數據錯誤,輸出錯誤提示信息如果數據正確,不執行任何操作。

void error(int judge)
{
	if(judge==1) printf("數據類型輸入錯誤\n");
	else if(judge==2) printf("數值輸入錯誤,應屬於零到十范圍\n");
	else if(judge==3) printf("數值總和必須在0~99范圍\n");
	else if(judge==4) printf("符號輸入錯誤\n");  
 }

num塊:執行字符轉為數字

將輸入num函數的字符進行判斷,如果能轉化成數字,則返回對應數字;如果不能轉化成數字,則返回錯誤信息。

int num(char d[])
{
	if(!strcmp(d,"零")) return 0;
	else if(!strcmp(d,"一")) return 1;
	else if(!strcmp(d,"二")) return 2;
	else if(!strcmp(d,"三")) return 3;
	else if(!strcmp(d,"四")) return 4;
	else if(!strcmp(d,"五")) return 5;
	else if(!strcmp(d,"六")) return 6;
	else if(!strcmp(d,"七")) return 7;
	else if(!strcmp(d,"八")) return 8;
	else if(!strcmp(d,"九")) return 9;
	else if(!strcmp(d,"十")) return 10;
	else error(2); 
}

judge塊:符號判斷

對輸入judge函數的數據進行判斷,如果是指定符號,則進行指定操作;如果不是指定符號,則返回錯誤信息。

int judge(int n ,char c[],char d[])
{
	if(!strcmp(c,"增加")) return n+num(d);
	else if(!strcmp(c,"減少")) return n-num(d);
	else error(4); 
}

sum塊:將最終數據轉化成字符輸出

將輸入sum函數的最終數據轉化成漢字輸出。

void sum(int n)
{
	char nums[10][4]={"零","一","二","三","四","五","六","七","八","九"};
	if(n<10) printf("%s",nums[n]);
	else
	{
		int m=n%10;
		n=n/10;
		if(!strcmp(nums[n],"一")) printf("十%s",nums[m]);
		else printf("%s十%s",nums[n],nums[m]);
	} 
}

calculate塊:針對每一次的運算調用judge、sum、num塊

對輸入calculate函數的運算操作,調用相關函數,執行運算操作

void calculate(int coin)
{
	char b[10],c[10],d[10];
	while(2)
	{
		scanf("%s",b); 
		if(!strcmp(b,"看看"))
		{
			if(coin>99) error(3);
			else sum(coin);
			break;
		}
		scanf("%s%s",c,d);
		coin = judge(coin,c,d); 
	}
}

main塊:打開輸入信息文件,連接函數

負責打開包含輸入信息的文件,作為主函數連接其他函數。

int main()
{
	char file[100];
	printf("請輸入文件地址\n");
	scanf("%s",file); 
	freopen(file,"r",stdin);
	char a[10], b[10], c[10], d[10];
	int coin;
	scanf("%s%s%s%s",a,b,c,d);
	getchar();
	if(!strcmp(a,"整數"))
	{
		if(num(d)==-1) error(2);
		else
		{
			coin += num(d);
		} 
	}
	else error(1); 
	if(coin>99||coin<0) error(3); 
	else
	{
		calculate(coin);
	}
}

(2)制作編譯腳本

題目信息理解錯,分析其他同學作業(感謝大佬)之后,改用Windows批處理。

@echo off
echo 請輸入文件所在磁盤
set /p a=
echo 正在轉移到該磁盤
cd "%a%"
echo 請輸入文件所在路徑
set /p b=
echo 轉移到文件路徑
cd "%b%"
echo 請輸入文件名
set /p c=
echo 編譯開始
gcc "%c%" -o try.exe
if exist "try.exe" echo 編譯成功
if not exist "try.exe" echo 編譯失敗
pause

問題:

    >【1】用Notepad++編譯腳本,出現亂碼情況
    >【2】出現bat文件快速打開快速關閉情況
    >【3】出現無法用變量a實現cd、if操作問題

解決方法:

    >【1】使用Windows自帶的記事本
    >【2】在文件中末尾添加pause語句
    >【3】使用"%a%"格式解決

(3)測試腳本

繼續使用Windows批處理制作簡單測試腳本

單元測試模塊選取

因為代碼中num函數與judge函數,承擔最重要的運算部分,故選取num函數與judge函數進行單元測試。
設計測試程序

#include<stdio.h>

int num(char d[])
{
	if(!strcmp(d,"零")) return 0;
	else if(!strcmp(d,"一")) return 1;
	else if(!strcmp(d,"二")) return 2;
	else if(!strcmp(d,"三")) return 3;
	else if(!strcmp(d,"四")) return 4;
	else if(!strcmp(d,"五")) return 5;
	else if(!strcmp(d,"六")) return 6;
	else if(!strcmp(d,"七")) return 7;
	else if(!strcmp(d,"八")) return 8;
	else if(!strcmp(d,"九")) return 9;
	else if(!strcmp(d,"十")) return 10;
	else return -1; 
}

int judge(char c[])
{
	if(!strcmp(c,"增加")) return 1;
	else if(!strcmp(c,"減少")) return 2;
	else return -1; 
}

int main()
{
	int a,i,k;
	char d[13][10]={"零","一","二","三","四","五","六","七","八","九","十","增加","減少"};
	char c[13][10]={"0","我","真","的","好","菜","啊","!","十一","1","2","加上","-"}; 
	for(i=0,k=1;i<13;i++)
	{
		if(k==1) printf("輸入 %s  ",d[i]);
		else printf("輸入 %s  ",c[i]); 
		if(i<11)
		{
			if(k==1) a=num(d[i]);
			else a=num(c[i]);
			if(a!=-1) printf("number pass\n");
			else printf("number error\n");
		}
		else
		{
			if(k==1) a=judge(d[i]);
			else a=num(c[i]);
			if(a!=-1) printf("symbol pass\n");
			else printf("symbol error\n");
		}
		if(i==12&&k==1)
		{
			k++;
			i=0;
			printf("正確輸入測試完畢,進行錯誤輸入測試\n"); 
		}
		if(k==2&&i==12) printf("所有輸入測試完畢");
	}
} 

編寫測試腳本

@echo off
cd d:
echo 開始測試
text1.exe
echo 測試結束
pause

測試結果展示

(3)通過命令行讀取一個文件

使用C語言中的freopen()函數傳入包含輸入信息的文件,再執行后續操作

首先編寫幾個輸入信息的文件

運行C語言程序

問題:

    【1】使用fopen函數,顯示錯誤信息
    【2】使用正確的函數,地址輸入錯誤

解決方法:

    【1】使用freopen函數
    【2】地址錯誤形式"E:\aa.txt",正確形式"E:\\aa.txt"或者"E:/aa.txt"

(4)完整代碼

#include<stdio.h>
#include<string.h>

void error(int judge)
{
	if(judge==1) printf("數據類型輸入錯誤\n");
	else if(judge==2) printf("數值輸入錯誤,應屬於零到十范圍\n");
	else if(judge==3) printf("數值總和必須在0~99范圍\n");
	else if(judge==4) printf("符號輸入錯誤\n");  
 }

int num(char d[])
{
	if(!strcmp(d,"零")) return 0;
	else if(!strcmp(d,"一")) return 1;
	else if(!strcmp(d,"二")) return 2;
	else if(!strcmp(d,"三")) return 3;
	else if(!strcmp(d,"四")) return 4;
	else if(!strcmp(d,"五")) return 5;
	else if(!strcmp(d,"六")) return 6;
	else if(!strcmp(d,"七")) return 7;
	else if(!strcmp(d,"八")) return 8;
	else if(!strcmp(d,"九")) return 9;
	else if(!strcmp(d,"十")) return 10;
	else return -1; 
}

int judge(int n ,char c[],char d[])
{
	if(!strcmp(c,"增加")) return n+num(d);
	else if(!strcmp(c,"減少")) return n-num(d);
	else error(4); 
}

void sum(int n)
{
	char nums[10][4]={"零","一","二","三","四","五","六","七","八","九"};
	if(n<10) printf("%s",nums[n]);
	else
	{
		int m=n%10;
		n=n/10;
		if(!strcmp(nums[n],"一")) printf("十%s",nums[m]);
		else printf("%s十%s",nums[n],nums[m]);
	} 
}

void calculate(int coin)
{
	char b[10],c[10],d[10];
	while(2)
	{
		scanf("%s",b); 
		if(!strcmp(b,"看看"))
		{
			if(coin>99) error(3);
			else sum(coin);
			break;
		}
		scanf("%s%s",c,d);
		coin = judge(coin,c,d); 
	}
} 
 

int main()
{
	char file[100];
	printf("請輸入文件地址\n");
	scanf("%s",file); 
	freopen(file,"r",stdin);
	char a[10], b[10], c[10], d[10];
	int coin;
	scanf("%s%s%s%s",a,b,c,d);
	getchar();
	if(!strcmp(a,"整數"))
	{
		if(num(d)==-1) error(2);
		else
		{
			coin += num(d);
		} 
	}
	else error(1); 
	if(coin>99||coin<0) error(3); 
	else
	{
		calculate(coin);
	}
}

總結:這次的作業我做了很長時間,從最開始的理解錯題目,用Python在錯誤的方向上尋找解決辦法,遲遲沒有成果而放棄,再到現在的成功完成。我明白正確的方向比盲目的尋找更重要。

Windows批處理天下第一!


免責聲明!

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



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