1.1 如何撰写C++程序_How to Write a C++ Program
练习1.4,在终端上让用户输入fast name和last name并打印出来
练习1.4
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> user_name(2);
cout << "Please enter your first name: ";
cin >> user_name[0];
cout << "hi," << user_name[0]
<< " Please enter your last name: ";
cin >> user_name[1];
cout << "\nHello, "
<< user_name[0] << " " << user_name[1]
<< "...and goodbye!\n";
return 0;
}
Please enter your first name: Kyla
hi,Kyla Please enter your last name: Crane
Hello, Kyla Crane...and goodbye!
1.2对象与初始化_Defining and Initializing a Data Object
一般来讲内置数据类型(如bool,int,float,char等)可以直接用assignment运算符(=)进行初始化
int val = 0;
float score = 88.8;
bool real = true;
string name = "eva";
也可以使用构造函数语法(constructor syntax)进行初始化
int val(0);
float score(88.8);
bool real(true);
string name("eva");
当对象需要多个初值时,(=)方法就没法完成任务了,于是可以用“多值初始化”的构造函数初始化语法(constructor initialization syntax),这里用复数(complex number)类为例,它有实部虚部两个初值
complex<double> temp(0.0, 7);
若有类似最大最小值,圆周率之类的长久不变的常量,可以使用const定义
const double PI = 3.1415926; //若在使用中企图为const对象指定新值,会产生编译错误
一些常见的转义字符(escape cequence):
- '\n'——换行符(newline)
- '\t'——制表符(tab)
- '\0'——null
- '''——单引号(single quote)
- '"'——双引号(souble quote)
- '\'——反斜线(backslash)
1.3撰写表达式_Writing Expressions
表达式就是一个或多个常量、变量和运算符的组合:
- 赋值运算符:=
- 条件运算符:?:
- 算数运算符:+、-、*、/、%
- 关系运算符:==、!=、<、>、<=、>=
- 逻辑运算符:OR(||)、AND(&&)、NOT(!)
- 复合赋值运算符:+=、-=、*=、/=、%=
运算符的优先级:
1.4条件语句和循环语句_Writing Conditional and Loop Statements
- 条件语句:
if语句
if ( 0 <= val )
--val; //如果条件表达式为true,则执行该语句
//如果在条件判断之后想要执行多条语句需要加语句块
if ( 0 <= val ) { //语句块由此开始
--val;
print = val;
} //语句块由此结束
if-else
//else自句与if配合使用,当if的条件判断为flase时执行else语句块
if (val % 2) {
std::cout << "奇数";
} else {
std::cout << "偶数";
}
else-if
//else-if的判断和if的判断属于同一层平行关系,只能有一个为true,其他的都为false
if (conditionOne) { //若为true后续的else-if都不再执行判断
std::cout << "飞禽";
} else if (conditionTwo) {
std::cout << "走兽";
} esle if (conditionThree) {
std::cout << "游鱼";
} else { //若所有的判断都为false执行该语句块
std::cout << "虫豸";
}
switch
//switch可以用来替换一长串的if-else-if的子句
switch (number) { //switch的条件判断要为整数或者枚举
case 1:
std::cout << "飞禽\n";
break;
case 2:
std::cout << "走兽\n";
break; //break,执行满足条件的case标签语句块后跳出switch;
case 3:
std::cout << "游鱼\n";
break;
default: //若所有的case标签都不符合,则执行default标签
std::cout << "虫豸\n";
break;
}
//若上述代码不加break且number == 2,输出结果为:
//走兽
//游鱼
//虫豸
- 循环语句:
while
//只要条件判断表达式为true,则语句块就会不断执行
int val(0);
while ( val < 10 ) {
cout << val << ' ';
++val;
}
//打印结果为:0 1 2 3 4 5 6 7 8 9
//continue,结束当前循环迭代,进入下一次循环
int val(0);
while ( val < 10 ) {
if ( val % 2 ) { //奇数为true
++val;
continue; //奇数不打印,只打印偶数
}
cout << val << ' ';
++val;
}
//打印结果为:0 2 4 6 8
//break,直接跳出循序且不再进入循环
int val(0);
while ( val < 10 ) {
if ( 5 == val ) { //当val为5时直接跳出循环
break;
}
cout << val << ' ';
++val;
}
//打印结果为:0 1 2 3 4
1.5如何运用Array和Vector_How to Use Arrays And Vectors
注意,这里的array指的是C++的内置数组类型,并非STL库的array容器
- 定义
定义array时需指定元素类型(element type)、名称(name)和尺度大小(必须为常量表达式(constant expression))
const int size = 18;
int arr[size];
定义vector时同上,但大小不一定为常量表达式
#include <vector> //要包含容器所在头文件
vector<int> arr(size);
- 访问
array和vector都可以通过下标运算符([])来进行索引操作访问指定元素
arr[0] = 1; //指定第一个元素为1
迭代array和vector中的多个元素时,通常用到for循环
for循环访问array和vector
/*
for (init-statement; condition; expression) {
statement
}
init-statement:进入循环前执行,多用于设置初值,只执行一次
condition:循环判断条件
expression:每次迭代结束执行一次
以上三个元素可以留空,但';'必须写:
for ( ; ; ) {
statement
}
*/
for (int i = 0; i < size; ++i) {
cout << arr[i] << ' '; //for循环中使用[]运算符访问多个元素
}
array和vector初始化列表
const int size = 18;
//array:初始化列表元素不能超过size,若有不足剩余位置自动初始化为0
int arr_1[size] = {
1, 2, 3,
3, 4, 7,
2, 5, 12,
3, 6, 10,
4, 9 16,
5, 12, 22,
};
//若是不指明array大小,编译器会根据初始化列表算出大小为18
int arr_2[] = {
1, 2, 3,
3, 4, 7,
2, 5, 12,
3, 6, 10,
4, 9 16,
5, 12, 22,
};
//vector不支持上述初始化列表写法,有个类似的冗长写法
vector<int> val_1(size);
val_1[0] = 1;
val_1[1] = 2;
// ...
val_1[size - 1] = 22;
//另一种是用array来初始化vector
vector<int> val_2(arr_1, arr_1 + size);
1.6指针带来的弹性_Pointers Allow for Flexibility
通常,指针具有以下形式:
type_of_object_to * name_of_pointer_object
以int为例,我们要的指针要指向int,因此命名为pi,并赋初值为0:
int *pi = 0; //此时pi不指向任何对象,称之为null指针,操作null指针会出现段错误
操作指针
int ival = 1024;
int *pi = 0;
pi = &ival; //指针pi通过取址运算符(&)指向ival的内存地址
cout << *pi << ' ' << ival; //通过指针,读取ival的值,打印1024 1024
*pi = 2048; //通过指针更改ival值
cout << *pi << ' ' << ival; //打印2048 2048
//指针的成员选择运算符不一样
vector<int> fibonacci;
for (int i = 0, i < 10; ++i) {
if (i < 2) {
fibonacci.push_back(1);
} else {
fibonacci.push_back(fibonacci[i - 1] + fibonacci[i - 2]);
}
}
vector<int> *pv = &fibonacci;
//查看第二个元素是否为1
if (! fibonacci.empty() && (1 == fibonacci[1])) //这里使用dot成员选择运算符
if (pv && ! pv->empty() && (1 == (*pv)[1])) //这里使用arrow成员选择运算符
1.7文件读写_Writing and Reading Files
要对文件进行读写操作,要包含fstream头文件:
#include <fstream>
打开文件的模式
//以输出模式打开一个可供输出的文件
//若不存在text.txt则会产生一个文件
//若存在text。txt则会清空数据
ofstream outfile("text.txt");
//若不想清空数据,则需要以追加模式打开,新数据会加到文件末尾
ofstream outfile("text.txt", iios_base::app);
//以读取模式打开文件
ofstream infile("test.txt");
//以读写模式打开文件
fstream iofile("text.txt", ios_base::in | ios_base::app); //此时所在位置在文件末尾
iofile.seekg(0); //将文件重新定位到文件起始位置
练习1.5用户输入姓名(不小于两个字符)并响应信息。请以两种方式实现:第一种C-style字符串,第二种使用string对象
C-style
//C-style需要手动分配固定的空间,并且不记录自生长度,需要便利其中元素(strlen()可以实现)
#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
int main()
{
const int maxSize = 128;
char userName[maxSize];
cout << "Please enter your name: ";
cin >> setw(maxSize) >> userName; // setw()需要填充多少字符串,默认' '
switch (strlen(userName))
{
case 1:
cout << "你好," << userName << "单字名,有个性!\n";
break;
//其他长度的名字就不写了
case 127:
cout << "名也太长了,你写名字要多久?\n";
break;
default:
cout << "你好," << userName << "祝你幸运每一天\n";
break;
}
return 0;
}
string
//string的存储空间会根据存储的元素数量动态变化
#include <iostream>
#include <string>
using namespace std;
int main()
{
string userName;
cout << "Please enter your name: ";
cin >> userName;
switch (userName.size())
{
case 1:
cout << "你好," << userName << "单字名,有个性!\n";
break;
//其他长度的名字就不写了
case 127:
cout << "名也太长了,你写名字要多久?\n";
break;
default:
cout << "你好," << userName << "祝你幸运每一天\n";
break;
}
return 0;
}
练习1.6从标准输入设备读一串整数到array和vector,并遍历求和取平均值打印
array
#include <iostream>
using namespace std;
int main()
{
const int arraySize = 128;
int ia[arraySize];
int ival;
int icnt = 0;
while (icnt < arraySize && cin >> ival)
{
ia[icnt++] = ival;
if ('\n' == cin.get())
break;
}
int sum = 0;
for (int i = 0; i < icnt; ++i)
{
sum += ia[i];
}
int average = sum / icnt;
cout << "Sum: " << sum
<< "\nAverage: " << average << endl;
return 0;
}
vector
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec;
int ival;
while (cin >> ival)
{
ivec.push_back(ival);
if ('\n' == cin.get())
break;
}
int sum = 0;
for (int i = 0; i < ivec.size(); ++i)
{
sum += ivec[i];
}
int average = sum / ivec.size();
cout << "Sum: " << sum
<< "\nAverage: " << average << endl;
return 0;
}
练习1.7打开已有数据的文本文件text.txt,读取数据到vector中并遍历打印,然后用泛型算法sort()(头文件为algorithm)排序后输出到另一个文件sort.txt中
读写文件
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>
using namespace std;
int main()
{
// 判断文件打开是否正常
ifstream inFile("./text.txt");
if (!inFile)
{
cerr << "opps! Unable to open input file\n";
return -1;
}
ofstream outFile("./sort.txt");
if (!outFile)
{
cerr << "opps! Unable to open output file\n";
return -2;
}
string word;
vector<string> text;
while (getline(inFile, word)) // 将数据读出来,按行读取打印出的排版好看些
{
text.push_back(word);
}
int index = 0;
cout << "Unsorted text: \n";
for (; index < text.size(); ++index)
{
cout << text[index] << '\n';
}
cout << endl;
sort(text.begin(), text.end()); //按行排序,行内单词顺序不变
outFile << "Sorted text: \n";
for (index = 0; index < text.size(); ++index)
{
outFile << text[index] << '\n';
}
outFile << endl;
return 0;
}