Essential CPP 学习笔记-第一章-C++编程基础
此笔记为学习EssentialCPP-侯捷译版-学习总结笔记,用于后续复习整理用。
- Main 函数:
Main 函数为C++系统内置函数,标准语法为:
int main (){ //int 为main函数返回值,括号内为输入参数
...
return 0; //return 0表示此函数运行正常
}
2 . 头文件xxx.h:
在C++中,若想调用某一class,需要首先引入包含这个class的头文件xxx.h; 引入头文件的格式为:
#include <iostream>
*代码练习1,简单的输入输出功能
// EssentialCPP.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream> //输入输出头文件
#include <string> //字符串头文件
using namespace std; //重要!定义命名空间,using namespace均为c++的标准关键字,
//std表示自定义的命名空间,规定类对象或变量的存在空间
//防止出现:两个命名相同的变量/类导致冲突发生
int main()
{
string test_name;
cout << "Please enter your name: \n";
cin >> test_name;
cout << "\n"
<< "Hello "
<< test_name
<< " goodbye";
return 0 ;
}
3.重要! 命名空间 using namespace std:
//重要!定义命名空间,using namespace均为c++的标准关键字,
//std表示自定义的命名空间,规定类对象或变量的存在空间
//防止出现:两个命名相同的变量/类导致冲突发生
! 标准程序库所提供的任何事物(包括string class,cout,cin这两个类对象)都被封装在std这个命名空间下
4.构造函数初始化语法(除了使用assignment 标识符‘=’以外的一个赋值方法)- (Constructor initialization syntax)
- 构造函数初始化语法:主要应用于对象需要多个初始化值的时候。
- 语法为 #include <complex>
complex <double> purei(0,7) ;
5. 设定常量语法(即初始化值赋值之后,这个数值不能在程序中被修改)
- 语法为:const int max_tries=3;
6. 转义符: 由于\n,\t等已经包含特殊含义,因此若想在程序中显示\标识符时,使用\\转义符可以代表\
7. 复合赋值 :cnt++, ++cnt
int tries =0 ;
cout << "Are your ready to try :"
<< ++tries <<"Times? \n" //在执行语句之前,tries变量已经执行+1指令,此时值为2
cout <<"Are your ready to try :"
<<tries ++ << "Times? \n" //在执行语句之后,tries才将执行+1z指令,运行时值为1
8. 定义及初始化array 和vector (使用for loop)
- 注意: 在初始化array和vector时候,需要首先确定其容量;
- 注意: 使用for loop时候,第一次进入循环时,会进行一次判断。
- 若想依次输出array或者vector内部的数据,可以使用for loop进行遍历(iterate)
//数组array:
const int seq_size=18 ;
int pell_seq [seq_size]; //定义整型数组
//vector
#include<vector>
vector<int> pell_seq (seq_size) //定义整型vector
//从array或者vector内取出数据,或赋值
pell_seq [0] =1 ;
pell_Seq [1] =2;
//若向array 或者Vector内部添加元素,创建pell数列:
//Pell 数列为:1,2,5,12,29,70,169,408
for(int ix=2; ix<seq_size;ix++){
pell_seq[ix]=2*pell_Seq[ix-1] + pell_seq[ix-2];
}
------------------------------------------------------------------------
//若预先不知道array的容量,可以在初始化的时候对array进行直接赋值,这样他会自动计算出元素数量:
int elem_seq_array[]{
1,2,3,4,5,6,7,8,9,10
}
//vector与array之间的差异1:
vector这个变量知道自己的容量是多少,所以可以用以下方式遍历:
假设vector名称为 elem_seq_vector
for(int ix =0; ix<elsm_seq_vector.size();ix ++){
cout<<pell_seq_vector[ix] <<"." ;
}
9. 使用指针-存取vector内部的某一个数值
- 指针:代表某特定的内存地址,直接操作内存地址而不不直接操作对象;
- 指针的用法:
//指针:
1. 定义一个名为 ival 的 int 对象
int ival = 1024;
2.定义一个int型的指针对象:
int *pi;
3. 将ival变量的内存地址存放在这个指针内(&取地址运算符):
int *pi = &ival ;
4.若想取得“位于该指针所致之内存地址上的对象,在指针之前使用*即可”
例如:
*pi=1024; -->就是在pi指针所指内存对象的值,将其设置为1024;
5.指针的复杂程度在:
5.1 指针对象既可以让我们操作内存中的特定地址,也可以指针本身所指的对象值:
例如:
pi; ->这个是含有”内存地址“的指针对象 (门牌号)
*pi ;->这个指的是内存地址存储的值 (地址里住的人),此处为1024
5.2 在使用指针之前,必须提前知道这个指针对象所指地址内是否有需要的对象,否则会出错;
重要:在使用指针前,需要判断指针内含地址是否为0,若为0,就不可进行提领(dereference)
->int *pi= 0;
-> if (!pi){
才可进行指针操作,否则出错
}
//使用指针来操作vector内部数值:
//注意!指针的声明方法为: 变量类型 *pi; 例如:int *pi;
vector<int> fibonacci,lucas,pell,triangular; //初始化vector
vector<int> *pv = 0; //初始化指针
pv= &fibonacci; //将fibonacci地址赋予给指针
pv= &lucas;
10. 文件的读写(程序执行结束时,写入文件一些数据,以便再次运行程序时进行调用)
#include <fstream>
//......//
//
------------------------写入模式------------------------------
1. 以输出模式开启一个文件:(打开文件时,文件已有内容会清除)
ofstream outfile ("seq_date.txt"); //若文件存在,将被清零打开;若不存在,将被创建;
2. 以追加模式打开文件(在文件后边添加内容)
ofstream outfile ("seq_date.txt", ios_base::app);
* 文件可能加载失败,因此在真正写入文件时,需要判断是否打开成功:
if(! outfile){ //若打开成功,outfile=true; 失败就是false;
}
3.重要: 若文件未能成功开启,需要将错误信息写入cerr,告知; cerr与cout都是输出函数
区别是cerr会立刻输出-没有缓冲(bufferred)
if(!outfile){
cerr<<"Oops,Uable to save session data!\n"
}
else {
outfile <<“anson" << " " //中间使用空格进行分隔
<<"3 times" << " "
<<num_right << endl ;
}
---------------------读取模式-----------------------------------------------
若要读取文件,使用ifstream指令
1.读取文件信息的语法为:以读取模式(input mode),开启infile
ifstream infile("test.txt");
int num_tries = 0;
int num_cor = 0;
if(!infile){
cerr<<xxx
}
else {
string name;
int nt;
int nc;
while(infile>>name) //while 循环每次都会迭代读取文件的下一行
//读取到最后一行时为FALSE,作为结束条件
{
infile>>nt>>nc; //由于文件格式为:anna 24 19,因此
//总次数存入nt,猜对的次数存入nc
if (name == usr_name){
cout<<"Welcome bace, "<<usr_name;
<<"\n Your current score is "<< nc;
<< "Out of "<< nt <<"\nGood Luck!\n"
num_tries =nt;
num_cor = nc;
}
}
}
---------------------同时读取并写入-----------------------------------------------
同时读取并写入,需要建立fstream对象,写入方式为append
fstream iofile("seq_data.txt", ios_base::in|ios_base::app)
if(!iofile){
cerr<< "Fail to load the file";
}
else{
iofile.seekg(0); //开始读取之前,将文件定位至起始处
}
---------------------总结-----------------------------------------------
读取并写入文件时步骤:
1. 包含头文件:#inculde <fstream>
2. 写入文件: ofstream outfile ("xxx.txt",ios_base::app)
3. 读取文件: ifstream infile ("xxx.txt")