2020 1月13日
Second_week 1.13-1.19
- | Study_update |
---|---|
Mon. | whlie,do whlie①,break② |
Tue. | continue①,try语句块和异常处理②,函数基础③,局部对象与静态局部对象,分离式编译 |
Wed. | 参数传递,const形参和实参,数组形参①,main:预处理命令行选项(没看懂!),含有可变形参的函数② |
Thur. | — |
Fri | 文件的读写① |
Sat | ---- |
Sun. | ---- |
1.13 Monday
whlie
用whlie求数组的元素之和
#include "pch.h"
#include <iostream>
using namespace std;
int sumit(int *parray_begin, int *parray_end);
int sumit(int *parray_begin, int *parray_end)
{
int sum = 0;
if (!parray_begin || !parray_end)
return sum;
while (parray_begin != parray_end)
//把当前的值加到sum上
//然后增加指针,使其指向下一个元素
sum += *parray_begin++;
return sum;
}
int main()
{
int ia[3]{ 1,3,3 };
cout<<sumit(begin(ia), end(ia));
}
①do whlie
如果循环控制是在循环体内被设置的话,用传统的whlie语句就必须设置一个值来启动循环,使用Do whlie语句确保执行一次循环。
②break
break终止最近的while,do while,for或者switch语句.程序的执行权被传递给紧接着被终止语句之后的语句。
1.14 Thusday
①continue
continue语句(continue statement)终止最近的循环中的当前迭代并立即开始下一次迭代。continue只能出现在for,while和dowhile循环的内部,或者嵌套在此类循环里的语句或块的内部。也作用与最近的循环,但是break可以直接作用于switch,continue只有当switch语句嵌套在迭代语句内部时,才能使用。
#include "pch.h"
#include <iostream>
#include <string>
using namespace std;
int main()
{
string buf;
while (cin>>buf&&!buf.empty())
{
if (buf[0]=='_')//判断首字符是否为下划线,如果不是就中断当次循环进入下一循环。
{
continue;
}//下面继续处理符合预期的字符串
}
}//c++primer 洋葱骑士
②try语句块和异常处理
异常是指存在于运行时的反常行为,这些行为超出了函数的正常功能的范围,例如 失去数据库连接以及遇到意外输入等。
异常处理机制为程序中异常检测和异常处理这两部分提供协作支持,个人理解是遇到问题,会发出故障信号表明出现故障,然后这是专门负责发出异常的部分,无需知道故障在哪里得到解决,然后有另外的处理异常的代码块进行处理。异常处理包括:
·throw表达式(throw expression)
异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发(raise)了异常。
个人理解 throw是表明异常的环节。
·try语句块(try block)
异常处理部分使用try语句块处理异常。try语句块以try关键字开始,并且以多个Catch子句(catch clause)结束。try语句块中代码抛出的异常通常会被某个catch子句处理。因为catch子句“处理”异常,所以它们也被称作异常处理代码(exception class)
·一套异常类(exception class)
用于在throw表达式和相关的catch子句之间传递异常的具体信息。
程序的异常检测部分使用throw表达式引发一个异常。throw表达式包含关键字throw和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型。
例如
if(a!=b)
{
throw runtime)error("****");
类型runtime_error是标准异常类型的一种,定义在stdecept头文件中。
·Try语句块
通用形式
try{
program-statements
}
catch(exception-declaration)
{
handler-statements
}
catch(exception-declaration)
{
handler-statements
}
跟在try块后面的是Catch子句,包括三部分:关键字catch。括号内一个可能未命名的对象的声明(称作异常声明)以及一个块。
个人理解
可能抛出异常的语句,放置于try块中,try块对应一个子句去处理这个异常。
③函数基础
典型的函数包括返回类型,函数名,形参列表以及函数体。
通过调用运算符来执行函数,形式是一对圆括号,作用于一个表达式,该表达式是函数或者指向函数的指针,圆括号内是实参列表。
调用函数完成两项工作:一是用实参初始化函数对应的参数,二是将控制权转移给被调用函数,此时主函数暂时中断,被调函数开始执行。
1.15 Wednesday
尽量使用常量引用
①数组形参
数组的两个特殊性质对定义和使用作用在数组上的函数有影响,这两个性质分别是:不允许拷贝数组(C++ primer p102)以及使用数组时通常会将其转换成指针。
②含有可变形参的函数
如果实参数量未知但是全部实参的类型相同,可以使用initializer_list类型的形参。
定义时跟Vector差不多,initializer_list对象中的元素永远是常量。
如果想要向initializer_list形参中传递一个值的序列,则必须把序列放在一对花括号中。
#include "pch.h"
#include <iostream>
#include <vector>
using namespace std;
int sum(initializer_list<int>li)//计算元素之和的函数,形参为initializer_list类型。
{
int res=0;
for (auto beg=li.begin();beg!=li.end();beg++ )
{
res += *beg;
}
return res;
}
int main()
{
cout << sum({ 12,42,54,44,55,34 });//调用sum函数 实参必须用花括号扩起。
}
//洋葱骑士
1.16Friday
文件的读写①
如果要把用户数据可以在不同的“会话sesion”累计使用。
为了达到这个目的,要做到:(1)每次执行结束,将用户的姓名及会话的某些数据写入文件,(2)在程序开启另外一个会话时,将数据从文件中读回。
要对文件进行读写操作,首先得包含fstream头文件:
#include
为了打开一个可供输出的文件,我们定义一个ofstream(供输出用的file stream)对象,并将文件名传入:
//以输出模式开启seq_data.txt
ofstream outfile(“seq_data.txt”);
声明outfile的时候,如果文件不存在,便有一个文件被产生出来并且打开供输出使用。如果存在,这个文件被打开用于输出,而原有文件的数据会被丢弃。
如果我们并不希望丢弃原有内容,而是希望将数据增加到该文件中,需要以追加模式打开这个文件,为此我们提供第二个参数ios_base::app给ofstream对象。
//以追加模式(append mode)打开seq_data.txt
//新数据会被加到文件末尾
ofstream outfile(“seq_data.txt”.ios_base::app);
文件有可能打开失败。在进行写入操作之前,我们必须确认文件的确打开成功,方法是检验class object的真伪:
//如果outfile的求值结果为/false’,表示文件未成功打开
if(!outfile)。。。。
例如:
在我的操作系统的桌面创建一个data.txt并写入内容。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ofstream outfile("C:\\Users\\洋葱骑士\\Desktop\\data.txt",ios_base::app);//文件地址
if (!outfile)//检查是否打开成功
cerr << "error!" << endl;
else
{
string stra = "hello "; string strb = "world";//写入文件
outfile << stra<<' ' << strb<<' ' << endl;
cout << "success!";
}
}//洋葱骑士