【算法笔记】第二章-知识点记录

本文总结了C++编程中的基础知识点,包括使用memset为数组赋值、字符数组操作、引用和结构体使用方法、cin与cout输入输出以及浮点数比较技巧等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 输入输出

  1. scanf()和printf()

%c: 输入单个字符;能够识别空格与换行将其输入;
%s: 输入一个字符串存进字符数组里;以空格或换行作为字符串的结束;使用%s时,数组名前不需要使用&取地址运算符

  1. getchar()和putchar()

单个字符的输入输出

  1. 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 头文件

  1. strlen():得到字符串中第一个\0前的字符个数
  2. strcmp():返回两个字符串大小的比较结果,比较原则是按字典序。格式strcmp(字符数组1,字符数组2)
  3. strcpy():把一个字符串的内容复制给另一个字符串。格式strcpy(字符数组1,字符数组2)。(2内容给1)
  4. 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;才能使用。

  1. 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);
  1. 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值