c语言练习(二)

1、使用指针完成以下内容:

定义三个整数的的列阵,写三个功能,input(),deal(),print():输入,处理,打印:input功能,需要完成三个编号的输入,deal功能需要从小到大排序,print功能需要打印结果。

我的思路:首先定义一个整数的数组,长度为3;然后分别输入,再处理排序,用排序方法排序,最后输出结果;

实现代码:

主函数里就定义四行代码 :

    int a[3];
    input(a);
    deal(a);
    print(a);
分别实现的方法:

void input(int *x){
    for(int i=0;i<3;i++){
        printf("请输入第%d位数:",i+1);
        scanf("%d",&(*x));
        *x++;
    }
    
} 
void deal(int *x){
    for(int i=0;i<2;i++){
        for(int j=i+1;j<3;j++){
            if(*(x+i)>*(x+j)){
                *(x+i)^=*(x+j);
                *(x+j)^=*(x+i);
                *(x+i)^=*(x+j);
            }
        }
    }
}
void print(int *x){
    printf("该编号最小到大:");
    for(int i=0;i<3;i++){
        printf("%d,",*x++);
    } 
}
ok,

2、

n个人围成一圈,顺序排号。从第一个人开始报数(从13报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

代码即注释如下:

int nmax=50;//定个50长的数组
    int i,k,m,n,num[nmax],*p;
    printf("please input the total of numbers:");
    scanf("%d",&n);//输入一个整数
    p=num;//p指向数组的首地址
    for(i=0;i<n;i++)
        *(p+i)=i+1;//给数组的各元素赋值,从1到n;
    i=0;//记录循环数是否到末尾,到开发就赋值0
    k=0;//k是记录三次
    m=0;//记录还有几个数,如果m还有最后一个数,也就是m>=n-1时,不再循环,就跳出来输出;
    while(m<n-1)
    {
        if(*(p+i)!=0) k++;
        if(k==3)
            { *(p+i)=0;
                k=0;
                m++;
            }
        i++;
        if(i==n) i=0;
    }
    while(*p==0) p++;//判断哪个数不为0,不为0的就是最后剩下来的;
    printf("%d is leftn",*p);//最后输出该数

3、有代码如下:请输出结果

    int  a=100;
    fun(&a);
void fun(int *n)
{

    while( (*n)--);
    printf("%d\n",++(*n));
}

结果为:0

解释:首先fun(&a)传的是地址,函数里*n就是a的值100;while循环最后直接跟了个分号相当于空语句,这一点有好多初学者容易忽略,忽略掉就不对了,你明明想的会输出从100到0,怎么就输出一个0了呢!原因就是分号,再看里面的条件,*n本来就是a的值100,也就相当于a--,这样a就成了99,以此类推,等到a变成了0,也就是假,大家知道,在以语言中0就是假,所以当*n为0时,(*n)--变成-1的时候跳出来,再下面打印时打印++(-1),你说是几,当然是0了;

4、有代码如下:请输出结果

int a[] = {0, 2,4,6,8};
int *p[5]={a, a+1, a+2, a+3, a+4};
int ** pp = p;


a==*p==*pp;
    printf("%d\n",*pp ++);//它就是a的首地址
    printf("%d\n", *pp-a);//1-0=1
    printf("%d\n", **++pp);//
    printf("%d\n", pp - p);

输出结果:

4176

1

4

2

解释:首先说明a是个数组里有5个数,*p[5]一个数组指针也有5个元素分别是:a的首地址、a的第二个、第三人,第四个、第五个地址;然后就是**p二级指针,指向p的首地址,也就是a的首地址,这样说,下面就知道输出什么了吧!

第一个输出语句:输出第一个*pp就是p的首地址也就是a的首fbfh,所以输出一个地址4176;
你要是不信,你就再打印这一句:

printf("%d,%d,%d,%d\n",a,&a[0],*p,*pp);

这一句的输出结果 是: 4176,4176,4176,4176

第二个输出语句:当第一个输出语句执行完,*pp++就指向了下一个元素就是*p里面的a+1;当a+1-a=1,所以这样输出了1喽;

第三个输出语句:**++pp看起来不好看,咱拆开看,写成这样 *(*++pp),这样清楚了,(*++pp)就相当于a+2,因为在第一个输出语句执行完了以后*pp就已经是a+1了,现在又++所以变成a+2;然后再*(a+2)不就是a[2]的值4嘛!

第四个输出语句:执行完第三个语句后  *pp指向*p[2]的值是a+2,p是首地址a,它两相减pp-p=a+2-a=2;所以输出2;

5、输出以下图形:

    *******

     *****

      ***

       *

      ***

     *****

    *******


代码如下:

int m,n;
    for(int k=1;k<=7;k++){
        n=7-abs(k-4);//一行前面输出的空格
        m=abs(k-4)*2+1;//一行上有多少个星星
        for(int i=0;i<n;i++){
            printf("%s"," ");
        }
        for(int j=0;j<m;j++){
             printf("%s","*");
        }
        printf("\n");
    }






你可能感兴趣的:(c语言练习(二))