算法笔记-C/C++快速入门

1.C/C++快速入门

stdio->standrad input output

1.1 变量

  • 绝对值在$10^9$范围以内的整数或者说32位整数都可以定义为int型

  • 如果在$10^{18}$范围以内的整数或者说364位整数都可以定义为long long型

  • 碰到浮点型数据都应该使用double来储存,float的有效精度只有6~7位

  • 0~9 -> 48-57

  • A~Z -> 65-90

  • 小写字母比大写字母的ascii码值大32

  • C语言的强制类型转换:(新类型名)变量名

  • 宏定义: #define 标识符 常量/任何语句或片段

  • 两整数相除,结果仍为整数

  • i++ 先使用i再将i加1; ++i先将i+1在使用i

  • 三目运算符: A ? B : C;

  • 位运算符的优先级没有算术运算符高

1.2 顺序结构

  • n/=m+1 等价于 n=n/(m+1)

  • double 输入的格式符为 %lf输出的格式符为 %f

  • 如果输入的是用空格隔开的数字,%d之间可以不加空格

  • 除了%c外,scanf对其他格式符的输入是以空白符(即空格、Tab)为结束判断标志的

  • 常用输出格式

%md -> 可以使不足m为的int型变量以m位进行 右对齐输出,其中高位用 空格补齐, 如果变量本身超过m位,则保持原样
%0md -> 与上面不同的是当变量不足m位时, 高位用0补而不是空格。
%.mf -> 让浮点数保留m为小数输出(如果是四舍五入,那么要用到round函数),因为该保留是“ 四舍六入五成双
  • getchar用来输入单个字符, putchar用来输出单个字符,要注意getchar会接受换行符作为输入

  • typedef long long LL; //给long long 起个别名LL

  • log(double x) 该函数返回double型变量的以自然对数为底的对数

1.3 循环结构

  • 如果文件保存为.cpp文件,那么可以在for循环里面定义临时变量

1.4 数组

  • 数组大小必须是整数常量,不可以是变量

  • 如果想要给整个数组都赋初值0,只需把第一个元素赋为0,或者只用一个大括号来表示,否则数组中的每个元素可能会是一个随机数。

  • 冒泡排序

核心思想: 每一趟通过交换的方式把当前剩余元素的最大值移动到一端,而当剩余元素减少为0时,排序结束
  • 如果数组大小较大(大概$10^6$级别),则需要将其定义在主函数外面。

  • memset ———— memset(数组名, 值, sizeof(数组名));

memset 使用的是 按字节赋值,所以最好 用memset赋0或-1
  • %s 通过空格或者换行来识别一个字符串的结束

  • gets识别换行符\n作为输入结束,因此scanf完一个整数后,如果要使用gets,需要先用getchar接受整数后的换行符。

  • 字符数组的长度一定要比实际存储的字符串的长度至少多1,同时puts和printf就是通过识别\0作为字符串的结尾来输出的。

  • strlen函数可以的到字符数组中第一个\0前的字符的个数。

  • strcpy(dst, scr), strcat(dst, scr)

  • sscanf与sprintf

sscanf(str, "%d", &n); -> 把字符数组str中的内容以"%d"的格式写到n中( 从左到右)
sprintf(str, "%d", n); -> 把n以"%d"的格式写到str字符数组中( 从右到左)
示例:
int n = 233; char str[100]; sprintf(str, "%d", n); printf("%s", str);
输出结果:
233

1.5 函数

  • main函数返回0的意义在于告知系统程序正常终止。

  • 数组作为参数时,在函数中对数组元素的修改就等同于是对原数组元素的修改。

1.6 指针

  • 变量的地址一般指它占用的字节中的第一个字节的地址。

  • C语言中用指针来表示内存地址(或者成指针指向了内存地址),而如果这个内存地址恰好是某个变量的地址,那么又称“这个指针指向该变量”。

  • 指针是一个unsigned类型的整数。

  • 指针变量用来存放指针,如同int型变量用来存放int型常量。

  • int *p1, p2;这种定义中只有p1是 int* 型的,p2是 int 型的。

  • int *p; p 保存地址,*p是这个地址中存放的元素。

