【C++】笔试常见ACM模式下的输入输出

1 本地测试(文件重定向)

由于笔试oj平台测试的时候的输入都是以文件形式输入,因此如果我们无法以传统方式交互式方式输入。

因此可以文件重定向的方式。通过将输入内容写入文件,再让程序从文件中读取数据,模拟 OJ 的批量输入。此方法适用于多组测试用例、复杂输入格式的场景。

准备好一个包含输入的文件,

将需要测试的c++文件编译成可运行文件。

其中yourprogram.cpp替换成你需要测试的c++源文件;yourprogram.exe为编译后的名字,这个名字可以自定义

 g++ yourprogarm.cpp -o yourprogarm.exe

运行编译后的文件,使用管道将input.txt的内容作为程序的输入

Get-Content input.txt | .\yourprogram.exe

此时,input.txt里面的内容将会像手动输入的一样,被程序读取。

2.  常见输入读取

2.1 循环输入

任意个样例作为输入。每个样例的格式固定。

如以下输入,每个样例为一行,每一个样例包含两个数字:

1 11
2 22
3 33
4 44

使用循环输入来读取:

void fun2(){
    int i;
    while(cin>>i){
        int j;
        cin>>j;
        cout<<"每个样例的输入为"<<i<<" "<<j<<endl;
    }
}

输出为:

2.2 第一行输入为任意个,第二行输入为固定个

输入为:

1 2 3 4 5 6
88 77

由于第二行是固定个输入,因此可以使用循环读取的方式先把所有输入读入一个数组。最后再取出数组后k位作为第二行输入。

//第一行输入任意个个数字,第二行输入固定为2个
void fun_dynamic_cin(){
    vector<int> book;
    int tmp;
    while(cin>>tmp){
        book.push_back(tmp);
    }
    //第一行
    for(int i=0;i<book.size()-2;i++){
        cout<<book[i]<<" ";
    }
    cout<<endl;
    //第二行
    for(int i=book.size()-2;i<book.size();i++){
        cout<<book[i]<<" ";
    }
}

工作台输出:

2.3 输入两行,每一行都为任意个

输入为:

1 2 3 4 5 6
1 3 5 7 9 11 13

由于输入的几行都是不固定个数的数字,因此需要使用getline来读取整一行的字符串,然后对字符串进行切分,获得数字数据。

#include <sstream>
void fun_two_raw_cin(){
    string s;
    int num;
    
    //读取第一行内容
    getline(cin,s);
    stringstream ss(s); // 用字符串流分割数字
    vector<int> nums;
    while (ss >> num) {    // 逐个解析数字
        nums.push_back(num);
    }
    for(int i=0;i<nums.size();i++){
        cout<<nums[i]<<" ";
    }
    cout<<endl;
    
    //读取第二行的内容
    getline(cin,s);
    stringstream ss2(s); // 用字符串流分割数字
    vector<int> nums2;
    while (ss2 >> num) {    // 逐个解析数字
        nums2.push_back(num);
    }
    for(int i=0;i<nums2.size();i++){
        cout<<nums2[i]<<" ";
    }
}

输出为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值