數據結構線性表實驗報告


一、實驗目的:

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));

      

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM