//程式設計實現兩個複數的運算。設有兩個複數 和 ,則他們的運算公式為:
//// 要求:(1)定義乙個結構體型別來描述複數。
// (2)複數之間的加法、減法、乘法和除法分別用不用的函式來實現。
// (3)必須使用結構體指標的方法把函式的計算結果返回。
// 說明:使用者輸入:運算符號(+,-,*,/) a b c d.
// 輸出:a+bi,輸出時不管a,b是小於0或等於0都按該格式輸出,輸出時a,b都保留兩位。
////輸入:
// - 2.5 3.6 1.5 4.9
//輸出:
// 1.00+-1.30i
//
這個問題現在學到了兩種解法,都可以通過編譯,第一種呢,是從網上看到的:
#includechar sign;
double a, b, c, d;
scanf("%c%lf%lf%lf%lf",&sign,&a,&b,&c,&d);
if( sign == '+' )
printf("%.2lf+%.2lfi",a+c,b+d);
if( sign == '-' )
printf("%.2lf+%.2lfi",a-c,b-d);
if( sign == '*' )
printf("%.2lf+%.2lfi",a*c-b*d,a*d+b*c);
if( sign == '/' )
printf("%.2lf+%.2lfi",(a*c + b*d)/(c*c + d*d),(b*c - a*d)/(c*c + d*d));
return 0;
}
這個題像這樣硬做並不難,但是如果要遵從題目要求:1、定義乙個結構體型別來描述複數 2、必須用結構體指標的方法把函式的計算結果返回。 作為乙個不是很熟練思維又慢的初學者,我是有一些方的。但還好最後在大神的指點下,還是勉強把它寫了出來。
#include#include#includestruct fushu;
fushu* add(fushu a, fushu b)
fushu* minus(fushu a, fushu b)
fushu* multiply(fushu a, fushu b)
fushu* divide(fushu a, fushu b)
int main()
if( sign == '-' )
if( sign == '*' )
if( sign == '/' )
return 0;
}
看上去有些長,但其實只要明白最簡單的加法是怎麼寫出來的,其他的只是改幾個字母而已。
解決這個問題過程中,發現了自己的幾個薄弱知識點:
1.在c與c++之間,定義結構體變數呼叫的方式是小有不同的,
<1>在c語言中,可以用:
typedef struct student; 這時我們只是定義了結構體型別名,定義結構體變數時,要寫 struct student stu1;
而如果想省點事的話,就這樣寫:
typedef struct studentstu; 這個意思就是 讓 stu = struct student, 後面再定義結構體變數時,就可以寫 stu stu1; <2>在c++中,可以用:
struct student; 而在這裡,可以看到c++的簡潔,我們後面想定義結構體變數時,直接可以寫student stu1;
而如果你不幸習慣性地用c語言的方式寫了的話
typedef struct studentstu; 沒關係,這本來就和c語言一樣,stu在這裡還是會等於struct student,
當然,也可能有人這麼寫:
struct studentstu; 不要想當然地與c語言模擬了,stu這時不等於student,這裡的意思是用student這個結構體型別定義了stu 這個結構體變數,而且,我們還可以定義更多的結構體變數(你開心就好)
struct studentstu1,stu2,stu3……;
2、定義函式的時候,發現很矇逼
回顧一下要求,用結構體指標的方法把函式值返回
所以要定義乙個結構體指標型別的函式,才會需要返回結構體指標
所以以加法為例:fushu* add(fushu a, fushu b) 因為我們要輸入兩組複數,所以我們在定義兩組結構體變數,a,b
3、實現函式的時候,不知道怎麼寫
要返回結構體指標,需要再定義乙個指標型變數才行,
...
其實身為初學者我並不明白這一步的用處,後來查閱一些資料,明白了,malloc是用來人為給各種型別的變數分配記憶體空間用的,涉及到堆疊的問題,簡單一說,「堆」就是我寫的這樣,用malloc手動分配空間,其實用new也可以,不多說,而「棧」,大家最熟了,就是用int,char,double......這些型別名來讓系統自動給你分配空間,而大小都已經定好了,你不需要再改,最後回來,如果這一步不手動分配空間的話,函式結束時,空間會自動銷毀,那時我們的指標就不知道該指向**去了,這樣是很危險的,也就是常說的「野指標」,乙個不知道指向**的東西,總是有些詭異呀
(可能語言不嚴謹,僅僅是我理解之後的簡述)。
4、實現函式
...
5、 主函式
不多說了,看看上面寫的吧
藍橋杯練習系統 P1103求複數和
程式設計實現兩個複數的運算。設有兩個複數 和 則他們的運算公式為 要求 1 定義乙個結構體型別來描述複數。2 複數之間的加法 減法 乘法和除法分別用不用的函式來實現。3 必須使用結構體指標的方法把函式的計算結果返回。說明 使用者輸入 運算符號 a b c d.輸出 a bi,輸出時不管a,b是小於0...
演算法訓練 P1103 複數
程式設計實現兩個複數的運算。設有兩個複數 和 則他們的運算公式為 要求 1 定義乙個結構體型別來描述複數。2 複數之間的加法 減法 乘法和除法分別用不用的函式來實現。3 必須使用結構體指標的方法把函式的計算結果返回。說明 使用者輸入 運算符號 a b c d.輸出 a bi,輸出時不管a,b是小於0...
試題 演算法訓練 P1103 藍橋杯
題目描述 資源限制 時間限制 1.0s 記憶體限制 256.0mb 程式設計實現兩個複數的運算。設有兩個複數 和 則他們的運算公式為 要求 1 定義乙個結構體型別來描述複數。2 複數之間的加法 減法 乘法和除法分別用不用的函式來實現。3 必須使用結構體指標的方法把函式的計算結果返回。說明 使用者輸入...