思考题(1):位数输出
计算一个输入整数的十进制表示的位数?
条件 1:允许有多余输出的情况下,怎么实现?
条件 2:只允许输出数字位数的时候,又该怎么实现?
请单纯考虑使用 printf 一族函数方法实现。
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
printf(" has %d digits
", printf("%d", n)); // 有多余输出
char output[50];
int ret = sprintf(output, "%d", n);
printf("%d
", ret); // 无多余输出
return 0;
}
思考题(2):读入一行字符串
请大家自行实现一个读入一行字符串,并且输出相关内容的程序,思考如下:
条件 1:如果字符串中没有空格,怎么实现?
条件 2:如果字符串中有空格,又该怎么实现?
请单纯考虑用 scanf 一族函数方法实现。
#include <stdio.h>
char str[100];
int main() {
scanf("%[^
]s", str);
printf("%s
", str);
return 0;
}
思考题:打印乘法表
使用循环和条件判断,打印一个格式优美的 66 乘法表
要求 1:输出内容及样式参照下面给出的样例
要求 2:每两列之间用 字符进行分隔,行尾无多余 字符
#include <stdio.h>
int main() {
for (int i = 1; i <= 6; i++) {
for (int j = 1; j <= i; j++) {
j == 1 || printf(" ");
printf("%d * %d = %d", j, i, i * j);
}
printf("
");
}
return 0;
}
思考题:设计迷你随机函数
设计一个循环过程,循环 100 次,以不太明显的规律输出 1~100 中的每个数字。
要求 1:规律尽量不明显。
要求 2:只能使用循环和最基本的运算,不允许超前使用数组。
#include <stdio.h>
int main() {
int n = 5;
for (int i = 1; i <= 100; i++) {
printf("%2d ", n);
if (i % 10 == 0) printf("
");
n = (n * 3) % 101;
}
return 0;
}
思考题:去掉倍数
设计一个去掉倍数的程序,要求如下:
首先读入两个数字 n 和 m,n 的大小不会超过 10,m 的大小都不会超过 10000;
接下来读入 n 个各不相同的正整数,输出 1 到 m 中,有哪些数字无法被这 n 个正整数中任意的一个整除。
#include <stdio.h>
int check[1005] = {0};
int main() {
int n, m, num;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d", &num);
for (int j = num; j <= m; j += num) {
check[j] = 1;
}
}
for (int i = 1; i <= m; i++) {
if (check[i] == 1) continue;
printf("%d ", i);
}
return 0;
}
思考题(1):体验利器
刚刚在上面,介绍了 sprintf 和 sscanf 两个字符串处理的利器工具,那么就请使用 sprintf 函数实现 strlen、strcpy、strcat 函数的功能,注意哦,只允许使用 sprintf 函数,模仿如上三个函数的功能。
#include <stdio.h>
char str1[1000], str2[1000];
int main() {
scanf("%s%s", str1, str2);
printf("str1 = %s str2 = %s
", str1, str2);
sprintf(str1, "%s", str1); // strlen(str1)
sprintf(str1, "%s", str2); // strcpy(str1, str2)
printf("str1 = %s str2 = %s
", str1, str2);
sprintf(str1, "%s%s", str1, str2); // strcat(str1, str2)
printf("str1 = %s str2 = %s
", str1, str2);
return 0;
}
思考题(2):优美的遍历技巧
介绍完了字符串的相关知识以后,请思考如下问题,如何在不计算字符串长度的情况下,遍历字符串的每一位呢?
程序设计要求是,读入一个字符串,然后在不计算字符串长度的情况下,输出字符串中的每一个字符,每个字符占一行。其中所谓计算字符串长度的方法,包括但不限于 strlen,sprintf,先行 for 循环遍历统计等。
#include <stdio.h>
int main() {
char str[1000];
scanf("%s", str);
for (int i = 0; str[i]; i++) {
printf("%c
", str[i]);
}
return 0;
}