c++算法学习-1

发布时间:2026/7/16 5:21:32

c++算法学习-1 day11.头文件#include iostream是头文件i-input 输入o-output 输出using namespace std使用std的名字空间 防止一样的名字导致冲突 不知道谁是谁std指的是标准库里面所有的内容例如cin cout 防止与用户创建的cin冲突using namespace std; ps:cout hello endl;等同于std::cout hello std::endl; 指的是std空间里面的cin和endl2.cout和cincout和cin会自动的识别类型cin 标准输入对象 是流提取运算符 cinnum;//输入操作 输入一个整数存放在num中cout 标准输出流对象 是流插入运算符 coutnum; //输出操作 将num中的值打印在屏幕上endl 进行输出换行#include iostream using namespace std; int main() { cout hello word endl; cout 哈哈 endl; return 0; } int main(){ int num; cin num; cout num; return 0; }day21.数据类型int-整形 short [int]端整形 long [int]长整形 long long [int]更长的整形 [int]可以省略float-单精度浮点型 double双精度浮点型 long double更长的双精度浮点型char-字符型 ASCII值a-A32 A97单引号括起来的是a是字符双引号括起来的是abcd是字符串#include iostream using namespace std; main(){ char ch1q; coutch1endl; char ch113; cout ch; return 0; } 输出都是qfloat a5.5 这里会把5.5识别成double 默认小数位double float a5.5f 这样就不会了 double a5.5 √ long double a5.5 √ double a1e5 表示1.0*10^5为100000 double a1e510 表示1.0*10^510为100010 double a1.23e510 表示1.23*10^510为123010布尔类型bool0表示假 非0为真bool flagtrue;真 bool flag1;真 bool flagfalse;假 bool flag0;假2.signed和unsignedsigned有符号 可以表示正负号和unsigned无符号 只有0和正整数修饰字符和整形变量声明为 unsigned 的好处是同样⻓度的内存能够表⽰的最⼤整数值增大了⼀倍。16位的 signed short int 的取值范围是 -32768~32767 最大是32767 而unsigned short int 的取值范围是 0~65535最大值增大到了 65535 。32位的 signed int 的取值范围可以参看 climits 中给出的定义。signed char c; 范围为 -128 到 127 unsigned char c; 范围为 0 到 255 charsigned char 不一定 由编译器决定的 常见的编译器是signed char 0xffffU ⽆符号16位整型的最⼤值 num-10 赋值是相反的 是将-10赋值到num3.数据类型的长度sizeof 是⼀个关键字也是操作符专门是⽤来计算特定数据类型的长度的单位是字节。 sizeof( 类型 ) sizeof 表达式 #include iostream using namespace std; main(){ int a10; coutsizeof aendl; coutsizeof aendl; coutsizeof (int)endl; return 0; } 结果是 4 4 4#include iostream #include climits using namespace std; main(){ coutCHAR_MINendl; coutCHAR_MAX; } 结果 -128 12732位有符号的整形32/84 因此是int4.typedeftypedef 旧类型名 新类型名; typedef unsigned int uint; typedef long long ll; typedef unsigned long long ull; 上⾯代码的意思是将 unsigned int 类型重命名为 uint 使⽤ uint 创建的变量和使⽤ unsigned int 是⼀样的其他⼏个也是⼀样的道理。 uint num1 0; 等价于 unsigned int num1 0; ll num2 0; 等价于 long long num2 0; ull num3 0; 等价于 unsigned long long num3 0;输入整数打印字符 #include iostream using namespace std; int main() { int n 0; cin n; char ch n; cout ch endl; return 0; }#include iostream using namespace std; int main() { char n ; cin n; cout n endl; return 0; } 输入65 出来的是65.变量和常量变量当全局变量和局部变量定义的名字相同的时候局部优先cout::mendl;这个用::输出的是全局变量 就不是优先局部变量了全局变量全局变量通常在定义时就被初始化如果没有明确指定初始值它们通常会被初始化为0。局部变量局部变量通常不会自动初始化。它们需要在使用之前明确地赋值或初始化。如果没有初始化它们的值将是未定义的使用未初始化的局部变量可能会导致不可预测的行为或运行时错误因此局部变量建议初始化。在vs2022里面会直接报错 在devc会随机常量字面常量#define 定义的常量#define 常量名 内容 #include iostream using namespace std; #define M 100 #define CH x #define PI 3.14159 int main() { cout M endl; cout CH endl; cout PI endl; return 0; } 结果 100 x 3.14159const定义的常量const 类型 常量名字 常量值; #include iostream using namespace std; const double PI 3.14159; int main() { int r 0; cin r; cout 周⻓ 2 * PI * r endl; cout ⾯经 PI * r * r endl; PI 3.14; 这种写法是错误的常量不能被修改 return 0; }day31.算术操作符/ 除法的操作符除数不能为0如果除数为0程序会崩溃的。 % 取模操作符的计算结果是两个操作数进⾏除法运算后的余数。 取模操作符的操作数只能是整型不能是浮点型这个编译器会报语法错误的。 #include iostream using namespace std; int main() { int a 7 2; 加法运算 int b 7 - 2; 减法运算 int c 7 * 2; 乘法运算 int d 7 / 2; 除法运算得到的是整除后的商 double d 7 / 2; 除法运算得到的是整除后的商 int e 7 % 2; 取余运算得到的是整除后的余数 cout a endl; cout b endl; cout c endl; cout d endl; cout e endl; return 0; }#include iostream using namespace std; int main() { float x 6 / 4; cout x endl; 1 float y 6.0 / 4; 6/4.0结果是⼀样的 cout y endl; 1.5 return 0; } 1负数也是⽀持取模的但是负数求模结果的正负号由第⼀个运算数操作数的正负号决定。 #include iostream using namespace std; int main() { cout 11 % -5 endl; 1 cout -11 % -5 endl; -1 cout -11 % 5 endl; -1 return 0; }以 char 类型为例 char 的数值范围在 -128 ~ 127 当字符相加超过最⼤值后打印出来的结 果会变成负数这与数据的存储有关 #include iostream using namespace std; int main() { char a Z; char b a Z; 9090180 cout b endl; 输出了不显⽰的内容 printf(%d, b); -76char的⼗进制内容 return 0; }#include iostream using namespace std; int a, b; int main() { cin a b; cout a / b a % b endl; }2.赋值运算符赋值运算符是把右边的值赋值给左边的 int a 3; int b 0; int c 0; c b a 2; 连续赋值从右向左依次赋值的。 5 5 33.类型转换整型提升表达式之中的char和short类型⼀定会先转换成int类型然后参与运算。算术转换表达式中出现下面的任意两种类型的值进行计算的时候要先要将较下面的类型转换成另外⼀种类型才能计算。当int和float进行比较的时候 先将int转换程float long double double float unsigned long int long int unsigned int int#include iostream using namespace std; int main() { //案例1 char a a; int b 10; char c a b; 这⾥a会发⽣整型提升ab的结果存放到c中⼜发⽣截断 int是4字节 而float是1字节 所以保留int的低位的字节放进char //案例2 int c 10; double d 3.14; double e c d; cd的时候这⾥c会发⽣算数转换转换为double类型 return 0; }4.单目操作符和--b(a--) b也是10couta--endl 输出的是10 而不是9day41.getchar 和 putchargetchar() 和 putchar() 是属于 C 语言的库函数C是兼容 C 语言的所以 C 中只要正确包含头⽂件也可以正常使用这两个函数。getcharint getchar ( void ); getchar() 函数返回⽤⼾从键盘输⼊的⼀个字符使⽤时不带有任何参数。 程序运⾏到这个命令就会暂停等待⽤⼾从键盘输⼊等同于使⽤ cin 或 scanf() ⽅法读取⼀个字 符。 它的原型定义在头⽂件 cstdio 。getchar() 不会忽略起⾸的空⽩字符总是返回当前读取的第⼀个字符⽆论是否为空格。 如果读取失败返回常量 EOF 由于 EOF 通常是 -1 所以返回值的类型要设为 int ⽽不是 char 。 #include cstdio #include iostream using namespace std; int main() { int ch; ch getchar(); cout ch endl; cout (char)ch endl; return 0; }回车也会进行读取putcharint putchar( int character ); putchar() 函数将它的参数字符输出到屏幕它的原型定义在头⽂件 cstdio#include cstdio int main() { int ch 0; ch getchar(); putchar(ch); return 0; } 操作成功时 putchar() 返回输出的字符否则返回常量 EOF 。2.scanf和printfprintfint printf ( const char * format, ... ); printf() 的作⽤是将参数⽂本输出到屏幕。 它名字⾥⾯的 f 代表 format 格式化表⽰可以定制输出⽂本的格式。 #include cstdio int main() { printf(Hello World\n); return 0; }占位符printf()可以在输出文本中指定占位符。所谓 “占位符”就是这个位置可以用其他值代入。#include cstdio // 输出 There are 3 apples int main() { printf(There are %d apples\n, 3); return 0; } 上⾯⽰例中 There are %d apples\n 是输出⽂本⾥⾯的 %d 就是占位符表⽰这个位置要 ⽤其他值来替换。占位符的第⼀个字符⼀律为百分号 % 第⼆个字符表⽰占位符的类型 %d 表⽰这 ⾥代⼊的值必须是⼀个整数。 printf() 的第⼆个参数就是替换占位符的值上⾯的例⼦是整数 3 替换 %d 。执⾏后的输出结果 就是 There are 3 apples 。#include cstdio int main() { printf(%s will come tonight\n, zhangsan); return 0; } 上⾯⽰例中 %s 表⽰代⼊的是⼀个字符串所以 printf() 的第⼆个参数就必须是字符串这个例 ⼦是 zhangsan 。执⾏后的输出就是 zhangsan will come tonight 。#include cstdio int main() { printf(%s says it is %d oclock\n, lisi, 21); return 0; } 上⾯⽰例中输出⽂本 %s says it is %d oclock 有两个占位符第⼀个是字符串占位 符 %s 第⼆个是整数占位符 %d 分别对应 printf() 的第⼆个参数 lisi 和第三个参数 21 。执⾏后的输出就是 lisi says it is 21 oclock 。 printf() 参数与占位符是⼀一对应关系如果有 n 个占位符 printf() 的参数就应该有 n 1 个。如果参数个数少于对应的占位符 printf() 可能会输出内存中的任意值。宽度printf() 允许限定占位符的最⼩宽度。 #include cstdio int main() { printf(%5d\n, 123); 输出为 123 return 0; } 上⾯⽰例中 %5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位对应的值的前⾯会添加空格。 输出的值默认是右对⻬即输出内容前⾯会有空格如果希望改成左对⻬在输出内容后⾯添加空 格可以在占位符的 % 的后⾯插⼊⼀个 - 号。 #include cstdio int main() { printf(%-5d\n, 123); 输出为 123 return 0; } 上⾯⽰例中输出内容 123 的后⾯添加了空格。#include cstdio int main() { printf(%12f\n, 123.45); 输出 123.450000 return 0; } 上⾯⽰例中 %12f 表⽰输出的浮点数最少要占据12位。由于⼩数的默认显⽰精度是⼩数点后6位 所以 123.45 输出结果的头部会添加2个空格。scanfint scanf ( const char * format, ... ); scanf() 函数⽤于读取⽤⼾的键盘输⼊。 程序运⾏到 scanf() 这个语句时会停下来等待⽤⼾从键盘输⼊。 ⽤⼾输⼊数据、按下回⻋键后 scanf() 就会处理⽤⼾的输⼊将其存⼊变量。 scanf() 的语法跟 printf() 类似。#include cstdio int main() { int i 0; scanf(%d, i); printf(%d\n, i); return 0; } 它的第⼀个参数是⼀个格式字符串⾥⾯会放置占位符与 printf() 的占位符基本⼀致告诉编 译器如何解读⽤⼾的输⼊需要提取的数据是什么类型。这是因为 C 语⾔的数据都是有类型的 scanf() 必须提前知道⽤⼾输⼊的数据类型才能处理数据。 它的其余参数就是存放⽤⼾输⼊的变量格式字符串⾥⾯有多少个占位符就有多少个变量。 上⾯⽰例中 scanf() 的第⼀个参数 %d 表⽰⽤⼾输⼊的应该是⼀个整数。 %d 就是⼀个占位 符 % 是占位符的标志 d 表⽰整数。第⼆个参数 i 表⽰将⽤⼾从键盘输⼊的整数存⼊变量 i 。#include cstdio int main() { int a, b, c, d; scanf(%d%d%d%d, a, b, c, d); printf(%d %d %d %d\n, a, b, c, d); return 0; }#include cstdio int main() { int i 0; int j 0; float x 0; float y 0; scanf(%d%d%f%f, i, j, x, y); printf(i %d\n, i); printf(j %d\n, j); printf(x %f\n, x); printf(y %f\n, y); return 0; }上面示例中格式字符串 %d%d%f%f 表示用户输⼊的前两个是整数后两个是浮点数。比如键盘输⼊ 1 -20 3.4 -4.0e3 这四个值依次放⼊ i 、 j 、 x 、 y 四个变量。scanf() 处理数值占位符时会自动过滤空白字符包括空格、制表符、换行符等。所以用户输入的数据之间有⼀个或多个空格不影响 scanf() 解读数据。另外用户使用回⻋车键将输入分成几行也不影响解读。#include cstdio int main() { int a, b, c, d; scanf(%d %d %d %d, a, b, c, d); 输入格式是1 2 3 4 这个不对1234 printf(%d %d %d %d\n, a, b, c, d); return 0; } scanf() 处理⽤⼾输⼊的原理是: ⽤⼾的输⼊先放⼊缓存等到按下回⻋键后按照占位符对缓存进⾏解读。解读⽤⼾输⼊ 时会从上⼀次解读遗留的第⼀个字符开始直到读完缓存或者遇到第⼀个不符合条件的 字符为⽌。占位符scanf返回值scanf() 的返回值是⼀个整数表⽰成功读取的变量个数。 如果没有读取任何项或者匹配失败则返回 0 。如果在成功读取任何数据之前发⽣了读取错误或 者遇到读取到⽂件结尾则返回常量 EOF-1。 #include cstdio int main() { int a 0; int b 0; float f 0.0f; int r scanf(%d %d %f, a, b, f); printf(a%d b%d f%f\n, a, b, f); printf(r %d\n, r); return 0; }#includecstdio int main() { int a, b; scanf(%d%d, a, b); printf(%.3lf%%\n, b * 100.0 / a); return 0; } 百分号 % 可以这样输出 printf(%%); 注意a和b的取值范围 百分⽐不是直接b/a是需要乘以100.0的因为需要得到⼩数所以要是⼩数除法 有时候先乘100再除a还是先除a再乘100是有差异的。 ⽐如4/8*100 和 4*100/8 的结果就有差异的。3.cin和coutcincin 和 cout 的输⼊输出⾮常的⽅便不需要⼿动控制格式能够⾃动识别变量类型。 #include iostream using namespace std; int main() { int a; char c; float f; cin a; cin c; cin f; cout 打印结果:endl; cout a endl; cout c endl; cout f endl; return 0; }cin使用细节cin在读取的时候是根据用户的输入从前往后从上往下依次扫描。cin在读取的过程中遇到空格⾃动会跳过所以不要担心在想要的字符前输入空白字符。当一行读取结束的时候会自动换行读取下一行的内容。cin后面不可以跟换行endl、连续输入输出cin 的好处 当输⼊若⼲个变量也就是数据量很少的时候我们就可以通过 把所有的数据⽤⼀⾏ 代码完成接收⽽且⽆需关⼼数据的类型和 scanf 函数⽐起来代码的书写⾮常简洁明了。 cout 的好处 cout 也可以⽤来连续输出多个数值⽽且⽆需考虑数值的类型因为它本⾝会做类型处 理和 printf ⽐起来⽐较⽅便。cout 的格式输出(加餐)控制宽度和填充 (加餐)cout 结合iomanip (IO manipulators)头⽂件中的操纵符可以灵活控制输出格式 setw 设置字段宽度只对紧接着的输出项有效。 setfill 设置填充字符。 #include iostream using namespace std; #include iomanip int main() { int a 123; cout 默认宽度: a endl; cout 宽度设置为10: setw(10) a endl; cout 宽度为10不够时填充*: setw(10) setfill(*) a endl; return 0; }控制数值格式 (加餐)控制整数格式加餐dec 以⼗进制格式显⽰整数默认。 hex 以⼗六进制格式显⽰整数。 oct 以⼋进制格式显⽰整数。 #include iostream using namespace std; #include iomanip int main() { int n 255; cout ⼗进制 : dec n endl; cout ⼗六进制: hex n endl; cout ⼋进制 : oct n endl; return 0; }控制对齐方式加餐left 左对⻬。 right 右对⻬默认。 #include iostream using namespace std; #include iomanip int main() { int n 123; cout 右对⻬: setw(10) right n endl; cout 左对⻬: setw(10) left n endl; return 0; }--------计算三角形面积(sqrt)这⾥给⼤家介绍⼀个库函数 sqrt 这个函数是计算平⽅根的 函数可以计算出参数x的平⽅根然后返回这个函数需要的头⽂件是 cmath 。 double sqrt (double x); float sqrt (float x); long double sqrt (long double x); python是 import math math.sart()#include iostream #include cmath #include iomanip using namespace std; int main() { double a, b, c; cin a b c; double p (a b c) / 2; double area sqrt(p * (p - a) * (p - b) * (p - c)); cout fixed setprecision(1) area endl; return 0; }day51.if-else语句if 和 else的后边是没有分号的if ( 表达式 ) 语句; 表达式成⽴为真则语句执⾏表达式不成⽴为假则语句不执⾏ 0为假⾮0表⽰真也就是表达式的结果如果是 0 则语句不执⾏表达式的结果如果是不是 0 则语句执⾏。输⼊⼀个正整数 n判断 n 是否为奇数 #include iostream using namespace std; int main() { int n 0; cin n; if (n % 2 1) cout n 是奇数 endl; return 0; }输⼊⼀个正整数 n 如果 n 是奇数就打印 奇数 是偶数就打印 偶数 。 这⾥就需要 if...else... 语句了语法形式如下 if ( 表达式 ) 语句1; else 语句2;#include iostream using namespace std; int main() { int n 0; cin n; if (n % 2 1) cout n 是奇数 endl; else cout n 是偶数 endl; return 0; }if / else后边默认只能控制⼀条语句如果需要写多条语句的时候需要使⽤{}#include iostream using namespace std; int main() { int age 0; cin age; if (age 18) { cout 成年 endl; cout 可以谈恋爱了 endl; } else { cout 未成年 endl; cout 不能早恋 endl; } return 0; }嵌套其中橙⾊的部分相当于嵌套在 else 语句中 if...else 语句是在 if 或者 else 中选择执⾏其 中⼀句代码其实 f...else 是⼀条语句那么 形式 1 中橙⾊代码外边的 {} 就可以省略掉就 和 形式 2 ⼀样了。悬空else但是当你去运⾏代码输出的结果是啥都不输出。 这就是悬空 else 的问题如果有多个 if 和 else else 总是跟最接近的 if 匹配。--------绝对值(fabs abs)#include iostream #include cmath using namespace std; int main() { float n 0; scanf(%f, n); n fabs(n); printf(%.2f\n, n); return 0; }2.关系表达式相等运算符与赋值运算符是两个不⼀样的运算符不要混淆。连续比较浮点数比较相等这时候就要允许有误差存在常见的写法如下#include iostream using namespace std; int main() { double a 0.1; double b 0.2; double c 0.3; if (fabs((a b) - c) 1e-9) 1e-9 表⽰允许的误差范围 cout a b 约等于 c endl; else cout a b 不等于 c endl; return 0; }3.条件操作符三目操作符a 单目运算符 ab 双目运算符 exp1 ? exp2 : exp3 条件操作符的计算逻辑是如果 exp1 为真 exp2 计算 exp2 计算的结果是整个表达式的结 果如果 exp1 为假 exp3 计算 exp3 计算的结果是整个表达式的结果。 这种三⽬操作符和 if 语句的逻辑⾮常相似就是根据 exp1 的结果来选择执⾏ exp2 或者 exp3 。⼀般使⽤在简单的逻辑判断中。4.逻辑操作符短路数的性质#include iostream using namespace std; int main() { int x 0; cin x; if (x % 2 0 (x 4 x 12)) 同时满⾜的情况 cout 1; else cout 0; if (x % 2 0 || (x 4 x 12)) ⾄少满⾜⼀种情况 cout 1; else cout 0; if ((x % 2 0) (x 4 x 12) 1) 只满⾜⼀种情况 cout 1; else cout 0; if ((x % 2 0) (x 4 x 12) 0) ⼀种情况都不满⾜ cout 1; else cout 0; return 0; }day61.switch 语句除了 if 语句外C语⾔还提供了 switch 语句来实现分⽀结构。 switch 语句是⼀种特殊形式的 if...else 结构⽤于判断条件有多个结果的情况。它把多重 的 else if 改成更易⽤、可读性更好的形式 switch (expression) { switch 后的 expression 必须是整型表达式。 case value1: statement case 后的值必须是整形常量表达式。 case value2: statement default: statement } 上⾯代码中根据表达式 expression 不同的值执⾏相应的 case 分⽀。如果找不到对应的值 就执⾏ default 分⽀。#include stdio.h int main() { int n 0; scanf(%d, n); switch (n % 3) { case 0: cout 余数为0 endl; case 1: cout 余数是1 endl; case 2: cout 余数是2 endl; } return 0; } 上述的代码中我们要注意的点有 case 和后边的数字之间必须有空格switch语句中的breakswitch 语句分⽀语句在 switch 语句中 case 语句决定了分⽀的⼊⼝⽽ break 才是决定 分⽀出⼝的所以当⼀条 case 语句执⾏结束后如果没有遇到 break 语句就会继续往下执⾏⽽ 只有遇到 break 才会跳出 switch 语句。switch语句中的defaultswitch 后边的 expression 的结果不是 value1 也不是 value2 的时候就会执⾏ default ⼦句。 在 switch 语句中 case ⼦句和 default ⼦句有要求顺序吗 default 只能放在最后吗 其实在 switch 语句中 case 语句和 default 语句是没有顺序要求的只要你的顺序是满⾜实 际需求的就可以。不过我们通常是把 default ⼦句放在最后处理的。scanf的%4d%2d当输入202601的时候 year将是2026 month是012.while循环⾸先上来就是执⾏判断表达式表达式的值为 0 循环直接结束表达式的值不为 0 则执⾏循环语 句语句执⾏完后再继续判断是否进⾏下⼀次判断。 #include iostream using namespace std; int main() { int i 1; while (i 10) { cout i ; i i1; } return 0; }反向输出每⼀位#include iostream using namespace std; int main() { int n 0; cin n; while (n) { cout n % 10; n / 10; } return 0; }角谷猜想3.n--和--n的循环while中n--循环n次 --n循环n-1次但是在for循环里面都一样 都是n次day71.for循环表达式1只执行1次for循环的表达式1int i 在外面的时候可以在全局用 而在for里面就不能全局用鸡尾酒疗法--------取整(ceil和floor函数)double d6.5; int q(int)d; double pd-p; 6.5-60.5 if(p0.0) (int)(d1) else (int)d 向上取整--------pow函数pow(x,y)指的是x的y次方2.do-while循环⼀般 do while 使⽤在循环体⾄少被执⾏⼀次的场景下所以较少⼀些。计算位数day81.break和continuebreak 的作⽤是⽤于永久的终⽌循环只要 break 被执⾏直接就会跳出循环继续往后执 ⾏。 continue 的作⽤是跳过本次循环 continue 后边的代码在 for 循环和 while 循环中有所 差异的。 注意 break 和 continue 在各个循环语句中的使⽤⽅式基本相同2.循环嵌套打印空心或者实心矩形简化的第n小素数水仙花数

相关新闻