譚浩強C語言第八章課后習題


1、輸入三個整數,按照從小到大順序輸出

 1 #include<stdio.h>
 2 int main()
 3 {
 4     void swap(int *p1,int *p2);
 5     int n1,n2,n3;
 6     int *p1,*p2,*p3;
 7     printf("input three integer n1,n2,n2:");
 8     scanf("%d,%d,%d",&n1,&n2,&n3);
 9     p1=&n1;
10     p2=&n2;
11     p3=&n3;
12     if(n1>n2) swap(p1,p2);
13     if(n1>n3) swap(p1,p3);
14     if(n2>n3) swap(p2,p3);
15     printf("Now the order is:%d %d %d\n",n1,n2,n3);
16     return 0;
17 }
18 void swap(int *p1,int *p2)
19 {
20     int p;
21     p=*p1;
22     *p1=*p2;
23     *p2=p;
24 }

2、輸入三個字符串,按照從小到大輸出

#include<stdio.h>
#include<string.h>
#define M 100
int main()
{
    void swap(char *,char *);
    char str1[M],str2[M],str3[M];
    printf("input three line:\n");
    gets(str1);
    gets(str2);
    gets(str3);
    if(strcmp(str1,str2)>0)
        swap(str1,str2);
    if(strcmp(str1,str3)>0)
        swap(str1,str3);
    if(strcmp(str2,str3)>0)
        swap(str2,str3);
    printf("Now the order is:\n");
    printf("%s,%s,%s\n",str1,str2,str3);
    return 0;
}
void swap(char *p1,char *p2)
{
    char p[M];
    strcpy(p,p1);
    strcpy(p1,p2);
    strcpy(p2,p);
}

3、

#include<stdio.h>
int main()
{
    void input(int *);
    void max_min_value(int *);
    void output(int *);
    int number[10];
    input(number);
    max_min_value(number);
    output(number);
    return 0;
}
void input(int *number)
{
    int i;
    printf("input 10 numbers:");
    for(i=0;i<10;i++)
        scanf("%d",&number[i]);
}
void max_min_value(int *number)
{
    int *max,*min,*p,temp;
    max=min=number;
    for(p=number+1;p<number+10;p++)
    {
        if(*p>*max)
            max=p;
        else if(*p<*min)
            min=p;
        temp=number[0];number[0]=*min;*min=temp;
        if(max=number)
            max=min;
        temp=number[9];number[9]=*max;*max=temp;
    }
    
}
    void output(int *number)
    {   int *p;
        printf("Now they are:");
            for(p=number;p<number+10;p++)
                printf("%d  ",*p);
            printf("\n");
    }

 4、移動m個位置

#include<stdio.h>
int main()
{
    void move(int [20],int,int);
    int number[20],n,m,i;
    printf("how many numbers?");
    scanf("%d",&n);
    printf("input %d numbers:\n",n);
    for(i=0;i<n;i++)
        scanf("%d",&number[i]);
    printf("how many place you want move?");
    scanf("%d",&m);
    move(number,n,m);
    printf("now they are:\n");
    for(i=0;i<n;i++)
        printf("%d  ",number[i]);
    printf("\n");
    return 0;
}
void move(int array[20],int n,int m)
{
    int *p,array_end;
    array_end=*(array+n-1);
    for(p=array+n-1;p>array;p--)
        *p=*(p-1);
    *array=array_end;
    m--;
    if(m>0) move(array,n,m);
}

5、n個人圍成一圈,順序排號,從第一個人開始報數,凡是報到3的人出圈子,問最后留下來的是原來的第幾號

#include<stdio.h>
int main()
{
    int i,k,m,n,num[50],*p;
    printf("\n input number of person: n=");
    scanf("%d",&n);
    p=num;
    for(i=0;i<n;i++)
        *(p+i)=i+1;      //從1到n編號
    i=0;                 //i為每次循環時計數變量
    k=0;                 //k為123報數時計數變量
    m=0;                 //m為退出人數
    while(m<n-1)
    {
        if(*(p+i)!=0) k++;
        if(k==3)
        {
            *(p+i)=0;
            k=0;
            m++;
        }
        i++;
        if(i==n) i=0;    //報數到尾后i恢復為0

    }
    while(*p==0) p++;
    printf("the last number is%d\n",*p);
    return 0;
}

