谭浩强C语言第八章课后习题

1、输入三个整数,按照从小到大顺序输出

 1 #include
 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
#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
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;p10;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;p10;p++)
                printf("%d  ",*p);
            printf("\n");
    }

 4、移动m个位置

#include
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)
        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)
        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
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)
        *(p+i)=i+1;      //从1到n编号
    i=0;                 //i为每次循环时计数变量
    k=0;                 //k为123报数时计数变量
    m=0;                 //m为退出人数
    while(m1)
    {
        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
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
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
#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(n1)
    {
        n++;
        p1++;
    }
    while(*p1!='\0')
    {
        *p2=*p1;
        p1++;
        p2++;
    }
*p2='\0';
}

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

#include
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
#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
#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
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
#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
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)
        scanf("%d",&num[i]);
    p=&num[0];
    sort(p,n);
    printf("now is");
    for(i=0;i)
        printf("%d  ",num[i]);
    printf("\n");
    return 0;
}
void sort(char *p,int m)
{
    int i;
    char temp,*p1,*p2;
    for(i=0;i2;i++)
    {
        p1=p+i;
        p2=p+(m-1-i);
        temp=*p1;
        *p1=*p2;
        *p2=temp;
    }
}

17、自己写一个strcmp函数,函数原型为strcmp(char *p1,char *p1)

#include
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
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
#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
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)
        pstr[i]=&data[i];
    printf("input %dnumbers:",n);
    for(i=0;i)
        scanf("%d",psrr[i]);

p=pstr;

 sort(p,n);

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

 for (i=0;i

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

 printf("\n");

 return 0;

}

void sort(int **p,int n)

{int i,j,*temp;

 for (i=0;i

 {for (j=i+1;j

 {if (**(p+i)>**(p+j)) // 比较后交换整数地址  

 {temp=*(p+i);

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

 *(p+j)=temp;

 }

 }

 }

}

 15、有一个班4个学生,5名学生。

求第一门课程的平均分。

找出两门以上课程不及格的学生。输出他们的学号及平均成绩。

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

#include
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 
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/* 将含有两位以上数的其它位的数值累计于 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/*  将含有两位以上数的其它位的数值累加于 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/* 打印数据 */
 printf("%d ",*(pa+j));
 printf("\n");
 return 0;
}

 

转载于:https://www.cnblogs.com/1998wdq/p/11609817.html

你可能感兴趣的:(谭浩强C语言第八章课后习题)