M78佐菲头像
关注

c语言学习笔记:循环辅助语句与数组

循环辅助语句

 

写循环的时候,有时候不想让它老老实实跑完所有轮次,就需要这几个语句来控制流程:

 

break —— 直接跳出当前整个循环。多层嵌套的话,只跳出它所在的那一层。

 

continue —— 跳过本次循环剩下的部分,直接进入下一轮。遇到continue之后,循环体里它后面的代码就不执行了。

 

return —— 跳出当前函数。如果return写在main函数里,整个程序直接结束。

 

这三个用得挺多的,尤其是break和continue,配合条件判断能省不少事。

 

 

 

数组

 

数组就是用来存一堆相同类型数据的东西,比如存10个学生的成绩,总不能定义10个变量吧。

 

数组的定义和访问

 

定义格式: 类型 数组名[元素个数]; 

 

比如  int a[10];  就是定义了一个能存10个int的数组,占40个字节。

 

访问元素用下标: 数组名[下标] ,下标从0开始,到元素个数减1结束。一定要注意数组越界的问题,访问超出范围的下标是很危险的,可能会把别的数据搞坏。

 

初始化

 

数组不初始化的话,里面存的是随机值。常见的初始化方式:

 

- 全部初始化: int a[5] = {1, 2, 3, 4, 5}; 

- 局部初始化: int a[10] = {1, 2, 3};  —— 前面三个有值,后面自动补0

- 全0初始化: int a[10] = {0};  —— 所有元素都是0

- 省略个数: int a[] = {1, 2, 3};  —— 编译器自动根据初始化值确定个数

 

存储特点

 

数组在内存里是连续存放的,每个元素类型一致,按下标顺序排列。这三个特性(单一性、有序性、连续性)很重要,后面学指针的时候会经常用到。

 

 

 

数组排序

 

排序是数组最常见的操作了,这里记几个基础的排序算法。

 

选择排序

 

思路:每一轮从待排位置往后找,把最小的(升序的话)换到当前位置。

 

时间复杂度O(n²),空间复杂度O(1),不稳定排序。

 

冒泡排序

 

思路:相邻两个数两两比较,大的往后挪,每一趟确定一个最大值。

 

时间复杂度O(n²),空间复杂度O(1),稳定排序。

 

插入排序

 

把数组分成已排序和未排序两部分,每次从未排序部分取一个数,插到已排序部分的合适位置。这个思路比较直观,就像打扑克理牌一样。

 

二分查找

 

这个不是排序算法,但是和有序数组配合使用效率很高。前提是数组必须已经排好序了。

 

思路:每次和中间位置的数比较,大了就去右半边找,小了就去左半边找,每次砍掉一半。

 

时间复杂度O(logn),比遍历查找快得多,数据量大的时候优势特别明显。

 

 

 

字符数组

 

字符数组就是存字符的数组,本质上和普通数组一样,但因为经常用来存字符串,所以单独拿出来说。

 

初始化

 

用字符串字面量初始化的时候,末尾会自动加一个'\0'作为结束标志。这就是为什么"hello"看起来5个字符,实际占6个字节。

 

输入输出

 

输出可以用 printf("%s", str) 或者 puts(str) ,puts会自动换行。

 

输入的话, scanf("%s", str) 遇到空格、tab、回车就停止读了。 gets() 能读整行但是不安全,容易越界,实际开发中尽量少用。

 

常用字符串函数

 

C标准库提供了几个操作字符串的函数,挺实用的:

 

- strlen:计算字符串长度,不包括'\0'

- strcpy:把一个字符串拷贝到另一个字符数组

- strcat:把一个字符串拼接到另一个字符串后面

- strcmp:比较两个字符串的大小

 

这些函数都需要包含 <string.h> 头文件。

 

数组这块内容还是挺多的,排序算法建议自己手写几遍,光看是记不住的。下次再接着记函数的部分。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2401_88406318/article/details/163313708

文章来源crawl

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--