C程式設計(譚浩強)第五版課後題答案 第八章

来源:https://www.cnblogs.com/lazyheartkx/archive/2022/05/18/16284766.html
-Advertisement-
Play Games

大家好,這篇文章分享了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=&num;
    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;
            }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為了修複生產數據,需要執行一段一次性的代碼。 鑒於是spring老項目,就想到了InitializingBean。 代碼如下。服務啟動後,log里發現出現2條“一次性任務開始”。 好在裡面邏輯做了防重控制,沒有受到什麼影響。 @Slf4j @Component public class TransT ...
  • 什麼是隱藏類 隱藏類,是一種不能被其他類直接使用的類。引入隱藏類的主要目的是給框架來使用,使得框架可以在運行時生成類,並通過反射間接使用它們。可能有點抽象,不要緊,下麵我們通過一個例子來直觀的認識它! 隱藏類案例 第一步:先創建一個普通的Java類 public class JEP371Hidden ...
  • 下麵介紹的是JUC包下一些線程安全類的一些簡單使用和一些小demo。 Semaphore 信號量,即可以同時使用的線程數,tryrequire就是將信號量減一,release就是信號量+1,當等於0就會阻塞,大於零才會喚醒。 當需要控制線程訪問數量,可以使用信號量來做控制,比較簡單。 下麵是使用信號 ...
  • Spring Ioc源碼分析系列--Ioc容器註冊BeanPostProcessor後置處理器以及事件消息處理 前言 上一篇分析了BeanFactoryPostProcessor的作用,那麼這一篇繼續在refresh()方法里游蕩,相信對Spring熟悉點的朋友,在看完BeanFactoryPost ...
  • 大家好,這篇文章分享了C程式設計(譚浩強)第五版第十章課後題答案,所有程式已經測試能夠正常運行,如果小伙伴發現有錯誤的的地方,歡迎留言告訴我,我會及時改正!感謝大家的觀看!!! ...
  • 高精度 運算:加法、減法、階乘、乘法 翻轉: 這些運算都是從小位開始,所以一般需要翻轉。以字元串儲存:reverse(a.begin(),a,end())。以數組儲存: for (int i1 = lena1 - 1; i1 >= 0; i1--) { a1[lena1-1-i1] = a[i1] ...
  • 大家好,這篇文章分享了C程式設計(譚浩強)第五版第九章課後題答案,所有程式已經測試能夠正常運行,如果小伙伴發現有錯誤的的地方,歡迎留言告訴我,我會及時改正!感謝大家的觀看!!! ...
  • 回溯法(98條消息) (新手向)遞歸與回溯演算法學習(一)——n位逐位整除數_TripleGold.的博客-CSDN博客 演算法思想: (通用的解題法)窮舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當發現不滿足求解條件時就回退,嘗試其他路徑 回溯法的解題步驟: 針對給定問題確定問題的解空間樹, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...