6、寫一個函數,求一個字符串長度。

#include<stdio.h>
int main()
{
    int length(char *p);
        int len;
    char str[20];
    printf("input string   :");
    scanf("%s",str);
    len=length(str);
    printf("the length of string is%d \n",len);
    return 0;
}
int length(char *p)
{
    int n;
    n=0;
    while(*p!='\0')
    {n++;
    p++;}
    return(n);
}

8、輸入一行文字,找出其中大寫字母小寫字母、空格、數字、以及其他字符各有多少。

#include<stdio.h>
int main()
{
    int upper=0,lower=0,digit=0,space=0,other=0,i=0;
    char *p,s[20];
    printf("input string:  ");
    while((s[i]=getchar())!='\n') i++;
    p=&s[0];
    while(*p!='\n')
    {
        if(('A'<=*p)&&(*p<='Z'))
            ++upper;
        else if(('a'<=*p)&&(*p<='z'))
            ++lower;
        else if(*p==' ')
            ++space;
        else if((*p<='9')&&(*p>='0'))
            ++digit;
        else
            ++other;
        p++;
    }
    printf("upper case :%d   lower case:%d",upper,lower);
    printf("  space:%d     digit:%d    other :%d\n",space,digit,other);
    return 0;
}

 7、有一個字符串包含n個字符。寫一個函數,將此字符串中從第m個字符開始的全部字符復制成為另一個字符。

#include<stdio.h>
#include<string.h>
int main()
{
    void copystr(char *,char *,int);
    int m;
    char str1[20],str2[20];
    printf("input string:");
    gets(str1);
    printf("which character that began to copy?:");
    scanf("%d",&m);
    if(strlen(str1)<m)
        printf("error:");
    else
    {
        copystr(str1,str2,m);
        printf("%s",str2);
    }
    return 0;
}
void copystr(char *p1,char *p2,int m)
{
    int n;
    n=0;
    while(n<m-1)
    {
        n++;
        p1++;
    }
    while(*p1!='\0')
    {
        *p2=*p1;
        p1++;
        p2++;
    }
*p2='\0';
}

9、寫一個函數,將一個3*3矩陣轉置

#include<stdio.h>
int main()
{
    void move(int *pointer);
    int a[3][3],*p,i;
    printf("input matrix:\n");
    for(i=0;i<3;i++)
        scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
    p=&a[0][0];
    move(p);
    printf("Now,matrix:\n");
    for(i=0;i<3;i++)
        printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
    return 0;
}
void move(int *pointer)
{
    int i,j,t;
    for(i=0;i<3;i++)
        for(j=i;j<3;j++)
        {
            t=*(pointer+i*3+j);
            *(pointer+i*3+j)=*(pointer+j*3+i);
            *(pointer+j*3+i)=t;
        }
}

11、在主函數輸入10個等長字符串。用另一函數對他們排序,然后在主函數輸出排序。

用字符型二維數組
#include<stdio.h>
#include<string.h>
int main()
{
    void sort(char s[][6]);
    int i;
    char str[10][6];
    printf("input 10 strings:\n");
    for(i=0;i<10;i++)
        scanf("%s",str[i]);
    sort(str);
    printf("now is:\n");
    for(i=0;i<10;i++)
        printf("%s\n",str[i]);
    return 0;
}
void sort(char s[10][6])
{
    int i,j;
    char *p,temp[10];
    p=temp;
    for(i=0;i<9;i++)
        for(j=0;j<9-i;j++)
        if(strcmp(s[j],s[j+1])>0)
        {
            strcpy(p,s[j]);
            strcpy(s[j],s[j+1]);
            strcpy(s[j+1],p);
        }
}
//用指向一位數組的指針作函數參數
#include<stdio.h>
#include<string.h>
int main()
{
    void sort(char(*p)[6]);
    int i;
    char str[10][6];
    char (*p)[6];
    printf("input 10 strings :\n");
    for(i=0;i<10;i++)
        scanf("%s",str[i]);
    p=str;
    sort(p);
    printf("now is:");
    for(i=0;i<10;i++)
        printf("%s\n",str[i]);
    return 0;
}
void sort(char(*s)[6])
{int i,j;
char temp[6],*t=temp;
 for(i=0;i<9;i++)
        for(j=0;j<9-i;j++)
        if(strcmp(s[j],s[j+1])>0)
        {
            strcpy(t,s[j]);
            strcpy(s[j],s[j+1]);
            strcpy(s[j+1],t);
        }
}

 10、一個5*5的矩陣,排序,四個角從左至右從上到下依次從小到大中間放最大

#include<stdio.h>
int main()
{
    void change(int *p);
    int a[5][5],*p,i,j;
    printf("input matrix :\n");
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            scanf("%d",&a[i][j]);
        p=&a[0][0];
        change(p);
        printf("Now is:\n");
        for(i=0;i<5;i++)
        {
            for(j=0;j<5;j++)
                printf("%d   ",a[i][j]);
            printf("\n");
        }
        return 0;
}
void change(int *p)
{
    int i,j,temp;
    int *pmax,*pmin;
    pmax=p;
    pmin=p;
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
        {
            if(*pmax<*(p+5*i+j)) pmax=p+5*i+j;
            if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;
        }
        temp=*(p+12);
        *(p+12)=*pmax;
        *pmax=temp;
        temp=*p;
        *p=*pmin;
        *pmin=temp;
        pmin=p+1;
        for(i=0;i<5;i++)
            for(j=0;j<5;j++)
          if(((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j))) pmin=p+5*i+j;
            temp=*pmin;
            *pmin=*(p+4);
            *(p+4)=temp;
            pmin=p+1;
            for(i=0;i<5;i++)
                for(j=0;j<5;j++)
            if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+4))&&(*pmin>*(p+5*i+j))) pmin=p+5*i+j;
                    temp=*pmin;
                    *pmin=*(p+20);
                    *(p+20)=temp;
                    pmin=p+1;
                    for(i=0;i<5;i++)
                        for(j=0;j<5;j++)
                        
                            if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+4))&&((p+5*i+j)!=(p+20))&&(*pmin>*(p+5*i+j))) pmin=p+5*i+j;
                            temp=*pmin;
                            *pmin=*(p+24);
                            *(p+24)=temp;
}

12、用指針數組處理11,字符串不等長。

#include<stdio.h>
#include<string.h>
int main()
{
    void sort(char *[]);
    int i;
    char *p[10],str[10][20];
    for(i=0;i<10;i++)
        p[i]=str[i];
    printf("input 10 strings:\n");
    for(i=0;i<10;i++)
        scanf("%s",p[i]);
    sort(p);
    printf("now is:");
    for(i=0;i<10;i++)
        printf("%s\n",p[i]);
    return 0;
}
void sort(char *s[])
{
    int i,j;
    char *temp;
    for(i=0;i<9;i++)
        for(j=0;j<9-i;j++)
            if(strcmp(*(s+j),*(s+j+1))>0)
            {
                temp=*(s+j);
                *(s+j)=*(s+j+1);
                    *(s+j+1)=temp;
            }
}

14、將n個數按輸入時順序的逆序排列。

#include<stdio.h>
int main()
{
    void sort(char *p,int m);
    int i,n;
    char *p,num[20];
    printf("input n:");
    scanf("%d",&n);
    printf("please input these numbers:");
    for(i=0;i<n;i++)
        scanf("%d",&num[i]);
    p=&num[0];
    sort(p,n);
    printf("now is");
    for(i=0;i<n;i++)
        printf("%d  ",num[i]);
    printf("\n");
    return 0;
}
void sort(char *p,int m)
{
    int i;
    char temp,*p1,*p2;
    for(i=0;i<m/2;i++)
    {
        p1=p+i;
        p2=p+(m-1-i);
        temp=*p1;
        *p1=*p2;
        *p2=temp;
    }
}

17、自己寫一個strcmp函數,函數原型為strcmp(char *p1,char *p1)

#include<stdio.h>
int main()
{
    int strcmp(char *p1,char *p2);
    int m;
    char str1[20],str2[20],*p1,*p2;
    printf("input two strings:\n");
    scanf("%s",str1);
    scanf("%s",str2);
    p1=&str1[0];
    p2=&str2[0];
    m=strcmp(p1,p2);
    printf("result:%d,\n",m);
    return 0;
}
int strcmp(char *p1,char *p2)
{
    int i;
    i=0;
    while(*(p1+i)==*(p2+i))
        if(*(p1+i++)=='\0') return 0;
        return(*(p1+i)-*(p2+i));
}

18、輸入月份號,輸出英文月名。指針數組處理。

#include<stdio.h>
int main()
{
    char *month[13]={"error","january","fabruary","march","april","may","june","july","august","september","october","november","december"};
    int n;
    printf("input:");
    scanf("%d",&n);
    if((n<=12)&&(n>=1))
        printf("it is %s.\n",*(month+n));
    else
        printf("wromg:\n");
    return 0;
}

 20、用指向指針的指針對5個字符串進行排序並輸出

#include<stdio.h>
#include<string.h>
#define LINEMAX 20
int main()
{
    void sort(char **p);
    int i;
    char **p,*pstr[5],str[5][LINEMAX];
    for(i=0;i<5;i++)
        pstr[i]=str[i];
    printf("input 5 strings:\n");
    for(i=0;i<5;i++)
        scanf("%s",pstr[i]);
    p=pstr;
    sort(p);
    printf("\nstrings sorted:\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+i);
            *(p+i)=*(p+j);
            *(p+j)=temp;
        }
        }
    }
}

21、用指向指針的指針對n個整數進行排序

#include<stdio.h>
int main()
{
    void sort(int **p,int n);
    int i,n,data[20],**p,*pstr[20];
    printf("input n:\n");
    scanf("%d",&n);
    for(i=0;i<n;i++)
        pstr[i]=&data[i];
    printf("input %dnumbers:",n);
    for(i=0;i<n;i++)
        scanf("%d",psrr[i]);

p=pstr;

 sort(p,n);

 printf("Now,the sequence is:\n");

 for (i=0;i<n;i++)

 printf("%d ",*pstr[i]);

 printf("\n");

 return 0;

}

void sort(int **p,int n)

{int i,j,*temp;

 for (i=0;i<n-1;i++)

 {for (j=i+1;j<n;j++)

 {if (**(p+i)>**(p+j)) // 比較后交換整數地址  

 {temp=*(p+i);

 *(p+i)=*(p+j);

 *(p+j)=temp;

 }

 }

 }

}

 15、有一個班4個學生,5名學生。

求第一門課程的平均分。

找出兩門以上課程不及格的學生。輸出他們的學號及平均成績。

找出平均成績在九十分以上或者全部成績在85分以上的學生。

#include<stdio.h>
int main()
{
    void avsco(float *,float *);
    void avcour1(char(*)[10],float*);
    void fali2(char course[5][10],int num[],float *pscore,float aver[4]);
    void good(char course[5][10],int num[4],float *pscore,float aver[4]);
    int i,j,*pnum,num[4];
    float score[4][5],aver[4],*pscore,*paver;
    char course[5][10],(*pcourse)[10];
    printf("input course:\n");
    pcourse=course;
    for(i=0;i<5;i++)
        scanf("%s",course[i]);
    printf("input NO. and scores:\n");
    printf("NO.");
    for(i=0;i<5;i++)
    printf(",%s",course[i]);
        printf("\n");
    pscore=&score[0][0];
    pnum=&num[0];
    for(i=0;i<4;i++)
    {
        scanf("%d",pnum+i);
            for(j=0;j<5;j++)
                scanf("%f",pscore+5*i+j);
    }
paver=&aver[0];
 printf("\n\n"); 
 avsco(pscore,paver); //  求出每個學生的平均成績  
 avcour1(pcourse,pscore); //  求出第一門課的平均成績  
 printf("\n\n");
 fali2(pcourse,pnum,pscore,paver); //  找出 2 門課不及格的學生  
 printf("\n\n");
 good(pcourse,pnum,pscore,paver); //  找出成績好的學生  
 return 0;
}
void avsco(float *pscore,float *paver) //  求每個學生的平均成績的函數
 {int i,j;
 float sum,average;
 for (i=0;i<4;i++)
 {sum=0.0;
 for (j=0;j<5;j++)
 sum=sum+(*(pscore+5*i+j)); // 累計每個學生的各科成績
 average=sum/5; // 計算平均成績
 *(paver+i)=average;
 }
}
void avcour1(char (*pcourse)[10],float *pscore) //  求第一課程的平均成績的函數  
 {int i;
 float sum,average1;
 sum=0.0;
 for (i=0;i<4;i++)
 sum=sum+(*(pscore+5*i)); // 累計每個學生的得分
 average1=sum/4; // 計算平均成績
 printf("course 1:%s average score:%7.2f\n",*pcourse,average1);
}
void fali2(char course[5][10],int num[],float *pscore,float aver[4]) 
 //  找兩門以上課程不及格的學生的函數  
 {int i,j,k,labe1;
 printf(" ==========Student who is fail in two courses======= \n");
 printf("NO. ");
 for (i=0;i<5;i++)
 printf("%11s",course[i]);
 printf(" average\n");
 for (i=0;i<4;i++)
 {labe1=0;
 for (j=0;j<5;j++)
 if (*(pscore+5*i+j)<60.0) labe1++;
 if (labe1>=2)
 {printf("%d",num[i]);
 for (k=0;k<5;k++)
 printf("%11.2f",*(pscore+5*i+k));
 printf("%11.2f\n",aver[i]);
 }
 }
}
void good(char course[5][10],int num[4],float *pscore,float aver[4])
 //  找成績優秀學生 ( 各門 85 以上或平均 90 分以上 ) 的函數  
 {int i,j,k,n;
 printf(" ======Students whose score is good======\n");
 printf("NO. ");
 for (i=0;i<5;i++)
 printf("%11s",course[i]);
 printf(" average\n");
 for (i=0;i<4;i++)
 {n=0;
 for (j=0;j<5;j++)
 if (*(pscore+5*i+j)>85.0) n++;
 if ((n==5)||(aver[i]>=90))
 {printf("%d",num[i]);
 for (k=0;k<5;k++)
 printf("%11.2f",*(pscore+5*i+k));
 printf("%11.2f\n",aver[i]);
 }
 }
}
        

