牛客网 构造输入输出数据 ACM模式
包含了c++所有的头文件
#include<bits/stlc++.h>
经历第一次笔试之后,发现对于ACM模式的笔试不是很清楚,在输入输出的构造上浪费很多时间,特查阅资料以及自己总结以下各种构造输入要求的方法
while(cin) 说明
int val;
while(cin<<val){
std::cout<<val<<std::endl;
}
运算符返回的是流对象的引用,cin是一个流对象,而**>>运算符返回左边的流对象**,也就是说cin>>val返回cin,于是while(cin>>val)就变成了while(cin),问题就变成了一个流对象在判断语句中的合法性。
输入类型可分为数字、字符串、混合型
数字
(1)输入一个数,对该数字进行一些操作
例如判断是否是素数,立方根等
int val;
while(cin<<val){ // 使用while不容易出错
std::cout<<val<<std::endl;
}
(2) 输入一组数,对该组数字进行操作
~scanf("%lld",&n)
#include<bits/stdc++.h>
using namespace std;
long long n;
long long solve[5];
int main()
{
while(cin>>n)// ~scanf("%lld",&n)
{
for(int i=0; i<5; ++i)
{
cin>>solve[i];//scanf("%lld",&solve[i] );
}
long long sum=0;
for(int i=0; i<5; ++i)
{
if( solve[i]<n )
{
sum+=solve[i];
}
}
printf("%lld\n",sum);
}
return 0;
}
(3) 输入一个数,表示有多少组数
字符串
(1)输入一个字符串,对该字符串进行一些操作
string number;
while(cin<<number){ // 使用while不容易出错
std::cout<<number<<std::endl;
}
字符串知识附加
字符串的操作
// 1. 分割字符串
void substr()等 // 需要自己实现
// 2. 字符串string转int
void atoi()
// 3. int转字符串string
void to_string()
以下按照空格去分割字符串
#include <iostream>
#include <string>
#include <sstream>
#include <iterator>
#include <vector>
#include <algorithm>
using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector; using std::istringstream;
using std::stringstream;
int main(){
string text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
"Sed laoreet sem leo, in posuere orci elementum.";
string space_delimiter = " "; // 分割依据
vector<string> words{};
size_t pos = 0; // 寻找分割点
while ((pos = text.find(space_delimiter)) != string::npos) {
// pos = text.find(space_delimiter) 在text中寻找space_delimiter的第一个出现位置 用pose记录
// string::npos静态成员常量:是对类型为size_t的元素具有最大可能的值。当这个值在字符串成员函数中的长度或者子长度被使用时,该值表示“直到字符串结尾”。作为返回值他通常被用作表明没有匹配。
words.push_back(text.substr(0, pos)); // 保存
text.erase(0, pos + space_delimiter.length()); // 去除 接着分割
}
for (const auto &str : words) {
cout << str << endl;
}
return EXIT_SUCCESS; // return 0
}
(2)输入一个数表示有多少个字符串,再输入每个字符串
int N,T;//定义数量N, 测试数据量T
string temp;//字符串变量
cin>>T;
while(T--){
while(cin>>N){ //输入数量
vector<string> input; //存储所有的字符串
for(int i=0;i<N;i++){
cin>>temp; //输入字符串
input.push_back(temp);//保存
}
}
}
(3) 输入一组字符串,不告知大小
不知道怎么停止
int T; //测试数据组数T
string temp;//字符串变量
cin>>T;
while(T--){
vector<string> input; //存储所有的字符串
while(cin>>temp){ //输入数量
input.push_back(temp);//保存
//...
}
}
使用getline
char str[BUFFER];
while (cin.getline(str, BUFFER)) {
}
string str;
while (getline(cin, str)) {
}