找出以下代码存在的逻辑性问题,并加以解释#include<bits/stdc++.h> using namespace std; class Photo { private: int width; int height; int n_bytes; public: static int num; Photo():width(0),height(0),n_bytes(0){ num++; }; Photo(int w, int h, int n):width(w),height(h),n_bytes(n){ num++; }; Photo(const Photo& p){ this->width = p.width; this->height = p.height; this->n_bytes = p.n_bytes; num++; }; void show_info(){ cout << num << " " << width << " " << height << " " << n_bytes << endl; };//显示图片信息,输出格式见样例 void clip_1_1(){ if(width > height){ width = height; }else{ height = width; } };//将图片按最大的正方形裁剪,计算新的高和宽。结果截断小数部分,下同 void clip_4_3(){ if(width > (4/3)*height){ width = (4/3)*height; }else{ if(height > (4/3)*width){ height = (4/3)*width; }else{ if(width > height){ height = (3/4)*width; }else{ width = (3/4)*height; } } } };//将图片按最大的4:3形状裁剪,计算新的高和宽 }; int Photo::num = 0; int main(){ Photo p1(4000, 3000, 4); p1.clip_1_1(); p1.show_info(); Photo p2(4000, 3000, 4); p2.clip_4_3(); p2.show_info(); Photo p3(p2); p3.clip_1_1(); p3.show_info(); int height, width, n_bytes; cin >> height >> width >> n_bytes; Photo p4(height, width, n_bytes); p4.clip_4_3(); p4.show_info(); p4.clip_1_1(); p4.show_info(); return 0; }
时间: 2024-03-09 08:51:10 浏览: 58
代码存在的逻辑性问题有:
1. 在函数 clip_1_1 和 clip_4_3 中,进行宽高的重新赋值操作,但是并没有对 n_bytes 进行调整,导致输出的图片信息不准确。
2. 在函数 clip_4_3 中,对于宽高比例不符合 4:3 的情况,使用了嵌套的 if-else 结构,使得代码的逻辑复杂,容易出错。同时,在进行浮点数运算时,使用了整数除法,导致计算结果不准确。
3. 在 main 函数中,多次使用了相同的变量名,容易引起混淆。
针对这些问题,可以进行如下的改进:
1. 在进行宽高赋值操作时,同时对 n_bytes 进行调整。
2. 在函数 clip_4_3 中,可以使用简单的 if-else 结构,避免嵌套和复杂的计算。同时,可以将浮点数计算转换为整数计算,避免精度问题。
3. 修改 main 函数中的变量名,使其更具有描述性。
改进后的代码如下:
```c++
#include<bits/stdc++.h>
using namespace std;
class Photo {
private:
int width;
int height;
int n_bytes;
public:
static int num;
Photo():width(0),height(0),n_bytes(0){
num++;
};
Photo(int w, int h, int n):width(w),height(h),n_bytes(n){
num++;
};
Photo(const Photo& p){
this->width = p.width;
this->height = p.height;
this->n_bytes = p.n_bytes;
num++;
};
void show_info(){
cout << num << " " << width << " " << height << " " << n_bytes << endl;
};//显示图片信息,输出格式见样例
void clip_1_1(){
if(width > height){
height = width;
width = height * 1.0 / 1.0 + 0.5;
n_bytes = n_bytes * width * height / (width + height) / (width + height);
}else{
width = height;
height = width * 1.0 / 1.0 + 0.5;
n_bytes = n_bytes * width * height / (width + height) / (width + height);
}
};//将图片按最大的正方形裁剪,计算新的高和宽。结果截断小数部分,下同
void clip_4_3(){
if(width * 3 > height * 4){
height = width * 4 / 3;
n_bytes = n_bytes * width * height / (width + height) / (width + height);
}else{
width = height * 4 / 3;
n_bytes = n_bytes * width * height / (width + height) / (width + height);
}
};//将图片按最大的4:3形状裁剪,计算新的高和宽
};
int Photo::num = 0;
int main(){
Photo photo1(4000, 3000, 4);
photo1.clip_1_1();
photo1.show_info();
Photo photo2(4000, 3000, 4);
photo2.clip_4_3();
photo2.show_info();
Photo photo3(photo2);
photo3.clip_1_1();
photo3.show_info();
int input_height, input_width, input_n_bytes;
cin >> input_height >> input_width >> input_n_bytes;
Photo photo4(input_height, input_width, input_n_bytes);
photo4.clip_4_3();
photo4.show_info();
photo4.clip_1_1();
photo4.show_info();
return 0;
}
```
阅读全文