16、輸入一個字符串,內有數字和非數字字符。例如

A123x456 1760?302tab5876

將其中連續的數字作為一個整數,依次存放到數組a中。統計宮有多少個整數,並輸出

#include <stdio.h>
int main()
{
 char str[50],*pstr;
 int i,j,k,m,e10,digit,ndigit,a[10],*pa;
 printf("input a string:\n");
 gets(str);
 pstr=&str[0]; /* 字符指針 pstr 置於數組 str  首地址 */
 pa=&a[0]; /* 指針 pa 置於 a 數組首地址 */
 ndigit=0; /*ndigit 代表有多少個整數 */
 i=0; /* 代表字符串中的第幾個字符 */
 j=0;
 while(*(pstr+i)!='\0')
 {if((*(pstr+i)>='0') && (*(pstr+i)<='9'))
 j++;
 else
 {if (j>0)
 {digit=*(pstr+i-1)-48; /* 將個數位賦予 digit*/
 k=1;
 while (k<j) /* 將含有兩位以上數的其它位的數值累計於 digit*/
 {e10=1;
 for (m=1;m<=k;m++)
 e10=e10*10; /*e10 代表該位數所應乘的因子 */
 digit=digit+(*(pstr+i-1-k)-48)*e10; /* 將該位數的數值 \ 累加於 digit*/
 k++; /* 位數 K 自增 */
 }
 *pa=digit; /* 將數值賦予數組 a*/
 ndigit++;
 pa++; /* 指針 pa 指向 a 數組下一元素 */
 j=0;
 }
 }
 i++;
 }
 if (j>0) /* 以數字結尾字符串的最后一個數據 */
 {digit=*(pstr+i-1)-48; /* 將個數位賦予 digit*/
 k=1;
 while (k<j) /*  將含有兩位以上數的其它位的數值累加於 digit*/
 {e10=1;
 for (m=1;m<=k;m++)
 e10=e10*10; /*e10 代表位數所應乘的因子 */
 digit=digit+(*(pstr+i-1-k)-48)*e10; /* 將該位數的數值累加於 digit*/
 k++; /* 位數 K 自增 */
 }
 *pa=digit; /* 將數值賦予數組 a*/
 ndigit++;
 j=0;
 }
 printf("There are %d numbers in this line, they are:\n",ndigit);
 j=0;
 pa=&a[0];
 for (j=0;j<ndigit;j++) /* 打印數據 */
 printf("%d ",*(pa+j));
 printf("\n");
 return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM