㈠ 試用c語言的結構類型定義表示復數的抽象數據類型
#include <stdio.h>
//結構體
typedef struct
{
double a;
double b;
} COMPLEX;
//加
COMPLEX add (COMPLEX a, COMPLEX b)
{
a.a += b.a;
a.b += b.b;
return a;
}
//減
COMPLEX subtract (COMPLEX a, COMPLEX b)
{
a.a -= b.a;
a.b -= b.b;
return a;
}
//乘
COMPLEX multiply (COMPLEX a, COMPLEX b)
{
COMPLEX c;
c.a = a.a*b.a - a.b*b.b;
c.b = a.a*b.b + a.b*b.a;
return c;
}
//除
COMPLEX divide (COMPLEX a, COMPLEX b) {
COMPLEX c;
double divisor = b.a*b.a + b.b*b.b;
if (divisor - 0 == 0)
exit (0);
c.a = (a.a*b.a + a.b*b.b) / divisor;
c.b = (a.b*b.a - a.a*b.b) / divisor;
return c;
}
然後讀入數據,判斷運算符號就行了。
㈡ 怎樣寫一個抽象數據類型!
template <class T> 這是定義類模版
因為C語言的函數參數傳遞需要指定確定類型才行。這樣在編寫程序過程就比較麻煩。比如
要寫一個兩個數相加的函數 int add(int a,int b),可以看到,這個函數只支持int 類型,float,double等類型就不能用這個函數了,只能再寫一個 float addf(float a,float b)。這樣代碼的重用性能不好。
到了C++就有模版的出現了
就是定義一個模版,傳入參數類型是不定時,就可以定義為模版。
你的代碼就是了,template <class T> class T是任意的類型。
這樣需要說明的是,模版的類型轉換過程是發生在編譯之前,也就是預編譯,預編譯跟預處理不同,預處理純粹是編譯前宏代碼的替換,預編譯是開始編譯後,對一些模版類型進行調整生成中間代碼,當然還有其它一些工作。
當編譯成目標文件後,模版在定義變數賦了什麼類型就是什麼類型了
㈢ C語言設計實現抽象數據類型"有理數"基本操作包括有理數的加法,減法,乘法,除法,以及求有理數的分子,分
有理數即分數,
分數的數據類型是很簡單的。
另外,求有理數的分子,分母的問題,因為給的有理數只能是有限小數,所以根本沒有疑問。
但是如果改成:
求分子分母之和最小的,在一定誤差范圍內的分數,這個問題才有價值
比如:
0.3333333,如果誤差為1e-4
那麼1/3明顯要比333333/10000000
下面給出一個實現(C++):
struct RatNum
{
int a,b;
static int GCD(int a,int b)
{
if(a<0)a=-a;
if(b<0)b=-b;
if(a==0)return b;
if(b==0)return a;
if(a<b)
{
int c=a;
a=b;
b=c;
}
unsigned int c;
while(c= a % b)
{
a = b ;
b = c;
}
return b;
}
explicit RatNum(int aa=0,int bb=1)
:a(aa),b(bb)
{
}
explicit RatNum(double num,double esp=0.00000001)
{
if(esp<0)esp=-esp;
for(b=1;;b++)
{
a=b*num+.5;
double k=a-b*num;
if(k<0)k=-k;
if(k<esp)break;
}
}
void norm()//約分
{
int c=GCD(a,b);
a/=c;
b/=c;
if(b<0)
{
a=-a;
b=-b;
}
}
RatNum operator/(const RatNum& f)const
{
RatNum d=*this;
d.a*=f.b;
d.b*=f.a;
return d;
}
RatNum operator-()const
{
RatNum ret=*this;
ret.a=-ret.a;
return ret;
}
void operator*=(const RatNum& f)
{
a*=f.a;
b*=f.b;
norm();
}
RatNum operator*(const RatNum& f)const
{
RatNum d=*this;
d*=f;
return d;
}
RatNum operator*(int q)const
{
RatNum d=*this;
d.a*=q;
return d;
}
void operator-=(const RatNum& f)
{
int bb=b;
a*=f.b;
b*=f.b;
a-=f.a*bb;
}
void operator+=(const RatNum& f)
{
int bb=b;
a*=f.b;
b*=f.b;
a+=f.a*bb;
}
void positive()
{
if (a<0)a=-a;
}
bool operator==(int n)
{
return a==n*b;
}
void operator=(int q)
{
a=q;
b=1;
}
};
㈣ C語言問題求助,一個抽象數據類型的例子
抽象是提取共性的過程。C的話可以使用結構體來存儲公共域,比如:
struct
student
{
char
name[20];
unsigned
char
age;
unsigned
int
id;
...
};
這個結構體說明了學生這種抽象數據類型的成員都有那些
㈤ 抽象數據類型怎麼用C語言實現 就是用一般的語言C程序寫出來嗎 到底怎麼用C程序實現
你所謂的抽象數據類型到底是什麼樣子的??類似於泛型的話可以通過兩個#實現,比如:
#define Link(node_type) struct node_type##Link{\
struct node_type##Link* prev;\
node_type value;\
struct node_type##Link* next;\
}
#define Declare_Link(node_type) Link(node_type)
這樣你就可以通過:
Declare_Link(int);
聲明一個節點值時int類型,節點類型是int_Link類型的新數據類型,如果你定義了鏈表的操作,那你可以只通過傳入int類型,就可以聲明並使用任意類型的鏈表了。
㈥ 關於C語言抽象數據類型不完整類型的問題
數據類型包括兩個方面:1,這種類型所能代表的值的范圍,或者說這種類型裡面存的是什麼東西;2,可以對這種類型做什麼操作
所謂抽象數據類型,就是你在使用這個類型的時候,只要知道上面兩點就可以了,你不用去管它裡面是怎麼實現的。如果該類型的具體實現改變了,也不會影響使用這個類型的已有的程序的代碼。比如你在c語言裡面經常用到int這個類型,但你從來沒想過它是怎麼來實現int與int之間的加法,乘法的,你也不需要知道。哪天編譯器把int型的加法改了一下,跟你也沒關系,你只要會使用就行了。
㈦ 從C語言的角度來解釋什麼是抽象數據類型
簡單的說一下吧,所謂抽象數據類型ADT,是指
我們在邏輯上定義的
一種
數據類型。
如你所知道的,計算機內,無論是內存還是外存,都只是一組二進制的數位而已。
大多數時候,比如我們所熟知的
Char類型、Int類型等等,都是一組已經定義好的二進制數位。
所謂定義好,是指,在這一組數位中,如Char類型,8位,即一組8個二進制數位,我們如何標識和處理每一位,以及解讀每一位所代表的意義。
你學過C,應該知道ASCII碼,和二進制計數。
Char的這個數據類型的含義就是說
以二進制計數
算出對應的數值,
再以ASCII碼為標准,解讀出這8位二進制位中所表示的字母。
事實上,我想說的是,這就是一個基本的抽象數據類型了。
當然,ADT不僅僅是一組數位的定義,他還包括一組定義在這個結構上的一組操作。
struct這個方法,在後來的演變中,成為了C++和其他高等語言中的類(class)。
我知道,這樣講你肯定不是很明白,但關於這個東西,有一門課程叫做《數據結構》,中間詳細敘述了所有有關
抽象數據類型的概念
。
其中,有一本
《數據結構C語言版》清華大學出版社
嚴蔚敏著
的教材,是所有計算機專業學生必修的一門課程。你可以看看。
祝好運!
㈧ 試用C語言的結構類型定義表示復數的抽象數據類型。
定義:
class complex
{
private:
double real; //復數的實部
double imag; //復數的虛部 復數表示為 real + imag i (如 2 + 3i)
public:
complex()
{
real=0;
image=0;
}
complex(double r, double i)
{
real=r;
imag=i;
}
void input(); //輸入函數
void output(); //輸出函數
void add(complex a);
void sub(complex a);
……………………………… //加、減、乘、除為成員函數 運算時直接調用就行
//建議您先實現加法和減法
}
祝您成功,加油!
㈨ 嚴蔚敏的數據結構(C語言版)緒論抽象數據類型Triplet的表示和實現
&T表示引用類型,函數調用時值傳遞, Status DestroyTeiplet(Triplet &T) 忠 三元組T整個進行了改變,被銷毀了,所以用了&T,進行了引用傳遞,功能類似於指針傳遞,不過書寫類型可以類似於值傳遞;Status Get(Triplet T,int i,ElemType &e) 僅僅是查詢三元組,沒有改變三元組的內容,所以用了直接調用值傳遞;建議去看下關於函數調用的 引用傳遞 值傳遞 和指針傳遞的 各種參數傳遞形式