首页 > 其他分享 >每天打卡一小时 第十九天 编译四部曲

每天打卡一小时 第十九天 编译四部曲

时间:2023-05-05 23:11:17浏览次数:34  
标签:BigNum ++ s2 第十九 int num -- 打卡 四部曲

第一部曲 自然语言 

先将大数类的框架写好,再定义其中的函数

分别写出每一个函数,通过分步骤的方法解决问题

 

有参构造函数

首先声明函数时,默认参数

定义 根据数值的正负进行选择 

然后进行循环将数字进行输入

拷贝构造函数

循环进行赋值操作

公有函数成员

选择正负符号 循环赋值

直接输出

 

重载运算符 

好难

此题中最难的部分

明天细说

 

第二部曲 流程图

第三部曲 代码

#include <cstring>

class BigNum
{
private:
    char num[N];
public:
    BigNum( char c[N] = "+0" );
    BigNum( const BigNum &p );
    ~BigNum()
    {
        cout<<"BigNum Destructor run"<<endl;
    }
    void setNum( char c[N] );
    char const * getNum(void) const;
    BigNum operator + ( const BigNum &a );
    BigNum operator - (  BigNum &b );
    void show() const;
};
 
 
BigNum::BigNum( char c[N] )
{
    int i,j,a = strlen(c);
    if( c[0] != '-')
    {
        num[0] = '+';
        if( c )
        {
            for( i=strlen(c), j=0; i>=1; i--,j++)
            {
                num[i] = c[j];
            }
        }
        num[a+1] = '\0';
    }
    else
    {
        num[0] = c[0];
        for( i=strlen(c)-1, j=1; i>=1; i--,j++)
        {
            num[i] = c[j];
        }
        num[a] = '\0';
    }
    cout<<"BigNum Constructor run"<<endl;
}
 
BigNum::BigNum( const BigNum &p )
{
    int i=0;
    if(p.num)
    {
        while( p.num[i] != '\0' )
        {
            num[i] = p.num[i];
            i++;
        }
        num[i] = '\0';
    }
    cout<<"BigNum CopyConstructor run"<<endl;
}

void BigNum::setNum( char c[N] )
{
    int i,j,a = strlen(c);
    if( c[0] != '-')
    {
        num[0] = '+';
        if( c )
        {
            for( i=strlen(c), j=0; i>=1; i--,j++)
            {
                num[i] = c[j];
            }
        }
        num[a+1] = '\0';
    }
    else
    {
        num[0] = c[0];
        for( i=strlen(c)-1, j=1; i>=1; i--,j++)
        {
            num[i] = c[j];
        }
        num[a] = '\0';
    }
}
 
char const * BigNum::getNum(void) const
{
    return num;
}
 
BigNum BigNum::operator + ( const BigNum &a )
{
    if(num[0]=='+' && a.num[0]=='-')
    {
        BigNum s2(a);
        s2.num[0] = '+';
        return  (*this) - s2;
    }
    if(num[0]=='-' && a.num[0]=='+')
    {
        BigNum s2(a);
        num[0] = '+';
        return s2 - (*this);
    }
    BigNum s;
    int i;
    char s2[N];
    for( i=0; a.num[i]!='\0'; i++)
    {
        s2[i] = a.num[i];
    }
    s2[i] = '\0';
    int len1 = strlen(num);
    int len2 = strlen(s2);
    int Max=0;
    if( len1 > len2)
    {
        Max = len1;
        num[len1] = '0';
        for( i=len2; i<=len1; i++)
        {
            s2[i] = '0';
        }
    }
    else
    {
        if( len1 < len2 )
        {
            Max = len2;
            s2[len2] = '0';
            for( i=len1; i<=len2; i++)
            {
                num[i] = '0';
            }
        }
        else
        {
            Max = len1;
            s2[len2] = '0';
            num[len1] = '0';
        }
    }
    if( (num[0]=='+' && s2[0]=='+') || (num[0]=='-' && s2[0]=='-') )
    {
        for( i=1; i<=Max; i++)
        {
            int c = ( (num[i]-'0') + (s2[i]-'0') );
            if( c>= 10 )
            {
                c -= 10;
                s.num[i] = char( c +'0');
                s2[i+1]++;
            }
            else
            {
                s.num[i] = char( c + '0');
            }
        }
        s.num[i] = '\0';
        if(num[0]=='+' && s2[0]=='+')
        {
            s.num[0] = '+';
        }
        if(num[0]=='-' && s2[0]=='-' )
        {
            s.num[0] = '-';
        }
    }
 
    return s;
}
 
BigNum BigNum::operator - (  BigNum &b )
{
    if(num[0]=='+' && b.num[0]=='-')
    {
        BigNum s2(b);
        s2.num[0] = '+';
        return  (*this) + s2;
    }
    if(num[0]=='-' && b.num[0]=='+')
    {
        BigNum s2(b);
        s2.num[0] = '-';
        return  (*this) + s2;
    }
    BigNum s;
    int i;
    char s2[N];
    for( i=0; b.num[i]!='\0'; i++)
    {
        s2[i] = b.num[i];
    }
    s2[i] = '\0';
    int len1 = strlen(num);
    int len2 = strlen(s2);
    int Max=0;
    if( len1 > len2)
    {
        Max = len1;
        num[len1] = '0';
        for( i=len2; i<=len1; i++)
        {
            s2[i] = '0';
        }
    }
    else
    {
        if( len1 < len2 )
        {
            Max = len2;
            s2[len2] = '0';
            for( i=len1; i<=len2; i++)
            {
                num[i] = '0';
            }
        }
        else
        {
            Max = len1;
            s2[len2] = '0';
            num[len1] = '0';
        }
    }
    if( (num[0]=='+' && s2[0]=='+') || (num[0]=='-' && s2[0]=='-') )
    {
        if(num[0]=='-' && s2[0]=='-')
        {
            s2[0] = '+';
            num[0] = '+';
            for( i=0; num[i]!='\0'; i++ )
            {
                char ch;
                ch = num[i];
                num[i] = s2[i];
                s2[i] = ch;
            }
        }
        char s1[N];
        char s3[N];
        int j;
        for( i=Max,j=0; i>0; j++,i--)
        {
            s1[j] = num[i];
        }
        s1[j] = '\0';
        for( i=Max,j=0; i>0; j++,i--)
        {
            s3[j] = s2[i];
        }
        s3[j] = '\0';
        if( strcmp(s1,s3)>0 )
        {
            s.num[0] = '+';
            for( i=1; i<=Max; i++)
            {
                int c = ( (num[i]-'0') - (s2[i]-'0'));
                if( c<0 )
                {
                    c+=10;
                    s.num[i] = char( c + '0');
                    num[i+1]--;
                }
                else
                {
                    s.num[i] = char( c + '0');
                }
            }
            s.num[i] = '\0';
        }
        else
        {
            if( strcmp(s1,s3)<0 )
            {
                s.num[0] = '-';
                for( i=1; i<=Max; i++)
                {
                    int c = ( (s2[i]-'0') - (num[i]-'0'));
 
                    if( c<0 )
                    {
                        c+=10;
                        s.num[i] = char( c + '0');
 
                        s2[i+1]--;
                    }
                    else
                    {
                        s.num[i] = char( c + '0');
 
                    }
                }
                s.num[i] = '\0';
            }
            else
            {
                s.num[0] = '+';
                s.num[1] = '0';
                s.num[2] = '\0';
            }
        }
    }
    return s;
}
 
