zoukankan      html  css  js  c++  java
  • 面向对象程序设计寒假作业1编程题

    这个作业属于哪个课程 2020年面向对象程序设计 (福州大学 - 数学与计算机科学学院)
    这个作业要求在哪里 面向对象程序设计寒假作业1
    这个作业的目标 1.安装C++开发环境(见附录)
    2.完成问答题、实践题及编程题
    3.发布博客
    作业正文 面向对象程序设计寒假作业1问答题
    面向对象程序设计寒假作业1实践题
    面向对象程序设计寒假作业1编程题
    其他参考文献 均已在问答题、实践题中标出

    编程题

    1.题目要求:

    通过汉字“整数”、“钱包”、“看看”、“增加”、“减少”实现白话文编程。注意钱包总额范围为零至九十九

    2.分解需求:

    通过读题可知,本题包含三个方面:
    (1)定义整数变量“钱包”,并对其进行初始化;
    (2)输入“增加”、“减少”的指令,对钱包总额进行变化;
    (3)通过“看看 钱包”,输出钱包总额。

    3.思考过程及疑惑

    首先,我打算把其分为四块进行,由main函数、负责钱包总额初始化的函数、负责钱包总额增减的函数以及输出钱包总额的函数构成。
    以下为钱包总额初始话的函数代码:

    int beginning(int wallet,char d[]){
        if(strcmp(d,"零")==0) return 0;  //这里使用strcmp函数时,当字符串相同时,返回值应为0,一开始
        else if(strcmp(d,"一")==0) return 1;    //以为是1,故得不出结果,一定要注意!!
        else if(strcmp(d,"二")==0) return 2;
        else if(strcmp(d,"三")==0) return 3;
        else if(strcmp(d,"四")==0) return 4;
        else if(strcmp(d,"五")==0) return 5;
        else if(strcmp(d,"六")==0) return 6;
        else if(strcmp(d,"七")==0) return 7;
        else if(strcmp(d,"八")==0) return 8;
        else if(strcmp(d,"九")==0) return 9;
        else if(strcmp(d,"十")==0) return 10;
        else return -1;
        }    
    

    这里我采取枚举的方法,但是代码会显得很冗长,有没有其他更简便的方法呢?
    对于负责钱包总额增减的函数的部分,我采用在main函数中判断,若字符串c为“增加”,则进行

    wallet+=calculate(wallet,d);
    

    同理,若字符串c为“减少”,则进行

    wallet-=calculate(wallet,d);
    

    本来一开始是打算将增加与减少分别写一个函数的,但是后来发现用if语句进行判断,更加简洁,下面为我的函数主体代码:

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

    对于输出钱包总额的函数这个部分,一开始我打算在函数中分三种情况讨论,然后再在每一种情况中枚举出1-10种情况,而后发现这样做过于冗长,故此再写了一个函数负责1-10汉字输出,而在输出钱包总额函数中的三种情况调用此函数。如下:

    void num(int i){
        if(i==0) printf("零");
        else if(i==1) printf("一");
        else if(i==2) printf("二");
        else if(i==3) printf("三");
        else if(i==4) printf("四");
        else if(i==5) printf("五");
        else if(i==6) printf("六");
        else if(i==7) printf("七");
        else if(i==8) printf("八");
        else if(i==9) printf("九");
        else if(i==10) printf("十");
    }
    void sum(int wallet){
        int a,b;
        if(wallet<=10){num(wallet);}
        else if(wallet<20){
            a=wallet%10;
            printf("十");
            num(a);
        }
        else{
            a=wallet/10;
            b=wallet%10;
            num(a);
            printf("十");
           if(b!=0) num(b); /*这一步我认为比较重要,因为假如钱包总额
                                          正好被十整除,按照我们中文习惯,是不会
                                          打出零的,比如20->二十而非二十零,故我
                                          认为这步判断不可或缺。*/
        }
    }
    

    对于main函数部分,代码见下:

    int main() {
        char a[100],b[100],c[100],d[100];
        int wallet=0,i,flag=0;
        scanf("%s %s %s %s",a,b,c,d);
        if(strcmp(a,"整数")!=0||strcmp(c,"等于")!=0) flag=1;
        for(i=1;flag==0;i++){
            if(i==1) wallet=beginning(wallet,d);
            else {
                scanf("%s",a);
                if(strcmp(a,b)!=0&&strcmp(a,"看看")!=0) break;
                scanf("%s",c);
                if(strcmp(a,"看看")==0){
                    sum(wallet);
                    break;}
                scanf("%s",d);
             if(strcmp(c,"增加")==0) wallet+=calculate(wallet,d);
             if(strcmp(c,"减少")==0) wallet-=calculate(wallet,d);
            }
        }
       return 0;
    }
    

    总代码如下:

    #include <stdio.h>
    #include <string.h>
    int beginning(int wallet,char d[]){
        if(strcmp(d,"零")==0) return 0;
        else if(strcmp(d,"一")==0) return 1;
        else if(strcmp(d,"二")==0) return 2;
        else if(strcmp(d,"三")==0) return 3;
        else if(strcmp(d,"四")==0) return 4;
        else if(strcmp(d,"五")==0) return 5;
        else if(strcmp(d,"六")==0) return 6;
        else if(strcmp(d,"七")==0) return 7;
        else if(strcmp(d,"八")==0) return 8;
        else if(strcmp(d,"九")==0) return 9;
        else if(strcmp(d,"十")==0) return 10;
        else return -1;
    }
    int calculate(int wallet,char d[]){
          if(strcmp(d,"零")==0) return 0;
          else if(strcmp(d,"一")==0) return 1;
          else if(strcmp(d,"二")==0) return 2;
          else if(strcmp(d,"三")==0) return 3;
          else if(strcmp(d,"四")==0) return 4;
          else if(strcmp(d,"五")==0) return 5;
          else if(strcmp(d,"六")==0) return 6;
          else if(strcmp(d,"七")==0) return 7;
          else if(strcmp(d,"八")==0) return 8;
          else if(strcmp(d,"九")==0) return 9;
          else if(strcmp(d,"十")==0) return 10;
          else return -1;
    }
    void num(int i){
        if(i==0) printf("零");
        else if(i==1) printf("一");
        else if(i==2) printf("二");
        else if(i==3) printf("三");
        else if(i==4) printf("四");
        else if(i==5) printf("五");
        else if(i==6) printf("六");
        else if(i==7) printf("七");
        else if(i==8) printf("八");
        else if(i==9) printf("九");
        else if(i==10) printf("十");
    }
    void sum(int wallet){
        int a,b;
        if(wallet<=10){num(wallet);}
        else if(wallet<20){
            a=wallet%10;
            printf("十");
            num(a);
        }
        else{
            a=wallet/10;
            b=wallet%10;
            num(a);
            printf("十");
           if(b!=0) num(b);
        }
    }
    
    int main() {
        char a[100],b[100],c[100],d[100];
        int wallet=0,i,flag=0;
        scanf("%s %s %s %s",a,b,c,d);
        if(strcmp(a,"整数")!=0||strcmp(c,"等于")!=0) flag=1;
        for(i=1;flag==0;i++){
            if(i==1) wallet=beginning(wallet,d);
            else {
                scanf("%s",a);
                if(strcmp(a,b)!=0&&strcmp(a,"看看")!=0) break;
                scanf("%s",c);
                if(strcmp(a,"看看")==0){
                    sum(wallet);
                    break;}
                scanf("%s",d);
             if(strcmp(c,"增加")==0) wallet+=calculate(wallet,d);
             if(strcmp(c,"减少")==0) wallet-=calculate(wallet,d);
            }
        }
       return 0;
    }
    
    

    4.测试用例

    5.疑惑及解决

    * 在解决这一题,我使用枚举的方法将0-10全部写出来,是否有更简便的方法可以替换这种枚举的方法; * 在这一过程中,我尝试了用scanf函数与gets函数,并比较了两者的不同,可以在今后的学习中分情况不同从而进行使用 * 本次使用了strcmp函数,并且注意到了,当两个字符串相同时,其返回值为0,而并非1,这以后一定会注意!!
  • 相关阅读:
    DNSMAQ 搭建 DNS 服务
    kubernetes跨网段pod网络不通问题
    复制密钥到目标机器
    修改博客园css样式
    删除harbor项目下的所有镜像
    菜鸟 Python 100例
    清理日志
    UNIX基础--控制台和终端
    FreeBSD安装桌面环境
    Gentoo启动菜单设置:使用官方LiveDVD Grub主题
  • 原文地址:https://www.cnblogs.com/lvhang/p/12233520.html
Copyright © 2011-2022 走看看