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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...