C++中级班课堂笔记
1.字符串(添加头文件cstring)
字符串是由数字、字母、下划线或其它符号组成的一串字符, 用双引号括起来.
1.1 定义字符串 利用关键词string即可定义字符串变量,可用于存储一串字符.
string s; //表示定义了一个字符串s
1.2 初始化
字符串初始化与数值型数组初始化没有本质区别.
但它除了可以逐个给数组元素赋予字符外,也可以直接 用字符串对其初始化.
string s="C program";
字符串结束标志:字符串默认以空格符'\0'结束.
1.3 读入字符串
方法一:cin语句 如:cin>>s; //cin不能读入空格
方法二:getline()函数 如:getline(cin,s); //getline()可以读入空格
1.4 计算字符串长度
size()函数
使用方法:int len=字符串名.size(); //len表示字符串长度
字符串默认结束标志'\0'不计入长度
1.5 遍历字符串各个字符
利用字符串名加元素对应下标(下标默认从0开始)进行访问(字符串名[下标]),代码如下: string s; getline(cin,s); int len=s.size(); for (int i=0;i<len;i++){ cout<<s[i]; }
1.6 字符串结束标志
字符串默认以空字符'\0'结束.
1.7 插入函数insert
一般格式:字符串1.insert(pos,字符串2)
函数作用:在字符串1的第pos个字符前,插入字符串2,并返回这个字符串.
1.8 查找函数find
一般格式:字符串1.find(字符串2,pos)
函数作用:在字符串1中从第pos个字符开始寻找字符串2,并返回位置, 如果找不到返回-1,pos可以省略,默认值是0.
注意:使用find函数查找子串但是找不到时,它会返回一个 常数string::npos,但是由于它不一定是个int类型的常量, 所以需要将其强制转换为int类型才能直接输出-1.
2.结构体 结构体(struct)由一系列具有相同类型或不同类型的数据构成的数据集合, 是一种数据结构.
2.1 定义结构体 程序中可在主函数之前定义一个结构体,其一般形式如下所示:
struct 结构体名称{
结构体各成员列表;
};
如定义一个包含学生姓名、学号、语文成绩、数学成绩和英语
成绩的结构体如下图所示: struct student{ string name; //学生姓名 int xuehao; //学生学号 int math; //数学成绩 int chinese; //语文成绩 int english; //英语成绩 };
2.2 定义结构体变量
结构体声明好之后,可像定义整数int、实数double型变量来定义一个结构体变量.
结构体变量的定义有两种形式:
(1)定义结构体类型的时候同时定义变量
struct 结构体名称{ //其中struct是关键字
结构体各成员列表; //可以有多个成员
}结构体变量表; //可以同时定义多个结构体变量,用","隔开
例如:
struct student{
string name;
int chinese,math;
}a; //同时定义了结构体变量a
(2)先定义结构体再定义结构体变量
struct 结构体名称{
结构体各成员列表;
};
结构体名称 结构体变量表; //同样可以同时定义多个结构体变量
例如:
struct student{
string name;
int chinese,math;
};
student a;
//定义一个结构体数组
//student b[100]; 定义了一个可以存储多个学生信息的结构体数组b
2.3 赋值运算符初始化 在程序中可通过赋值运算符给结构体存入数据. 如: struct student1={"张三",20160516,100,94,96}; //表示将第一个学生信息全部初始化为大括号内数据.
2.4 访问数据 可利用结构体变量名、各成员名和成员访问运算符"."进行 访问,其一般形式如下: 结构体变量名.成员名 如: student1.name; //表示访问该学生的姓名 student1.english; //表示访问该学生的英语成绩
2.5 利用cin语句读入数据存入结构体中 利用for循环结合输入语句即可读入数据存入结构体中, 如下所示: student a[105]; //定义可存储105人信息的结构体数组 main(){ int n; //n表示学生人数 cin>>n; //输入学生人数 for(int i=1;i<=n;i++) { cin>>a[i].name>>a[i].math>>a[i].chinese>>a[i].english; a[i].xuehao=i; } }
2.6 输出数据 利用for循环依次访问结构体中各数据并输出,参考程序 如下所示: for(int i=1;i<=n;i++) { cout<<a[i].name<<' '<<a[i].math<<' '<<a[i].chinese<<' '<<a[i].english; }
3.单,多关键字排序
3.1 sort排序函数
sort函数包含在头文件为#include<algorithm>的C++标准库中.
sort函数使用模板:
sort(start,end,排序规则函数);
sort函数有三个参数:
a.第一个是要排序的数组的起始地址.
b.第二个是结束的地址(最后一位要排序的下一位的地址)
c.第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数(结构体数组排序时不可以省略),
此时默认的排序方法是从小到大排序.
cmp原理:从数列中随机取一个值为判断值y,与y前某一值x作比,以return x>y为例:若返
回值为真, 即x>y,则不作改变,若返回值为否,则交换x与y的位置.
例如:
sort(a+1,a+1+n,cmp); //a+1 开始排序的位置, a+1+n 排序结束的位置, cmp 比较函数
bool cmp(stu a, stu b) //比较函数
{
return a.sum > b.sum; //若返回值为真不作改变,若返回值为否,则交换a.sum与b.sum的位置
}
3.2 单关键字排序
针对数据的某一特性进行排序.
cmp()比较函数:作为sort排序函数第三个参数,用于确定排序方式.
如:
bool cmp(student a,student b){//按学生成绩进行排序
return a.score>b.score;//大于表示从大到小排
//小于表示从小到大排 : return a.score<b.score;
}
3.3 多关键字排序
针对数据的某几种特性进行排序,先以主关键字排序,如果主关键字相同则根据次关键字排序...
如:
bool cmp(student a,student b){//将学生成绩按总分高低进行排序,若总分相同则按数学成绩高低排
if (a.score!=b.score){
return a.score>b.score;
}
else{
return a.math>b.math;
}
}
4.文件操作(添加头文件cstdio)
在C++程序中文件操作基本步骤如下:
1)打开文件,将文件指针指向文件,决定打开文件类型;
2)对文件进行读,写操作;
3)在使用完文件后,关闭文件.
freopen()函数是包含在头文件cstdio中的一个库函数,
用于重定向输入输出流,在不改变原始代码的情况下改变输入输出环境.
该命令格式如下:
freopen(要打开的文件名,文件打开模式,文件指针);
说明:
1)要打开的文件名或文件路径需用双引号括起来;
2)常用文件打开模式有r(read)表示以只读方式打开输入文件,
w(write)表示以写入方式打开输出文件,在程序中均需要用双引号括起来;
3)文件指针通常使用标准流文件stdin(标准输入流),stdout(标准输出流),
stderr(标准错误流).
4)写在程序输入输出语句之前.
重定向文件输入:freopen("文件名","r",stdin);
重定向文件输出:freopen("文件名","w",stdout);
使用方法,如:
1)freopen("date.in","r",stdin); //表示使用freopen函数以只读方式打开输入文件date.in.
2) freopen("date.out","w",stdout); //表示使用freopen函数以写入方式打开输出文件date.out.
取整函数
取整函数包含在头文件为#include<cmath>的C++标准库中.
向下取整函数 floor() //如 floor(10.5)==10
向上取整函数 ceil() //如 ceil(10.5)==11
5.自定义函数
5.1 定义函数
定义形式如下:
数据类型 函数名(形参列表){
函数体; //执行语句
}
说明:1)数据类型:函数的数据类型是函数的返回值类型(若数据类型为void,则无返回值);
2)函数名:即该函数的名称,一般根据该函数作用取容易记忆的名称;
3)形参列表:形参列表可以为空,即无参函数,也可以有多个形参,形参间用逗号隔开,
且必须有相应的数据类型.不管有无形参,圆括号均不能省略.
4)函数允许嵌套使用,但不允许嵌套定义.
5.2 调用函数 调用形式如下: 函数名(实参列表); 调用时实参列表中应给出与定义时形参列表个数相同且数据类型相符的实参.
例:自定义函数prime,判断整数n是否是素数.
bool prime(int n){
if (n<2) return false;//返回假 说明不是素数
for (int i=2;i*i<=n;i++){
if (n%i==0){
return false;//若有除了1和n以外的因数 返回假 说明不是素数
}
}
return true;//若无除了1和n以外的因数 返回真 说明是素数
}
6.递归算法 在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法.
基本思想:函数直接或间接调用它自己去解决问题.
递归算法的主要作用就是把复杂的问题分解成简单的问题来求解.
递归两要素:
1)递归边界;
2)递归表达式;
递归算法一般框架:
返回值类型 函数名(形参列表){
if (边界条件){//判断是否到达递归边界
//若到达递归边界则返回相应值
return 相应值;
}
else{//说明未到达递归边界
return 根据递归表达式调用该函数自己继续递归;
}
}
6.枚举算法 按照问题本身的性质,一一列举出该问题的所有可能的解.
基本思路:
1) 确定枚举对象;
2) 分析枚举范围;
3) 判断解的条件;
4) 继续分析并优化算法;
如何优化算法:减少枚举对象,缩小枚举范围,优化判定条件 .
共 3 条回复
........................................................................................
···
牛皮