關於(C++)資料結構複數計算器作業的拓展

2020-09-22 12:00:28

關於(C++)資料結構複數計算器作業的拓展

  1. 複數計算器幾乎是每個c++學習者都會遇到的一個典型的題目,但大多數的題解在處理複數的輸入的時候都是將實部和虛部分開輸入和儲存,對於自己來說挺省事的,但對於使用者來說,比較侷限,比較死板。為了實現輸入的時候能夠以複數的一般形式輸入(即(-a,a,a-i,a-bi,a+bi,a+i,-i,i)形式輸入,其中a,b為浮點數),對>>進行了以下過載。
  2. 總體的思路是將輸入的內容儲存到一個空間較大的字元陣列中,然後對其進行識別。
  3. (已經定義了一個複數類,a,b分別為複數的實部和虛部)識別分為兩個部分,一個是識別只有實部的複數,另一個識別含有虛部的複數(其中包括只有虛部、實部和虛部都有)從左到右依次讀取,以+、-、i以及無符號作為識別的標誌。
  4. 對於數位部分,整數部分採用自左向右累加,小數部分採用自右向左累加。以小數點「.」為標誌。
  5. 由於輸入形式多樣,需要逐步根據輸出的情況逐步修改程式碼。
  6. 這裡並沒有對錯誤的輸入進行識別和相應的警示,需要可自行新增。
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++課程設計複數計算器