一、實驗目的:
1、 復習c/c++語言,並實現簡單的算法設計。
2、 掌握結構體類型/類的定義方法以及自定義數據類型使用。
3、 掌握函數的設計和調用。
4、 學會理解ADT(Abstract Data Type)描述,從而利用程序語言加以實現。
5、 學會基本的程序組織方法和對抽象數據類型實現的應用。
二、實驗內容和要求
實驗內容:
設計一個復數的抽象類型定義。
實現復數基本運算基本操作。
編寫函數對所實現的抽象數據類型進行測試並驗證。
實驗要求:
1、由輸入生成復數的實部虛部。
2、對所定義的數據類型的應用中,間接訪問結構體類型/類內部數據。
3、完成基本四則運算,設置復數實部、虛部等操作。
三、實現提示
1、抽象數據類型定義
抽象數據類型用一個三元組(D,S,P)表實,其中D表示數據對象,S是D上的關系集,P是對數據對象D的基本操作集合。
A、抽象數據類型的定義格式:
ADT抽象類型名{
數據對象:<數據對象定義>
數據關系:<數據關系定義>
基本操作:<基本操作定義>
}ADT抽象數據類型名
B、抽象數據類型中基本操作的定義格式:
基本操作名(參數表)
初始條件:<初始條件描述>
操作結果:<操作結果描述>
賦值參數:為操作提供輸入值;
引用參數:既可為操作提供輸入值,還返回操作結果;
初始條件:指操縱前數據結構和參數應滿足的條件。若不滿足,操作失敗,返回相應錯誤信息。初始條件為空,省略之。
操作結果:操作正常完成,數據結構的變化和返回結果。
2、抽象數據類型的復數例
ADTComplex{
D: {real, imag | e1,e2為實數}
R:{<real, imag>}
P: void InitialComplex(Complex &x,float r, float i);
賦值參數:初始化復數x,實數r,虛部i;
操作結果:設置復數x的實部為r,虛部為i;
float GetReal(Complex x);
賦值參數:復數x
操作結果:返回復數x的實部
float GetImag(Complex x);
賦值參數:復數x
操作結果:返回復數x的虛部
void SetReal(Complex &x, float real);
賦值參數:操作復數x,將為復數x賦值於實部的real;
操作結果:復數x的實部被設置為real;
void SetImag (Complex &x, float imag);
賦值參數:操作復數x,將為復數x賦值於虛部的imag;
操作結果:復數x的虛部被設置為imag;
Complex add(Complex x, Complex y);
賦值參數:所要相加的兩個復數x,y
操作結果:返回兩個復數x和y的和
Complex sub(Complex x, Complex y);
賦值參數:所要相減的兩個復數x,y
操作結果:返回兩個復數x和y差
Complex multi(Complex x, Complex y);
賦值參數:所要相稱的兩個復數x,y
操作結果:返回兩個復數x和y積
Complex expect(Complex x, Complex y);
賦值參數:所要相除的兩個復數x,y
操作結果:返回兩個復數x和y商
3、復數基本知識
復數基本四則運算:
① 、復數z1與z2的和的定義:z1+z2=(a+bi)+(c+di)=(a+c)+(b+d)i;
② 、復數z1與z2的差的定義:z1-z2=(a+bi)-(c+di)=(a-c)+(b-d)i;
③ 、復數的乘法運算規則:設z1=a+bi,z2=c+di(a、b、c、d∈R)是任意兩個復數,那么它們的積(a+bi)(c+di)=(ac-bd)+(bc+ad)i,其實就是把兩個復數相乘,類似兩個多項式相乘,在所得的結果中把i2換成-1,並且把實部與虛部分別合並,兩個復數的積仍然是一個復數。
④、復數的除法運算規則:\
4、結構體基本知識
Typedef為關鍵字,作用是給一種數據類型定義一個新的名字。
其可以給多種數據類型定義新的名字,既可以是int、float等內部基礎數據類型,也可以是已經定義的結構體類型。
四、實驗步驟簡述
1、熟悉復數、結構體基本概念。
2、創建"ComPlex.h"、"ComPlex.cpp"、"main.cpp"文件,
"ComPlex.h"文件:儲存復數的結構定義和操作對應的函數頭。
"ComPlex.cpp"文件:實現"ComPlex.h"文件所定義的操作。
"main.cpp"文件:儲存主函數,實現復數的應用。
3、設計封裝復數的結構體。
4、根據復數抽象類型定義中所指的基本操作,定義並實現復數的初始化,實部和虛部的獲取和設置函數。
5、根據復數抽象類型定義中所指的基本運算,定義並實現復數的加減乘除四則運算。
6、編寫一個主函數,接受用戶的輸入,並根據輸入構造連個復數變量。
7、在數函數中對步驟6中構造的復數進行各項運算,驗證各種運算結果的正確性。
8、驗證得到以下結果:
五、實驗總結:
1、程序的實現首先要明確程序設計的目的和算法,明確所應用到的基本知識。
2、程序設計應當保持明確的思路,盡可能在完善簡化程序的過程中優化程序,多文件可增加程序可讀性。
3、數據類型的抽象化,成就了定義的普適性。
六、代碼
//Complex.h
#include<stdio.h>
typedef struct
{
float real;
float imag;
}Complex;
void InitialComplex(Complex &x,float r, float i);
float GetReal(Complex x);
float GetImag(Complex x);
void SetReal(Complex &x, float real);
void SetImag (Complex &x, float imag);
Complex add(Complex x, Complex y);
Complex sub(Complex x, Complex y);
Complex multi(Complex x, Complex y);
Complex expect(Complex x, Complex y);
//Complex.cpp
#include<stdio.h>
#include"Complex.h"
void InitialComplex(Complex &x, float r, float i)
{
x.imag = i;
x.real = r;
}
float GetReal(Complex x)
{
return x.real;
}
float GetImag(Complex x)
{
return x.imag;
}
void SetReal(Complex &x, float real)
{
x.real = real;
}
void SetImag (Complex &x, float imag)
{
x.imag = imag;
}
Complex add(Complex x, Complex y)
{
Complex z;
z.imag = x.imag + y.imag;
z.real = x.real + y.real;
return z;
}
Complex sub(Complex x, Complex y)
{
Complex z;
z.imag = x.imag - y.imag;
z.real = x.real - y.real;
return z;
}
Complex multi(Complex x, Complex y)
{
Complex z;
z.imag = x.real * y.imag + x.imag * y.real ;
z.real = x.real * y.real - x.imag * y.imag ;
return z;
}
Complex expect(Complex x, Complex y)
{
Complex z;
z.real = (x.real *y.real +x.imag *y.imag )/(y.real *y.real +y.imag *y.imag );
z.imag = (x.real *(-y.imag) + y.real *x.imag)/ ( y.real*y.real +y.imag *y.imag );
return z;
}
//main.cpp
#include"Complex.h"
int main()
{
Complex a,b,c;
float r = 0, i =0;
printf("請輸入第一個復數的實部、虛部,用空格隔開:\n");
scanf("%f %f", &r, &i);
InitialComplex(a,r,i);
printf("請輸入第二個復數的實部、虛部,用空格隔開:\n");
scanf("%f %f",&r, &i);
SetReal(b,r);
SetImag(b,i);
printf("第一個復數的實部為:%f, 虛部為:%f。\n", GetReal(a), GetImag(a)) ;
printf("第二個復數的實部為:%f, 虛部為:%f。\n", GetReal(b), GetImag(b)) ;
printf("兩個復數之和:");
c = add(a,b);
printf("%f %f \n", GetReal(c), GetImag(c));
printf("兩個復數之差:") ;
c = sub(a,b);
printf("%f %f \n", GetReal(c), GetImag(c));
printf("兩個復數乘積:");
c = multi(a,b);
printf("%f %f \n", GetReal(c), GetImag(c));
printf("兩個復數的商:");
c = expect(a,b);
printf("%f %f \n", GetReal(c), GetImag(c));
}