| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C语言基础知识(三) -> 正文阅读 |
|
[C++知识库]C语言基础知识(三) |
程序结构设计包括C语言在内的几乎任何编程语言都支持以下三种程序设计结构,它们分别是:
程序设计是什么????????程序设计就是用各种程序设计语言(C、C++、Java、VB、Pascal 等)将算法流程转化为可以被计算机执行的代码的过程。 顺序结构????????顺序结构的程序设计就是把解决问题的过程一步一步由上至下,按顺序编制成可执行代码。 顺序结构程序设计一般由三部分组成:
????????实例 ????????随机产生一个四位数整数。输出整数和其各位数字。 ????????好了咱先把代码搞出来
????????运行结果
1.首先生成一个随机的四位数整数。 ????????rand()函数产生的是一个伪随机数,重复调用该函数所产生的随机数字是相同的。要想每次执行产生不同的随机数,就需要用srand()函数进行随机初始化。 ????????随机初始化函数srand()可以设置随机数生成器的种子,不同的种子将产生不同的随机数。在程序运行过程中时间是一直变化的,所以我们可以借助 time.h 库中的 time(NULL) 函数返回计算机当前的时间数,把它作为随机数生成器的种子,从而在每次执行 rand( ) 函数时产生一个不同的随机数。 ????????将当前时间设置为随机数生成器种子的代码如下:
2.拆分这个四位整数,获得其各位上的数字。 ????????拆分一个数可以利用%和/运算符实现。假设 a、b、c、d 分别表示四位整数 number 的个、十、百、千位上的数,则它们的值可以分别表示为:
????????好了齐活。 选择结构????????选择结构也称分支结构,是一种根据判断条件的成立与否来确定程序执行方向的一种程序设计结构。if 和 else 是两个新的关键字,if 意为如果,else 意为否则,用来对条件进行判断,并根据判断结果执行不同的语句。 ????????C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。 最简单的if语句
????????前置条件:表达式必须要有,表达式外面的()也是必须的。 ????????功能:如果表达式为真就执行语句块,否则就向下执行。 if实例
????????运行结果
????????9>5,表达式为真,所以执行语句块。 语句块????????所谓语句块(Statement Block),就是由{ }包围的一个或多个语句的集合。如果语句块中只有一个语句,也可以省略{} if else语句
????????功能:如果表达式为真就执行语句块1,否则执行语句块2 。 if else实例
????????运行结果
多个if else语句
if else语句的嵌套
switch case语句????????在C语言中,应用条件语句 if-else 可以很方便地使程序实现两个分支,但是如果出现多个分支的情况,虽然可以使用 if-else 语句的嵌套,但是程序会显得比较复杂,不易阅读。 ????????switch 是另外一种选择结构的语句,用来代替简单的、拥有多个分枝的 if else 语句。 基本格式如下:
switch 语句的执行流程????????实例
????????运行结果
循环结构C语言的循环控制结构一般有三种基本形式:
????????while 语句和 do-while 语句可以相互转换。for 循环的循环处理次数比 while 和 do-while 更加简洁,for 循环的执行顺序是先初始化循环变量,再判断条件是否为真,条件为真则执行循环体;执行完毕则改变循环变量,再次对条件进行判断,循环执行直至条件不成立。 循环控制语句循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转。
注意事项:
while 循环????????while 语句适用于当条件成立时重复操作的循环控制结构,因而常被称作当型循环。其一般格式如下:
????????它与 if 语句中的 condition 一样,其外面的括号是必需的。循环体是 while 语句的主体部分,是需要重复操作的一条或多条 C 语句,它包含多条语句时,其外侧必须加上花括号{}。 ????????判断表达式为真执行循环体,否则退出 while 语句,继续执行后续语句。 ????????实例
????????运行结果
当number=5时,结束循环。 do while 循环????????do-while 语句适用于重复操作直到条件不成立为止的循环控制结构,因而常被称作直到型循环。其一般格式如下:
????????特别注意: 和 while 语句不一样的是,要在 do-while 语句 判断表达式 外的括号后面加上分号。 ????????实例
????????运行结果
while语句和do-while语句的互换do-while 语句和 while 语句都擅长于解决循环次数未知的重复操作,但两者在实际应用中还是有区别的:
while和do-while小结左图为while执行过程,右图为do-while执行过程
for循环????????如果已知重复操作的次数,可以使用 for 循环语句,其一般格式如下
????????for 循环中的表达式1(初始化条件)、 表达式2(循环条件) 和 表达式3(自增或自减) 都是可选项,都可以省略(但分号 ;必须保留 )。 ????????实例
????????运行结果
????????结果分析
????????死循环,就是循环条件永远成立,循环会一直进行下去,永不结束。死循环对程序的危害很大,一定要避免。
相当于
for循环语句的嵌套????????如果把一个 for 循环语句放在另一个 for 循环语句的循环体中,就构成了 for 循环的嵌套。其一般格式如下:
????????实例 ????????计算 1+2+3+…+100。
????????运行结果
数组????????在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。 ????????在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。 一维数组????????数组可以看作是一行连续的数据,只有一个下标,称为一维数组。 一维数组的定义????????我们知道,要想把数据放入内存,必须先要分配内存空间。放入4个整数,就得分配4个int类型的内存空间:
????????这样,就在内存中分配了4个int类型的内存空间,共 4×4=16 个字节,并为它们起了一个名字,叫a。 ????????我们把这样的一组数据的集合称为数组(Array),所包含的每一个数据叫做数组元素(Element),所包含的数据的个数称为数组长度(Length),数组中的每个元素都有一个序号,这个序号从0开始,而不是从我们熟悉的1开始,称为下标(Index)。 ????????例如int a[4];就定义了一个长度为4的整型数组,名字是a。a[index]使用数组元素时,指明下标即可,a为数组名称,index 为下标。 接下来我们就把第一行的4个整数放入数组:
????????这里的0、1、2、3就是数组下标,a[0]、a[1]、a[2]、a[3] 就是数组元素。 ????????在学习过程中,我们经常会使用循环结构将数据放入数组中(也就是为数组元素逐个赋值),然后再使用循环结构输出(也就是依次读取数组元素的值),下面我们就来演示一下如何将 1~10 这十个数字放入数组中:
????????运行结果
????????变量 i 既是数组下标,也是循环条件;将数组下标作为循环条件,达到最后一个元素时就结束循环。数组 nums 的最大下标是 9,也就是不能超过 10,所以我们规定循环的条件是 i<10,一旦 i 达到 10 就得结束循环。 ????????最后我们来总结一下数组的定义方式:
????????dataType 为数据类型,arrayName 为数组名称,length 为数组长度。例如:
需要注意的是:
数组内存是连续的????????数组是一个整体,它的内存是连续的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。下图演示了int a[4];在内存中的存储情形: ????????数组内存是连续的这一点很重要,所以我使用了一个大标题来强调。连续的内存为指针操作(通过指针来访问数组元素)和内存处理(整块内存的复制、写入等)提供了便利,这使得数组可以作为缓存(临时存储数据的一块内存)使用。大家暂时可能不理解这句话是什么意思,等后边学了指针和内存自然就明白了。 数组的初始化????????上面的代码是先定义数组再给数组赋值,我们也可以在定义数组的同时赋值,例如:
????????数组元素的值由{}包围,各个值之间以,分隔。 对于数组的初始化需要注意以下几点:
????????表示只给 a[0]~a[4] 5个元素赋值,而后面 5 个元素自动初始化为 0。 ????????当赋值的元素少于数组总体元素的时候,剩余的元素自动初始化为 0: ? ? ? ? 1、对于short、int、long,就是整数 0; ? ? ? ? 2、对于char,就是字符 '\0'; ? ? ? ? 3、 对于float、double,就是小数 0.0。 ????????我们可以通过下面的形式将数组的所有元素初始化为 0:
????????由于剩余的元素会自动初始化为 0,所以只需要给第 0 个元素赋值为 0 即可。
????????而不能写成:
????????相当于
二维数组????????在实际问题中有很多数据是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以确定它在数组中的位置。多维数组可由二维数组类推而得到。 二维数组的定义????????二维数组定义的一般形式是:
????????其中,dataType 为数据类型,arrayName 为数组名,length1 为第一维下标的长度,length2 为第二维下标的长度。 ????????我们可以将二维数组看做一个 Excel 表格,有行有列,length1 表示行数,length2 表示列数,要在二维数组中定位某个元素,必须同时指明行和列。例如:
????????定义了一个 3 行 4 列的二维数组,共有 3×4=12 个元素,数组名为 a,即:
????????如果想表示第 2 行第 1 列的元素,应该写作 a[2][1]。 ????????二维数组在概念上是二维的,但在内存中是连续存放的;换句话说,二维数组的各个元素是相互挨着的,彼此之间没有缝隙。那么,如何在线性内存中存放二维数组呢?有两种方式:
????????在C语言中,二维数组是按行排列的。 也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;每行中的 4 个元素也是依次存放。数组 a 为 int 类型,每个元素占用 4 个字节,整个数组共占用 4×(3×4)=48 个字节。 ????????你可以这样认为,二维数组是由多个长度相同的一维数组构成的。 二维数组的初始化????????二维数组的初始化可以按行分段赋值,也可按行连续赋值。 ????????例如,对于数组 a[5][3],按行分段赋值应该写作:
????????按行连续赋值应该写作:
????????这两种赋初值的结果是完全相同的。 对于二维数组的初始化还要注意以下几点:
????????是对每一行的第一列元素赋值,未赋值的元素的值为 0。赋值后各元素的值为:
????????可以写为:
????????例如,二维数组a[3][4]可分解为三个一维数组,它们的数组名分别为 a[0]、a[1]、a[2]。 ????????这三个一维数组可以直接拿来使用。这三个一维数组都有 4 个元素,比如,一维数组 a[0] 的元素为 a[0][0]、a[0][1]、a[0][2]、a[0][3]。 数组小结
字符数组和字符串????????用来存放字符的数组称为字符数组,例如:
????????字符数组实际上是一系列字符的集合,也就是字符串(String)。在C语言中,没有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串。 ????????C语言规定,可以将字符串直接赋值给字符数组,例如:
????????数组第 0 个元素为's',第 1 个元素为'h',第 2 个元素为'u',后面的元素以此类推。 ????????为了方便,你也可以不指定数组长度,从而写作:
????????给字符数组赋值时,我们通常使用这种写法,将字符串一次性地赋值(可以指明数组长度,也可以不指明),而不是一个字符一个字符地赋值,那样做太麻烦了。 ????????这里需要留意一个坑,字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了。请看下面的例子:
字符串结束标志(划重点)????????字符串是一系列连续的字符的组合,要想在内存中定位一个字符串,除了要知道它的开头,还要知道它的结尾。找到字符串的开头很容易,知道它的名字(字符数组名或者字符串名)就可以;然而,如何找到字符串的结尾呢?C语言的解决方案有点奇妙,或者说有点奇葩。 ????????在C语言中,字符串总是以 '\0' 作为结尾,所以 '\0' 也被称为字符串结束标志,或者字符串结束符。 ????????'\0'是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为空字符。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在C语言中唯一的作用就是作为字符串结束标志。 ????????C语言在处理字符串时,会从前往后逐个扫描字符,一旦遇到'\0'就认为到达了字符串的末尾,就结束处理。'\0'至关重要,没有'\0'就意味着永远也到达不了字符串的结尾。 ????????由" "包围的字符串会自动在末尾添加'\0'。例如,"abc123"从表面看起来只包含了 6 个字符,其实不然,C语言会在最后隐式地添加一个'\0',这个过程是在后台默默地进行的,所以我们感受不到。 ????????需要注意的是,逐个字符地给数组赋值并不会自动添加'\0',例如:
????????数组 str 的长度为 3,而不是 4,因为最后没有'\0'。 ????????当用字符数组存储字符串时,要特别注意'\0',要为'\0'留个位置;这意味着,字符数组的长度至少要比字符串的长度大 1。请看下面的例子:
????????abc123看起来只包含了 6 个字符,我们却将 str 的长度定义为 7,就是为了能够容纳最后的'\0'。如果将 str 的长度定义为 6,它就无法容纳'\0'了。 ????????当字符串长度大于数组长度时,有些较老或者不严格的编译器并不会报错,甚至连警告都没有,这就为以后的错误埋下了伏笔,读者自己要多多注意。 字符串长度????????所谓字符串长度,就是字符串包含了多少个字符(不包括最后的结束符'\0')。例如"abc"的长度是 3,而不是 4。 ????????在C语言中,我们使用string.h头文件中的 strlen() 函数来求字符串的长度,它的用法为:
????????strname 是字符串的名字,或者字符数组的名字;length 是使用 strlen() 后得到的字符串长度,是一个整数。 ????????实例
????????运行结果:
数组元素的查询????????在实际开发中,经常需要查询数组中的元素。不幸的是,C语言标准库没有提供与数组查询相关的函数,所以我们只能自己编写代码。 对无序数组的查询????????所谓无序数组,就是数组元素的排列没有规律。无序数组元素查询的思路也很简单,就是用循环遍历数组中的每个元素,把要查询的值挨个比较一遍。请看下面的代码:
????????运行结果
????????注意:数组下标的取值范围是非负数,当 thisindex >= 0 时,该数字在数组中,当 thisindex < 0 时,该数字不在数组中,所以在定义 thisindex 变量时,必须将其初始化为一个负数。 对有序数组的查询????????查询无序数组需要遍历数组中的所有元素,而查询有序数组只需要遍历其中一部分元素。例如有一个长度为 10 的整型数组,它所包含的元素按照从小到大的顺序(升序)排列,假设比较到第 4 个元素时发现它的值大于输入的数字,那么剩下的 5 个元素就没必要再比较了,肯定也大于输入的数字,这样就减少了循环的次数,提高了执行效率。 请看下面的代码:
????????与前面的代码相比,这段代码的改动很小,只增加了一个判断语句。因为数组元素是升序排列的,所以当 nums[i] > num 时,i 后边的元素也都大于 num 了,num 肯定不在数组中了,就没有必要再继续比较了,终止循环即可。 字符串处理函数????????C语言提供了丰富的字符串处理函数,可以对字符串进行输入、输出、合并、修改、比较、转换、复制、搜索等操作,使用这些现成的函数可以大大减轻我们的编程负担。 ????????string.h是一个专门用来处理字符串的头文件,它包含了很多字符串处理函数。 字符串连接函数 strcat()????????strcat 是 string catenate 的缩写,意思是把两个字符串拼接在一起,语法格式为:
????????arrayName1、arrayName2 为需要拼接的字符串。 ????????strcat() 将把 arrayName2 连接到 arrayName1 后面,并删除原来 arrayName1 最后的结束标志'\0'。这意味着,arrayName1 必须足够长,要能够同时容纳 arrayName1 和 arrayName2,否则会越界(超出范围)。 ????????strcat() 的返回值为 arrayName1 的地址。 ????????请看下面的例子:
????????运行结果
字符串复制函数 strcpy()????????strcpy 是 string copy 的缩写,意思是字符串复制,也即将字符串从一个地方复制到另外一个地方,语法格式为:
????????strcpy() 会把 arrayName2 中的字符串拷贝到 arrayName1 中,字符串结束标志'\0'也一同拷贝。 ????????请看下面的例子:
????????运行结果
????????将 str2 复制到 str1 后,str1 中原来的内容就被覆盖了。 注意: strcat() 要求 arrayName1 要有足够的长度,否则不能全部装入所拷贝的字符串。 字符串比较函数 strcmp()????????strcmp 是 string compare 的缩写,意思是字符串比较,语法格式为:
????????arrayName1 和 arrayName2 是需要比较的两个字符串。 ????????字符本身没有大小之分,strcmp() 以各个字符对应的 ASCII 码值进行比较。strcmp() 从两个字符串的第 0 个字符开始比较,如果它们相等,就继续比较下一个字符,直到遇见不同的字符,或者到字符串的末尾。 返回值:
????????对4组字符串进行比较:
????????运行结果
如有错误,烦请斧正 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 | -2025/4/19 2:01:52- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |