大家好,這篇文章分享了C程式設計(譚浩強)第五版第八章課後題答案,所有程式已經測試能夠正常運行,如果小伙伴發現有錯誤的的地方,歡迎留言告訴我,我會及時改正!感謝大家的觀看!!! ...
1. 輸入3個整數,要求按由小到大的順序輸出。
#include <stdio.h>
int main()
{
int a,b,c,*p_a=&a,*p_b=&b,*p_c=&c;
void f(int *,int *);
printf("請輸入三個數字: \n");
scanf("%d%d%d",p_a,p_b,p_c);
if(*p_a>*p_b)
f(p_a,p_b);
if(*p_a>*p_c)
f(p_a,p_c);
if(*p_b>*p_c)
f(p_b,p_c);
printf("數字從小到大排序為:%d %d %d\n",*p_a,*p_b,*p_c);
return 0;
}
void f(int *p_a,int *p_b)
{
int t=*p_a;
*p_a=*p_b;
*p_b=t;
}
2. 輸入3個字元串,要求按由小到大的順序輸出。
#include <stdio.h>
#include<string.h>
#define N 3
int main()
{
char str[N][40];
char *p[N];
int i,j;
void f(char *,char *);
printf("請輸入三個字元串: \n");
for(i=0;i<N;i++)
{
scanf("%s",str[i]);
p[i]=str[i];
}
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(strcmp(p[i],p[j])>0)
f(p[i],p[j]);
printf("字元串從小到大排序為:%s %s %s\n",p[0],p[1],p[2]);
return 0;
}
void f(char *p1,char *p2)
{
char p3[N];
strcpy(p3,p2);
strcpy(p2,p1);
strcpy(p1,p3);
}
3. 輸入10個整數,將其中最小的數與第一個數對換, 把最大的數與最後一個數對換。
寫3個函數:
①輸入10個數;
②進行處理;
③輸出10個數。
#include <stdio.h>
#define N 10
int main()
{
int n[N];
void in1(int *);
void maxmin1(int *);
void out1(int *);
printf("請輸入%d個數字:\n",N);
in1(n);
maxmin1(n);
out1(n);
return 0;
}
void in1(int *arr)
{
int i;
for(i=0;i<N;i++)
scanf("%d",&arr[i]);
}
void maxmin1(int *arr)
{
int i,tmp,max1=arr[0],min1=arr[0];
int *p_max=NULL,*p_min=NULL;
for(i=1;i<N;i++)
{
if(max1<arr[i])
{
max1=arr[i];
p_max=&arr[i];
}
if(min1>arr[i])
{
min1=arr[i];
p_min=&arr[i];
}
}
tmp=*p_min;
*p_min=arr[0];
arr[0]=tmp;
tmp=*p_max;
*p_max=arr[N-1];
arr[N-1]=tmp;
}
void out1(int *arr)
{
int i;
for(i=0;i<N;i++)
printf("%d ",arr[i]);
}
4. 有n個整數,使前面各數順序向後移m個位置,最後m個數變成最前面m個數
寫一函數實現以上功能,在主函數中輸人n個整數和輸出調整後的n個數。
解題思路: 找出倒數第m個數據,從這裡開始保存倒數第m位置的數據,因為倒數第m位置的數據要放到數組最前方,將m之前的數據向後偏移一位,然後將數組第一個位置的數據替換為保存的m位的數據,逐個往後遞增即可。
#include <stdio.h>
int main()
{
int i,n,m;
int num[100]={0};
void move(int *,int,int);
printf("請輸入數字的個數:\n");
scanf("%d",&n);
printf("請依次輸入數字:\n");
for(i=0;i<n;i++)
scanf("%d",&num[i]);
printf("請輸入要後移的距離:\n");
scanf("%d",&m);
move(num,n,m);
for(i=0;i<n;i++)
printf("%d",num[i]);
printf("\n");
return 0;
}
void move(int *arry[],int n,int m)
{
int i,j,end=n-m,temp; //end為倒數第m個數的位置
int *p;
for(i=0;i<m;i++)
{
p=arry+end+i; //p指向數組第m+i的地址,即後m個數要前移的數的地址
temp=*p; //用temp記下要前移的數
for(j=i+end;j>i;j--) //把前n-m個數依次後移一個單位
{
*p=*(p-1);
p--;
}
*(arry+i)=temp; //把後m個數移到數組前m的位置
}
}
5. 有n個人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來第幾號的那位。
解題思路: 從第一個人開始,逐個報數,誰報3就退出,並且重置報數,直到最後一個人後,又重新從第一個人繼續報數,直到最終只剩一個人的時候退出即可。
#include <stdio.h>
int main()
{
int i,n,remain,num=0;
int *p;
int people[200]={0};
printf("請輸入人數:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
people[i]=i+1;
remain=n;
while(remain>1)
{
p=people; //當數組遍歷一遍時,再從頭遍歷
while(p!=people+n)
{
if((*p)!=0)
{
num++;
if(num==3)
{
*p=0;
num=0;
remain--;
}
}
p++;
}
}
for(i=0;i<n;i++)
{
if(people[i]!=0)
printf("最後剩的人的序號是%d號\n",people[i]);
}
return 0;
}
6. 寫一函數,求一個字元串的長度。在main函數中輸入字元串,並輸出其長度。
解題思路: 字元串以\0作為結尾,則從第一個字元開始向後移動遇到\0認為字元串結束。
#include <stdio.h>
int main()
{
char a[240];
int count(char *str);
printf("請輸入字元串:\n");
scanf("%s",a);
printf("字元串的長度是%d\n",count(a));
return 0;
}
int count(char *str)
{
char *p=str;
int num=0;
while((*(p++))!='\0')
num++;
return num;
}
7. 有一字元串,包含n個字元。寫一函數,將此字元串中從第m個字元開始的全部字元複製成為另一個字元串。
#include <stdio.h>
#include<string.h>
int main()
{
int m;
char a[240]={0};
char b[240]={0};
void copy(char str1[],char str2[],int n);
printf("請輸入字元串:\n");
scanf("%s",a);
printf("請輸入要複製字元串的起始位置:");
scanf("%d",&m);
copy(a,b,m);
printf("複製後的字元串為:%s\n",b);
return 0;
}
void copy(char str1[],char str2[],int n)
{
char *p;
int i;
p=str1+n-1;
for(i=0;i<=strlen(str1)-n;i++)
str2[i]=*(p++);
}
8. 輸入一行文字,找出其中大寫字母、小寫字母、空格、數字以及其他字元各有多少。
#include <stdio.h>
int main()
{
char b[240]={0};
int a=0,A=0,num=0,space=0,other=0;
char *p;
p=b;
printf("請輸入字元串:\n");
gets(b);
while(*p!='\0')
{
if(*p>='a' && *p<='z')
a++;
else if(*p>='A' && *p<='Z')
A++;
else if(*p>='0' && *p<='9')
num++;
else if(*p==' ')
space++;
else
other++;
p++;
}
printf("小寫字母個數:%d\n大寫字母個數:%d\n數字個數:%d\n空格個數:%d\n其它字元個數:%d\n",a,A,num,space,other);
}
9. 寫一函數,將一個3x3的整型矩陣轉置。
解題思路: 矩陣轉置就是行變列,列變行,就是 arry[i][j] 轉換為 arry[j][i] ; 但是需要註意的是,
一. 因為行列個數可能並非相同,轉換後行數或者列數變多了或者變少,因此不能直接轉換。需要重新申請空間存儲轉換後的數據。
二. 二維數組是線性扁平化存儲的,無法確定列數的情況下傳參後,在函數中使用時需要頭指針向後偏移 列數*第n行 才能訪問到第n行的數據。例如在函數中訪問 arry[i][j] ,需要通過arry + col_num*i + j 方式進行訪問。
#include <stdio.h>
#define M 3
#define N 3
int main()
{
int i,j;
int d[M][N];
void chang(int str[][M],int row,int line); //二維數組做形參時,列不能省
printf("請輸入一個%dx%d數組:\n",M,N);
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&d[i][j]);
printf("\n");
chang(d,M,N);
printf("轉置後的數組為:\n");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
printf("%d",d[i][j]);
printf("\n");
}
return 0;
}
void chang(int str[][M],int row,int line)
{
int i,j;
int **p;
p=str;
p=(int **)malloc(sizeof(int *)*line);
for(i=0;i<line;i++)
p[i]=(int *)malloc(sizeof(int)*row);
for(i=0;i<line;i++)
for(j=i;j<row;j++)
{
int t;
t = *(*(str)+line*j+i);
*(*(str)+line*j+i) = *(*(str)+row*i+j);
*(*(str)+row*i+j) = t;
} //二維數組的存儲是扁平化的, 訪問第j行第i列的數據,應該是 arry + j*列數 + i
//j是原數組的行
}
10. 將一個5x5的矩陣中最大的元素放在中心,4個角分別放4個最小的元素(順序為從左到右,從上到下依次從小到大存放),寫一函數實現之。用main函數調用。
解題思路: 將二維數組當做一維數組進行處理比較方便,而二維數組本身就是扁平化存儲,所以直接使用首地址即可。
先遍歷找到最大值,將其與中間數字交換,而中間數字的下標就是數字總數除以2;
其次尋找四次最小值,每次尋找的時候將最小值的下標記錄起來,前提是這個數字如果已經是選中的最小數字之一,則需要跳過,也就是只跟剩餘的數字作比較。(第二次開始遍歷找最小數字的時候,千萬不能與第一個最小數進行比較,否則永遠都只有一個最小數)。
#include <stdio.h>
#define M 5
#define N 5
int main()
{
int i,j;
int d[M][N];
void chang(int str[][N],int row,int line); //二維數組做形參時,列不能省
printf("請輸入一個%dx%d數組:\n",M,N);
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&d[i][j]);
printf("\n");
chang(d,M,N);
printf("轉變後的數組為:\n");
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%5d",d[i][j]);
printf("\n");
}
return 0;
}
void chang(int str[][N],int row,int line)
{
int i,j,t,k,tmp,min_id[4],min_tmp;
int *p;
int *pmax,*pmin;
p=&str[0][0];
pmax=p;
pmin=p;
for(i=0;i<row;i++)
for(j=0;j<line;j++)
if(*pmax<*(p+line*i+j))
pmax=p+line*i+j;
tmp=*(p+line*row/2); //行列相乘的總數除以2加一即為中心的位置,註意數組下標是從0開始的
*(p+line*row/2)=*pmax;
*pmax=tmp;
for(i=0;i<4;i++)
{
min_tmp=str[row*line-1];
for(j=0;j<row*line;j++)
{
k=0;
for(;k<i;k++)
if(j==min_id[k]) //如果某個下標值已經是最小下標,則不再比較
break;
if(k!=i) //k!=i說明執行break了,即這時j值是最小下標,結束本次迴圈
continue;
if(min_tmp>str[j])
{
min_tmp=str[j];
min_id[i]=j;
}
}
}
tmp=*(p);
*(p)=*(p+min_id[0]);
*(p+min_id[0])=tmp;
tmp=*(p+line-1);
*(p+line-1)=*(p+min_id[1]);
*(p+min_id[1])=tmp;
tmp=*(p+line*(row-1));
*(p+line*(row-1))=*(p+min_id[2]);
*(p+min_id[2])=tmp;
tmp=*(p+line*row-1);
*(p+line*row-1)=*(p+min_id[3]);
*(p+min_id[3])=tmp;
}
11. 在主函數中輸入10個等長的字元串。用另一函數對它們排序。然後在主函數輸出這10個已排好序的字元串。
解題思路:採用strcmp,返回值大於0表示第一個字元串大於第二個字元串
#include <stdio.h>
#include<string.h>
#define M 10
#define N 1000
int main()
{
int i;
char d[M][N];
void sort(char str[][N]); //二維數組做形參時,列不能省
printf("請輸入%d個等長的字元串:\n",M);
for(i=0;i<M;i++)
gets(d[i]);
printf("\n");
sort(d);
printf("排序後的字元串為:\n");
for(i=0;i<M;i++)
printf("%s\n",d[i]);
printf("\n");
return 0;
}
void sort(char str[M][N])
{
int i,j;
char temp[N]={0};
char *p;
p=temp;
for(i=0;i<M;i++)
for(j=i;j<M;j++)
if((strcmp(str[j],str[i]))>0)
{
strcpy(p,str[j]);
strcpy(str[j],str[i]);
strcpy(str[i],p);
}
}
12. 用指針數組處理上一題目,字元串不等長。
解題思路: 與數字的比較沒什麼區別,只不過需要採用strcmp進行字元串的大小比較,使用指針實現需要在最早接收數據的時候就採用字元串指針數組,這樣的好處在於指針的指向可以直接通過賦值進行改變,而指針數組中的字元串的順序只需要交換不同字元串的地址就可以實現
#include <stdio.h>
#include<string.h>
#define M 10
#define N 1000
int main()
{
int i;
char d[M][N];
char *p[M];
void sort(char *str[][N]); //二維數組做形參時,列不能省
for(i=0;i<M;i++)
p[i]=d[i];
printf("請輸入%d個等長的字元串:\n",M);
for(i=0;i<M;i++)
gets(p[i]);
printf("\n");
sort(p);
printf("排序後的字元串為:\n");
for(i=0;i<M;i++)
printf("%s\n",p[i]);
printf("\n");
return 0;
}
void sort(char *str[M])
{
int i,j;
char *temp;
for(i=0;i<M;i++)
for(j=i;j<M;j++)
if((strcmp(*(str+j),*(str+i)))>0)
{
temp=*(str+j);
*(str+j)=*(str+i);
*(str+i)=temp;
}
}
13. 寫一個用矩形法求定積分的通用函數,分別求$\quad \int_0^1 sinxdx, \quad \int_0^1 cosxdx, \quad \int_0^1 e^xdx$ ,說明: sin,cos,exp 函數已在系統的數學函數庫中,程式開頭要用#include <math. h>。
解題思路:
矩形法,學過高等數學就知道化曲為直的思想。將定積分化為多個函數連續的和。基本思想是將區間[a,b]化成n等分,當n越大的時候結果越準確。圖形化成一小塊一小塊的矩形。底邊長都為(b-a)/n.高為每個等分點的函數值。然後將每個矩形的面積相加即為所求。
因為被分成n等分,就可以認為每一等分是一個矩形,那麼每一矩形的面積為: 每一個矩形面積為:Sn=f(x)(b-a)/n ;總面積為:S=S1+S2+…+Sn;具體計算過程根據公式套即可。
這裡主要在於函數指針的應用,將函數作為參數傳遞給另一個函數,在另一個函數中進行調用的方式向外提供統一介面,而介面內的處理方式隨著傳入的函數而不同
#include <stdio.h>
#include<math.h>
int main()
{
int n;
double a,b,c,(*p)(double);
double jifen(double (*)(double),double,double,int); //第一個參數是float型函數指針,函數的參數是float型
double fsin(float);
double fcos(double);
double fexp(double);
printf("請輸入積分的上限和下限:");
scanf("%lf %lf",&a,&b);
printf("請輸入矩形法要分成的份數:");
scanf("%d",&n);
p=fsin;
c=jifen(fsin,a,b,n);
printf("積分fsin的值為%lf:\n",c);
p=fcos;
c=jifen(fcos,a,b,n);
printf("積分fcos的值為%lf:\n",c);
p=fexp;
c=jifen(fexp,a,b,n);
printf("積分fexp的值為%lf:\n",c);
return 0;
}
double jifen(double (*p)(double),double a,double b,int n)
{
int i;
double x,h,s;
h=(a-b)/n;
x=b;
s=0;
for(i=0;i<n;i++)
{
x+=h;
s+=(*p)(x)*h;
}
return s;
}
double fsin(double x)
{
return sin(x);
}
double fcos(double x)
{
return cos(x);
}
double fexp(double x)
{
return exp(x);
}
14. 將n個數按輸入時順序的逆序排列,用函數實現。
#include <stdio.h>
int main()
{
int i,n;
int *p;
int num[40]={0};
void chang(int *,int);
printf("請輸入數的個數:");
scanf("%d",&n);
printf("請輸入數據:");
for(i=0;i<n;i++)
scanf("%d",&num[i]);
p=#
chang(p,n);
printf("逆序後的數據為:\n");
for(i=0;i<n;i++)
printf("%d",num[i]);
printf("\n");
return 0;
}
void chang(int *p,int n)
{
int i;
int temp;
for(i=0;i<n/2;i++)
{
temp=*(p+i);
*(p+i)=*(p+n-1-i);
*(p+n-1-i)=temp;
}
}
15. 有一個班4個學生,5門課程。
①求第1門課程的平均分;
②找出有兩門以上課程不及格的學生,輸出他們的學號和全部課程成績及平均成績;
③找出平均成績在90分以上或全部課程成績在85分以上的學生。
分別編3個函數實現以上3個要求。
#include <stdio.h>
#define M 4
#define N 5
float aver[M];
int main()
{
int i,j;
int id[M];
float score[M][N],(*p)[N]; //(*p)要按列取
void aver1(float (*p)[N]);
void less60(float (*p)[N],int id[]);
void best(float (*p)[N],int id[]);
for(i=0;i<M;i++)
{
printf("\n請第%d個學生的學號:",i+1);
scanf("%d",&id[i]);
printf("\n請第%d個學生的成績:",i+1);
for(j=0;j<N;j++)
scanf("%f",&score[i][j]);
}
p=score;
aver1(p);
less60(p,id);
best(p,id);
return 0;
}
void aver1(float (*p)[N])
{
int i;
float aver,sum=0;
for(i=0;i<M;i++)
sum+=*(*(p+i));
aver=sum/4.0;
printf("第一門課的平均分是:%.2f\n",aver);
}
void less60(float (*p)[N],int id[M])
{
int i,j,n;
float sum;
for(i=0;i<M;i++)
{
sum=0;
for(j=0;j<N;j++)
sum+=*(*(p+i)+j);
aver[i]=sum/5.0;
}
for(i=0;i<M;i++)
{
int flag=0;
for(j=0;j<N;j++)
{
if(*(*(p+i)+j)<60.0)
flag++;
}
if(flag>2)
{
printf("學號為%d的同學有兩門以上成績不及格!其全部成績及平均成績如下:\n",id[i]);
for(n=0;n<N;n++)
printf("%.2f ",*(*(p+i)+n));
printf("\n");
printf("平均成績:%.2f\n",aver[i]);
}
}
}
void best(float (*p)[N],int id[M])
{
int i,j,flag;
for(i=0;i<M;i++)
{
flag=1;
if(aver[i]<=90.0)
flag=0;
for(j=0;j<N;j++)
if(*(*(p+i)+j)<=85.0)
flag=0;
if(flag==1)
printf("學號為%d的同學平均成績在90分以上或全部課程成績在85分以上\n",id[i]);
}
}
16. 輸入一個字元串,內有數字和非數字字元,例如:A123x456 17960? ,302tab5876,將其中連續的數字作為一個整數,依次存放到一數組a中。例如,123放在a[0],456放在a[1]…統計共有多少個整數,並輸出這些數。
#include <stdio.h>
#include<string.h>
int main()
{
int i,j=0,n=0;
int len,cnt=0,a[1000]={0},tmp=0;
char str[1000]={0},*p,temp[1000]={0};
printf("請輸入字元串:");
gets(str);
len=strlen(str);
p=str;
for(i=0;i<=len;i++)
{
if(*(p+i)>='0' && *(p+i)<='9')
{
cnt++;
temp[j++]=*(p+i);
}
else
{
int x=1;
if(cnt!=0)
{
j=cnt;
for(;cnt>0;cnt--)
{
tmp+=(temp[j-1]-'0')*x;
x*=10;
j--;
}
a[n++]=tmp;
}
j=0;
tmp=0;
cnt=0;
}
}
printf("整數個數是%d\n",n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
17. 寫一函數,實現兩個字元串的比較。即自己寫一個strcmp函數,函數原型為int strcmp(char * p1 ,char * p2); 設p1指向字元串s1, p2指向字元串s2。要求當s1=s2時,返回值為0;若s1≠s2,返回它們二者第1個不同字元的ASCII碼差值(如"BOY"與"BAD" ,第2個字母不同,0與A之差為79- 65=14)。如果s1>s2,則輸出正值;如果s1<s2,則輸出負值。
解題思路: 使用兩個指針指向兩個字元串首部,逐個往後進行比較,不相等的時候則將數據進行相減,作為返回值
#include <stdio.h>
#include<string.h>
int main()
{
int n;
char str1[1000]={0},*p1,*p2,str2[1000]={0};
int strcmp1(char *p1,char *p2);
printf("請輸入字元串1:");
gets(str1);
printf("請輸入字元串2:");
gets(str2);
p1=str1;
p2=str2;
n=strcmp1(p1,p2);
printf("返回值是%d\n",n);
}
int strcmp1(char *p1,char *p2)
{
int i=0,h=0;
while(*(p1+i)!='\0' && *(p2+i)!='\0')
{
if(*(p1+i)!=*(p2+i))
h=*(p1+i)-*(p2+i);
i++;
}
return h;
}
18. 編一程式,輸入月份號,輸出該月的英文月名。例如,輸人3,則輸出"March" ,要求用指針數組處理。
解題思路: 首先定義字元串指針數字,數組中每一個元素都存放一個字元串指針,每個指針指向不同字元串的位置。則輸入月份數字後,根據下標獲取對應月份字元串的地址即可
#include <stdio.h>
int main()
{
int n;
char *Month0[12]={"January","February","March","April","May","June","July","August","Septemper","October","November","December"};
//註意要加雙引號
printf("請輸入要查詢的月份:");
scanf("%d",&n);
if(n>=1 && n<=12)
printf("%s\n",Month0[n-1]);
else
printf("輸入錯誤\n");
return 0;
}
19.(1) 編寫一個函數new,對n個字元開闢連續的存儲空間,此函數應返回一個指針(地址),指向字元串開始的空間。new(n)表示分配n個位元組的記憶體空間。(2)寫一函數free,將前面用new函數占用的空間釋放。Free(p)表示將p(地址)指向的單元以後的記憶體段釋放。
#include <stdio.h>
#define NEWSIZE 1000
char newbuf[NEWSIZE];
char *pnew=newbuf;
char *mynew(int n)
{
if(pnew+n<=newbuf + NEWSIZE)
{
pnew+=n;
return(pnew-n);
}
else
return(NULL);
}
void myfree(char *p)
{
if(p>=newbuf && p<=newbuf+NEWSIZE)
pnew=p;
}
int main()
{
}
20. 用指向指針的指針的方法對5個字元串排序並輸出。
解題思路:指向指針的指針其實就是二級指針,使用二級指針的保存一級指針的地址,讓這個一級指針指向具體的數據空間; 定義一個字元串指針數組包含5個元素,每個元素可以保存一個字元串的首地址,而這個地址指向的是具體的字元串數據空間,通過指針訪問實現對指向空間內的字元串進行比較排序交換即可。
#include <stdio.h>
#include<string.h>
#define SIZE 1000
int main()
{
int i;
char *pstr[5];
char **p;
char str[5][SIZE];
void sort(char **p);
for(i=0;i<5;i++)
pstr[i]=str[i]; //將第i個字元串的首地址賦予指針數組 pstr 的第i個元素
printf("請輸入5個字元串:\n");
for(i=0;i<5;i++)
scanf("%s",pstr[i]);
p=pstr; //將二級指針指向指針數組 pstr 的首地址
sort(p);
printf("排序後的字元串順序為:\n");
for(i=0;i<5;i++)
printf("%s\n",pstr[i]);
return 0;
}
void sort(char **p)
{
int i,j;
char *temp;
for(i=0;i<5;i++)
for(j=i+1;j<5;j++)
if(strcmp(*(p+i),*(p+j))>0)
{
temp=*(p+j);
*(p+j)=*(p+i);
*(p+i)=temp;
}
}
21. 用指向指針的指針的方法對n個整數排序並輸出。要求將排序單獨寫成一個函數。n個整數在主函數中輸入,最後在主函數中輸出。
解題思路: 指向指針的指針其實就是二級指針,使用二級指針的保存一級指針的地址,讓這個一級指針指向具體的數據空間。排序就是按照每個元素指針指向空間中的數據進行比對排序即可。
#include <stdio.h>
int main()
{
int i,n;
int *pnum[20];
int **p;
int num[20];
void sort(int **p,int n);
printf("請輸入數字的個數:");
scanf("%d",&n);
for(i=0;i<n;i++)
pnum[i]=&num[i]; //將第i個字元串的首地址賦予數組 pnum 的第i個元素
printf("請輸入%d個數字:\n",n);
for(i=0;i<n;i++)
scanf("%d",pnum[i]);
p=pnum; //將二級指針指向數組指針 pnum 的首地址
sort(p,n);
printf("排序後的數字順序為:\n");
for(i=0;i<n;i++)
printf("%d ",*pnum[i]);
printf("\n");
return 0;
}
void sort(int **p,int n)
{
int i,j;
int *temp;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(*(p+i)>*(p+j))
{
temp=*(p+j);
*(p+j)=*(p+i);
*(p+i)=temp;
}
}