Essential c++初学 第一章 basic c++ programming
1. 输入输出与初始化:
cin>>user_name
cout<<'\n'
<<"hello"
单引号char类型,表示变量类型为字符型。
双引号str类型,表示字符类型变量名字。
常量命名:const —> which mean constant
const int seq_size =18
int pell_seq[seq_size]
以下这一小块是个人理解:
#include <iostream>
#include <string>
using namespace std;
include 类似于Import
using namespace std; 书上说是命名空间,用来封装库,可以避免和应用程序发生命名冲突的问题。(大概类似from xx import xxx )
2. 逻辑运算符:
或运算: ||
if (usr_rsp =='N' || usr_rsp =='n'){
//...
}
与运算:&&
if (password && validate(password)){
//...
}
非运算:!
if (!usr_name)...
3. 条件语句
switch(num_tries)
{
case1:
cout<<"xxxxxxxx";
break;
case2:
cout<<"xxxxxxxxxxxxx";
break;
case3:
cout<<"xx";
break;
...
}
其中sitch后的小括号包含的一定是个表达式,且表达式的值必须是int类型,以对应case后的值。
break用来跳出case。
4.容器
有两种容器,array 和vector
要定义array,必须指定array的元素类型,还得给与array一个名称,并指定其尺寸大小。
const int seq_size = 18;
int pell_seq[seq_size];
对于vector object ,必须包含vector头文件,vector 是个class template,所以必须在类名之后尖括号内指定元素类型。
#include<vector>
vector<int>pell_seq(seq_size)
两种容器的初始化:
int elem_seq[] = {
1,2,3,3,4,7,2,5,12,
3,5,10,4,9,16,5,12,22
}
vector不支持上面这种初始化,必须一个个位置赋值。但可以先初始化一个array然后再整体赋值给vector。
int elem_seq[] = {
1,2,3,3,4,7,2,5,12,
3,5,10,4,9,16,5,12,22
}
vector<int>elem_seq(elem_vals,elem_vals+seq_size)
5. 指针
//定义一个指针
int *pi;
//初始化一个指针
int *pi=0;
//验证某指针非空
if(!pi)
//指向元素类型为Int的vector
vector<int>*pv = 0;
使用class boject类型指针和使用内置类型指针有所不同,因为class object关联了一组可调用(invoke)的操作(operation)
//例如,欲检查某个vector的第二个元素是否为1
if(!vector.empty()&&(vector[1] ==1))
语句中的句号 . 称为dot成员选择运算符,用来选择我们想要进行的操作,如果通过指针来选择操作必须用arrow成员选择运算符。
!pv->empty()
并且,如果要使用下表运算符(即中括号索引),我们必须先提领pv。由于下标运算符的优先级较高,因此pv提领操作两旁必须加上下括号
if(pv&&!pv->empty() && ((*pv)[1]==1))
6. 文件读写
读取并写入txt文件,相当于python的open(‘txt’,‘a’)。其中ofstream是一个供输出用的file stream对象。cerr是没有缓存,直接显示在终端上的cout。
说是包括std在内的库,尽量不要使用using namespace std;的方法定义命名空间,而使用如下面程序中的方式,原因还有待深入学习后领悟。
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::ofstream out_file("D:/c++_test/test.txt", std::ios_base::app);
std::string usr_name = "nan";
int num_tries = 10, num_right = 9;
if (!out_file)
std::cerr << "error";
else
out_file << usr_name << ' '
<< num_tries << ' ' << num_right << std::endl;
}
ifstream是一个供输入的file stream对象类。以读取模式打开Infile。使用了流输出,这种方法暂时理解为可以识别出空格’ '作为一个标识符,整行数据都不进行数据类型区分,将第一个数据读取传给name,第二个传给nt,第三个传给nc。
#include <fstream>
#include <string>
#include <iostream>
int main() {
std::ifstream infile("D:/c++_test/test.txt");
int num_tries = 0;
int num_cor = 0;
std::string usr_name;
std::cin >> usr_name;
if (!infile) {
std::cerr << "He is a new customer";
}
else
{
std::string name;
int nt;
int nc;
while (infile >> name)
{
infile >> nt >> nc;
if (name == usr_name) {
std::cout << "welcome back " << usr_name
<< "\nYour current score is " << nc
<< "out of " << nt << "\ngood luck!\n";
num_tries = nt;
num_cor = nc;
}
}
}
getchar();
}
章节作业 练习1.6
编写一个程序,从标准输入中输入一系列整数,将读入的整数依次放到vector中,然后遍历这个容器,求总和以及平均值,并将数据都保存在txt中。
#include <string>
#include <iostream>
#include <vector>
#include <fstream>
int main() {
const int seq_size = 20;
std::vector<int>vector_seq(seq_size);
int array_seq[seq_size];
int vec_num=0;
std::ofstream outfile("D:/c++_test/assign_1_6.txt", std::ios_base::app);
for (; vec_num < 10;vec_num++) {
std::cout << "please input a number,"
<<"if you don't want to continue,just input '-1'"<<std::endl;
std::cin >> vector_seq[vec_num];
if (vector_seq[vec_num] == -1)break;
if (!outfile)
std::cerr << "error";
else
outfile << vector_seq[vec_num]<<std::endl;
//本来使用一个字母作为跳出循环的信号,但数据类型错误会判断混乱
//有待后续更新
}
int num_sum = 0;
for (int ix = 0; ix < vec_num; ix++) {
num_sum = vector_seq[ix] + num_sum;
}
int num_mean = 0;
if (vec_num == 0)
std::cout << "try again";
else
{
num_mean = num_sum / vec_num;
outfile << "the sum is" << num_sum << " ,the mean is" << num_mean;
}
}
遇到的小问题:
Q1:for的第一个位置若初始化vec_num=0会导致for循环体结束后vec_num一直为0?
A:初始化vec_num则会从新在更小的局部区域内指定了一个同名变量,vec_num++改变的一直都是这个小局部变量,离开for循环后,vec_num是在使用外层的那个局部变量,所以值是0。
Q2:为啥-1退出的功能没法实现?
A:在for (; vec_num < 10 && (vec_num!±1);vec_num++)里面的时候当前vec_num都是没有传入数字的,所以即便输入-1,也还是一直没法符合不等于的循环结束条件。
Q3: i++和++i的区别?
A:比如i=3,b=i++就是说b=3,完成之后让i变成4,b=++i就是先让i++变成4,然后b=4,其中++i比i++效率要高些。一般来说在循环域里面,这两者并没有什么很大的区别,但是要注意其生存周期,以及i值在程序流中的变化。