zoukankan      html  css  js  c++  java
  • 谭浩强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
    ",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:
    ");
        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:
    ");
        printf("%s,%s,%s
    ",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("
    ");
        }

     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);
        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:
    ");
        for(i=0;i<n;i++)
            printf("%d  ",number[i]);
        printf("
    ");
        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("
     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
    ",*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 
    ",len);
        return 0;
    }
    int length(char *p)
    {
        int n;
        n=0;
        while(*p!='')
        {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())!='
    ') i++;
        p=&s[0];
        while(*p!='
    ')
        {
            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
    ",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!='')
        {
            *p2=*p1;
            p1++;
            p2++;
        }
    *p2='';
    }

    9、写一个函数,将一个3*3矩阵转置

    #include<stdio.h>
    int main()
    {
        void move(int *pointer);
        int a[3][3],*p,i;
        printf("input matrix:
    ");
        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:
    ");
        for(i=0;i<3;i++)
            printf("%d %d %d
    ",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:
    ");
        for(i=0;i<10;i++)
            scanf("%s",str[i]);
        sort(str);
        printf("now is:
    ");
        for(i=0;i<10;i++)
            printf("%s
    ",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 :
    ");
        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
    ",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 :
    ");
        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:
    ");
            for(i=0;i<5;i++)
            {
                for(j=0;j<5;j++)
                    printf("%d   ",a[i][j]);
                printf("
    ");
            }
            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:
    ");
        for(i=0;i<10;i++)
            scanf("%s",p[i]);
        sort(p);
        printf("now is:");
        for(i=0;i<10;i++)
            printf("%s
    ",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("
    ");
        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:
    ");
        scanf("%s",str1);
        scanf("%s",str2);
        p1=&str1[0];
        p2=&str2[0];
        m=strcmp(p1,p2);
        printf("result:%d,
    ",m);
        return 0;
    }
    int strcmp(char *p1,char *p2)
    {
        int i;
        i=0;
        while(*(p1+i)==*(p2+i))
            if(*(p1+i++)=='') 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.
    ",*(month+n));
        else
            printf("wromg:
    ");
        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:
    ");
        for(i=0;i<5;i++)
            scanf("%s",pstr[i]);
        p=pstr;
        sort(p);
        printf("
    strings sorted:
    ");
        for(i=0;i<5;i++)
            printf("%s
    ",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:
    ");
        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: ");

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

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

     printf(" ");

     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:
    ");
        pcourse=course;
        for(i=0;i<5;i++)
            scanf("%s",course[i]);
        printf("input NO. and scores:
    ");
        printf("NO.");
        for(i=0;i<5;i++)
        printf(",%s",course[i]);
            printf("
    ");
        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("
    
    "); 
     avsco(pscore,paver); //  求出每个学生的平均成绩  
     avcour1(pcourse,pscore); //  求出第一门课的平均成绩  
     printf("
    
    ");
     fali2(pcourse,pnum,pscore,paver); //  找出 2 门课不及格的学生  
     printf("
    
    ");
     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
    ",*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======= 
    ");
     printf("NO. ");
     for (i=0;i<5;i++)
     printf("%11s",course[i]);
     printf(" average
    ");
     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
    ",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======
    ");
     printf("NO. ");
     for (i=0;i<5;i++)
     printf("%11s",course[i]);
     printf(" average
    ");
     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
    ",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:
    ");
     gets(str);
     pstr=&str[0]; /* 字符指针 pstr 置于数组 str  首地址 */
     pa=&a[0]; /* 指针 pa 置于 a 数组首地址 */
     ndigit=0; /*ndigit 代表有多少个整数 */
     i=0; /* 代表字符串中的第几个字符 */
     j=0;
     while(*(pstr+i)!='')
     {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:
    ",ndigit);
     j=0;
     pa=&a[0];
     for (j=0;j<ndigit;j++) /* 打印数据 */
     printf("%d ",*(pa+j));
     printf("
    ");
     return 0;
    }
  • 相关阅读:
    python并发编程之深入理解yield from
    python中的多进程编程
    Python并发concurrent、Future类、异步
    【Socket通信】关于Socket通信原理解析及python实现
    深入理解Python元类
    Django RestFrameWork 源码解析
    Django的Restful规范
    小程序colorUI框架初步使用教程
    类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 (KeyMouseGo)
    如何在postgresql中,一句sql完成未有数据记录的insert,再update的操作
  • 原文地址:https://www.cnblogs.com/1998wdq/p/11609817.html
Copyright © 2011-2022 走看看