void BigNum::show() const
{
    char ch[N] = "+0";
    char c[N] = "+00";
    //cout<<num<<endl;
    if( strcmp(ch,num) == 0 || strcmp(c,num) == 0 )
    {
        cout<<"BigNum("<<ch<<")"<<endl;
    }
    else
    {
        cout<<"BigNum("<<num[0];
        int i;
        int flag;
        for( i=strlen(num)-1; i>=0; i--)
        {
            if(num[i]!='0')
            {
                flag = i;
                break;
            }
        }
        for( i=flag; i>=1; i--)
        {
            cout<<num[i];
        }
        cout<<")"<<endl;
    }
}

  

第四步曲 总结

通过拆分问题解决问题,看似很麻烦,但是可以将其拆解为多个函数的增加

无非就是几个函数叠合在一个,可以建立很多个文件,每一个文件放一个函数,解决一个函数再进行下一个函数

标签:BigNum,++,s2,第十九,int,num,--,打卡,四部曲
From: https://www.cnblogs.com/youxiandechilun/p/17375647.html

相关文章

  • 第14天打卡
    问题: 源代码:#include<iostream>using namespace std;int main(){for(int i=95859+1;i<100000;i++){int a=i/10000,b=i/1000%10,c=i/10%10,d=i%10;if(a==d&&b==c){cout<<i;break;}}} ......
  • 每周打卡 第二(?)周 5
       #include<cstring>#include<cstdio>#include<iostream>#include<algorithm>usingnamespacestd;constintN=30;intm,n;intst[N];boola[N];voidf(intu,intt){if(u>m){for(inti=1;i<=m;i++)......
  • 打卡8
    importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();intsum=0,sumc=0,sumr=0,sumf=0;for(inti=0;i<n;i++){inta=sc.......
  • c++打卡练习(21)
    分钱:五块钱,换成一块、五毛、一毛,有几种换法?流程图:伪代码:源代码:#include<iostream>usingnamespacestd;intmain(){ intyuan[6]={0,10,20,30,40,50}; intjiao[11]={0,5,10,15,20,25,30,35,40,45,50}; inti,j,k,m=1; for(i=0;i<=50;i++){ for(j=0;j<11;j++){ for(k=0;k......
  • 打卡第十六天
    将两个整数交换次序后输出一、1.设置一个值传递的函数二、三、#include<iostream>usingnamespacestd;voidjiaohuan(int&a,int&b){ intteam;team=a;a=b;b=team;}intmain(){ intx,y; cin>>x>>y; jiaohuan(x,y); cout<<""<<x<<"&......
  • 建民打卡日记5.5
    一、问题描述本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。二、流程设计实际上本题考察分数相加:即分母通分,分子相加,约分。 最大公约数gcd(),使用递归的方式实现辗转相除法求最大公约数。 returnb......
  • 每日打卡一小时(第十九天)(空)未完
    一.问题描述6-3【CPP0024】设计并实现大数类BigNum定义一个整数型大数类,要求能够完成100位以内的较大整数的加法和减法计算,main(void)函数完成对其的测试。BigNum类结构说明: BigNum类的数据成员包括:①私有数据成员:数值域num(char[]型)。BigNum类成员函数包括:①有参构造......
  • 天天打卡一小时第十天
    天天打卡一小时第十天问题描述实验2-5念数字输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:0:ling1:yi2:er3:san4:si5:wu6:liu7:qi8:ba9:jiu输入格式:输入在一行中给出一个整数,如:1234。提示:整数包括负数、零和正数。输出格式:在......
  • 打卡17
    3.4回文数方法1:这个数据范围是很小的了,即便是从1遍历到256*256然后再判段每个数的位数才256*256*5时间复杂度,很小的也就6*10^6左右,然后判断前后是否对称即可;方法2:这是比较简单的方法,从1-256平方,然后判断每个数是否对称即可,不会爆int。#include<bits/stdc++.h>usingnamespace......
  • 5.4打卡
     template<classT>classMyArray{private:intsize;T*data;public:MyArray(ints){size=s;data=newT[size];}voidsort(){inti,j,min;Tt;for(i=0;i<size;i++)cin>>data[i];for(i=0;i<size-1;i++)......