?1.有下列幾種用二元組表示的數(shù)據(jù)結(jié)構(gòu),試畫出它們分別對應的圖形表示(當出現(xiàn)多個關(guān)系時,
對每個關(guān)系畫出相應的結(jié)構(gòu)圖),并指出它們分別屬于何種結(jié)構(gòu)。
⑴ A=(K,R)其中
K={a1,a2,a3...,an}
R={}
⑵ B=(K,R)其中
K={a,b,c,d,e,f,g,h}
R={r}
r={<a,b>,<b,c>,<c,d>,<d,e>,<e,f>,<f,g>,<g,h>}
⑶ C=(K,R)其中
K={a,b,c,d,f,g,h}
R={r}
r={<d,b>,<d,g>,<b,a>,<b,c>,<g,e>,<g,h>,<e,f>}
⑷ D=(K,R)其中
K={1,2,3,4,5,6}
R={r}
r={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)}
⑸ E=(K,R)其中
K={48,25,64,57,82,36,75,43}
R={r1,r2,r3}
r1={<48,25>,<25,64>,<64,57>,<57,82>,<82,36>,<36,75>,<75,43>}
r2={<48,25>,<48,64>,<64,57>,<64,82>,<25,36>,<82,75>,<36,43>}
r3={<25,36>,<36,43>,<43,48>,<48,57>,<57,64>,<64,75>,<75,82>}
解:⑴是集合結(jié)構(gòu);⑵是線性結(jié)構(gòu);⑶⑷是樹型結(jié)構(gòu);⑸散列結(jié)構(gòu)。只作為參考。
2.設(shè)計二次多項式ax2+bx+c的一種抽象數(shù)據(jù)類型,假定起名為QIAdratic,
該類型的數(shù)據(jù)部分分為三個系數(shù)項a、b和c,操作部分為:(請寫出下面每一個
操作的具體實現(xiàn))。
⑴ 初始化數(shù)據(jù)成員ab和c(假定用記錄類型Quadratie定義成員),每個數(shù)據(jù)成
員的默認值為0。
Quadratic InitQuadratic(float aa=0,float bb=0,float cc=0);
解:
Quadratic InitQuadratic(float aa,float bb,float cc)
{
Quadratic q;
q.a=aa;
q.b=bb;
q.c=cc;
return q;
}
⑵ 做兩個多項式加法,即使對應的系數(shù)相加,并返回相加的結(jié)果。
Quadratic Add(Quadratic q1,Quadratic q2);
解:
Quadratic Add(Quadratic q1,Quadratic q2);
{
Quadratic q;
q.a=q1.a+q2.a;
q.b=q1.b+q2.b;
q.c=q1.c+q2.c;
return q;
}
⑶ 根據(jù)給定x的值計算多項式的值。
float Eval(Quadratic q,float x);
解:
float Eval(Quadratic q,float x)
{
return(q.a*x*x+q.b*x+q.c);
}
⑷ 計算方程ax2+bx+c=0的兩個實數(shù)根,對于有實根、無實根和不是實根方程
(即a==0)這三種情況要返回不同的整數(shù)值,以便于工作調(diào)用函數(shù)做不同的處理。
int Root(Quadratic q,float& r1,float& r2);
解:
int Root(Quadratic q,float& r1,float& r2)
{
if(q.a==0)return -1;
float x=q.b*q.b-4*q.a*q.c;
if(x>=0){
r1=(float)(-q.b+sqrt(x))/(2*q.a);
r2=(float)(-q.b-sqrt(x))/(2*q.a);
return 1;
}
else
return 0;
}
⑸ 按照ax**2+bx+c的格式(x2用x**2表示)輸出二次多項式,在輸出時要注意
去掉系數(shù)為0的項,并且當b和c的值為負時,其前不能出現(xiàn)加號。
void Print(Quadratic q)
解:
void Print(Quadratic q)
{
if(q.a) cout<<q.a<<"x**2";
if(q.b)
if(q.b>0)
cout<<"+"<<q.b<<"x";
else
cout<<q.b<<"x";
if(q.c)
if(q.c>0)
cout<<"+"<<q.c;
else
cout<<q.c;
cout<<end1;
}
3.用c++函數(shù)描述下列每一個算法,并分別求出它們的時間復雜度。
⑴ 比較同一簡單類型的兩個數(shù)據(jù)x1和x2的大小,對于x1>x2,x1=x2和x1<x2這三種不同
情況分別返回'>''='和'<'字符。假定簡單類型用SimpleType表示,它可通過typedef
語句定義為任一簡單類型。
解:
char compare(SimpleType x1,SimpleType x2)
{
if(x1>x2) return'>';
else if(x1==x2) return '=';
else return'<';
}
其時間復雜度為O(1)
⑵ 將一個字符串中的所有字符按相反方的次序重新放置。
解:
void Reverse(char*p)
{
int n=strlen(p);
for(int i=0;i<n/2;i++){
char ch;
ch=p[i]
p[i]=p[n-i-1];
p[n-i-1]=ch;
}
}
其時間復雜度為O(n)
⑶ 求一維double型數(shù)組a[n]中的所有元素之乘積。
解:
double product(double a[],int n)
{
double p=1;
for(int i=0;i<n;i++)
p*=a[i];
return p;
}
其時間復雜度為O(n)
⑷ 計算Σni=0xi/i+1的值。
解:
double Accumulate(double x,int n)
{
double p=1,s=1;
for(int i=1;i<=n;i++){
p*=x;
s+=p/(i+1);
}
return s;
}
其時間復雜度為O(n)
⑸ 假定一維數(shù)組a[n]中的每個元素值均在[0,200]區(qū)間內(nèi),分別統(tǒng)計出落在[0,20)
,[20,50),[50,80),[80,130),[130,200]等各區(qū)間的元素個數(shù)。
解:
int Count(int a[],int n,int c[5])//用數(shù)組c[5]保存統(tǒng)計結(jié)果
{
int d[5]={20,50,80,130,201};//用來保存各統(tǒng)計區(qū)間的上限
int i,j;
for(i=0;i<5;i++)c[i]=0;//給數(shù)組c[5]中的每個元素賦初值0
for(i=0;i<n;i++)
{
if(a[i]<0||a[i]>200)
return 0;//返回數(shù)值0表示數(shù)組中數(shù)據(jù)有錯,統(tǒng)計失敗
for(j=0;j<5;j++)//查找a[i]所在區(qū)間
if(a[i]<d[j]) break;
c[j]++;//使統(tǒng)計相應區(qū)間的元素增1
}
return 1;//返回數(shù)值1表示統(tǒng)計成功
}
其時間復雜度為O(n)
⑹ 從二維整型數(shù)組a[m][n]中查找出最大元素所在的行、列下標。
解:
void find(int a[M][N],int m,int n,int&Lin,int&Col)
//M和N為全局常量,應滿足M>=n和N>=n的條件,Lin和Col為引用
//形參,它是對應實參的別名,其值由實參帶回
{
Lin=0;Col=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(a[i][j]>a[Lin][Col]){Lin=i;Col=j;}
}
其時間復雜度為O(m*n)
4.指出下列各算法的功能并求出其時間復雜度。
⑴ int prime(int n)
{
int i=2;
int x=(int)sqrt(n);
while(i<=x){
if(n%i==0)break;
i++;
}
if(i>x)
return 1;
else
return 0;
}
解:
判斷n是否是一個素數(shù),若是則返回數(shù)值1,否則返回0。該算法的時間復雜度為
O(n1/2)。
⑵ int sum1(int n)
{
int p=1,s=0;
for(int i=1;i<=n;i++){
p*=i;
s+=p;
}
return s;
}
解:
計算Σi!(上標為n,下標為i=1)的值,其時間的復雜度為O(n)。
⑶ int sum2(int n)
{
int s=0;
for(int i=1;i<=n;i++){
int p=1;
for(int j=1;j<=i;j++)
p*=j;
s+=p;
}
return s;
}
解:
計算Σi!的值,時間復雜度為O(n2)
⑷ int fun(int n)
{
int i=1,s=1;
while(s<n)
s+=++i;
return i;
}
解:
求出滿足不等式1+2+3...+i≥n的最小i值, 其時間復雜度為O(n1/2)。
⑸ void UseFile(ifstream& inp,int c[10])
//假定inp所對應的文件中保存有n個整數(shù)
{
for(int i=0;i<10;i++)
c[i]=0;
int x;
while(inp>>x){
i=x%10;
c[i]++;
}
}
解:
利用數(shù)組c[10]中的每個元素c[i]對應統(tǒng)計出inp所聯(lián)系的整數(shù)文件中個位值同為i的整數(shù)個
數(shù),時間復雜度為O(n)
⑹ void mtable(int n)
{
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++)
cout<<i<<"*"<<j<<"="
<<setw(2)<<i*j<<"";
cout<<end1;
}
}
解:
打印出一個具有n行的乘法表,第i行(1≤i≤n)中有n-i+1個乘法項,每個乘法項為i與j(
i≤j≤n)的乘積,時間復雜度為O(n2)。
⑺ void cmatrix(int a[M][N],int d)
//M和N為全局整型常量
{
for(int i=0;i<M;i++)
for(int j=0;j<N;j++)
a[i][j]*=d;
}
解:
使數(shù)組a[M][N]中的每一個元素均詳細以d的值,時間復雜度為O(M*N)
⑻ void matrimult(int a[M][N],int b[N][L],int c[M][L])
//
{
int i,j,k;
for(i=0;i<M;i++)
for(j=0;j<L;j++)
c[i][j]=0;
for(i=0;i<M;i++)
for(j=0;j<L;j++)
for(k=0;k<N;k++)
c[i][j]+=a[i][k]*b[k][j];
}
解:
矩陣相乘,即a[M][N]×b[N][L]→c[M][L],時間復雜度為O(M×N×L)。
5.題目略
⑴解:
void InitSet(Set& s)
{
for(int i=1;i<=SETSIZE;i++)
s.m[i]=0;
}
⑵解:void InitSet(Set& s,int a[],int n)
{
fot(int i=0;i<n;i++)
s.m[a[i]]=1;
}
⑶解:
Set operator + (Set s1,Set s2)
{
Set s;
InitSet(s);
for(int i=1;i<=SETSIZE;i++)
if((s1.m[i]==1)||s2.m[i]===1))
s.m[i]=1;
return s;
}
⑷解:
Set operator*(Set s1,Set s2)
{
Set s;
InitSet(s);
for(int i=1;i<=SETSIZE;i++)
if((s1.m[i]==1)&&(s2.m[i]==1))
s.m[i]=1;
return s;
⑸解:
Boolean operator^(int elt,Set s)
{
if(s.m[elt]==1)
return True;
else
return False;
}
⑹解:
void Inisert(Set& s,int n)
{
s.m[n]=1;
}
⑺解:
void Delete(Set& s,int n)
{
s.m[n]=0;
}
⑻解:
ostream& operator<<(ostream& ostr,Set& s)
{
ostr<<'{'
for(int i=1;i<=SETSIZE;i++)
if(s.m[i]==1)
ostr<<i<<',';
ostr<<'}'<<end1;
return ostr;
}