C语言练习——Day09

51、输入3个数a,b,c,按大小顺序输出(利用指针)。

#include "stdio.h"

int main(){
    void compare(int *a,int *b);
    int a, b,c;
    scanf("%d,%d,%d",&a,&b,&c);
    if (a<b) {
        compare(&a, &b);
    }
    if (a<c) {
        compare(&a, &c);
    }
    if (b<c) {
        compare(&b, &c);
    }
    printf("%d,%d,%d",a,b,c);
}
void compare(int *a,int *b){
    int temp;
    temp=*a;*a=*b;*b=temp;
}

运行结果:在这里插入图片描述

52、输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

刚开始写这道题时出错,调试后发现错误原因,也记录一下~
一定要知道错误的原因,不能一知半解,不然下次一样会错~
错误代码

#include "stdio.h"
#define N 5
int main(){
    void input(int array[N]);
    void output(int array[N]);

    int array[N],*max,*min,*p;
    max=array,min=array;
    input(array);
    for (p=array; p<array+N; p++) {
        
        if (*max<*p) {
            *max=*p;
        }
        else if (*min>*p) {
            *min=*p;
        }
    }
    int temp=*min;*min=array[0];array[0]=temp;
    temp=*max;*max=array[N-1];array[N-1]=temp;
    output(array);
}
void input(int array[N]){ 
    int *p;
    for(p=array;p<array+N;p++)
    scanf("%d",p);
}
void output(int array[N]){ 
    int *p;
    for(p=array;p<array+N;p++){
    printf("%d ",*p);
    }
    printf("\n");
}

运行结果:在这里插入图片描述
调试部分结果如下图所示:
在这里插入图片描述
分析:假设array[0]的地址为200,则min和max的地址也为200,循环一次后*min变为2,即200这个地址上的值变为2,即array{2,2,1,5,4},*max也随之发生改变,也变为2。

循环一次的结果*max=2*min=2array{2,2,1,5,4}
循环两次的结果*max=1*min=1array{1,2,1,5,4}
循环三次的结果*max=5*min=5array{5,2,1,5,4}
循环四次次的结果*max=4*min=4array{4,2,1,5,4}

结论:变化的是200这个地址上的值,我们得到的仅仅是最大最小值,而数组值的交换要求我们必须知道最大最小值的位置。
修改代码如下:

#include "stdio.h"
#define N 5
int main(){
    void input(int array[N]);
    void output(int array[N]);

    int array[N],*max,*min,*p;
    max=array,min=array;
    input(array);
    for (p=array; p<array+N; p++) {
        
        if (*max<*p) {
            max=p;//不能写成*max=*p
        }
        if (*min>*p) {
            min=p;
        }
    }
    int temp=*min;*min=array[0];array[0]=temp;
    temp=*max;*max=array[N-1];array[N-1]=temp;
    output(array);
}
void input(int array[N]){ 
    int *p;
    for(p=array;p<array+N;p++)
    scanf("%d",p);
}
void output(int array[N]){ 
    int *p;
    for(p=array;p<array+N;p++){
    printf("%d ",*p);
    }
    printf("\n");
}

运行结果:在这里插入图片描述

53、有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。

#include<stdio.h>
int main(){
    void move(int n,int m,int array[20]);
    int number[20],n,m,i;
    printf("输入数组的大小:");
    scanf("%d",&n);
    printf("输入后移的m值:");
    scanf("%d",&m);
    for(i=0;i<n;i++){
        scanf("%d,",&number[i]);
    }
    move(n,m,number);
    for(i=0;i<n-1;i++){
        printf("%d,",number[i]);
    }
    printf("%d",number[n-1]);
}
void move(int n,int m,int array[20]){
    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(n,m,array);}
}

运行结果:在这里插入图片描述

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

#include<stdio.h>
#include<math.h>

int main(void) {
    int n, * p, number=0, k = 0;//k表示退出的人数
    printf("输入人数n:");
    scanf("%d", &n);
    int array[20];
    for (int i = 1; i <= n; i++) {
        array[i - 1] = i;
    }
    while (k != n-1) {
        for (p = array; p < array + n; p++) {
            if(*p != 0){
                number++;
                if (number % 3 == 0) {
                    number = 0;
                    //printf("%d\n", *p);
                    *p = 0;
                    k++;
                }
            }
        }
    }
    for (p = array; p < array + n; p++) {
        if (*p != 0) {
            printf("最后留下的是原来第%d号。", *p);
        }
    }
}

运行结果:在这里插入图片描述

55、写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

#include<stdio.h>
#include<math.h>
int length(char c[]){
    char *p;p=c;
    int n=0;
    while (*p!='\0') {
        n++;
        p++;
    }
    return n;
}
int main(void) {
    int length(char c[]);
    char c[20];
    scanf("%s",c);//gets(c)把空格也算成字符;
    printf("%d",length(c));
}

运行结果:在这里插入图片描述
注意:scanf () 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。.而gets () 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老板来根肠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值