输入
- 建议用while(cin)的形式
几乎所有的输入都是数字或者字符串,根据数字和字符串可以将输入分为几种情况:
1.先说数字(通常给定一组数,或者给定给一个数组)
(1)直接输入一个数,对该数字进行一些操作,例如判断是否是素数,立方根等,这种类型只需要输入一个数即可,可用以下几种输入:
int N;//定义一个输入变量用于接收系统输入的数字
cin >> N;//方式一,直接输入,再执行相应操作
while (cin >> N) {
//方式二,将输入放在while后面,这种方式推荐大家用,因为C++的输入是流的方式,因此用while来判断接收是比较常用的方法,不容易出错(一些情况下只能用这种输入,所以推荐用这种,包括后面的字符串)
}
(2)给定一个数,表示有多少组数(可能是字符和数字的组合)
/*举个例子,输入一个数N表示学生人数,然后输入每个学生的姓名和学号,要求按学号降序打印每个学生的信息,例子如下:
输入:
3
liming,1410
zhangsan,1562
lisi,1355
输出:
zhangsan,1562
liming,1410
lisi,1355*/
//对于上例,输入一般采用以下的方法:
int N;//学生总数
while (cin >> N) { //while里面输入总数,然后在该循环里面处理
for (int i=0; i<N; i++){ //用for循环输入N组数据
cin >> stu[i].name >> stu[i].num;//输入姓名和学号
}
}
//也可以不用while循环(不推荐,除非用while不好处理或者处理不了)
int N;
cin >> N;
for (int i=0; i<N; i++){ //用for循环输入N组数据
cin >> stu[i].name >> stu[i].num;//输入姓名和学号
}
//这种方式看似很直观易懂,但这种方式对于系统里的测试用例来说可能不太友好,一般C++的输入都强调流的概念,这种方式只能某些情况下可以使用,大家可以自己多刷一刷,就会发现这种方式经常会遇到莫名其妙的错误
3)可能直接就是要求输入一组数,并不告知具体的数量,以(2)的例子为例,如果不告诉你多少个学生,你就无法根据学生数量用for循环输入了,这时候用while循环就可以很好地处理(流的处理模式)
string name;//定义姓名变量
int num;//定义学号变量
while(cin >> name >> num) {//输入一组,处理一组
student s = {name,num};
Input.push_back(s);//用一个结构体数组来接收输入的学生信息即可
//....
}
2. 再说字符(串)(很常见)
(1)给定字符(串),进行相关地处理
//给定字符
char ch;
cin >> ch;//方式一
while (cin.get(ch))//方式二
//给定字符串
string input;
getline(cin,input);//方式一
cin >> input;//方式二
while(方式一/方式二) //方式三
//还是推荐用方式三的输入方式,不容易出错,字符串的一些题目用方式一和方式二可能会出错(由于输入格式的问题)
(2)给定不止一组字符串,告知大小
//举个例子,先输入一个数表示有多少个字符串,再输入每个字符串,根据字符串长度排序
int N;//定义数量
string temp;//字符串变量
while (cin >> N){ //输入数量
vector<string> input; //存储所有的字符串
for(int i=0; i<N; i++){
cin >> temp; //输入字符串
input.push_back(temp);//保存
}
}
//下面是另一种不安全的写法
int N;//定义数量
cin>>N;//输入数量
string temp;//字符串变量
vector<string> input; //存储所有的字符串
for(int i=0; i<N; i++){
cin >> temp; //输入字符串
input.push_back(temp);//保存
}
//以该例题为例,可能在本地IDE能得到正确答案,但如果是牛客网系统,由于输入格式的问题,这样写编译会通过,就是得不到正确答案
(3)输入一组字符串,不告知大小,仍然以上个例子举例,不告诉你有多少字符串,这样就不能根据数量来用for循环做了,但可以用while循环处理
string temp;//字符串变量
vector<string> input; //存储所有的字符串
while(cin >> temp){ //输入数量
input.push_back(temp);//保存
//...
}
输出
C++的输出cout与输入cin一样都是用流来控制的,cin和cout都在iostream这个头文件中,命名空间为std,因此使用的时候都要加上头文件和命名空间。输出相对来说简单一些,不会出现输入的一些问题,相反,cout输出有时候还可以帮助你解决题目,一下列举一些常见输出语句
//输入一个数字再输出
int num;//定义
cin >> num;//输入
cout << num << endl;//输出并且换行
//输入一个字符串再输出
string input;//定义
cin >> input;//输入
cout << input<< endl;//输出并且换行
//输入输出多个数据
int num1,num2;
string s1,s2;
cin >> num1 >> s1;
cin >> num2 >> s2;
cout << num1 << s1 << ' ' << num2 << s2 << endl;
链表处理
定义链表对应的结构体
struct ListNode
{
int value;
ListNode *next;
//构造函数
ListNode(int valuel, ListNode *nextl = nullptr)
{
value = value1;
next = next1;
}
};
//可以用以下两种方法创建链表节点
ListNode *secondPtr = new ListNode(13.5);
ListNode *head = new ListNode(12.5, secondPtr);
//等价于以下两句
ListNode *head = new ListNode(13.5);
head = new ListNode(12.5, head);
删除链表,注意内存释放
//先构造一个临时节点,用来记录下一个位置,再依次删除链表节点,最后删除该临时节点
void releaseNode(ListNode* node)
{
//创建临时节点
ListNode* temp = NULL;
if(node == NULL)
{
cout << "链表节点内存为空
";
}
else
{
while(node != NULL)
{
temp = node;
node = node ->next;
delete temp;
cout << "节点内存清除成功
";
}
}
}