關于(C++)資料結構復數計算器作業的拓展
- 復數計算器幾乎是每個c++學習者都會遇到的一個典型的題目,但大多數的題解在處理復數的輸入的時候都是將實部和虛部分開輸入和存盤,對于自己來說挺省事的,但對于使用者來說,比較局限,比較死板,為了實作輸入的時候能夠以復數的一般形式輸入(即(-a,a,a-i,a-bi,a+bi,a+i,-i,i)形式輸入,其中a,b為浮點數),對>>進行了以下多載,
- 總體的思路是將輸入的內容保存到一個空間較大的字符陣列中,然后對其進行識別,
- (已經定義了一個復數類,a,b分別為復數的實部和虛部)識別分為兩個部分,一個是識別只有實部的復數,另一個識別含有虛部的復數(其中包括只有虛部、實部和虛部都有)從左到右依次讀取,以+、-、i以及無符號作為識別的標志,
- 對于數字部分,整數部分采用自左向右累加,小數部分采用自右向左累加,以小數點“.”為標志,
- 由于輸入形式多樣,需要逐步根據輸出的情況逐步修改代碼,
- 這里并沒有對錯誤的輸入進行識別和相應的警示,需要可自行添加,
istream& operator >>(istream& is, Complex1& x)//輸入任意形式的復數(-a,a,a-i,a-bi,a+bi,a+i,-i,i)
{
char m[100];
is >> m;
int a = strlen(m);
float n = 0;int flag = 1, j = 0, k;
if (m[a - 1] != 'i')//當復數只有實部,復數的形式為(a,-a)
{
if (m[0] == '-')
{
flag = -1;
j++;
}
else
{
flag = 1;
}
while ((m[j] >= '0' && m[j] <= '9') || m[j] == '.')//小數部分取值計算
{
int l;float o = 0;
if (m[j] == '.')
{
for (l = j; m[l] != '\0'; l++)
{
}
for (j = l-1; m[j] != '.'; j--)
{
o = o * 0.1 + m[j] - '0';
}
o = o * 0.1;
n = o + n;
j = l ;
break;
}
if (o == 0)
{
n = n * 10 + m[j] - '0';
j++;
}
}
x.a = n*flag;
return is;
}
else
{
for (j = 0; j < a;j++)
{
if (n != 0 && (m[j] == '-' || m[j] == '+'))
{
x.a = flag * n;
n = 0;
}
if (m[j] == '-')
{
flag = -1;
j++;
}
else if (m[j] == '+')
{
if (m[j] != 'i')
{
flag = 1;
j++;
}
}
else
{
if (m[j] != 'i')
{
flag = 1;
}
}
if (m[j] == 'i')
{
if (n == 0)
x.b = flag;
else
x.b = flag * n;
break;
}
while ((m[j] >= '0' && m[j] <= '9') || m[j] == '.')
{
int l; float o = 0;
for (l = j; m[l] != '-' && m[l] != '+'&&m[l]!='i'; l++)
{
}
if (m[j] == '.')
{
for (j = l-1; m[j] != '.'; j--)
{
o = o * 0.1 + m[j] - '0';
}
o = o * 0.1;
n = o + n;
j = l ;
break;
}
n = n * 10 + m[j] - '0';
j++;
}
--j;
}
}
}
第一次寫博客,有不足的地方請多指教,
參考資料:(只是實作了a±bi的復數形式的識別)
C++課程設計復數計算器
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/110544.html
標籤:其他
上一篇:C++計算機語言
