指针一

第1关:用指针法输入12个整数,然后按每行4个数输出

任务描述
题目描述:用指针法输入12个整数,然后按每行4个数输出

编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入

输入包含一行,有12个整数。
输出

按顺序,每行输出4个整数。

测试说明
样例输入:

1 2 3 4 5 6 7 8 9 10 11 12
样例输出:

1 2 3 4
5 6 7 8
9 10 11 12

问题分析
给出一个使用指针的解题程序。
另外给出一个不使用指针的解题程序,可以做个比较。
再给出一个按数据流输入输出的解题程序,省去存储数组。

解题程序(指针)

#include <stdio.h>

int main(void)
{
    /*********Begin*********/
#define N 12
#define M 4
    int a[N], *p = a, cnt;
    while (p < a + N)
        scanf("%d", p++);
    
    p = a;
    cnt = 0;
    while (p < a + N) {
        if (cnt % M != 0) printf(" ");
        printf("%d", *p++);
        if (++cnt == M) {
            printf("\n");
            cnt = 0;
        }
    }
    /*********End**********/
    return 0;
}

解题程序(数组)

#include <stdio.h>

int main(void)
{
    /*********Begin*********/
#define N 12
#define M 4
    int a[N], i;
    for (i = 0; i < N; i++)
        scanf("%d", &a[i]);
    
    for (i = 0; i < N; i++) {
        if (i % M != 0) printf(" ");
        printf("%d", a[i]);
        if (i % M == 3)
            printf("\n");
    }
    /*********End**********/
    return 0;
}

解题程序(数据流)

#include <stdio.h>

int main(void)
{
    /*********Begin*********/
#define N 12
#define M 4    
    int a, cnt = 0;
    while (++cnt <= N) {
        scanf("%d", &a);

        if (cnt % M != 1) printf(" ");
        printf("%d", a);
        if (cnt % M == 0)
            printf("\n");
    }
    /*********End**********/
    return 0;
}

第2关:指针变量作为函数参数实现两变量交换值

任务描述
题目描述:对输入的两个整数a,b,用指针变量作为函数参数,交换a和b的值。

编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
两个整数a b
输出
输出用函数交换处理后的值a b
测试说明
样例输入:
1 2
样例输出:
2 1

解题程序

#include <stdio.h>
/*********Begin*********/
void swap(int *p, int *q)
{
    int t = *p;
    *p = *q;
    *q = t;
}
/*********End**********/
int main(void)
{
	int a, b;
	scanf("%d%d", &a, &b);
	/*********Begin*********/
    swap(&a, &b);
    printf("%d %d\n", a, b);
	/*********End**********/
    return 0;
}

第3关:报数

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

编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入

初始人数n
输出

最后一人的初始编号

测试说明
样例输入:

3
样例输出:

2

问题分析
这是一个原始的约瑟夫问题。
这里分别给出使用指针和不使用指针的解法。
可以看出使用指针的解题程序十分难懂,而使用数组的解题程序通俗易懂。

解题程序(指针)

#include <stdio.h>
int main(void)
{
    /*********Begin*********/
    /* 用数组模拟来实现 */
    int n;
    scanf("%d", &n);
    int a[n], *p = a, cnt = 0;
    /* 数组初始化 */
    while (++cnt <= n)
        *p++ = cnt;

    /* 模拟游戏过程 */
    int r = n; /* 未出圈人数 */
    p = a, cnt = 0;
    while (r > 1) {
        /* 跳过已经数过的 */
        while (*p == 0)
            if (++p == a + n) p = a;

        /* 数数 */
        if (++cnt % 3 == 0)
            *p = 0, r--;

        /* 移动指针 */
        if (++p == a + n) p = a;
    }

    /* 输出结果:数组中非0元素即为剩下的编号 */
    p = a;
    while (*p == 0) p++;
    printf("%d\n", *p);
    /*********End**********/
    return 0;
}

解题程序(数组)

#include <stdio.h>
int main(void)
{
    /*********Begin*********/
    /* 用数组模拟来实现 */
    int n;
    scanf("%d", &n);
    int a[n];
    /* 数组初始化 */
    for (int i = 0; i < n; i++)
        a[i] = i + 1;

    /* 模拟游戏过程 */
    int r = n; /* 未出圈人数 */
    int k = 0, cnt = 0;
    while (r > 1) {
        /* 跳过已经数过的 */
        while (a[k] == 0)
            if (++k == n) k = 0;

        /* 数数 */
        if (++cnt % 3 == 0)
            a[k] = 0, r--;

        /* 移动下标 */
        if (++k == n) k = 0;
    }

    /* 输出结果:数组中非0元素即为剩下的编号 */
    for (int i = 0; i < n; i++)
        if (a[i]) {
            printf("%d\n", a[i]);
            break;
        }
    /*********End**********/
    return 0;
}

第4关:strcmp函数

任务描述
题目描述:用一个函数实现两个字符串的比较,即自己写一个strcmp函数

编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
输入两字符串
输出
输出最大的那个字符串
测试说明
样例输入:
abc
abd
样例输出:
abd

解题程序

#include <stdio.h>
int strcmp(char *p1, char *p2){
	/*********Begin*********/
    while (*p1 && *p2 && *p1++ == *p2++);
    return p2 - p1;
	/*********End**********/
}
int main(void)
{
	char a[110], b[110];
	scanf("%s%s", a, b);
	if (strcmp(a, b) > 0)
		printf("%s", a);
	else
		printf("%s", b);

    return 0;
}