Theni不是素数,程序结束Elset=t+1Untilt>=ii是素数,程序结束使用接近自然语言的形式将整个算法运行过程的结构表述出来。1.3.1C语言发展史1963年,剑桥大学将ALGOL60语言发展成为CPL语言。
1967年,剑桥大学的马丁·理查兹将CPL简化成BCPL语言。
1970年,美国贝尔实验室的肯·汤普森将BCPL修改成“B语言”。1972年,美国贝尔实验室的丹尼斯·里奇在B语言的基础上设计出了C语言。1978年,布赖恩·凯尼汉(BrianW.Kernighan)和丹尼斯·里奇(DennisM.Ritchie)出版了名著《TheCProgrammingLanguage》。1.3.2C语言标准●1989年,ANSI通过的C语言标准ANSIX3.159-1989被称为C89。●1990年,ISO(国际标准化组织)接受C89作为国际标准ISO9899-1990,该标准被称为C90。●1999年,ANSI通过了C99标准,C99标准相对C89做了很多修改。●2011年,ISO和IEC(国际电工委员会)发布C11标准。1.3.3C语言应用领域操作系统应用软件嵌入式游戏开发1.4.1主流开发工具介绍VisualStudioVisualStudio(简称VS)是由微软公司发布的集成开发环境。它包括了整个软件生命周期中所需要的大部分工具。Qt
//使用系统提供的标准输出,
在控制台显示信息
[int]16位(2个字节)0到65535(0
~216-1)int32位(4个字节)0到4294967295(0~232-1)long[int]32位(4个字节)0到4294967295(0~232-1)2.3.1基本类型1、整型整型数据可以被修饰符signed和unsigned修饰。其中,被signed修饰的整型称为有符号的整型,被unsigned修饰的整型称为无符号的整型,它们之间最大的区别是:无符号整型可以存放的正数范围比有符号整型的大一倍。默认情况下,整型数据都是有符号的,因此signed修饰符可以省略。小提示:字节字节(Byte)是计算机存储空间的一种单位,它是内存分配空间的一个基础单位,即内存分配空间至少是1个字节。●
最小的存储单位——位(bit,b);一个二进制数字0或1占一位。●
字节(Byte,B):1B=8bit;一个英文字母占一个字节。●千字节(KiloByte,KB):1KB=1024B。●兆字节(MegaByte,MB):1MB=1024KB。●
吉字节(GigaByte,GB):1GB=1024MB。●
数据类型
成员名1;
成员名2;……
成员名n;};定义共用体类型data:uniondata{
inti;charch;
};2.3.2构造类型共用体变量定义方式:先定义类型再定义变量uniondata{inti;charch;};uniondataa,b;定义类型同时定义变量uniondata{
inti;charch;}a,b;2.3.2构造类型共用体变量定义方式:匿名定义union{inti;charch;}a,b;2.3.2构造类型共用体变量初始化格式:union共用体类型名共用体变量={其中一个成员的类型值};共用体变量名.成员变量=值;在使用第一种方式赋值时,虽然共用体变量初始化时只给一个成员赋值,但是这个成员值必须要使用大括号括起来。2.3.2构造类型定义了共用体变量之后,需要对共用体变量进行初始化,对共用体变量进行初始化时只能对其中一个成员进行初始化。注意2.3.2构造类型共用体成员变量引用:共用体变量.成员名
sizeof运算符:用于求字节数长度2.4.1运算符与表达式的概念表达式:使用运算符将操作数连接而成的式子称为表达式。(1)常量和变量都是表达式,例如,常量3.14、变量i。(2)运算符的类型对应表达式的类型,例如,算术运算符对应算术表达式。(3)每一个表达式都有自己的值,即表达式都有运算结果。2.4.2算术运算符与算术表达式算术运算符用于处理算术运算,它与数学中的算术运算符作用是一样的,但其组成与数学中的算术运算符稍有不同。使用算术运算符连接起来的式子称为算术表达式。2.4.2算术运算符与算术表达式算术运算符运算符运算范例结果+正号+33-负号b=4;-b;-4+加5+510-减6-42*乘3*412/除5/51%
取模7%52++
自增(前)a=2;b=++a;a=3;b=3;++
自增(后)a=2;b=a++;a=3;b=2;--
自减(前)a=2;b=--a;a=1;b=1;--
自减(后)a=2;b=a--;a=1;b=2;2.4.2算术运算符与算术表达式(1)算术运算符遵循“先乘除后加减”原则。(2)自增自减运算符放数据前后,作用顺序不同。(3)整数与浮点数相除会进行隐式转换。(4)取模运算,结果取决于被模数。注意多学一招:运算符的结合性运算符的结合性指同一优先级的运算符在表达式中操作的结合方向,即当一个运算对象两侧运算符的优先级别相同时,运算对象与运算符的结合顺序。大多数运算符结合方向是“自左至右”。2.4.3关系运算符与关系表达式关系运算符用于对两个数据进行比较,其结果是一个逻辑值(“真”或“假”),如“5>3”,其值为“真”。C语言的比较运算中,“真”用非“0”数字来表示,“假”用数字“0”来表示。使用关系运算符连接起来的式子称为关系表达式。关系运算符运算符运算范例结果==相等于4==30!=不等于4!=31<
小于4<30>
//等同于x=x+3;2.4.6条件运算符与表达式条件运算符用于条件判断,符号由:组成,其语法如下:表达式1表达式2:表达式3在条件表达式中,先计算表达式1,若其值为真(非0)则将表达式2的值作为整个表达式的取值,否则(表达式1的值为0)将表达式3的值作为整个条件表达式的取值。2.4.6条件运算符与表达式注意(1)条件运算符是三目运算符。(2)条件运算符“?”和“:”是一对运算符,不能分开单独使用。(3)条件运算符的优先级低于关系运算符与算术运算符,但高于赋值运算符。(4)条件运算符的结合方向自右向左。2.4.7位运算符位运算符是针对二进制数的每一位进行运算的符号,它是专门针对数字0和1进行操作的。位运算符2.4.7位运算符运算符运算范例结果&按位与0&000&101&111&00|按位或0|000|111|111|01~取反~01~10^按位异或0^000^111^101^01<<
左移00000010<<20000100010010011<<201001100>>
右移01100010>>20001100011100010>>2111110002.4.8sizeof运算符sizeof运算符用于获取某一数据或数据类型在内存中所占的字节数。sizeof(数据类型名称)或sizeof(变量名称)2.5运算符优先级在对一些比较复杂的表达式进行运算时,要明确表达式中所有运算符参与运算的先后顺序,我们把这种顺序称作运算符的优先级。运算符优先级2.5运算符优先级优先级运算符1.[]()2++--~!(数据类型)3*/%4+-5<<>>>>>6<><=>=7==!=8&9^10|11&&12||13:(三目运算符)14=*=/=%=+=-=<<=>>=>>>=&=^=|=多学一招:运算符优先级口诀“单算移关与,异或逻条赋”●“单”表示单目运算符:逻辑非(!)、按位取反(~)、自增(++)、自减(--)、取地址(&)、取值(*);●
3.2顺序结构顺序结构:程序中的所有语句都是从上到下逐条执行。3.3选择结构在实际生活中经常需要做出一些判断,如开车来到一个十字路口,需要对红绿灯进行判断,如果是红灯,就停车等候;如果是绿灯,则继续前行。在C语言中也经常需要对一些条件做出判断,C语言中的判断由选择结构语句实现,C语言选择语句可分为if条件语句和switch条件语句。3.3.1if条件语句1、if语句在if语句中,如果满足if后面的条件,就进行相应的处理。3.3.1if条件语句if语句的格式如下:
if(判断条件)
{
执行语句
}3.3.1if条件语句2、if…esle语句if…else语句是指如果满足某种条件,就进行相应的处理,否则就进行另一种处理。3.3.1if条件语句if…else语句的格式如下:if(判断条件){
执行语句1}else{
执行语句2}3.3.1if条件语句3、if…elseif…else语句if…elseif…else语句用于需对多个条件进行判断,进而执行不同操作的情景中。3.3.1if条件语句if…elseif…else语句的格式如下:if(判断条件1){执行语句1}elseif(判断条件2){执行语句2
}
……elseif(判断条件n){执行语句n
}else{执行语句n+1}多学一招:意大利面条式代码过多地使用if语句或if…else…语句会导致代码冗长。if(判断条件1){
执行语句1}if(){
执行语句2}elseif(判断条件2){
if(判断条件3){
执行语句3
if(判断条件4){
执行语句4}}else{
执行语句5}}这样的代码被形象地称之为“意大利面条”,结构复杂、逻辑混乱,不利于阅读与维护。3.3.2switch条件语句switch条件语句也是一种很常用的选择语句,和if条件语句不同,它针对某个表达式的值做出判断,从而决定程序执行哪一段代码。3.3.2switch条件语句switch语法格式:switch(表达式){case目标值1:
执行语句1
break;
case目标值2:
执行语句2
…
case目标值n:
执行语句n
default:
执行语句n+1
while(循环条件){
执行语句}{}中的执行语句被称作循环体,循环体是否执行取决于循环条件,当循环条件的值非0时,循环体就会被执行。循环体执行完毕时会继续判断循环条件,直到循环条件的值为0时,整个循环过程才会结束。3.5.1while循环while循环流程图:3.5.2do…while循环do…while循环语句和while循环语句功能类似,二者的不同之处在于,while语句先判断循环条件,再根据判断结果来决定是否执行大括号中的代码,而do…while循环语句先要执行一次大括号内的代码再判断循环条件。do…while循环语法:do{
执行语句…}while(循环条件);关键字do后面{}中的执行语句是循环体。do…while循环语句将循环条件放在了循环体的后面。这也就意味着,循环体会无条件执行一次,然后再根据循环条件来决定是否继续执行。3.5.2do…while循环do…while循环流程图:3.5.2do…while循环3.5.3for循环for循环通常用于循环次数已知的情况。for(初始化表达式;循环条件;操作表达式){
执行语句}for关键字后面()中包括了初始化表达式、循环条件和操作表达式3部分内容,它们之间用“;”分隔,{}中的执行语句为循环体。for(①;②;③){
④}3.5.3for循环分别用“①”表示初始化表达式、“②”表示循环条件、“③”表示操作表达式、“④”表示循环体,通过序号来分析for循环的执行流程。3.5.3for循环第1步,执行①。第2步,执行②,如果判断条件的值非0,执行第3步;如果判断条件的值为0,退出循环。第3步,执行④。第4步,执行③,然后继续执行第2步。第5步,退出循环。3.5.4循环嵌套在一个循环中再定义一个循环,这样的方式被称做循环嵌套。在C语言中,while、do…while、for循环语句都可以进行嵌套,它们之间也可以互相嵌套。for(初始化表达式;循环条件;操作表达式){
for(初始化表达式;循环条件;操作表达式){
执行语句;
}}3.5.4循环嵌套for循环嵌套是最常用的循环嵌套。3.5.5跳转语句跳转语句用于实现循环执行过程中程序流程的跳转,在C语言中,常用的跳转语句有break语句和continue语句。跳转语句breakcontinue3.5.5跳转语句1、break语句在switch条件语句和循环语句中都可以使用break语句:当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构;当它出现在循环语句中,作用是跳出当前循环语句,执行后面的代码。3.5.5跳转语句2、continue语句continue语句用在循环中,其作用是终止本次循环,接着执行下一次循环。多学一招:goto语句goto语句也是跳转语句,它用于将程序跳转到指定位置。goto语句标记;语句标记是遵循标识符规范的符号,语句标记后跟冒号(:)放在要跳转执行的语句之前,作为goto语句跳转的标识。hello:
数组名[常量表达式];类型说明符表示数组中所有元素的类型,常量表达式指的是数组的长度,也就是数组中存放元素的个数。例如:定义一个可存储5个int类型元素的数组,intarray[5];//数组array,存储int类型数据,大小为54.2.1一维数组的定义与初始化数组初始化的常见的方式有3种:1、直接对数组中的所有元素赋值。inti[5]={1,2,3,4,5};2、只对数组中的一部分元素赋值。inti[5]={1,2,3};3、对数组全部元素赋值,但不指定长度。inti[]={1,2,3,4};数组初始化4.2.1一维数组的定义与初始化(1)数组的下标是用方括号括起来的,而不是圆括号;(2)数组同变量的命名规则相同;(3)数组定义中,常量表达式的值可以是符号常量。注意4.2.2一维数组的访问1、读取指定元素一维数组的元素访问方式如下:数组名[下标];下标指的是数组元素的位置,数组元素的下标是从0开始的。4.2.2一维数组的访问2、遍历一维数组遍历数组使用循环语句实现,以数组的下标作为循环条件,只要数组下标有效就可以获取数组元素。for(i=0;i<10;i++){
printf("x[%d]:%d\n",i,x[i]);}inti=0;while(i<10){printf("x[%d]:%d\n",i,x[i]);i++;}小提示:数组越界数组的下标都有一个范围,即“0~[数组长度-1]”,假设数组的长度为6,其下标范围为0~5。当访问数组中的元素时,下标不能超出这个范围,否则程序会报错。4.2.3数组元素排序1、冒泡排序在冒泡排序的过程中,不断地比较数组中相邻的两个元素,较小者向上浮,较大者往下沉,整个过程和水中气泡上升的原理相似。4.2.3数组元素排序第1步:从第1个元素开始,将相邻的两个元素依次进行比较,直到最后两个元素完成比较。如果前1个元素比后1个元素大,则交换它们的位置。整个过程完成后,数组中最后1个元素自然就是最大值,这样也就完成了第1轮的比较。4.2.3数组元素排序第2步:除了最后1个元素,将剩余的元素继续进行两两比较,过程与第1步相似,这样就可以将数组中第二大的数放在倒数第2个位置。第3步:依次类推,对剩余元素重复以上步骤,直到没有任何一对元素需要比较为止。4.2.3数组元素排序冒泡排序流程图:4.2.3数组元素排序使用冒泡排序对数组{9,8,3,5,2}排序。4.2.3数组元素排序for(i=0;i<5-1;i++)//外层循环控制比较的轮数{
for(j=0;j<5-1-i;j++)//内层循环控制比较的次数
if(arr[j]>arr[j+1]){//如果前面的元素大于后面的元素
temp=arr[j];//就交换两个元素的位置
arr[j]=arr[j+1];
arr[j+1]=temp;
}}}4.2.3数组元素排序2、选择排序选择排序的原理与冒泡排序不同,它是指通过每一趟排序过程中从待排序记录中选择出最大(小)的元素,将其依次放在数组的最前或最后端,来实现数组的排序。接下来,分步骤讲解冒泡排序的整个过程。4.2.3数组元素排序第1步:在数组中选择出最小的元素,将它与0下标元素交换,即放在开头第1位。第2步:除0下标元素外,在剩下的待排序元素中选择出最小的元素,将它与1下标元素交换,即放在第2位。第3步:以此类推,直到完成最后两个元素的排序交换,就完成了升序排列。4.2.3数组元素排序选择排序流程图:4.2.3数组元素排序使用选择排序对数组{9,8,3,5,2}进行排序。4.2.3数组元素排序第1轮:循环找出最小值2,将它与第一个元素9进行交换。第2轮:循环找出剩下的4个元素中最小值3,将它与第二个元素8交换。第3轮:循环找出剩下的3个元素中最小值5,将它与第三个元素8交换。第4轮:对最后两个元素进行比较,比较后发现不需要交换,则排序完成。4.2.3数组元素排序for(i=0;i<5-1;i++){//外层循环控制比较的轮数
min=i;
//暂定i下标处的元素是最小的,用min记录其下标for(j=i+1;j<5;j++)//内层循环在剩下的元素中找出最小的元素{if(x[j]