2020年面向对象程序设计寒假作业2_编程题

编程题:

· 继续完成作业一的编程题。

· 优化架构,一般要求每个函数长度不超过15行。

· 优化规范,尤其是命名规范。

· 制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。

示例脚本:

gcc 1.cpp -o lang.exe

· 进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。

示例脚本:

gcc 1.cpp test.cpp -o test.exe
test

· 在作业一编程题的基础上添加以下功能:

通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt代表我要运行1.txt这个文本中的代码。

假设我的1.txt内容如下:

整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包

输入lang 1.txt后,命令行输出

优化作业一编程题的代码

(1)根据优化架构的要求,将代码分为六个函数,一个主函数,五个自定义函数。其中五个自定义函数如下框所示(各自的作用标注在后面):

int trans_input(char num[]);	//将输入的汉字转化为数字,便于计算 
int input_op(int sum); 	//输入多组数据,直到查看标志字符出现停止循环
int op(int n, char b[],int sum);	//对输入数据进行处理 
void printf_wallet(int sum);  //输出最终结果 
void trans_output(int sum);		//对最终结果的数字转化为汉字并输出

(2)根据优化规范的要求,我将大部分变量的命名,定义的较为通俗易懂,如变量意义的英文或是中文缩写。

char zs[20], wallet[20], opp[20], num[20];	
int sum,n;

(3)在原有代码的基础上,考虑到钱包最终的数额可能不是正数,添加了对于负数的处理。至于最终数额的大小,由原题目提到只会出现零一二三四五六七八九十,我还是只把最终数据范围限制在-99~99之间,如果数据过大,可以通过添加新的函数模块处理。

(4)完整代如下:

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

int trans_input(char num[]);	//将输入的汉字转化为数字,便于计算 
int input_op(int sum); 	//输入多组数据,直到查看标志字符出现停止循环
int op(int n, char b[],int sum);	//对输入数据进行处理 
void printf_wallet(int sum);  //输出最终结果 
void trans_output(int sum);		//对最终结果的数字转化为汉字并输出

char zs[20], wallet[20], opp[20], num[20];	
int sum,n;

int main()
{
    scanf("%s %s %s %s",zs,wallet,opp,num);
    sum = trans_input(num);	
    sum = input_op(sum);
	if(sum < 0)  //处理钱包数额为负数 
	{
		printf("负");
		sum=-sum;
	} 
	printf_wallet(sum);
    return 0;
}

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

int input_op(int sum)
{
	while (1)
    {
        scanf("%s %s",wallet,opp);
        if (strcmp(wallet,"看看") == 0)
        break;
        scanf("%s", num);
        n = trans_input(num);
        sum = op(n, opp, sum);
    }	
    return sum;
}

int op(int n, char opp[], int sum)
{
    if (strcmp(opp, "增加") == 0) sum = sum + n;
    if (strcmp(opp, "减少") == 0) sum = sum - n;
    return sum;
}

void printf_wallet(int sum)
{
	int shi;
	if(sum <= 10) 	trans_output(sum);	
    else	
    {
        shi = sum / 10;
        sum = sum % 10;
        if (shi == 1)
        {
            printf("十");
            trans_output(sum);
        }
        if(shi > 1)
        {
            trans_output(shi);
            printf("十");
            trans_output(sum);
        }
    }
 } 
 
 void trans_output(int sum)
{
    if (sum == 1) printf("一");
    if (sum == 2) printf("二");
    if (sum == 3) printf("三");
    if (sum == 4) printf("四");
    if (sum == 5) printf("五");
    if (sum == 6) printf("六");
    if (sum == 7) printf("七");
    if (sum == 8) printf("八");
    if (sum == 9) printf("九");
    if (sum == 10) printf("十");
}

(5)部分测试结果图:

制作编译脚本(脚本语言:windows批处理),运行脚本编译代码

说实话,这个题目我都看的不是很懂,参考了别的同学的作业,加上自己百度的结果,得到如下的结果。

(1)先根据各种资料,编写了代码如下:

@echo off 
echo 请输入文件名
set /p b=
C:Dev-CppMinGW64ingcc %b%.cpp -o x.exe
if exist x.exe echo 编译成功
if not exist x.exe echo 编译失败
pause

(2)最开始我将代码编写在记事本里,通过另存为转化为.bat,但是运行时出现了乱码。参考别人的解决方案,我将它放入写字板,再转化就成功了,得到了如下结果。

制作测试脚本,运行脚本进行测试,得出测试结果

我选择了汉字转数字和数字转汉字两个单元进行测试。

(1)测试脚本如下:

@echo off
echo part1开始测试
part1.exe
echo part1测试结束
echo part2开始测试
part2.exe
echo part2测试结束
pause

(2) 被测试的单元代码如下:

Part1:

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

int trans_input(char num[]);

int main()
{
	char zs[][4]={"零","一","二","三","四","五","六","七","八","九","十"};
	int i,n;
	for(i=0;i<11;i++)
	{
		n=trans_input(zs[i]);
		printf("%d ",n);
	}
	return 0;
} 

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

Patr2:

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

void printf_wallet(int sum);
void trans_output(int sum);	
 
int main()
{
	int num[100],i;
	for(i=0;i<100;i++)
	{
		num[i]=i;
		printf_wallet(num[i]);
		if((i+1)%5==0)
		printf("
");
	}
	return 0;
}

void printf_wallet(int sum)
{
	int shi;
	if(sum <= 10) 	trans_output(sum);	
    else	
    {
        shi = sum / 10;
        sum = sum % 10;
        if (shi == 1)
        {
            printf("十");
            trans_output(sum);
        }
        if(shi > 1)
        {
            trans_output(shi);
            printf("十");
            trans_output(sum);
        }
    }
 } 
 
void trans_output(int sum)
{
    if (sum == 0) printf("零"); 
	if (sum == 1) printf("一");
    if (sum == 2) printf("二");
    if (sum == 3) printf("三");
    if (sum == 4) printf("四");
    if (sum == 5) printf("五");
    if (sum == 6) printf("六");
    if (sum == 7) printf("七");
    if (sum == 8) printf("八");
    if (sum == 9) printf("九");
    if (sum == 10) printf("十");
}

(3)得到的测试结果如下图:

添加通过命令行读取一个文件,然后运行这个文件的功能

(1)通过百度和询问同学后了解到,要使用freopen函数,其格式如下:

freopen(“文件地址”,"r",stdin);

(2) 将样例文本复制,存放在1.txt中。

(3)修改源代码的主函数,如下图所示:

int main()
{
	freopen("1.txt","r",stdin);
	scanf("%s %s %s %s",zs,wallet,opp,num);
    sum = trans_input(num);	
    sum = input_op(sum);
	if(sum < 0)  //处理钱包数额为负数 
	{
		printf("负");
		sum=-sum;
	} 
	printf_wallet(sum);
    return 0;
}

(4)打开命令行窗口,按要求输入后,得到下图:

反思及感悟

通过本次作业学到了很多东西,对于windows批操作还有很多疑问,希望再以后的学习中能弄懂。

原文地址:https://www.cnblogs.com/littleseasalt/p/12262238.html