我正在從 DS Malik 的一本名為“使用 C 的資料結構”的書中學習資料結構。我目前正在解決以下書面編程練習:
在 C 中,最大的 int 值是 2147483647。所以大于這個的整數不能作為整數存盤和處理。同樣,如果兩個正整數的和或乘積大于 2147483647,則結果將不正確。存盤和操作大整數的一種方法是將數字的每個單獨數字存盤在陣列中。設計 largeIntegers 類,以便該類的物件可以存盤長達 100 位的整數。多載運算子 和 – 分別對此類的兩個物件的值進行加減。(在第 3 章的編程練習中,我們將多載乘法運算子。)多載賦值運算子以將一個大整數的值復制到另一個大整數中。多載流提取和插入運算子,以便于輸入和輸出。您的程式必須包含適當的建構式來初始化 largeIntegers 類的物件。(提示:將數字作為字串讀取,并以相反的順序存盤數字的數字。添加實體變數以存盤數字的數量和數字的符號。)
下面是我上面的代碼:
#include <bits/stdc .h>
using namespace std;
class largeIntegers {
private:
/* data */
int num[100] = {0};
int digits;
bool isPositive;
public:
friend istream &operator>>(istream &, largeIntegers &);
largeIntegers &operator (largeIntegers &);
void getLargeInteger(void);
void setLargeInteger(string);
void print(void);
largeIntegers();
largeIntegers(string);
};
int main() {
largeIntegers num1;
cin >> num1;
largeIntegers num2;
num2 = num1;
cin >> num1;
largeIntegers num3;
num3 = num1 num2;
num3.print();
return 0;
}
largeIntegers &largeIntegers::operator (largeIntegers &integer) {
largeIntegers temp;
int remainder = 0;
int digi = max(digits, integer.digits);
temp.digits = digi;
for (int i = 0; i < digi; i ) {
temp.num[i] = (remainder num[i] integer.num[i]) % 10;
remainder = (remainder num[i] integer.num[i]) / 10;
}
if (remainder) {
temp.num[digi] = remainder;
temp.digits ;
}
return temp;
}
largeIntegers::largeIntegers(string n) { setLargeInteger(n); }
largeIntegers::largeIntegers() {
isPositive = true;
digits = 0;
}
void largeIntegers::setLargeInteger(string n) {
int start = 0;
if (n[0] == '-') {
isPositive = false;
start = 1;
}
digits = 0;
for (int i = n.length() - 1; i >= start; i--) {
num[digits] = int(n[i]) - int('0');
digits ;
}
}
void largeIntegers::getLargeInteger(void) {
cout << "Enter a large integer:\n";
string n;
cin >> n;
setLargeInteger(n);
}
istream &operator>>(istream &isObject, largeIntegers &largeInt) {
string num;
isObject >> num;
largeInt.setLargeInteger(num);
return isObject;
}
void largeIntegers::print(void) {
if (!isPositive)
cout << "-";
for (int i = digits - 1; i >= 0; i--) {
cout << num[i];
}
cout << endl;
}
但是我的代碼不適用于加法操作。它給出了分段錯誤(核心轉儲)錯誤。有人可以解釋是什么問題以及如何解決嗎?
uj5u.com熱心網友回復:
該問題是,你的多載operator 是回傳一個區域變數的參考。要解決此問題,您可以改用以下版本的operator :
//return by value
largeIntegers operator (const largeIntegers &lhs, const largeIntegers &integer)
{
largeIntegers temp;
int remainder = 0;
int digi = max(lhs.digits, integer.digits);
temp.digits = digi;
for (int i = 0; i < digi; i ) {
temp.num[i] = (remainder lhs.num[i] integer.num[i]) % 10;
remainder = (remainder lhs.num[i] integer.num[i]) / 10;
}
if (remainder) {
temp.num[digi] = remainder;
temp.digits ;
}
return temp;
}
對于上述作業,operator 通過在類中添加如下朋友宣告來結交朋友:
friend largeIntegers operator (const largeIntegers &lhs, const largeIntegers &rhs);
可以在此處看到使用上述修改的完整作業程式,如下所示:
#include <bits/stdc .h>
using namespace std;
class largeIntegers {
private:
/* data */
int num[100] = {0};
int digits;
bool isPositive;
public:
friend istream &operator>>(istream &, largeIntegers &);
//i have added this friend declaration
friend largeIntegers operator (const largeIntegers &lhs, const largeIntegers &rhs);
void getLargeInteger(void);
void setLargeInteger(string);
void print(void);
largeIntegers();
largeIntegers(string);
};
int main() {
largeIntegers num1;
cin >> num1;
largeIntegers num2;
num2 = num1;
cin >> num1;
largeIntegers num3;
num3 = num1 num2;
num3.print();
return 0;
}
//i have modified the operator as shown below
largeIntegers operator (const largeIntegers &lhs, const largeIntegers &integer)
{
largeIntegers temp;
int remainder = 0;
int digi = max(lhs.digits, integer.digits);
temp.digits = digi;
for (int i = 0; i < digi; i ) {
temp.num[i] = (remainder lhs.num[i] integer.num[i]) % 10;
remainder = (remainder lhs.num[i] integer.num[i]) / 10;
}
if (remainder) {
temp.num[digi] = remainder;
temp.digits ;
}
return temp;
}
largeIntegers::largeIntegers(string n) { setLargeInteger(n); }
largeIntegers::largeIntegers() {
isPositive = true;
digits = 0;
}
void largeIntegers::setLargeInteger(string n) {
int start = 0;
if (n[0] == '-') {
isPositive = false;
start = 1;
}
digits = 0;
for (int i = n.length() - 1; i >= start; i--) {
num[digits] = int(n[i]) - int('0');
digits ;
}
}
void largeIntegers::getLargeInteger(void) {
cout << "Enter a large integer:\n";
string n;
cin >> n;
setLargeInteger(n);
}
istream &operator>>(istream &isObject, largeIntegers &largeInt) {
string num;
isObject >> num;
largeInt.setLargeInteger(num);
return isObject;
}
void largeIntegers::print(void) {
if (!isPositive)
cout << "-";
for (int i = digits - 1; i >= 0; i--) {
cout << num[i];
}
cout << endl;
}
查看上面代碼中的注釋以檢查我所做的修改
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/351780.html
