知识点记录
1. memset-对数组中每一个元素赋相同值
一般来说,对数组中所有元素赋相同值有两种方法:memset()
函数和fill()
函数。(fill函数在STL的algorithm头文件中再了解)
memset()
函数格式为:
memset(数组名,值,sizeof(数组名))
使用memset()
函数需要添加头文件<string.h>。建议只用于赋0或-1,因为是对字节赋值(补码分别为全0和全1,不易错),赋其他值使用fill函数
2. 字符数组
2.1 赋值
两种方法
- 直接使用 char str[15] = {‘A’,‘B’,‘C’…}
- char str[15] = “Good Story!” (仅限初始化赋值使用)
2.2 输入输出
- scanf()和printf()
%c
: 输入单个字符;能够识别空格与换行将其输入;
%s
: 输入一个字符串存进字符数组里;以空格或换行作为字符串的结束;使用%s时,数组名前不需要使用&取地址运算符。
- getchar()和putchar()
单个字符的输入输出
- gets()与puts()
gets()用于输入一行字符串,以换行符\n为输入结束(因此scanf完一个整数猴,如果要使用gets(),需要先用getchar()接受换行符\n),并存入一个一维数组中。puts()输出一个一维数组中的一整行字符串,再跟一个换行。
2.3 存储方式
字符数组的每一位由char类型的元素组成,一维字符数组的末尾都有一个空字符\0.
注1: 结束符\0的ASCII码为0(NULL),占用一个字符位,因此申请的数组大小应至少比字符串长度大1位。
注2: 如果不使用scanf()的%s格式 或 gets()输入字符串(如使用getchar()),应在输入每个字的末尾字符串后加入\0,否则printf()和puts()会因无法识别而乱码。
如
#include<stdio.h>
int main(){
char str[15];
for(int i = 0; i < 3; i++)
str[i] = getchar();
puts(str);
return 0;
}
2.4 string.h 头文件
strlen()
:得到字符串中第一个\0前的字符个数strcmp()
:返回两个字符串大小的比较结果,比较原则是按字典序。格式strcmp(字符数组1,字符数组2)
。strcpy()
:把一个字符串的内容复制给另一个字符串。格式strcpy(字符数组1,字符数组2)
。(2内容给1)strcat()
:把一个字符串接到另一个字符串后面。格式strcat(字符数组1,字符数组2)
。(2接在1后)
2.5 sscsnf()与sprintf()
sscsnf(str,"%d",&n)
:把str中的内容以%d的格式写到n中
sprintf(str,"%d",n)
:把n中的内容以%d的格式写到str字符数组中
2.6 以数组作为函数参数
以数组作为函数参数时,一维数组不用填写长度,二维数组的第二维需要填写长度,实际调用时也只需要填写数组名。
注意:以数组作为参数时,在函数中对数组的修改就等同于对原数组元素的修改。
3. 引用(即别名)
C++中的一种语法,定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用,一旦初始化完成,引用将和它的初始对象一直绑定在一起,因为无法令引用重新绑定到另一个对象,因此引用必须初始化。
- 指针的引用
#include <stdio.h>
void swap(int *&p1, int *&p2){
int *temp = p1;
p1 = p2;
p2 = temp;
}
int main(){
int a = 1, b = 1;
int *p1 = &a, *p2 = &b;
swap(p1,p2);
printf("a = %d, b = %d", *p1, *p2);
return 0;
}
4. 结构体
结构体内可以定义任何除了自己本身的之外的任何数据类型(也包括定义自身类型的指针变量)。
- 结构体的初始化(构造函数)
studentInfo(){}
特点:不需要写返回类型,且函数名与结构体名相同。有了这个构造函数的存在,才可以直接定义studentInfo类型的变量而不进行初始化(因为它没有让用户提供任何初始化参数)
struct studentInfo{
int id;
char gender;
//默认生成的构造函数
studentInfo(){};
}
如果想自己手动提供id和gender的初始化参数,可以像下面这样提供初始化参数来对结构体内的变量进行赋值。
struct studentInfo{
int id;
char gender;
studentInfo(int _id, char _gender){
id = _id;
gender = _gender;
}
}
也可以简化成一行
struct studentInfo{
int id;
char gender;
studentInfo(int _id, char _gender): id(_id), gender(_gender){}
}
这样就可以在需要时直接对结构体变量进行赋值了
studentInfo stu = studentInfo(10086,'M')
注:如果自己重新定义了构造函数,则不能不经初始化就定义结构体变量。就是说默认生成的构造函数"studentInfo(){}"
被覆盖了。为了既能不初始化就能定义结构体变量,可以把"studentInfo(){}"
手动加上。这就意味这,只要参数个数和类型个不完全相同,就可以定义任意多个构造函数,以适应不同的初始化场合。
struct studentInfo{
int id;
char gender;
//用不初始化就定义结构体变量
studentInfo(){}
//只初始化gender
studentInfo(char _gender) {
gender = _gender;
}
//同时初始化id和gender
studentInfo(int _id, char _gender){
id = _id;
gender = _gender;
}
}
- 应用实例
#include <stdio.h>
struct Point{
int x, y;
Point(){}
Point(int _x, int _y): x(_x), y(_y){}
}pt[10];
int main(){
int num = 0;
for(int i = 1; i <= 3; i++){
for(int j = 1; j <= 3; j++)
pt[num++] = Point(i,j);
}
for(int i = 0; i < num; i++)
printf("%d,%d\n", pt[i].x, pt[i].y);
return 0;
}
使用构造函数在结构体内可以元素较多的时候会使代码显得精炼,因为可以不需要临时变量就能初始化一个结构体,而且代码更加工整。
5. cin & cout
cin与cout是C++的输入与输出函数,需要添加头文件#include<iostream>
和 using namespace std;
才能使用。
- cin
不需要指定格式也不需要取地址运算符
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
return 0;
}
也可以同时读入多个变量,往后加>>进行扩展即可。即cin >> n >> db >> c >> str
。
若想读入一整行,需要使用*getline()*函数:
char str[100];
cin.getline(str, 100);
如果是string容器,则需要用如下方式:
string str;
getline(cin, str);
- cout
同时输出不同类型字符
cout << n << db << c << str;
输出的字符之间加入字符或字符串
cout << n << " " << db << "123" << ...;
两种换行方式:"\n" 和 endl
cout << n << "\n" << db << endl;
double类型的精度
#include<iomanip>
cout << setiosflags(ios::fixed) << setprecision(2) << 123.4567 << endl;
除了十分必要的情况下,建议直接使用printf与scanf。
6. 浮点数比较
- 等于:
#include <math.h>
const double eps = 1e-8;
#define Equ(a,b) ((fabs((a)-(b))) < (eps))
- 大于
#include <math.h>
const double eps = 1e-8;
#define More(a, b) (((a)-(b)) > (eps))
- 小于
#include <math.h>
const double eps = 1e-8;
#define Less(a, b) (((a)-(b)) < (-eps))
- 大于等于
#include <math.h>
const double eps = 1e-8;
#define MoreEqu(a, b) (((a)-(b)) > (-eps))
- 小于等于
#include <math.h>
const double eps = 1e-8;
#define LessEqu(a, b) (((a)-(b)) < (eps))
- 圆周率pi
cos(pi) = -1
可知 pi = arccos(-1)
,因此pi可写成
const double pi = acos(-1.0)