• 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批操作还有很多疑问,希望再以后的学习中能弄懂。

  • 相关阅读:
    xpath定向爬取
    正则表达式的零散知识
    正则表达式中的零宽断言
    Cookies
    一行代码从PDF提取Excel文件
    学习kafka的内容总结
    深度学习模型部署
    舆情情感分析
    关键词提取的几种常用方法总结以及代码实现
    语义预训练模型ERNIE
  • 原文地址:https://www.cnblogs.com/littleseasalt/p/12262238.html
Copyright © 2020-2023  润新知