【C/C++】使用一个 scanf 输入多组数据并求出最大数

【C/C++】使用一个 scanf 输入多组数据并求出最大数

收到一个任务,要求在一行内输入多组数据(且不知道具体几组,也不知道一组有多少数字)。输入完毕后程序对用空格分隔的多组数据扫描检测,直到遇到负数停止检测。随后程序将监测到的所有数字进行整理,并从中选出最大数输出。

图片[1]-【C/C++】使用一个 scanf 输入多组数据并求出最大数-梦闯の天下

力大砖飞,对输入的内容进行遍历检索,遇到数字开始记录,直到遇到非数字停止。随后将其与已知最大值进行比较,若更大则覆写存储当前最大值,若比当前已知最大值小则略过。同时在开始遍历前加上检测机制,防止用户输入一些乱七八糟的数据影响程序正常运行。

20240507174949414-详细教学@1x

定义并初始化一个 char 数组,同时定义一个可存储两个数的数组(用于存放当前扫描值和已知最大值)。使用 scanf 要求用户输入内容存储到 char 中。

#include "stdio.h"

int main() {
    char arr[1000000];
    long long int Num[2] = {0};
    scanf("%[^\n]", arr);   //请君输入

定义并初始化两个 long long int 类型变量,以实现限制大循环遍历次数以及记录当前遍历的数组位置。

    long long int i = 0, j = 0;

开始进行循环遍历检测,外侧的大循环提供检测遍历多组整数的功能,内侧的 while 循环用于将检测到的数字逐个从 char 类型转换、记录到 long long int 类型中。while 循环下的 if 将现有最大值 Num[0] 与当前遍历记录的恶数 Num[1] 进行比较,若更大则覆写,反之则不执行。随后若检测到当前数组位置是空格符,则跳过当前数组位置。

    for (i = 0; i < 100000; i++) { //游于数组。
        Num[1] = 0;
        if (arr[j] == '\0') { // 若字串终,遂止循矣。
            break;
        }
        
        if (arr[j] == '-' || arr[j] == '0') {    //魑魅魍魉,闻风而至者止。
            break;
        }   else if (arr[j] <= '0' || arr[j] > '9') {
            while (arr[j] <= '0' || arr[j] > '9') {   //偏僻善柔佞损者,具过矣。
                j++;
            }
        }
//        主循环始
        while (arr[j] >= '0' && arr[j] <= '9') {    //以数为址时
            Num[1] = (long long int)(Num[1] * 10 + (arr[j] - '0')); //转数以浮
            j++;
        }
        if (Num[1] > Num[0]) {  //与前相较
            Num[0] = Num[1];    //大则取之,小则弃之。
        }
        if (arr[j] == ' ' || arr[j] == '-') { // 非数哉,过矣
            j++;
        }
        if (arr[j] == '-') { // 若以负为始,止而走也
            break;
        }
    }

while 上面添加检测机制:若检测到数组已经到达最后一位,但仍未出现负号,则立即停止循环,保护程序。随后,利用 if 检测用户是否有在空格后面输入 0 或负号,若存在则立即停止;再 else if 检测用户输入的是否是数字,若不是数字则循环 j++ 甩掉非数字部分,直到遇到下一个符合要求的数字,进入 while 循环。

最后输出结果,结束程序。

    printf("%lld", Num[0]);
    
    return 0;
}

完整代码如下:

#include "stdio.h"

int main() {
    char arr[1000000];
    long long int Num[2] = {0};
    scanf("%[^\n]", arr);   //请君输入
    long long int i = 0, j = 0;
    for (i = 0; i < 100000; i++) { //游于数组。
        Num[1] = 0;
        if (arr[j] == '\0') { // 若字串终,遂止循矣。
            break;
        }
        
        if (arr[j] == '-' || arr[j] == '0') {    //魑魅魍魉,闻风而至者止。
            break;
        }   else if (arr[j] <= '0' || arr[j] > '9') {
            while (arr[j] <= '0' || arr[j] > '9') {   //偏僻善柔佞损者,具过矣。
                j++;
            }
        }
//        主循环始
        while (arr[j] >= '0' && arr[j] <= '9') {    //以数为址时
            Num[1] = (long long int)(Num[1] * 10 + (arr[j] - '0')); //转数以浮
            j++;
        }
        if (Num[1] > Num[0]) {  //与前相较
            Num[0] = Num[1];    //大则取之,小则弃之。
        }
        if (arr[j] == ' ' || arr[j] == '-') { // 非数哉,过矣
            j++;
        }
        if (arr[j] == '-') { // 若以负为始,止而走也
            break;
        }
    }
    printf("%lld", Num[0]);
    
    return 0;
}
    © 版权声明
    THE END
    分享和支持
    点赞12 分享
    评论 抢沙发
    头像
    留下评论,见证当下。
    提交
    头像

    昵称

    取消
    昵称表情代码快捷回复

      请登录后查看评论内容