藍橋杯P1103 複數運算問題

2021-07-09 21:10:42 字數 2667 閱讀 3288

//程式設計實現兩個複數的運算。設有兩個複數 和 ,則他們的運算公式為:

////  要求:(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 必須使用結構體指標的方法把函式的計算結果返回。說明 使用者輸入...