编辑与调试 顺序结构 选择结构一 选择结构二 循环一 循环二 函数
递归与嵌套函数 一维数组和二维数组 字符数组 指针一 指针二 结构体 文件
指针一
第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;
}
编辑与调试 顺序结构 选择结构一 选择结构二 循环一 循环二 函数
递归与嵌套函数 一维数组和二维数组 字符数组 指针一 指针二 结构体 文件