网站LOGO
公爵书房 | 技术分享
页面加载中
2月24日
网站LOGO 公爵书房 | 技术分享
以指键之轻,承载知识之重
菜单
  • 公爵书房 | 技术分享
    以指键之轻,承载知识之重
    用户的头像
    首次访问
    上次留言
    累计留言
    我的等级
    我的角色
    打赏二维码
    打赏博主
    数据输入的处理
    点击复制本页信息
    微信扫一扫
    文章二维码
    文章图片 文章标题
    创建时间
  • 一 言
    确认删除此评论么? 确认
  • 本弹窗介绍内容来自,本网站不对其中内容负责。

    数据输入的处理

    公爵 · 原创 ·
    笔记 · C语言数据
    共 6306 字 · 约 6 分钟 · 133
    本文最后更新于2023年09月02日,已经过了175天没有更新,若内容或图片失效,请留言反馈

    C 语言版

    简单的输入一组数据

    【Example Subject】

    c 代码:
    Description
    计算 a+b
    
    Input
    两个整数 a,b
    
    Output
    a+b的值
    
    Sample Input
    1 2
    
    Sample Output
    3

    这种简单输入,接受一组输入,针对这种输入计算出值即可。

    【Method】

    c 代码:
    #include <stdio.h>
    int main()
    {
        int a,b;
        scanf("%d %d",&a, &b);
        printf("%d\n",a+b);
        return 0;
    }

    一次运行输入多组数据直到读至 EOF

    一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止

    【Example Subject】

    c 代码:
    Description
    计算 a + b
    
    Input
    多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,
    每组输入单独占一行 
    
    Output
    每组的两个整数(a和b)求和并输出,每组的求和结果独占一行
    
    Sample Input
    1 5
    10 20
    400 516
    
    Sample Output
    6
    30
    916

    这种输入包含多对输入数据,需要构造一个循环读取。因为没有指出到底有多少对输入,要有办法判断输入何时结束。解决办法是:

    【Method】

    c 代码:
    #include <stdio.h>
    int main() 
    {
        int a,b;
        while(scanf("%d %d",&a, &b) != EOF) 
        {// 输入结束时,scanf函数返回值为EOF(-1),即没有数据输入时会退出while循环
            printf("%d\n",a+b);
        }
        return 0; 
    }

    注 1:scanf 函数返回值就是读出的变量个数,如果一个都没有,则返回值是 -1。EOF是一个预定义的常量,等于 -1。

    注 2:在调试程序时,键盘输入的数据,用 CTRL-Z(即按住 CTRL 键不放,再按下 Z)组合作为输入结束,此谓键盘输入设备的“文件末尾”。

    一次运行输入多组数据由 N 决定

    一次运行,要输入多组数据,组数由第一个输入数据决定(在开始的时候输入一个 N,接下来是 N 组数据)

    【Example Subject】

    c 代码:
    Description
    计算 a + b
    
    Input
    第一行是数据的组数N,从第二行是N组由两个整数(a和b)构成的输入,a和b之间用空格隔开,
    每组输入单独占一行 
    
    Output
    每组的两个整数(a和b)求和并输出,每组的求和结果独占一行
    
    Sample Input
    2
    1 5
    10 20
    
    Sample Output
    6
    30

    需要先读入第一行确定组数 N,而后写一次执行 N 次的循环进行处理即可。解决办法是:

    【Method】

    c 代码:
    #include<stdio.h>
    int main()
    {
        int n,i;
        int a,b;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",a+b);
        }
        return 0;
    }

    输入多组数据以特殊输入为结束标志

    输入不说明有多少组数据,但以某个特殊输入为结束标志。平时做题中常见诸如“输入学生成绩,以 -1 结束”,没有学生得 -1 分的,这个结束数据可以要得。

    【Example Subject】

    c 代码:
    Description
    计算 a + b
    
    Input
    多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行。
    当输入为 0 0 时,输入结束。
    
    Output
    每组的两个整数(a和b)求和并输出,每组的求和结果独占一行。
    
    Sample Input
    1 5
    10 20
    0 0
    
    Sample Output
    6
    30

    构造循环对数据进行处理,将是否遇到了要求结束的输入,作为循环是否结束的依据。解决办法是:

    【Method】

    c 代码:
    #include <stdio.h>
    int main()
    {
        int a,b;
        while(scanf("%d %d",&a, &b) &&(ab))
        {
            printf("%d\n",a+b);
        }
        return 0;
    }

    利用文件重定向提高调试效率

    编程得到正确结果前,往往需要多次运行程序,每次运行都需要花费不少的时间从键盘输入数据。每次输入的数据都是相同的时,会给人的心理带来不爽的感觉,并造成时间上的浪费。无论平时练习还是 ACM 竞赛实战,这些都是可以避免的。方法是,运用重定向。

    用下面的形式调用函数 freopen() 会将标准输入 stdin 重定向到文件 input.txt(这个名字可以自己定义)。

    c 代码:
    //设置输入和输出文件
    freopen("input.txt","r",stdin);    

    重定向后,原先从键盘(标准输入的默认设备)接受的输入,将统统从文件读取 input.txt 读取,这就是重定向。程序可以写作:

    c 代码:
    #include<stdio.h>
    int main()
    {
        //只加这一句输入将被重定向到文件input.txt
        freopen("input.txt","r",stdin);  
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d\n",a+b);
        return 0;
    }

    于是,在运行程序前,将本该由键盘输入的数据,写到文件 input.txt 中。而在运行程序时,数据将不再需要人去输入。那个快,很享受。

    需要注意的是,调试通过的程序,千万不要直接提交到 OJ 平台上去。如果竞赛中这样做了,罚你的 20 分钟不要算到我的头上。提交的程序要把输入重定向的一行删除,这样才算是符合要求的,可以获得 AC 的程序。

    除了删除那一行,还有一种简单的做法是,提交前将这一行前加上注释符"//",效果是一样的。

    c 代码:
    #include<stdio.h>
    int main()
    {
        //freopen("input.txt","r",stdin);  //只加这一句输入将被重定向到文件input.txt
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d\n",a+b);
        return 0;
    }

    C++ 版

    简单的输入一组数据

    【Example Subject】

    c 代码:
    Description
    计算 a+b
    
    Input
    两个整数 a,b
    
    Output
    a+b的值
    
    Sample Input
    1 2
    
    Sample Output
    3

    这种简单输入,接受一组输入,针对这种输入计算出值即可。

    【Method】

    c 代码:
    #include <iostream>
    using namespace std;
    int  main()
    {
        int a,b;
        //cin以空格或者回车作为输入输出分隔符
        cin >> a >> b;
        cout << a+b << endl;   
        return 0;
    }

    一次运行输入多组数据直到读至 EOF

    一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止

    【Example Subject】

    c 代码:
    Description
    计算 a + b
    
    Input
    多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,
    每组输入单独占一行 
    
    Output
    每组的两个整数(a和b)求和并输出,每组的求和结果独占一行
    
    Sample Input
    1 5
    10 20
    400 516
    
    Sample Output
    6
    30
    916

    这种输入包含多对输入数据,需要构造一个循环读取。因为没有指出到底有多少对输入,要有办法判断输入何时结束。解决办法是:

    【Method】

    c 代码:
    #include <iostream> 
    using namespace std;
    int main()
    {
        int a,b;
        while(cin >> a >> b)
        {
            cout << a+b << endl;
        }
        return 0;
    } 

    注 1:当读到输入结束时,cin >> a >> b 返回 0,循环也结束。

    注 2:在调试程序时,键盘输入的数据,用 CTRL-Z(即按住 CTRL 键不放,再按下 Z)组合作为输入结束,此谓键盘输入设备的“文件末尾”。

    一次运行输入多组数据由 N 决定

    一次运行,要输入多组数据,组数由第一个输入数据决定(在开始的时候输入一个 N,接下来是 N 组数据)

    【Example Subject】

    c 代码:
    Description
    计算 a + b
    
    Input
    第一行是数据的组数N,从第二行是N组由两个整数(a和b)构成的输入,a和b之间用空格隔开,
    每组输入单独占一行 
    
    Output
    每组的两个整数(a和b)求和并输出,每组的求和结果独占一行
    
    Sample Input
    2
    1 5
    10 20
    
    Sample Output
    6
    30

    需要先读入第一行确定组数 N,而后写一次执行 N 次的循环进行处理即可。解决办法是:

    【Method】

    c 代码:
    #include <iostream>
    using namespace std;
    int main() {
        int a, b, n;
        cin >> n;
        for(i=0;i<n;i++)
        {
            cin >> a >> b;
            cout << a + b << endl;
        }
        return 0;
    }

    输入多组数据以特殊输入为结束标志

    输入不说明有多少组数据,但以某个特殊输入为结束标志。平时做题中常见诸如“输入学生成绩,以 -1 结束”,没有学生得 -1 分的,这个结束数据可以要得。

    【Example Subject】

    c 代码:
    Description
    计算 a + b
    
    Input
    多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行。
    当输入为 0 0 时,输入结束。
    
    Output
    每组的两个整数(a和b)求和并输出,每组的求和结果独占一行。
    
    Sample Input
    1 5
    10 20
    0 0
    
    Sample Output
    6
    30

    构造循环对数据进行处理,将是否遇到了要求结束的输入,作为循环是否结束的依据。解决办法是:

    【Method】

    c 代码:
    #include<iostream>
    using namespace std;
    int main()
    {
        int a ,b;
        while(cin>>a>>b&&(ab))
        {
            cout<<a+b<<endl;
        }
        return 0;
    }

    利用文件重定向提高调试效率

    编程得到正确结果前,往往需要多次运行程序,每次运行都需要花费不少的时间从键盘输入数据。每次输入的数据都是相同的时,会给人的心理带来不爽的感觉,并造成时间上的浪费。无论平时练习还是 ACM 竞赛实战,这些都是可以避免的。方法是,运用重定向。

    用下面的形式调用函数 freopen() 会将标准输入 stdin 重定向到文件 input.txt(这个名字可以自己定义)。

    c 代码:
    //设置输入和输出文件
    freopen("input.txt","r",stdin);    

    重定向后,原先从键盘(标准输入的默认设备)接受的输入,将统统从文件读取 input.txt 读取,这就是重定向。程序可以写作:

    c 代码:
    #include<iostream>
    #include<cstdio>
    using namespace std;
    int main()
    {
        freopen("input.txt","r",stdin);  //只加这一句输入将被重定向到文件input.txt
        int a,b;
        cin>>a>>b;
        cout<<a+b<<endl;
        return 0;
    }

    于是,在运行程序前,将本该由键盘输入的数据,写到文件 input.txt 中。而在运行程序时,数据将不再需要人去输入。那个快,很享受。

    需要注意的是,调试通过的程序,千万不要直接提交到 OJ 平台上去。如果竞赛中这样做了,罚你的 20 分钟不要算到我的头上。提交的程序要把输入重定向的一行删除,这样才算是符合要求的,可以获得 AC 的程序。

    除了删除那一行,还有一种简单的做法是,提交前将这一行前加上注释符"//",效果是一样的。

    c 代码:
    #include<iostream>
    #include<cstdio>
    using namespace std;
    int main()
    {
        //freopen("input.txt","r",stdin);  //只加这一句输入将被重定向到文件input.txt
        int a,b;
        cin>>a>>b;
        cout<<a+b<<endl;
        return 0;
    }
    声明:本文由 公爵(博主)原创,依据 CC-BY-NC-SA 4.0 许可协议 授权,转载请注明出处。

    还没有人喜爱这篇文章呢

    发一条! 发一条!
    博客logo 公爵书房 | 技术分享 以指键之轻,承载知识之重 51统计 百度统计
    MOEICP 萌ICP备20226257号 ICP 赣ICP备2022001242号-1 ICP 闽公网安备35020502000606号 又拍云 本站由又拍云提供CDN加速/云存储服务

    🕛

    本站已运行 2 年 35 天 21 小时 6 分

    🌳

    自豪地使用 Typecho 建站,并搭配 MyLife 主题
    公爵书房 | 技术分享. © 2022 ~ 2024.
    网站logo

    公爵书房 | 技术分享 以指键之轻,承载知识之重
     
     
     
     
    壁纸