对于 int* 型的指针变量p来说, p+1是指p所指的int型变量的下一个int型变量地址,其中跨越了一整个int型(即4Byte)。
  • 对于指针变量来说,把其存储的地址的类型称为基类型

  • C语言中,数组名称也作为数组的首地址使用。

  • 如果指针作为函数参数类型,这时视为把变量的地址传入函数。如果函数中对这个地址中的元素进行改边,原先的数据就会确实地被改变。

交换两个数的错误写法:
void swap(int* a, int* b){ int *temp = a; a = b; b = temp; }
这种写法是错误的,原因在于main函数传给swap函数的" 地址" 其实是一个"无符号整型"的数,其本身也跟普通变量一样只是"值传递",swap函数对地址本身进行修改并不能对main函数里面的地址进行修改,能够使main函数里的数据发生变化的只能是swap函数中对地址指向的数据进行的修改。
正确的写法应该是:
void swap(int* a,int* b){ int temp = *a; *a = *b; *b = temp;
  • C++里面的引用可以达到不使用指针也能修改传入参数。

引用就相当于给原来变量又取了一个别名,同时新旧名字都指向同一个东西,所以对引用变量的操作就是对原变量的操作 ,要注意常量不可使用引用。
引用实例如下:(由于用了C++的语法,因此文件必须保存为.cpp类型)
#include<stdio.h> void change(int& x){ x = 1; } int main(){ int x = 10; change(x); printf("%d\n", x); return 0; }

输出结果:

1
  • 要把引用的&跟取地址的运算符&区分开,引用并不是取地址的意思.(这两个符号虽然一样,但是用法不一样),也可以对指针进行引用,只需要在变量名前加上&即可。

1.7 结构体

  • 结构体里面能够定义自身类型的指针变量,不能定义自身。

  • 访问结构体内的元素:

对于结构体普通变量(struct stu)来说,访问的写法为: stu.id
对于结构体指针变量(struct *p)来说,访问的写法为: (*p).id 或者 p->id
  • 结构体的初始化——使用构造函数进行初始化赋值。

  • 构造函数在结构体内,函数名与结构体名相同且不需要写返回类型。

  • 对于一个结构体,内部会默认生成一个构造函数(但不可见),但这个构造函数里面什么也没有。

  • 也可以自己手动提供内部元素的初始化参数。

struct studentInfo{ int id; char gender; //下面的参数用以对结构体内部变量进行赋值 studentInfo(int _id, char _gender): id(_id),gender(_gender){} //这是对构造函数的简化写法。 //其表示的含义是 : id = _id; gender = _gender; //其中_id与_gender是自己命名的变量名,只要不和已有变量冲突就可以用。 };

这样就可以在需要时直接对结构体变量进行赋值了:

studentInfostu = studentInfo(10086, 'M');

需要注意的是,自己重新定义了构造函数,则不能不经初始化就定义结构体变量。同时只要参数个数和类型不完全相同,就可以定义多个构造函数。

1.8 补充

1.8.1 cin与cout

  • 首先需要添加头文件"#include "和"using namespace std;"才能使用。

1.cin
  • cin的输入不指定格式,也不需要取地址运算符&,直接写变量名就可以。

cin >> n >>db >>c;

// 其中n为int型,db为double型,c为char型

  • 想要读入一整行,则需要使用getline函数:

char str[100];
cin.getline(str, 100);
  • 而如果是string容器,则需要用下面的方式输入:

string str;
getline(cin, str);
2.cout
  • 输出格式跟cin相似,但在输出时各变量中间没有空格或者换行符,需要自行加上去。

cout << n <<"" << db << "" << c; //加上空格

换行符可以用\n来表示或者使用endl来表示换行

cout << n << "\n" << db << endl;
  • cin和cout在输入/输出大量数据的情况下表现非常糟糕,会占用大量时间。

1.8.2 浮点数比较

  • 由于计算机中采用有限位的二进制编码,因此浮点数在计算机中的存储并不总是精确的。

  • 所以对于浮点数的比较,要引入一个区间范围eps,通常eps取$10^{-8}$。

a == b ---------> fabs(a-b) < eps
a > b ---------> a - b > eps

写在最后

以上是我个人在学习算法笔记时对于第一章做的笔记。由于我已经学习过C语言,所以记录的内容是对以前学习的查漏补缺,只是一些知识点记录。以后也会不定时更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 《算法笔记》是由胡凡编写的一本关于算法学习的教材,它最初以C/C++为主要编程语言。这本教材主要面向想要学习算法的初学者,以及希望进一步提升算法能力的人群。 《算法笔记》的内容广泛而且深入,涵盖了很多算法的基础知识和主要思想,如递归、排序、查找、图论、动态规划等。通过学习这本教材,读者可以掌握这些算法的基本原理和实现方法,提高解决实际问题的能力。 该教材有几个特点:首先,它提供了很多例子和习题,帮助读者巩固所学的知识;其次,它介绍了很多常用的数据结构,如数组、链表、栈、队列等,读者可以通过学习这些数据结构更好地理解和应用算法;最后,它还介绍了一些高级主题,如高级数据结构、算法优化等,这些内容对于进一步提升算法水平非常有帮助。 《算法笔记》是一本入门级的教材,因此在阅读时需要一些基本的编程知识和逻辑思维能力。该教材的语言简洁明快,适合作为学习参考书,同时也可以作为算法竞赛的辅助教材。 总而言之,《算法笔记》是一本很好的算法学习教材,它以C/C++为编程语言,全面介绍了算法的基本知识和常用方法,适合想要学习算法的初学者。无论是学术研究还是实际应用,阅读《算法笔记》都能提升算法能力,并为进一步学习和应用算法打下坚实的基础。 ### 回答2: 《算法笔记 胡凡 c/c 快速入门pdf》是一本介绍算法和C/C++编程语言的入门书籍。该书的作者是胡凡,它主要规划了算法的学习路径以及基本的C/C++编程语言。这本书适合初学者快速入门,对于想要系统学习算法和C/C++编程的人来说是一本不错的选择。 这本书的内容非常系统和全面。它以算法和数据结构为基础,包括基本排序、查找、图论等算法的介绍和实践,让读者能够快速掌握这些算法的原理和实现方法。同时,它还介绍了C/C++语言的基础知识和编程技巧,帮助读者理解和运用这些知识。 书中每章都有一些练习题,帮助读者巩固所学的知识。同时,每个章节末尾还提供了一些进阶的题目和参考答案,供读者深入学习和自我检测。这样的设计能够帮助读者更好地理解和掌握所学的内容。 总的来说,《算法笔记 胡凡 c/c 快速入门pdf》是一本很好的算法和C/C++入门书籍。它能够帮助读者快速了解算法和数据结构的基础知识,并学会使用C/C++语言进行编程。无论是对于想要入门算法和C/C++编程的初学者,还是已经有一定基础的读者,这本书都是一个很好的选择。 ### 回答3: 《算法笔记:胡凡C/C++快速入门PDF》是一本很棒的入门算法书籍。这本书主要介绍了常用的数据结构与算法,并通过C/C++语言来实现这些算法。 首先,这本书非常适合算法初学者。它从基础的数据结构开始讲解,如数组、链表、栈和队列,然后逐渐引入更复杂的数据结构,如二叉树、图和堆。此外,书中还介绍了常用的排序和查找算法,如冒泡排序、快速排序、二分查找等。每个算法都配有具体的代码实现和详细的解释,帮助读者理解算法的原理和应用。 其次,这本书的学习资料丰富。书中提供了很多例题和习题,读者可以通过实践来巩固所学的知识。此外,书中还介绍了一些常见的算法优化技巧和设计思路,提供了一些高效解决问题的方法和思考方式。 最后,这本书的编写风格简明易懂。作者通过清晰的语言和简洁的代码,将复杂的算法问题简化为易于理解的部分。不论是对于算法初学者还是对于有一定编程基础的读者,这本书都是一本很好的学习资料。 总而言之,《算法笔记:胡凡C/C++快速入门PDF》是一本很好的入门算法书籍。它适合初学者学习和理解常用的数据结构与算法,通过具体的代码实现和详细的解释帮助读者掌握算法的原理和应用。无论是编程初学者还是有一定基础的读者,都可以从这本书中获得丰富的知识和实践经验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值