NJUPT 程序设计周

A3_众数问题

图1 功能框架图
图2 数组存储算法图
图3 频率统计算法图
图4 求数组重数算法图
图5 调整重数算法图
图6 核心设计流程图
  • 众数问题_B19030825.cpp
#include 
#include 
#include 
using namespace std;

int main(){ 
    int n,i,j,temp;                                 //临时输入存入 temp 
    int array[1000][2]={(0,0)};                     //可存放1000个自然数及其频率 
re: cout<<"\n>> 请输入自然数个数n:";    cin>>n;             //自然数个数
    if(n<=0){                                       //错误输入 n 
        cout<<"\nERROR:请输入正数!\n";
        goto re;    
    }
    cout<<"\n>> 请输入n个自然数:";
    for(i=0;i>array[i][0];
        if(array[i][0]<0){                          //错误输入自然数 
            cout<<"\nERROR:请输入自然数!\n";
            goto re2;
        }
    }
    for(i=0;imax)
            max=array[i][1];
        cout<<"\n自然数:"<
图7 测试结果截图一
图8 测试结果截图二
图9 测试结果截图三
图10 测试结果截图四

程序调试过程中的问题

问题1:最开始想的是用链表结点存储数组元素,但是遍历结点的值总是和预期效果不一致,而且调试的时候总是报错。
解决方法:采用自己更熟练的二维数组数据结构存储。
问题2:输出重数以及众数的时候,重复输出。
解决方法:意识到一个重要的规律:重数只能有一个,而众数可以有多个。所以可以将多个相同众数的重数调整为一个,此时不在需要用到重复的众数,将其置0,最后得到数组所有不重复众数的重数。
问题3:刚开始准备沿用临时链表结点的思想,创建另一个二维数组存储众数,却发现代码冗长。
解决方法:直接用同一个二维数组存储、计算、输出。
问题4:在调试的时候,输出频率竟然随机出错。
解决方法:局部变量n是终端输入,而计算频率时array[i][1]用到了n,当时array的初始化为array[][2]={(0,0)},没有明确指明n。所以改为array[1000][2]={(0,0)}解决了问题。

B3_大整数算术运算器

图1 功能框架图
图2 字符串转换/倒序存储算法图
图3 比较大整数大小算法图
图4 大整数加法算法图
图5 大整数减法算法图
图6 大整数乘法算法图
图7 大整数除法算法图
图8 核心设计流程图
  • 大整数算术运算器_B19030825.cpp
#include
#include
#include
using namespace std;

struct big_number{                      //大整数结构体
    int d[1000];
    int len;                            //大整数位数 
    big_number(){                       //构造函数,用来初始化 
        d[1000]={0}; 
        len=0;
    }
}; 
    
big_number change(char str[]){          //将大整数字符串存储在结构体 
    big_number x;   
    x.len=strlen(str);
    for(int i=0;ib.len)return 1;            //a大于b,返回 1 
    else if(a.len=0;i++){    //从高位到低位逐一比较 
            if(a.d[i]>b.d[i])return 1;
            else if(a.d[i]0){             //如果高位为正 
                a.d[i+1]--;         
                a.d[i]+=10; 
            }
            else{                       //如果高位为 0 
                a.d[i+1]=9;         
                a.d[i]+=10;             
            } 
//      carry=-1;
        }
        c.d[c.len++]=a.d[i]-b.d[i];
//      cout<<"\ncarry:"<10222
    //方案B:先遍历 i10222
    for(;i=1&&c.d[c.len-1]==0)
        c.len--;                        //去除为 0的高位,同时保留一个最低位 
    return c;
} 

big_number multi(big_number a,int b){   //3、乘法运算 
    big_number c;
    int carry=0;
    for(int i=0;i=0;i--){            //a从高位到低位依次除 b 
        r=r*10+a.d[i];
        if(r=1&&c.d[c.len-1]==0)
        c.len--;                            //去除为0的高位,同时保留一个最低位
    return c;
} 

void print(big_number a){                   //终端输出 
    for(int i=a.len-1;i>=0;i--)
        printf("%d",a.d[i]);
}

void show(char line1[1000],char line2[1000],char ysf){//输出文本内容 
    cout<<"\na: "<=0;i--)
        fprintf(wb2,"%d",result.d[i]);
}

void ZDCZ(){
    char str1[1000],str2[1000];             //可以存储1000位大整数
    big_number a,b;                         //加数,减数,被乘数,被除数 
    int r,c,d;                              //乘数,除数,余数  
    cout<<"\n【 1:大整数加法 2:大整数减法 3:大整数乘法 4:大整数除法 5:退出 】\n";
re: cout<<"\n>> 请输入操作选项:";      char choice2;   cin>>choice2; 
    switch(choice2){
        case '1':
            cout<<"\n>> 请输入大整数a、b:";    cin>>str1>>str2;
            a=change(str1);                 b=change(str2);
            cout<<"\na+b= ";                
            if(compare(a,b))                print(add(a,b));
            else                            print(add(b,a));
            cout<> 请输入大整数a、b:";    cin>>str1>>str2;
            a=change(str1);                 b=change(str2);              
            cout<<"\na-b= ";                
            if(compare(a,b))                print(sub(a,b));
            else{
                cout<<"-";  
                print(sub(b,a));
            }
            cout<> 请输入大整数a、b:";    cin>>str1>>c;
            a=change(str1);
            cout<<"\na*b= ";                print(multi(a,c));
            cout<> 请输入大整数a、b:";    cin>>str1>>d;
            if(d==0){
                cout<<"\nERROR:除数不能为0,请重新输入!\n";
                goto re2;
            }
            a=change(str1);                 r=0;    
            cout<<"\na/b= ";                print(divide(a,d,r));
            cout<<"···"<> 请输入操作选项:";  char choice;    cin>>choice;
    if(choice=='A') {ZDCZ();    return 0;}      //终端操作 
    if(choice=='B') {WBCZ();    return 0;}      //文本操作 
}
图9 测试结果截图一
图10 测试结果截图二
图11 测试结果截图三
图12 测试结果截图四
图13 测试结果截图五
图14 测试结果截图六
图15 测试结果截图七
图16 测试结果截图八
图17 测试结果截图九
图18 测试结果截图十
图19 测试结果截图十一

程序调试过程中的问题

问题1:在编写乘法和除法时,我意识到不再是一位一位的处理数据,而是将乘数(除数)看作一个整体,而被乘数(被除数)仍然当作结构体(大整数数组)处理。
解决方法:将乘法和除法的乘数(除数)改为int类型即可。
问题2:在编写文本操作之乘法和除法时,第二行不能用change函数转换。
解决方法:因为change函数是将字符串转数组,所以换做将字符串转整型即可(利用algothorm库的atoi函数)。
问题3:在编写调整减法高位位置时,发现不能采用像加法那样遍历较大数的位数。
解决方法:方案A:先 c.len=a.len,再遍历 i10222。方案B:先遍历 i10222
问题4:在调试减法时,发现当a 解决方法:因为采用的数组存储的大整数,所以当a

课程设计总结

通过这次实验设计,我懂得了当程序编写遇到问题时不要顽固自封,不要守着一个方法做,换一种思路从头再来可能更加顺利。在刚开始编写时,虽然做到了实验要求里基本的简单输入要求,但当输入数据值、数据量情况多变时,就会出现错误。而这样的结果并不完美,这样的程序没有普适性,更没有实用性。所以我们应该不断优化自己的代码,不断考虑各种终端的操作情况,因为写出来的程序不光是拿给自己用,也是给别人用。如果用户的输入不在你的意料之中而出现报错,那么这个程序就失败了。这次B3实验我写的代码虽然成功运行了,但是还有一些bug需要优化,比如:终端/文本操作不能一次输入多个表达式(终端只能多次输入一个表达式),加法运算不支持负数输入(而是偷懒转线用减法),而乘法和除法没有做到两个(>20位)大整数的计算。

A3_众数问题拓展:界面实现

#include                                                    // 引用图形库头文件
#include 
#include                                                     
#include 
#include 
#include 

using namespace std;

int r[3][4] = { {30,20,100,80},{140,20,210,80},{250,20,320,80} };       //三个按钮的二维数组
char s[30];                                                             //输入字符串变量

int button_judge(int x, int y){                                         //按钮判断函数
    if (x > r[0][0] && xr[0][1] && y < r[0][3])return 1;
    if (x > r[1][0] && xr[1][1] && y < r[1][3])return 2;
    if (x > r[2][0] && xr[2][1] && y < r[2][3])return 3;
    return 0;
}

void simulation(int n,int array[1000][2]){                              //运行函数
    int i,j;
    for(i=0;imax)
            max=array[i][1];
        cout<<"当前自然数:"<

B3_大整数运算拓展:python实现

import math

a = input("a: ")
b = input("b: ")
x = input("x: ")
y = input("y: ")

result = str(int(a) + int(b))
print("a+b= " + result)
result = str(int(a) - int(b))
print("a-b= " + result)
result = str(int(a) * int(b))
print("a*b= " + result)
result = str(int(a) // int(b))
r = str(int(a) % int(b))
print("a/b= " + result + "···" + r)
result = str(math.isqrt(int(x)))
r = str(int(x) - (math.isqrt(int(x))) ^ 2)
print("sqrt(x)= " + result + "···" + r)
result = str(math.pow(int(x), int(y)))
print("pow(x,y)= " + result)

你可能感兴趣的:(NJUPT 程序设计周)