第一次闭环输出前面几节的demo

思考题(1):位数输出

计算一个输入整数的十进制表示的位数?
条件 1:允许有多余输出的情况下,怎么实现?
条件 2:只允许输出数字位数的时候,又该怎么实现?
请单纯考虑使用 printf 一族函数方法实现。

#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    printf(" has %d digits\n", printf("%d", n)); // 有多余输出
    char output[50];
    int ret = sprintf(output, "%d", n);
    printf("%d\n", ret); // 无多余输出
    return 0;
}

思考题(2):读入一行字符串

请大家自行实现一个读入一行字符串,并且输出相关内容的程序,思考如下:
条件 1:如果字符串中没有空格,怎么实现?
条件 2:如果字符串中有空格,又该怎么实现?
请单纯考虑用 scanf 一族函数方法实现。

#include <stdio.h>
char str[100];
int main() {
    scanf("%[^\n]s", str);
    printf("%s\n", str);
    return 0;
}

思考题:打印乘法表

使用循环和条件判断,打印一个格式优美的 66 乘法表
要求 1:输出内容及样式参照下面给出的样例
要求 2:每两列之间用 \t 字符进行分隔,行尾无多余 \t 字符

#include <stdio.h>
int main() {
    for (int i = 1; i <= 6; i++) {
        for (int j = 1; j <= i; j++) {
            j == 1 || printf("\t");          
            printf("%d * %d = %d", j, i, i * j);
        }
        printf("\n");
    }
    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 = (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\tstr2 = %s\n", str1, str2);
    sprintf(str1, "%s", str1);   // strlen(str1)
    sprintf(str1, "%s", str2);   // strcpy(str1, str2)
    printf("str1 = %s\tstr2 = %s\n", str1, str2);
    sprintf(str1, "%s%s", str1, str2);   // strcat(str1, str2)
    printf("str1 = %s\tstr2 = %s\n", 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\n", str[i]);
    }
    return 0;
}
posted @ 2020-03-29 22:43  insist钢  阅读(236)  评论(0编辑  收藏  举报