1.for循环
int limit;
int i;
//for循环的实现方式 通常C++会在for和括号之间加一个空格 而省略函数名和括号的空格
for (i = limit; i; i--)
cout << "i = " << i << "\n" << endl;
//cout.setf()用法
cout.setf(ios::boolalpha)
//表示设置一个标记,使布尔类型的量用字母显示而非0或者1
//C++中的一种新式的for句法规则
for(int i = 0; i<4 ;i++)
cout << i;
//这种表达方法的好处是在循环结束只会变量i就会消失
2.递增递减运算符
a++ //意味着使用a的当前值计算表达式 然后将a的值加1
++a //意味着先将a的值加1 然后再计算表达式
--a //同上
a-- //同上
*++pt //表示pt先进行自增,然后使用解除引用运算符
++*pt //表示先取得pt指向的值,然后将其进行自增
(*pt)++//表示先取得pt的值进行运算,然后将其自增
*pt++ //由于++的优先级更高 所以先进行地址自增 然后进行解除引用
3.逗号运算符(for循环代码块)
语句块允许把两条或者更多条语句放到按C++句法只能放一条语句的地方,逗号表达式也能完成同样的任务。其次,逗号表达式最常见的用途是将两个或更多的表达式放入for语句中,不够C++还为这个运算符提供了另外两个特性:首先它确保先计算第一个表达式,其次它规定逗号运算符的结果是第二个表达式的结果。
//代码片和逗号运算符
#include<iostream>
#include<string>
int main()
{
using namespace std;
cout << "Enter a word :" ;
string word;
cin >> word;
char temp;
int i,j;
for(j = 0,i = word.size() - 1; j < i; --i,++j) //逗号运算符
{
temp = word[i];
word[i] = word[j];
word[j] = temp;
} //代码块
cout << word << "\nDone" <<endl;
return 0;
}
//逗号运算符的结果
i = 20 , j = i *2
//这个表达式的结果是40
2.while循环
//while循环 和C中的while循环类似
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1;
cin >> str1;
int i = 0;
while(str1[i])
{
cout << str1[i] << " " << int(str1[i]) << endl;
i++;
}
return 0;
}
3.while循环和for循环的三个差别
- 在for循环中省略测试条件时,将认为条件为true
- 在for循环中,可使用初始化语句声明一个局部变量,但是while不可以
- 如果循环体中有continue语句,情况将稍有不同
4.延时函数(C++的ctime库)
CLOCKS_PER_SEC :系统时间转换为秒数的参数
系统时间单位数/CLOCKS_PER_SEC = 秒数
秒数 * CLOCKS_PER_SEC = 系统时间数
//利用ctime库延时指定时间
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
float secs;
cin >> secs;
clock_t delay;
delay = secs * CLOCKS_PER_SEC;
clock_t start = clock();
while(clock() - delay < start);
cout << "Time's Up!" << endl;
return 0;
}
注意:clcok()函数返回的类型是clock_t类型的变量,如果要与其进行算数运算,我们要定义的变量类型也应该是clock_t类型的。
5.类型别名
- 使用#define来定义类型别名
- 使用typedef来定义类型别名
//方法一
#define BYTE char
//这样预编译器会在编译的时候把所有的BYTE替换为char
//BYTE也就成了char的别名
//方法二
typedef char byte;
//这种方式是通过typedef关键字来创建别名
//这种方式要比预定义方式要高级
//因为预定义方式在给指针做别名的时候可能会出错
//typedef并不会有这种问题,所以typedef是更好的选择
//例子
typedef char* char_point;
char_point pa,pb; //pa,pb都是char类型的指针
#define float_point float*
float_point pa,pb; //pa是float类型指针,pb是普通变量
6.do while循环
do while循环和for循环,while循环的区别在于,do while循环是出口条件循环,而for循环和while循环都是入口条件循环。
出口条件循环的使用一般是在需要预先获得用户输入,然后再进行判断的时候。比如根据输入判断成绩是否合格,或者是猜你最喜欢的数字。
//猜数字--简单的do while循环
#include<iostream>
using namespace std;
int main()
{
int num;
do
{
cin >> num;
}
while(num != 8);
cout << "Right!" << endl;
return 0;
}
7.C++11的范围for循环
基于范围的for循环一般用于简化数组或容器类每个元素执行相同命令的操作。
下面介绍基本的句法:
//将列表的内容显示再屏幕上
for(int x : {3,5,7,6,9})
cout << x << " ";
cout << endl;
for(double &x : prices)
x = x *0.80;
//符号& 表明x是一个引用变量,只有这种方式 x才能对prices中的值进行修改
8.循环和文本输入
1.使用原始的cin进行输入
使用这种方式进行输入会导致,cin将忽略换行符以及空格,更为复杂的是,发送给cin的内容会被缓冲,只有用户按下回车键的时候,内容才会被发送给程序,这也导致了即使遇到了哨兵字符,用户仍可以继续输入的原因。
#include<iostream>
using namespace std;
int main()
{
int count = 0;
char cr;
cin >> cr;
while(cr != '#')
{
count++;
cout << cr << " ";
cin >> cr;
}
cout << count << endl;
}
2.逐个字符读取输入,一般来说不应该忽略换行符和空格以及制表符,而上面原始的cin并不能满足要求,,istream类中有一个成员函数cin.get(ch)能满足我们的要求,【cin.get()是老朋友了,之前我们再读取整行的时候介绍过它】,在没有参数(或者只有一个参数)的时候,它会读取一个字符,无论他是什么字符,使用它来替换上个程序的cin >> ch 会得到比刚才好的效果。
#include<iostream>
using namespace std;
int main()
{
int count = 0;
char cr;
cin.get(cr);
while(cr != '#')
{
count++;
cout << cr << " ";
cin.get(cr);
}
cout << count << endl;
}
9.嵌套循环和二维数组
//二维数组的创建方式
int maxtemps[4][5];
//这表示maxtemps是一个拥有四个元素的数组
//每个元素是一个拥有五个元素的数组
//也就是可以看作数组由四行组成,每行有五个值
//打印二维数组所有内容
int maxtemps[4][5];
for(int i = 0; i<4; i++)
for(int j = 0; j<5; j++)
cout << maxtemps[i][j] << endl;
//初始化二维数组
int maxtemps[4][5] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17, 18, 19, 20}
};
//字符串指针数组
const int Cities = 5;
const char* cities[Cities] =
{
"Beijing",
"Shanghai",
"Tianjin",
"Shenzhen",
"Fushun"
};
//这是一个char型的指针数组,这样每一个元素都是字符串的地址,字符串代表的是地址。
//string类型
//如果希望字符串可修改 需要去掉const常量限定符
const string cities[Cities] =
{
"Beijing",
"Shanghai",
"Tianjin",
"Shenzhen",
"Fushun"
};
//char型数组类型
//一个五个元素的字节数组
//每个字节数组是一个由五个字节数组组成的数组
const char cities[Cities][50] =
{
"Beijing",
"Shanghai",
"Tianjin",
"Shenzhen",
"Fushun"
};
10.条件分支语句
int num = 7;
//if语句
if (num == 7)
cout << "Yeah!" << endl;
//if-else语句
if (num == 7)
cout << "Yeah!" << endl;
else
cout << "Oh NO!" << endl;
//if-else if-else语句
if (num == 7)
cout << "Yeah!" << endl;
else if (num == 6)
cout << "Close!" << endl;
else
cout << "Oh NO!" << endl;
11.逻辑运算符
名称 | 符号 | 另一种表达形式 |
---|---|---|
与 | && (优先级高于或) | and |
或 | ||() | or |
非 | !(优先级最高) | not |
12.字符函数库 cctype
这些函数的原型是在头文件cctype中定义的
#include<iostream>
#include<cctype>
int main()
{
using namespace std;
cout << "Enter text for analysis ,and type @"
" to terminate input" << endl;
char ch;
int whitespace = 0;
int digits = 0;
int chars = 0;
int punct = 0;
int others = 0;
cin.get(ch);
while (ch != '@')
{
if(isalpha(ch)) //cctype中的函数 判断是否为字母
chars++;
else if(ispunct(ch)) //判断是否为标点符号
punct++;
else if(isdigit(ch)) //判断是否为数字
digits++;
else if(isspace(ch)) //是否为空格
whitespace++;
else
others++;
cin.get(ch)
}
cout << "alpha num\t" << chars << endl;
cout << "punct num\t" << punct << endl;
cout << "digits num\t" << digits << endl;
cout << "whitespace num\t" << whitespace << endl;
cout << "others num\t" << others << endl;
return 0;
}
函数名称 | 作用 |
---|---|
isalnum() | 如果是字母或者数字,返回true |
isalpha() | 如果是字母,返回true |
isdigit() | 如果是数字,返回true |
iscntrl() | 如果是控制字符,返回true |
isgraph() | 如果是除了空格外的打印字符,返回true |
islower() | 如果是小写字母,返回true |
isprint() | 如果是打印字符,返回true |
isspace() | 如果是标准空白字符(空格 进纸 换行 回车 水平制表符 垂直制表符),返回true |
issupper() | 如果是大写字母,返回true |
isxdigit() | 如果是十六进制数字,返回true |
tolower() | 如果大写字母,返回其小写,否则返回该参数 |
tosupper() | 如果小写字母,返回其大写,否则返回该参数 |
13.三目运算符 ?:
// 表达式1?表达式2:表达式3
//表达式1为真 执行2 否则执行3
//等价于
/*
if 表达式1
表达式2
else
表达式3
*/
14.switch语句
适用于大型列表的选择,比如菜单,功能选择。
注意:switch中的表达式必须是整数值表达式,case中的表达式,必须是整数常量表达式,一般来说case中的值一般是整数,字符,或者枚举类型。
#include<iostream>
using namespace std;
int main()
{
int num;
cin >> num;
//switch作为分支选择,会以此执行case语句
//如果本case语句成立,则本case语句后的所有语句都会被执行
//除了default,但是加上break可以跳出
switch (num)
{
case 1 : cout << 'apple';
break;
case 2 : cout << 'banana';
break;
case 3 : cout << 'pear';
break;
default: cout << "Nothing"
}
return 0;
}
//switch 与 枚举类型
#include<iostream>
using namespace std;
//枚举类型 在没有特殊声明的时候,按顺序为0~6
emum {red,orange,yellow,green,blue,violet,indigo};
int main()
{
cout << "Enter color code(0-6): ";
int code;
cin >> code;
while (code >= red && code <= indigo)
{
switch (code)
{
case red : cout << "red" <<endl; break;
case orange: cout << "orange" <<endl; break;
case yellow: cout << "yellow" <<endl; break;
case green: cout << "green" <<endl; break;
case blue : cout << "blue" <<endl; break;
case violet: cout << "violet" <<endl; break;
case indigo : cout << "indigo" <<endl; break;
}
cout << "Enter color code(0-6): ";
cin >> code;
}
return 0;
}
15.break 和 continue
break:直接跳出循环或者选择
continue:跳过剩余语句,开始新一轮循环
16.读取数字的循环
- 注意:如果逻辑与表达式左侧的表达式已经为false,则系统不会再计算右侧的表达式,而是直接返回false.
- 注意:当程序发现输入内容和要求内容不匹配的时候,cin返回的cin对象在作为表达式的时候,会转换为布尔型的false。而且不会执行写入操作,只有返回结果是true的时候才会写入。
- 注意:当写入内容不满足程序要求的时候,cin对象的错误标记会被设置,如果不清除掉这个设置的话,系统不会再执行任何读入操作,而这个标志需要通过cin.clear()来重置。
//读取高尔夫的成绩,并且计算总分,要求高尔夫的成绩一定是数字
#include<iostream>
using namespace std;
int main()
{
const int MAX = 5;
int golf[MAX];
cout << "Please enter your golf scores : " << endl;
for(int i = 0; i < MAX; i++)
{
cout << "Golf score #" << i+1 << ":" ;
while(!(cin >> golf[i]))
{
cin.clear();
while(cin.get() != '\n')
continue;
cout<<"\nPlease enter a number: ";
}
}
int total = 0;
for(int j = 0; j < MAX; j++)
{
total += golf[j];
}
return 0;
}
17.简单文件输入输出
文本IO:在使用cin进行输入的时候,程序将输入视为一系列字节,其中每个字节都被解释为字符的编码,无论目标数据类型是什么,输入一开始都是字符数据—文本数据。然后通过cin对象将文本数据转化为目标类型。
输入内容为 37.5 85.2
目标类型为字符型的时候:
char ch;
cin >> ch;
//此时,输入行中第一个字符被赋值给ch,第一个字符为3
//则他的字符编码(二进制)被存放在ch变量之中
//注意这里存储的不是3,而是3的字符编码
//由于目标格式和原格式相同所以不需要进行任何转换
目标类型为int型的时候:
int ch;
cin >> ch;
//此时,cin会不断读取,知道遇见第一个不是数字的字符
//也就是遇到了.的时候停止,它读取了3和7
//cin会进行计算,计算得出对应字符编码的是数值37
//因此将37的二进制编码复制到ch之中
目标类型为double型的时候:
double ch;
cin >> ch;
//此时,cin会不断读取,直到遇到第一个不属于浮点数的字符。
//也就是说它会读取3,7,'.',5,遇到空格的时候停下
//然后cin会进行计算,得出这四个字符对应的是37.5的浮点数
//因此将37.5的二进制编码复制给ch
目标类型为字符数组的时候:
char ch[50];
cin >> ch;
//此时,cin会不断读取,直到遇到第一个空白字符。
//也就是说他会读取3,7,'.',5,遇到空格的时候停下
//然后cin会将这四个字符的字节编码存储到数组中
18.写入到文本文件中
文件输出的基本要求
- 必须包含头文件 fstream
- 头文件fstream定义了一个用于处理输出的ofstream类
- 需要声明一个或多个ofstream变量,并以自己喜欢的方式对其命名,条件是遵守常用的命名规则
- 必须指明命名空间std
- 需要将ofstream对象和文件关联起来,方法之一就是使用open()方法
- 使用过文件之后需要将文件通过close()方法关闭
- 可结合使用ofstream对象和运算符<<来输出各种类型数据
//必须自己声明ofstream对象
ofstream fout;
//使用时需要将其与文件关联
fout.open("fish.txt");
//使用方式
//将一个double类型变量写入到文件中
double wt = 25.52;
fout << wt << endl;
//将一个字符数组写入到文件中
char word[50] = "Edge is a silly browser!!!";
fout << word << endl;
注意:iostream中帮我们预先声明了cout,而fstream并没有,所以我们需要自己命名一个ofstream变量,然后使用它。幸运的是,cout和我们的fout并没有区别,以至于大多数cout的方法在fout中也可以使用。
19.读取文本文件
- 必须包含头文件 fstream
- 头文件fstream定义了一个用于处理输出的ifstream类
- 需要声明一个或多个ofstream变量,并以自己喜欢的方式对其命名,条件是遵守常用的命名规则
- 必须指明命名空间std
- 需要将ofstream对象和文件关联起来,方法之一就是使用open()方法
- 使用过文件之后需要将文件通过close()方法关闭
- 可结合使用ifstream对象和运算符>>来输出各种类型数据
- 可以使用ifstream对象和get()来读取一个字符,getline()方法来读取一行字符
- 可以结合使用eof() fail()方法来判断读取是否成功
- ifstream对象本身被用作测试条件的时候,如果最后一个读取操作成功,他将被转换为布尔值true,否则被转换为false
//声明 与 文件关联
ifstream fin;
fin.open("fish.txt");
//使用方式
double wt;
fin >> wt;
char word[50];
fin.getline(word,50);
//检查文件是否打开 is_open()
fin.open("fish.txt");
if(!fin.is_open())
{
//EXIT_FAILURE为参数值,用于同系统通信,exit()用于终止程序
exit(EXIT_FAILURE)
}
//一个从文件中读取成绩并计算平均值的程序
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
//定义一个ifstream变量
ifstream fin;
//定义一个存储文件名的变量
string fileName;
//用户输入文件名
cin.getline(fileName,80);
//关联文件
fin.open(fileName);
//判断文件是否打开
if (!fin.is_open())
{
cout << "Could not open the file!!" << endl;
exit(EXIT_FAILURE);
}
//定义存储平均值的变量
double score = 0.0;
double i;
int count = 0;
//fin >> i 作为布尔类型 来代替fin.good()
while (fin >> i)
{
count++;
score += i;
}
//判断错误类型
if(fin.eof())
{
cout << "EOF!" << endl;
}
else if(fin.fail())
{
cout << "FAIL!" << endl;
}
else
count << "UNKNOWN!" << endl;
if (count == 0)
{
cout << "NOBODY!" << endl;
}
else
{
cout << score/count << endl;
}
fin.close()
return 0;
}