当然,还是先要声明,这篇是转载的。
1、cin>>
用法1:最基本,也是最常用的用法,输入一个数字:
#include <iostream>
using namespace std;
main ()
{
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
}
输入:2[回车]3[回车]
输出:5
用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束
#include <iostream>
using namespace std;
main ()
{
char a[20];
cin>>a;
cout<<a<<endl;
}
输入:jkljkljkl
输出:jkljkljkl
输入:jkljkl jkljkl //遇空格结束
输出:jkljkl
阅读全文…
依然是老师布置的作业。题目为:
Write a backtracking program to find a way through a rectangle maze.
即用回溯法找出一条走出矩形迷宫的路径。
程序写得很粗糙,相当粗糙。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
| #include<iostream>
#include<vector>
#include"time.h"
using namespace std;
int flag=1;//由于迷宫可能有多个解,flag的作用就是用来控制,使输出的解只有一个
/*模拟的迷宫是有h*l个点的矩形,若矩形的某位置可以通行,则用'-'表示,某位置有障碍
,不可通行,用'*'表示,已走过的点用'0'表示
*/
void find_way(vector<vector<char>> &maze,int maze_i,int maze_j)//回溯法
{
maze[maze_i][maze_j]='0';
//若已达到出口,则输出已经被解出来的迷宫,及线路图
if(maze_i==(maze.size()-1)&&maze_j==(maze[0].size()-1)){
flag=0;
cout<<"One solution of this maze is as follow: "<<endl;
for(vector<vector<char>>::size_type i=0;i<maze.size();i++){
for(vector<char>::size_type j=0;j<maze[0].size();j++){
cout<<maze[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
}else{
//如果下一个位置可以前进,则前进一步,然后递归调用fing_way函数
if(maze_i>0&&maze[maze_i-1][maze_j]=='-'&&flag==1){
find_way(maze,maze_i-1,maze_j);
}
if(maze_i<maze.size()-1&&maze[maze_i+1][maze_j]=='-'&&flag==1){
find_way(maze,maze_i+1,maze_j);
}
if(maze_j>0&&maze[maze_i][maze_j-1]=='-'&&flag==1){
find_way(maze,maze_i,maze_j-1);
}
if(maze_j<maze[0].size()-1&&maze[maze_i][maze_j+1]=='-'&&flag==1){
find_way(maze,maze_i,maze_j+1);
}
}
maze[maze_i][maze_j]='-';
}
int main()
{
vector<vector<char>> maze;
vector<char> temp;
int h,l,t=1;
srand((int)time(NULL));
while(t!=0){
cout<<"Input the height of the maze: ";
cin>>h;
cout<<"Input the length of the maze: ";
cin>>l;
//用二维的vector容器模拟一个迷宫,'-'表示可通行,'#'表示有障碍
for(int i=0;i<h;i++){
for(int j=0;j<l;j++){
if((i==0&&j==0)||(i==h-1&&j==l-1)) temp.push_back('-');//保证入口和出口是可通行的
else if(rand()%3){
temp.push_back('-');
}
else {
temp.push_back('#');
}
}
maze.push_back(temp);
temp.clear();
}
cout<<"The maze is as follow:"<<endl;
for(int i=0;i<h;i++){
for(int j=0;j<l;j++){
cout<<maze[i][j]<<" ";
}
cout<<endl;
}
/*迷宫默认的入口位置为左上角,出口位置为右下角
可以通过修改find_way的第二个和第三个参数,来修改入口位置
通过修改find_way的第一个if语句来修改出口位置
*/
cout<<endl;
find_way(maze,0,0);
//此时flag还等于0,证明迷宫无解
if(flag==1) cout<<"Oh my god! No solution in this terrible maze!"<<endl<<endl;
cout<<"Input 0 to quit this program,else to continue simulating."<<endl;
//模拟完一次后,把二维的vector容器清空,flag置1,为下一次模拟做准备
maze.clear();
flag=1;
cin>>t;
}
return 0;
} |
在前一节中我们有几个例子中提到了cin函数出错,以致不再执行读操作(程序8)。而且我们经常会看到程序中会出现cin.clear(),cin.ignore(), cin.fail()等函数。这些函数都是与cin的错误处理有关的。这一节我们来分析一下cin的错误处理机制,并且学习几个重要的函数:cin.fail(), cin.bad(), cin.good(), cin.clear(), cin.ignore()等。
程序执行时有一个标志变量来标志输入的异常状态,其中有三位标志位分别用来标志三种异常信息,他们分别是:failbit,eofbit,badbit。这三个标志位在标志变量中是这样分配的:
____________________________________
| 2 | 1 | 0 |
| failbit | eofbit | badbit |
|___________|__________|___________|
看一下这几个标志位的作用(引用msdn):
badbit, to record a loss of integrity of the stream buffer.
eofbit, to record end-of-file while extracting from a stream.
failbit, to record a failure to extract a valid field from a stream.
In addition, a useful value is goodbit, where no bits are set.
接下来我么看几个ios类的数据定义(引用msdn):
typedef T2 iostate;
static const iostate badbit, eofbit, failbit, goodbit;
这里ios类定义了这四个常量badbit, eofbit, failbit, goodbit,其实这四个标志常量就是取对应标志位的掩码,也即输入的四种异常情况!
以上四个常量对应的取值为:
ios::badbit 001 输入(输出)流出现致命错误,不可挽回
ios::eofbit 010 已经到达文件尾
ios::failbit 100 输入(输出)流出现非致命错误,可挽回
ios::goodbit 000 流状态完全正常, 各异常标志位都为0
我们可以用输出语句来验证这几个常量的值:
cout << ios:: failbit << endl;
cout << ios:: eofbit << endl;
cout << ios:: badbit << endl;
cout << ios:: goodbit << endl;
输出的结果为:
4
2
1
0
【注意】它们不是failbit、badbit、eofbit、goodbit这四个标记位的存贮变量,而是四个标志四种异常状态的常量,其实他们就相当于取对应状态标志位的掩码。如果标志变量为flag,则flag & failbit 就取得fail标志位。
阅读全文…
问题描述
很多初学者都认为cin函数是一个很简单的函数,其实不然!cin函数有很多需要了解的知识(比如:cin的返回值是什么,cin提供了哪些成员函数且分别是什么作用,如cin.clear(), cin.ignore(), cin.fail(), cin.good()等等),如果没有很好的掌握,在使用的时候很可能会出问题却不知其原因!而且很多人也确确实实遇到过不少问题,以下是几个简单的例子:
程序1:
#include <iostream>
using namespace std;
int main()
{
int m, n;
cin>>m;
cin>>n;
return 0;
}
测试情况:
如果用户每次都输入两个合法的数,程序不会出问题!
但是如果用户第一次输入时给一个非法的输入,比如说输入一个字符’a',你会发现程序不
会再执行第二条输入语句。似乎有点奇怪!!
程序2:
#include <iostream>
using namespace std;
int main()
{
char str[8];
cin.getline(str, 5);
cout<<str<<endl;
cin.getline(str, 5);
cout<<str<<endl;
return 0;
}
程序的功能很简单,就是输入一个字符串再输出,再次输入一个字符串输出。程序执行情况:
测试一:
abcd (回车)
abcd (输出)
efgh (回车)
efgh (输出)
当用户第一次输入的字符串字符数小于4时,程序执行正常!
测试二:
abcdefgh (回车)
abcd (输出)
(输出-换行)
当用户第一次输入的字符数字符数大于4时,第一个字符串接受输入的前四个字符,而第二次的输入操作没有执行,第二个字符串输出为空。似乎也很奇怪!!!
其实在很多时候都会遇到诸如此类的问题,如果不熟悉程序输入的原理和cin等一些函数的原理就不知道怎么解决!我在这里做一个简单的介绍,也许介绍得不是很准确和全面,或者存在一些误解,请大家包涵!
阅读全文…
近期评论