分支语句和逻辑运算符
if语句
//统计字符串中的字符个数,以及空白
int main()
{
char ch;
int count = 0;
int space = 0;
cout << "Enter characters;Enter # to quit" << endl;
cin.get(ch); //先读一个 防止第一个就为#
while (ch != '#')
{
if (ch == ' ')
space++;
count++;
cin.get(ch);
}
cout << "\n";
cout << count << " character read" << endl; //字符总数中包含回车生成的换行符
cout << space << " space read" << endl;
}
逻辑表达式
- or ||
- and &&
- not !将后面表达式的真值取反
x>5&&x<10 等价于 (x>5)&&(x<10)
注意: - !优先级高于所有的关系运算符和算术运算符。因此要对表达式取反,必须用括号将其括起来
!(x>5),若x>5 ,则!(x>5)的值为false
!x>5 , 永远为false,因为!x 为0或1,永远小于5. - and (&&)优先级高于||
age>50&&age<50 ||weight>20 等价于( age>50&&age<50 )||weight>20 - C++确保程序从左向右进行计算逻辑表达式,并在知道答案后立即停止
x!=0 &&1.0/x>1000.0 若x!=0 为false,则不判断后面的,表达式的值为0.
也可以用下面的方法表达
字符函数库cctype
C++从c语言继承了一个与字符相关的,非常方便的函数软件包,可以简化诸如确定字符是否为大写字符,是否有数字,标点等工作。头文件cctype。
?:运算符
c++中唯一需要3个操作数的运算符。
switch语句
将枚举量用作标签
int main()
{
enum Color {red,yello,blue,purse};
cout << "Enter code (0-4)\n" << endl;
int code;
cin >> code;
while (code >= red && code <= purse)
{
switch (code)
{
case red: cout << "red" << endl; break;
case yello: cout << "yello" << endl; break;
case blue: cout << "blue" << endl; break;
case purse: cout << "purse" << endl; break;
}
cin >> code;
}
}
switch 和if
switch语句中每个标签必须是一个单独的值,另外这个值必须是整数,包括char。switch无法处理浮点型的测试。若选项长度超过两个,就代码长度和执行速度而言,switch会合适点。
break continue goto
int main()
{
int a = 10;
if (a > 5)
goto Par;
Par:cout << "this is goto" << endl;
}
读取数字的循环
使用cin输入表达式的值来检测输入是不是数字,程序发现 输入错误的内容后,应该采取的以下步骤:重置cin以接受新的输入,删除错误输入,提示用户重新输入。(必须重置cin后才能删除错误的输入)
int main()
{
const int Max = 5;
int golf[Max];
cout << "Please Enter your golf scores \n";
cout << "you must enter " << Max << endl;
for (int i = 0; i < Max; i++)
{
cout << "round # " << i + 1 << ": ";
while (!(cin>>golf[i]))
{
cin.clear(); //重置输入
while (cin.get()!='\n')
{
continue; //去除错误的输入
}
cout << "Please input a int : " ;
}
}
cout << "Done\n";
}
简单文件输入输出(文本文件)
C++将读取键盘输入和在屏幕上显示输出的技巧用于文件的输入输出(文本IO)
文本IO和文本文件
文本IO:使用cin进行输入时,程序将输入视为一系列字节,其中每个字节都被解释为字符编码。不管目标数据类型是什么,输入一开始就是字符数据——文本数据。然后cin对象负责将文本转换为其它类型
输入行: 38.5 19.2
- char ch ; cin>>ch;
输入行中的第一个字符被赋值给ch,此处是3.其字符编码(二进制)被存储在变量ch中。输入和目标变量都是char,不必转换。下一输入操作将对8进行处理。 - int n; cin>>n;
这种情况下,cin将不断读取,直到遇到非数字字符,即. 。句点将成为输入队列下一个字符。cin通过计算发现,这两个字符对应的数值为38,因此将38的二进制编码复制到变量n中。 - double n; cin>>n;
cin将不断读取,直到遇到第一个不属于浮点数的字符,即cin读取38.5 ,空格成为输入队列下一个字符。cin通过计算发现,这两个字符对应的数值为38.5,因此将38的二进制编码复制到变量n中。 - char word[50]; cin>>word;
cin将不断读取,直到遇到空白字符,即cin读取38.5 ,空格成为输入队列下一个字符。cin将3 8 . 5 这四个字符的字符编码存储到数组word中,并在末尾加一个空字符。 - char word[50]; cin.getline(word,50);
cin将不断读取,直到遇到换行字符,所有字符都被存储在数组word中,并在末尾加一个空字符,换行符被丢掉。输入队列中的下一个字符是下一行字符中的第一个字符。
对于输出,将执行相反的操作,整数转为数字字符序列,浮点数转为数字字符序列和其它字符组成的字符序列,字符数据不做任何转换。
注意:输入一开始为文本,因此控制台输入的文件版本是文本文件,即每个字节存储一个字符编码的文本文件。
写文本文件
cout:
- 头文件 iostream , 其内部定义了一个用于处理输出的ostream类,声明了一个cout的ofstream对象
- 指定名称空间std。 cout和<< 显示各类数据。
文件输出与cout类似 - 头文件 fstream,其内部定义了一个用于处理输出的ofstream类,根据需要自行创建对象。
- 指定名称空间std。
- 将ofstream对象与文件关联起来,方法之一使用open(),用完记得close
- 使用ofstream对象 和<< 将各类数据输出到文件中。
注意:所有可用于cout的操作和方法(<< ,endl ,setf()) 都可以用为ofstream对象。
#include <iostream>
#include<fstream>
using namespace std;
int main()
{
ofstream out;
//open 接受一个C风格的字符串作为参数,可以是字面字符串,也可以是存储在数组中的
out.open("123.txt"); //若文件不存在,则创建,存在则截短为0;此外打开文件可能失败,应该增加失败的处理
double price = 48.5;
double arm = 0.368;
char str[] = "hello";
out << fixed;
out.precision(2);
out.setf(ios_base::showpoint);
out << "Speak : " << str << endl;
out << "price : " << price*arm << endl;
out.close();
}
输出:123.txt文件内容如下
Speak : hello
price : 17.85
读文本文件
cin:
- 头文件 iostream , 其内部定义了一个用于处理输入的istream类,声明了一个cin的ifstream对象
- 指定名称空间std。 cin和>> 显示各类数据。
- 使用cin和get读取一个字符,cin和getline读取一行
- 结合使用cin,eof(),fail()判断输入是否成功
- 对象cin本身被用作测试条件时,如果最后一个读取操作成功,它将转换为bool 的true值。
文件输出与cin类似 - 头文件 fstream,其内部定义了一个用于处理输入的ifstream类,根据需要自行创建对象。
- 指定名称空间std。
- 将ofstream对象与文件关联起来,方法之一使用open(),用完记得close()
- 使用ifstream对象 和<< 将各类数据输出到文件中。
- 使用eof() fail()等方法判断输入是否成功
- ifstream对象本身被用作测试条件时,如果最后一个读取操作成功,它将转换为bool 的true值。
#include <iostream>
#include<fstream>
using namespace std;
int main()
{
ifstream in;
in.open("123.txt"); //若文件不存在,则创建,存在则截短为0;此外打开文件可能失败,应该增加失败的处理
int count=0;
int sum = 0;
int value;
in >> value; //读取第一个
while (in.good()) //该方法在没有发生任何错误时,返回true
{
count++;
sum += value;
in >> value;
}
if (in.eof())
{
cout << "end of eof\n";
}
else if(in.fail()) //若文件中的数据类型不对,则打印此信息
{
cout << "input terminated by data mistake\n";
}
else
{
cout<< "input terminated by unknow mistake\n";
}
cout << sum << endl;
cout << count << endl;
in.close();
}
注意: 1. 读取操作中类型不匹配,则fail 返回true, 遇到EOF也返回true
2. 文件受损或硬件故障,bad返回true
3. eof(),只能检查是否到了文件尾,fail可以检查类型是否匹配
4. 方法good()指出最后一次的输入操作是否成功。意味着在读取输入的操作后,立即应用这种测试。标准方法如上所示。
表达式in >> value的结果为in,而在需要一个bool值得情况下in得结果为in.good()即true或false。
因此可以用下述替换上面得循环。(将两条输入语句用一条替代)
while(in>>value){}