《C语言》教学课件_第1页
《C语言》教学课件_第2页
《C语言》教学课件_第3页
《C语言》教学课件_第4页
《C语言》教学课件_第5页
已阅读5页,还剩357页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章概述第一章概述1.1C语言的起源1.2C语言的特点1.3C语言的简单例子1.4常用的开发环境1.5实战练习本章学习内容1.1C语言的起源机器语言:0、1构成的指令汇编语言:符号/标记语言高级语言:C、C++、Java等1.1C语言的起源A语言CPL语言BCPL语言B语言C语言C语言的发展历史1.2C语言的特点高效性:继承了低级语言的特点,能产生高效的代码可读性:属于高级语言,语法形式和人类语言相似灵活性:丰富的运算符和运算类型功能丰富:丰富的数据结构,指针移植性好:具有良好的移植性1.3C语言的简单例子1#include<stdio.h>23intmain()4{5printf(“HelloC’sworld!\n”);//输出要显示的信息6return0;7}【例1.1】简单的C语言例子1.6常用的开发环境C语言的开发过程1.4常用的开发环境Turbo-CBorlandC++BuilderMicrosoftVisualC++MicrosoftVisualC++.NET1.5实战练习在VisualC++6.0中编写C程序,输出内容:“Hello,C,I’mcoming!”END第2章C语言程序的组成第二章C语言程序的组成2.1进一步认识C语言程序2.2C语言的声明区2.3C语言的主函数2.4函数定义区2.5C语言的注释2.6代码的规范2.7实战练习本章学习内容2.1进一步认识C语言程序#include<stdio.h>#definePI3.14doublecalculateVolume(intheight,intradius);intmain(){intcHeight=0;intcRadius=0;doublevolume;printf(“请输入圆柱体的高度:\n”);scanf(“%d”,&cHeight);【例2.1】给出一个圆周率π,要求在键盘上输入圆柱体的高和底部圆的半径,计算圆柱体的体积,并将计算结果输出printf(“请输入圆柱体底面圆的半径:%n”);scanf(“%d”,&cRadius);volume=calculateVolume(cHeight,cRadius);printf(“圆柱体的体积是:%f\n”,volume);return0;}doublecalculateVolume(intheight,intradius){doubleresult=height*PI*radius*radius;returnresult;}2.1进一步认识C语言程序2.1进一步认识C语言程序C语言程序的组成部分2.2声明区#include 包含头文件例如:#include<stdio.h>C语言标准库2.2.1头文件2.2声明区函数声明的一般形式:返回值类型函数名(参数类型1,参数类型2,……);【注意】参数变量名可以省略函数声明是一条说明语句,必须以分号结束2.2.2函数声明2.2声明区变量声明形式如下:

变量类型名变量名;2.2.3函数声明变量必须先声明后使用声明是在程序编译阶段,告诉编译系统程序使用的变量都有哪些特征:变量名称、类型以及需要分配的内存空间大小等【注意】C语言变量名区分大小写尽量做到见行知义,如height表示高度,radius表示半径先声明后使用2.2声明区例如:#include<stdio.h>intmain(){printf(“未声明的变量var的值为:%d”,var);return0;}编译报错如下:2_2.cpp(4):errorC2065:’var’:undeclaredidentifier2.3主函数每个C语言程序都必须有且仅有一个主函数main()主函数也有函数特征:参数(可以为空)和返回类型(int类型)主函数是C语言的入口函数2.4函数定义区函数定义的一般形式为:

返回类型函数名(参数类型参数名1,…,参数类型参数名n){

函数体;}例如:intfun(intx,inty){return(x+y);}2.5注释C语言的注释以“//”开头,或者注释内容在“/*”和“*/”之间,

注释不参与程序的编译和运行。“//”用于单行注释;“/*”、“*/”用于多行注释,且不允许嵌套例如:/*这样的/*注释*/不正确*/C语言中没有强制规定必须要写注释,为程序添加适当的注释是一个良好的编程规范,方便日后程序的维护2.6代码的规范#include<stdio.h>intmain(){printf(“HelloC’sworld!\n”);return0;}一个说明或一条语句占一行;

合理的使用空白符(空格符、制表符、换行符)例如,下面程序格式就不合理:

2.6代码的规范用“{”、“}”括起来的部分通常是C语言的语句块,通常“{”可以与前一个字符在一行或独占一行;“}”通常也独占一行第一层次的语句通常在高一层次的语句留一个缩进后另起一行书写合理的代码注释格式一:if{//“{”独占一行

语句块;//缩进}//“}”独占一行格式二:if{//“{”与if占一行

语句块;//缩进}//“}”独占一行//“}”独占一行2.7实战练习输入两个整数x和y,输出两个数的和输入两个实数x和y,输入它们的平均数在VisualC++6.0中编写例题2.1,输入圆柱体的高为20,半径为10,计算并输出圆柱体的体积修改例2.2,使它可以正确运行(提示:在printf()函数前加上var的声明语句)END第三章C语言的基本构成元素和数据类型第三章C语言的基本构成元素和数据类型3.1关键字3.2标识符3.3数据类型3.4常量3.5变量3.6变量的存储类别3.7综合运用3.8实战练习本章学习内容3.1关键字autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedstaticsizeofstructswitchtypedefunionunsignedvoidvolatilewhile3.1关键字注意:C语言中,关键字必须是小写字母。定义变量时,关键字不能作为变量名使用,因为它属于C语言的保留字,仅限内部使用。3.2标识符标识符只能是由字母、数字、下划线组成的字符串,而且第一个字符必须是字母或下划线,而不能是数字例如:3count;/*错误,数字开头*/score++;/*错误,包含了+号*/count3;/*正确,字母开头,字母、数字组成*/_score;/*正确,下划线开头,字母、下划线组成*/标识符不能是C语言保留的关键字例如:int/*错误,int是C语言关键字*/Double/*正确,首字母大写,不是关键字*/3.2标识符C语言是区分大小写的,仅大小写不同的字符串代表不同的标识符例如:count,Count/*两个不同的标识符*/标识符命名尽量做到“见行知义”例如:score/*表示分数*/count/*表示数量*/ANSI规定,C语言标识符可以为任意长度,但是最好遵循“min-length&&max-information”原则,考虑到跨平台编译,最好遵守前8字符可以唯一区分的原则(某些编译程序仅能够识别前8字符,如IBMPC的MSC)3.3数据类型3.3数据类型基本数据类型不可以再分解为其他类型:整型、字符型、实型、枚举类型构造数据类型由多种类型组合而成的类型:数组类型、结构体类型和共用体类型指针类型指针类型的值表示某个变量在内存中的地址空类型使用void关键字定义,使用时通常需要强制转换void*memcpy(void*dest,constvoid*src,size_tn);3.4常量整型常量可以是长整型、短整型、有符号整型和无符号整型,使用时通常需要加限制符。常数后面加L修饰,表示长整型;常数后面加U修饰,表示无符号整型。3.4.1整型常量直接使用的整型常数,例如:12,-418等存储单位的相关概念:位、字节、字LongNumber=234L;/*表示长整型*/unsignedNumber=501U;/*表示无符号整型*/unsignedLongNumber=1024LU;/*表示无符号长整型*/3.4.1整型常量整型常量的三种表示形式:八进制形式、十进制形式和十六进制形式八进制形式在常数前加0修饰,数值的每个数码取值为0~703450123十进制形式人们最容易接收的形式,数值的数码取值为:0~9十六进制形式在常数前加0X或0x修饰,数值的数码取值为:0~9、A~F(或a~f),其中A~F(或a~f)分别代表十进制数值:10~153.4.1整型常量计算机中,符号数的三种表示方法:原码、反码和补码原码数值除符号外,对应的二进制数,以数值10为例:反码原码的二进制数按位取反,以数值-10为例:补码计算机中存储的数值方式,整数的补码与原码相同,负数的补码是将该数绝对值的二进制形式按位取反+13.4.2实型常量指数形式一般形式:aEn(其中a、n都是十进制数)表示:a*10n例如:0.11e-1127.154->1.27154e2实型也称为浮点型,由整数部分和小数部分组成,在常量的后面可以使用F(f)修饰,表示float单精度类型;或使用L(l)修饰,表示longfloat长双进度类型在C语言中,实数只采用十进制,有两种表示方法:十进制小数形式、指数形式十进制小数形式也称为科学计数形式,由数码0~9和小数点组成,例如:0.1127.1543.4.3字符常量字符串常量由一对双引号括起来的字符序列,如:“Cprogram”、”Helloworld!”字符串存储字符常量单引号括起来的一个字符,如:’A’、’a’、’$’3.4字符型常量字符常量和字符串常量的区别(1)字符常量由单引号括起来的,字符串常量必须由双引号括起来(2)字符常量只能是单个字符,字符串常量可包括0、1、多个字符(3)字符常量的单个字符只占1个字节,字符串常量占用的内存字节数等于字符串中字符个数+1个字节,因为要包含’\0’字符,例如同样存储字符a,字符常量和字符串常量分别如下:a字符常量字符串常量a\0ASCII码3.4.4转义字符转义字符含义ASCII码\n回车换行10\t横向跳到下一制表位置9\b退格8\r回车13\f走纸换页12\\反斜线符”\”92\’单引号符39\”双引号符34\a鸣铃7\ddd1~3位八进制数所代表的字符\xhh1~2位十六进制数所代表的字符3.5变量变量是指在程序运行期间,其值可以改变的量。一个变量应该有名字,在内存中占据一定大小的存储单元变量必须在使用之前定义3.5.1整型变量类型名称类型说明符所占空间取值范围有符号基本类型[signed]int4-2147483648~2147483647无符号基本类型unsigned[int]40~4294967295有符号短整型[signed]short[int]2-32768~32767无符号短整型unsignedshort[int]20~65535有符号长整型[signed]long[int]4-2147483648~2147483647无符号长整型unsignedlong[int]40~42949672953.5.2实型变量一般占4个字节的内存空间,按指数形式存储例如:3.1415的指数形式为:0.31415e1,在内存中存储如下:3.5.2实型

变量实型变量按照实数的精度可以分为单精度类型、双精度类型和长双精度类型,其中单精度类型可以提供7位有效数字;双精度类型可以提供16位有效数字;长双精度类型可以提供19位有效数字类型名称类型说明符字节数数值范围单精度类型float43.4E-38~3.4E+38(-3.4E+38~-3.4E-38)双精度类型double81.7E-308~1.7E+308(-1.7E+308~-1.7E-308)长双精度类型longdouble161.2E-4932~1.2E+4932(-1.2E+4932~-1.2E-4932)3.5.3字符变量由于字符型变量中存储的是无符号整数,所以可以将字符型变量与整型变量相互赋值,即字符和整数相互使用,在使用中要注意:整数赋给字符时,需要注意可能会引起字符的ASCII码值越界(ASCII码值最大为127)字符型变量用来存储字符常量,类型说明符为char一个字符型变量只能存储一个字符,实际上是将该字符常量的ASCII码值(一个无符号整数)存储到字符变量所占的存储单元字符型变量占1个字节的内存空间,取值范围为:-128~1273.6变量的存储类别变量的存储类别分为:静态存储和动态存储,存储类修饰符则告知编译器需要处理什么类型的变量:自动(auto)、静态(static)、寄存器(register)和外部(extern)变量有不同的存储类别,它由两种方式决定:变量被定义的位置和存储类修饰符3.6.1静态变量与动态存储从变量在程序中的生存期(变量存在的时间)可以将变量分为静态存储和动态存储。静态存储方式是指程序运行期间分配固定的存储空间;而动态存储方式是指在程序运行期间根据需要动态的分配存储空间。通常存储空间可以分为三个部分:程序区、静态存储区和动态存储区。静态存储类别的变量存放在静态存储区,动态存储类别的变量存放在动态存储区。3.6.2auto变量函数或语句块中的局部变量,如果不专门声明为static存储类别,都是动态分配存储空间的,存储在动态存储区中,当函数或语句块结束时,系统自动释放这些变量的存储空间,因此这类局部变量称为自动变量,类别修饰符为auto,所以也称为auto变量3.6.3static变量与auto变量不同,尽管两者的作用域都仅限于声明变量的函数(语句块)中,但static变量将始终保持它的值,并且初始化操作只在第一次执行时起作用,在随后的运行过程中,变量将保持函数(语句块)上一次执行时的值static变量是静态变量,有时希望函数(语句块)中局部变量的值在函数调用结束后可以保留,不会随着变量的自动释放而消失,这时就应该指定局部变量为“静态局部变量”#include<stdio.h>voiddoubleValue(){staticintstaticNum=5;staticNum=staticNum*2;printf(“%d\n”,staticNum);/*输出乘2的结果*/}3.6.3static变量【例3.1】练习使用static变量intmain(){printf(“第一次调用:”);doubleValue();/*调用doubleValue函数*/printf(“第二次调用:”);doubleValue();/*调用doubleValue函数*/return0;}

程序运行输出:第一次调用:10第二次调用:20第六章分支结构程序设计第六章分支结构程序设计6.1if语句6.2条件运算符6.3多重选择——switch语句6.4多分支语句的比较6.5选择结构程序综合运用6.6实战练习本章学习内容第六章分支结构程序设计6.1if语句if语句的第一种基本形式:if(表达式)语句;6.1.1单分支选择结构——if语句6.1if语句例:if(flag)printf(“flagvalueistrue”);if(x==y)printf(“xisequaltoy”);if(x==y){printf(“xisequaltoy”);}注意:if(value){…}if(value==0){…}6.1if语句if...else基本形式:if(表达式)

语句块1;else

语句块2;6.1.2双分支选择结构——if...else语句6.1if语句例:if(flag){printf(“flagvalueistrue”);}else{printf(“flagvalueisfalse”);}6.1if语句注意:else语句不能单独存在,一个else语句必须跟在一个if语句的后面语句块1和语句块2如果是复合语句,必须使用花括号括起来

if(x>0)

x++;/*语句1*/

printf(“x增加1”);/*语句2单独的语句*/

else/*错误*/

pritnf(“x<=0\n”);/*语句3*/6.1if语句6.1.3多分支选择结构——elseif语句形式一般形式为:if(表达式1)

语句1;elseif(表达式2)

语句2;…elseif(表达式n-1)

语句n-1;else

语句n;6.1if语句6.1if语句6.1.4多分支选择结构——if语句的嵌套形式一般形式为:if(表达式1)if(表达式2)

语句1;else

语句2;elseif(表达式3)

语句3;else

语句4;6.1if语句注意:在使用嵌套时,应注意if与else的配对情况,else总是与其上面最近的未配对的if进行配对,例如:if(表达式1)if(表达式2)

语句1;else/*else与表达式2的if语句配对*/

语句2;正确形式为:if(表达式1)if(表达式2)

语句1;else

语句2;6.2条件运算符条件运算符是C语言中唯一的一个三目运算符一般形式为:表达式1?表达式2:表达式3运算规则:如果表达式1的值为真,那么整个条件表达式的值就是表达式2的值;否则整个条件表达式的值就是表达式3的值if(a>b)max=a;elsemax=b;

等价于:max=a>b?a:b;6.2条件运算符注意:条件运算符的运算优先级低于关系运算符和算术运算符,高于赋值运算符max=((a>b)?a:b)等价于max=a>b?a:b;条件运算符中,“?”和”:”是一对运算符,不能分开使用条件运算符具有右结合性,例如:

max=a>b?a:c>d?c:d;

等价于:

max=a>b?a:(c>d?c:d);

6.3多重选择——switch语句6.3.1switch语句的基本形式Switch语句是多分支选择语句,使用switch语句可以提高代码的可读性一般形式为:switch(表达式){case常量表达式1:

语句块1;case常量表达式2:

语句块2;…case常量表达式n:

语句块n;default:

语句n+1;}6.3多重选择——switch语句switch语句的含义:首先计算表达式的值,并将其值逐个与其后的常量表达式相比较,当表达式的值与某个常量表达式的值相等时,执行该分支中的语句块,然后不再进行判断,继续执行后续的case语句和default语句;如果表达式的值与所有的case分支后的常量表达式都不相同,则执行default后的语句块6.3多重选择——switch语句6.3多重选择——switch语句注意:Switch语句中的表达式必须是一个整型表达式,它的类型可以是整型、字符型或枚举类型,其中可以包含运算符和函数调用,而case语句检验的值必须是整型常量,可以是常量表达式或常量运算任意两个case语句不能使用相同的常量值,否则会出现错误;每个switch语句结构中只能有一个default语句;default语句可以省略,各个case和default语句的先后顺序可以变动,对于与所有case常量都不匹配的情况,无论default语句在哪里,最后都会执行default语句每个case语句表示的条件后都必须有一个冒号:在每个case标号后的语句,可以不用大括号括起来,默认它们属于一个语句块;这一点与if语句不同;另外switch语句经常需要与break语句一起使用,如果没有break语句,程序执行对应的case语句后,会顺序执行后续所有语句,直到遇到第一个break语句

6.3多重选择——switch语句6.3.2多路开关模式的switch语句

形式:switch(表达式){case常量表达式1:case常量表达式2:

语句块1;break;case常量表达式3:case常量表达式4:

语句块2;break;…default:

语句n;break;}6.4多分支语句的比较语法比较:if是配合else关键字使用的,switch是配合case使用的;if语句先计算表达式的值,进行判断后进入相应的语句体执行;switch语句是计算出表达式的值,先进入switch语句体,然后判断效率比较:if...else是一个接一个比较,每个条件必须计算一遍,在对少量的条件进行检验时,速度较快;随着嵌套深度的增加检验速度变慢,不容易扩充;switch结构使用BinaryTree算法,对其中每一项case检验速度都是相同的,不管有多少个case,不需要逐个检验适用范围:分支较少时使用if…else,分支在4或4个以上,使用switch6.5选择结构程序综合应用例6.13输入年份,月份,计算当年这个月所包含的天数6.6实战练习1、设计程序,输入三个整数,使用if…else语句,输出最大数2、在第1题中,使用条件运算符来实现3、利用选择结构设计一个程序,使其能计算函数:END第七章循环结构与转移语句第七章循环结构与转移语句7.1循环结构7.2当型循环语句——while语句7.3直到型循环语句——do-while语句7.4for语句7.5循环语句的比较7.6循环的嵌套7.7转向语句7.8综合运用7.9实战练习本章学习内容第七章循环结构与转移语句假设需要计算1+2+3+…+100的和常规定义:intsum;sum=1+2+3+…+100/*C语言没有省略号*/C语言的循环语句用来解决这个问题7.1循环结构

需要重复做有规律的运算,可以使用循环结构特点:在给定条件成立时,反复执行某个语句块,直到条件不成立为止(其中:给定的条件称为循环条件;反复执行的语句块称为循环体)三种循环语句:while语句、do-while语句、for语句7.2当型循环语句——while语句

一般形式:while(表达式){

语句块;}7.2当型循环语句——while语句执行过程:1.计算表达式的值,若表达式的值为非0(逻辑真),执行步骤2;若表达式的值为0(逻辑假),执行步骤42.执行循环体3.转回步骤1,重新执行4.循环结束,执行while循环语句后面的语句7.2当型循环语句——while语句例如:i=0;while(++i<=100){sum+=i;}printf(“sum=%d\n”,sum);7.2当型循环语句——while语句说明:1.while是C语言的关键字,后面的圆括号中的表达式可以是C语言任何合法的表达式,但不能为空2.循环体中的语句可以是空语句、一条语句或多条语句,当循环体中只有一条语句时,可以省略花括号3.无法终止的循环称为死循环,正常情况下,循环体中除了执行语句外,还需要控制循环的值,避免出现死循环4.while语句是先判断后执行,若表达式的值一开始为0,那么循环体一次都不执行7.3直到型循环语句——do-while语句一般形式:do{

循环体语句块;}while(表达式);7.3直到型循环语句——do-while语句执行过程:1.执行do后面的循环体2.计算while后面圆括号内表达式的值,若值为非0(逻辑真),执行步骤1;若值为0(逻辑假),执行步骤33.结束循环,执行do-while之后的语句7.3直到型循环语句——do-while语句例如:i=1;do{sum+=i;}while(++i<=100);printf(“sum=%d\n”,sum);7.3直到型循环语句——do-while语句说明:1.do和while一样,也是C语言关键字,do必须和while联合使用2.while语句圆括号中的表达式,可以是C语言任意合法的表达式3.while语句后面的分号不能省略4.与while语句不同,do-while语句总是先执行一次循环体,无论表达式的值为0还是非0,循环体都至少被执行一次7.4当型循环语句——for语句一般形式:for([表达式1];[表达式2];[表达式3]){

循环体语句;}7.4当型循环语句——for语句执行过程:1.首先计算表达式1的值2.计算表达式2的值;若表达式2的值为非0(逻辑真),执行步骤3;若值为0(逻辑假),执行步骤53.执行for语句的循环体4.计算表达式3的值,执行步骤25.结束循环,执行for语句后的语句7.4当型循环语句——for语句例如:for(i=1;i<=100;i++){sum+=i;}printf(“sum=%d\n”,sum);7.4当型循环语句——for语句说明:1.for是C语言的关键字,表达式1、表达式2和表达式3称为for语句的3个要素,分别对应循环的起点、循环执行条件和循环值的更新。一般形式中的中括号[],代表三个表达式在使用时可以省略2.表达式1给出循环的起始值3.表达式2是循环控制条件,用来决定是否继续执行循环体,一般为关系表达式或逻辑表达式4.表达式3是每次执行循环体后循环变量值的更新语句5.循环体语句可以是空语句、一条语句或语句块7.4当型循环语句——for语句注意:1.省略表达式1、表达式2或表达式3时,要注意它们之间的分号,例如:for(;;)/*合法的for语句,表示无限循环*/2.for语句的执行过程中,表达式1只被计算1次;表达式2和表达式3可能被计算多次;循环体也可能被执行多次,当表达式2的值为0时,循环体一次都不执行7.4当型循环语句——for语句for语句的变体1.for语句中省略表达式1表达式1的作用是对循环变量设置初值,如果省略表达式1,需要在for语句之前就给循环变量赋初值i=1;for(;i<=100;i++){…;}省略表达式1时,表达式1和2之间的分号不能省略!7.4当型循环语句——for语句2.for语句中省略表达式2省略表达式2,不判断循环条件时,for语句会无限执行,使得程序进入死循环为了避免死循环,需要使用转向语句break,后续章节介绍7.4当型循环语句——for语句3.for语句中省略表达式3省略表达式3时,若要保证循环体正常结束,需要在循环体内控制循环变量值的更新for(i=1;i<=100;){sum+=i;i++;}7.4当型循环语句——for语句4.表达式1是与循环变量赋值无关的表达式intsum;inti=1;for(sum=0;i<=100;i++){sum+=i;}7.4当型循环语句——for语句for语句中逗号应用表达式1和表达式3,可以使用逗号表达式for(sum=0,i=1;i<=100;i++){sum+=i;}7.5循环语句的比较1.while语句和do-while语句只在while后面指定循环条件,在循环体中应包含循环趋于结束的语句;for语句可以在表达式3中包含使循环趋于结束的操作,可以在循环体中包含使循环趋于结束的操作2.循环变量的初始化应该在while语句和do-while语句之前完成;for语句可以在之前完成初始化,也可以在表达式1中完成初始化3.while语句和for语句只有在循环条件满足的前提下执行循环体;do-while语句无论循环条件是否满足,都会先执行一次循环体4.三种循环语句都可以使用break语句跳出循环,都可以使用continue语句结束本轮循环剩余语句并执行下一次循环操作7.6循环的嵌套1.while语句中嵌套while语句while(表达式){

语句块:while(表达式){

语句块:}}7.6循环的嵌套2.while语句中嵌套do-while语句while(表达式){

语句块:do{

语句块:}while(表达式);}7.6循环的嵌套3.while语句中嵌套for语句while(表达式){

语句块:for(表达式1;表达式2;表达式3){

语句块;}}7.6循环的嵌套4.do-while语句中嵌套do-while语句do{

语句块:do{

语句块;}while(表达式);}while(表达式);7.6循环的嵌套5.for语句中嵌套for语句for(表达式;表达式;表达式){

语句块:for(表达式;表达式;表达式)}7.7转移语句转向语句又称为转移语句,可以改变程序的执行流程,使程序从其所在的位置转移到另一处执行转移语句包含goto语句、break语句和continue语句其中goto语句是无条件转移语句break语句是终止整个循环,使程序从当前循环退出continue语句只是结束本次循环的剩余语句,转去执行下一轮循环goto语句goto语句是无条件转移语句,可以使程序立即跳转到函数内部的任意一条可执行语句goto语句的一般形式为:goto标识符;例如:gotoflag;printf(“thismessageisnotprint!”);flag:printf(“thismessagewillbeprint!”);7.7转移语句注意:1.goto语句的跳转方向可以是当前位置之前,也可以是当前位置之后;可以跳出一个循环,也可以跳入一个循环2.结构化程序设计不提倡使用goto语句,因为goto语句会使程序的执行流程无规律、可读性差,但也不是绝对禁止使用3.goto语句可以从循环体中跳转到循环体外,甚至一次性跳出多重循环7.7转移语句一般形式:break;例如:while(1){i++;if(i>10)break;}break语句break语句在switch语句中的作用是退出switch语句;在循环语句中是使程序跳出当前循环,执行循环后面的语句注意:break语句不能用于switch语句和循环语句之外的其他任何语句中7.7转移语句continue语句continue语句用于终止本次循环,跳出循环剩余语句,执行下一次循环一般形式:continue;注意:continue语句只结束本次循环,而不是终止整个循环;break语句则是结束整个循环7.7转移语句7.9实战练习1.分别使用while语句、do-while语句和for语句打印大写字母ASCII码2.累加1-100的值,当和超过4000时,使用break语句终止累加,输出结果3.改写例7.2,使用continue语句输出0~100之间不能被3整除的数END第八章数组第八章数组8.1一维数组8.2二维数组8.3多维数组8.4字符数组8.5经典排序算法8.6字符串处理函数8.7数组应用8.8实战练习本章学习内容8.1.1一维数组的定义和引用1.一维数组的定义一般形式:类型说明符数组名[整型常量表达式];例如:inta[10];定义整型数组,数组名a,它包含10个整型元素8.1.1一维数组的定义和引用存储结构:说明:(1)数组中所以的元素类型都是同一类型,即类型说明符所表示的类型(2)数组名属于标识符,必须满足C语言标识符的命名规则(3)“一维”可以理解数组名后中括号数量(4)整型常量表达式必须是一个常量,表示数组元素的个数8.1.1一维数组的定义和引用引用形式:数组名[数组元素下标表达式];例如:inta[10];数组元素的引用:a[0]、a[1]、a[4+1]等说明(1)数组元素下标是指元素在数组中的顺序号,可以是整型变量、整型常量、字符数据或整型表达式(2)数组下标的取值范围为:0~常量表达式的值-1例如:inta[10];那么数组a下标范围为:0~9(3)数组中各个元素的存储空间是连续的(4)数组不能整体引用,只能逐个引用数组元素(5)使用数组时要注意数组下标的引用是否越界8.1.2一维数组的初始化1.在定义数组时直接对数组元素赋初值inta[6]={1,2,3,4,5,6};2.只给一部分元素赋值,未赋值的部分元素值为0inta[6]={1,2,3};3.在对全部数组元素赋初值时可以不指定数组长度inta[]={1,2,3,4};/*数组a的长度是4*/8.2.1二维数组的定义和引用一般形式:类型说明符数组名[常量表达式1][常量表达式2];常量表达式1称为数组的行下标,常量表达式2称为数组列下标,下标都是从0开始计算例如:inta[2][3];有6个元素:a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]8.2.1二维数组的定义和引用存储结构:8.2.1二维数组的定义和引用说明1、二维数组定义时使用两个中括号,如果有二维数组a[n][m],那么二维数组a的行下标范围0~n-1,列下标范围0~m-1,最后一个元素a[n-1][m-1]2、可以把二维数组看作一维数组,每个数组元素又是包含有若干个元素的一维数组8.2.1二维数组的定义和引用引用格式:数组名[行下标表达式][列下标表达式];inta[2][3],i=0,j=0;a[1][2]、a[i][j]、a[i+1][j+1]都是合法的引用a[1.1][2]、a[1][3]、a[0,1]是错误的引用8.2.2二维数组的初始化初始化格式:类型说明符数组名[常量表达式1][常量表达式2]={{值,值,..},{...},...};1.将所有数据写在一个大括号内inta[2][3]={1,2,3,4,5,6};inta[2][3]={1,2,3,4};2.分行给数组元素赋值inta[2][3]={{1,2,3},{4,5,6}};inta[2][3]={{1,2},{4}};8.2.2二维数组的初始化说明一维数组,在数组定义时省略方括号中的常量表达式,通过所赋初值的个数来确定数组的大小二维数组,如果定义时有初始化,只可以省略第一个方括号中的常量表达式,而不能省略第二个方括号中的常量表达式。当省略行下标时,编译系统会将初始化值的个数与列数的商,再向上取整的结果作为二维数组的行数,然后分配存储单元。假设二维数组a的列数为N,初始化值的个数为S,那么该二维数组的行数为:⌈S/N⌉。inta[][3]={1,2,3,4,5,6};由初值个数6,列数3,编译系统会认为数组a的行数是2,即数组a为2行3列的二维数组。8.3多维数组一般形式:类型说明符数组名[常量表达式1][常量表达式2]...[常量表达式n];inta[3][4][5];8.4.1字符数组的定义和引用一般形式:char数组名[常量表达式];例如:chara[5];字符数组的引用使用下标形式:a[0]、a[1]、a[2]、a[3]、a[4]8.4.2字符数组初始化1.定义时使用大括号赋初值chara[5]={‘H’、’e’、’l’、’l’、’o’};2.省略字符数组长度的初始化chara[]={‘H’、’e’、’l’、’l’、’o’};3.直接使用字符串初始化字符数组chara[6]=“Hello”;/*包括字符串结束符’\0’*/8.4.3字符数组的结束标志符——’\0’C语言中,系统会在字符串结尾自动添加字符串结束符’\0’,所以在使用字符数组存储一个字符串时,不能忘记字符串结束符’\0’,特别是在计算字符数组元素个数时,需要在原字符串字符个数的基础上加1chara[5]=“Hello”;/*错误*/8.4.4字符数组的输入和输出1.使用格式符’%c’进行输入和输出printf(“%c”,a[i]);2.使用格式符’%s’进行输入和输出chara[]=“Hello”;printf(“%s”,a);3.字符串输入/输出函数——gets()、puts()8.4.4字符数组的输入和输出注意:(1)使用格式符”%s”输出字符数组时,该字符数组必须包含字符串结束符’\0’(2)使用“%s”输出字符串时,printf()函数中接收的参数是数组名(3)即使数组长度大于字符串实际长度,也只能输出到’\0’为止(4)如果一个字符数组中包含多个’\0’字符,遇到第一个’\0’时输出结束8.5.1选择法排序思想从每次待排序数组中选择一个最小值的数组元素(若是从大到小的排序,每次需要选择最大的数组元素),将这个数组元素的值与最前面第一个还未排序的数组元素的值进行交换,直到整个数组都是已排序的数组元素为止数组元素排序过程a[0]a[1]a[2]a[3]a[4]初值971431第1轮171439第2轮131479第3轮137149第4轮137914结果1479148.5.2冒泡法排序思想每次比较数组中的相邻两个数组元素的值,将较小的数排在较大的数前面(按从小到大的顺序),每一轮排序后,都有一个最小的数放在所有未排序的数前面。数组元素排序过程a[0]a[1]a[2]a[3]a[4]初值971431第1轮197143第2轮139714第3轮137914第4轮137914结果1379148.5.3交换法排序思想将每个数组元素与其后的所有元素一一比较,如果发现符合条件的数则进行交换。假设完成排序的数放在数组前半部分,未排序的放在后半部分,那么每一轮排序,都是用未排序的第一个数a[i]与其后的数一一进行比较,若存在比第一个数的值更小的数,则交换两个数的值,然后继续使用a[i](交换后的)值与后续的进行比较,直到本轮结束,a[i]加入排序完成的元素阵营;直到将所有的元素都完成排序,排序结束8.5数组排序算法过程数组元素排序过程a[0]a[1]a[2]a[3]a[4]初值971431第1轮191473第2轮131497第3轮137149第4轮137914结果1379148.5.4插入法排序思想将待排序的数组分成两部分:前半部分是已排序集合,后半部分是未排序集合,每一轮排序都是从未排序中取出第一个数,插入到前面已排序的集合中,直到所有未排序的元素都插入到排序集合为止数组元素排序过程a[0]a[1]a[2]a[3]a[4]初值971431第1轮791431第2轮791431第3轮379141第4轮137914结果1379148.5.5折半法排序思想又称为快速排序,选择中间值middle(在程序实现时一般选择数组的中间值),然后把比中间值小的数据放在左边,比中间值大的数据放在右边(假设需要按照从小到大的顺序),然后再对两边递归使用这一过程完成排序数组元素排序过程a[0]a[1]a[2]a[3]a[4]初值971431第1轮971314第2轮371914第3轮317914第4轮137914结果1379148.5.6排序算法比较1.选择法排序选择法排序在排序过程中共需要进行n(n-1)/2次比较,互相交换n-1次。选择法排序简单、容易实现,适用于数量较小的排序,但它是不稳定的排序算法,也就是说对应有相同关键字的记录,排序后可能会颠倒次序。2.冒泡法排序在例8.13中,我们使用flag作为判断终止循环的条件,可想而知,冒泡排序最好的情况就是正序,只需要比较一次;最坏的情况是逆序,需要比较n2次,冒泡排序是稳定的排序算法,当待排序列相对有序时,效果较好。3.交换法排序交换法排序是不稳定的排序算法,当待排序列相对有序时效果较好,最坏情况是待排序列逆序。8.5.6排序算法比较4.插入法排序插入法排序需要经过n-1次插入过程,如果数据恰好应该插入本身位置,可节省时间,所以同前面的算法相同,原始数据基本有序,该算法效果较好,它也是稳定的排序算法。5.折半法排序折半法排序对于较大的n时,是速度最快的排序算法;它是不稳定的排序算法,也就是说对应有相同关键字的记录,排序后可能会颠倒次序。综上可知;选择法排序、交换法排序和折半法排序是不稳定的排序算法,冒泡法排序和插入法排序是稳定的排序算法,当n较小、待排序的序列局部或整体有序时,可以使用选择法、冒泡法、交换法、插入法排序,当n较大并对稳定性不作要求时可以选用折半法排序8.6.1字符串复制语法格式:strcpy(目标字符数组名,源字符数组名);功能:把源字符数组中的字符串拷贝到目标字符数组中,字符串结束标志符’\0’也一同拷贝说明1.目标字符数组必须有足够的长度,以便装下源字符数组的字符串和其结束标志符’\0’。2.源字符数组名可以是字符数组名、字符串常量,若是字符串常量,相当于把一个字符串赋予一个字符数组。3.使用strcpy()函数需要包含头文件<string.h>8.6.2字符串连接语法格式:strcat(目标字符数组名,源字符数组名);功能:把源字符数组中的字符串连接到目标字符数组中的字符串结尾,其中目标字符数组中的字符串结束符’\0’被源字符数组中的首字符覆盖,源字符数组中的字符串结束符’\0’作为新串的字符串结束符注意1.使用字符串连接strcat()函数,同样需要包含头文件string.h。2.目标字符数组必须有足够的长度,以便装下目标字符串原有字符(不包括结束标志符’\0’)、源字符数组中的字符和结束标志符’\0’8.6.3字符串比较语法格式:strcmp(字符数组名1,字符数组名2);功能:按照ASCII码顺序比较字符数组名1和字符数组名2中的字符串,并返回两者比较的结果,返回值如下。1.返回值为0:字符串1与字符串2相等;2.返回值为正数:字符串1大于字符串2;3.返回值为负数:字符串1小于字符串2。说明1.使用字符串比较函数strcmp()同样需要包含头文件string.h。2.比较两个字符串时,若出现不同的字符,则以第一个不同的字符的比较结果作为整个字符串比较的结果8.6.4字符串大小写转换语法格式:strupr(字符串);功能:将字符串中的小写字母变成大写字母,其他字符不变语法格式:strlwr(字符串);功能:将字符串中的大写字母变成小写字母,其他字符不变8.6.5获取字符串长度语法格式:strlen(字符串);功能:计算字符串的实际长度(不包括字符串结束标志符’\0’),函数返回值为字符串的实际长度。注意strlen()函数返回的长度不包括字符串结束标志符’\0’8.7实战练习1.练习实现strcpy()函数2.例8.22中,在原字符数组的基础上,反转字符串END第九章函数第9章函数9.1函数概述9.2函数的定义9.3函数的返回语句9.4函数的参数9.5函数的调用9.6内部函数和外部函数9.7局部变量和全局变量9.8C语言库函数9.9实战练习本章学习内容9.1函数概述C语言的基本单位是函数,函数包含程序的可执行代码为了方便编写、调试,将一个程序划分为若干个程序模块,每个程序模块完成一种功能,这些模块就可以分成函数来实现一个源文件通常有一个或多个函数构成,编译系统以文件为单位进行编译,而不是以函数为单位进行编译9.1函数概述

系统函数和用户自定义函数的区别:好比吃饭这件事情,可以自己烧饭,也可以去餐厅点菜吃饭,自己烧饭就相当于用户自定义函数,需要自己动手买菜,洗菜,烧菜;去餐厅点菜吃饭就相当于系统函数,只需要点自己想吃的菜,至于买菜、洗菜、烧菜这些步骤,都有人为你做9.2.1函数定义的形式函数返回值类型函数名(参数列表){

函数体;}函数定义包括函数头和函数体两部分1.函数头(1)函数返回值类型:可以是C语言的某一种数据类型(2)函数名:在程序中必须是唯一的,需要遵循标识符的命名规则(3)参数列表:可以没有参数,也可以有多个参数2.函数体函数体包含函数可执行代码intAdd(inta,intb){...}说明:(1)无参函数:没有参数的函数voidShowMessage(){printf(“Thisisafunctionofshowmessage\n”);}(2)空函数:没有任何内容的函数9.2.1函数定义的形式9.2.2定义与声明声明格式:返回值类型函数名(参数列表);例如:intAdd(inta,intb);说明:(1)声明是一条语句,必须以分号结尾(2)函数声明中,参数列表的参数可以省略参数名(3)函数定义在调用之前,无需先给函数声明9.3函数的返回语句返回语句的形式:return表达式;或return(表达式);形如:return0;return语句的作用:返回语句可以使程序流程立即从所在的函数中退出,返回到调用的程序中去返回语句返回函数的值,调用函数可以使用被调用函数的返回值,执行下面的程序流程9.3函数的返回语句说明(1)返回语句的返回值的类型R必须与函数头中说明的函数返回值类型S一致,或T可以自动转换成的S(2)在一个函数中,返回语句可以有多个,但只有一个被执行(3)void返回类型表示函数没有返回值,可以没有返回语句,或只有return9.4.1形式参数与实际参数形式参数出现在函数的定义中,相当于函数中的变量,在整个函数体内都可以使用,函数体外不能使用实际函数是在主调函数中调用函数时,传入的参数通过函数的调用,将实际参数的值赋给形式参数9.4.1形式参数与实际参数说明(1)形式参数只有在函数调用时才分配内存单元,调用结束后,立即释放所分配的内存单元(2)实参对形参的数据传递是“值传递”,它属于单向传递,只能把实参的值传递给形参,而不能把形参的值传递给实参,若形参的值发生改变,不会影响实参的值9.4.2函数参数的特殊情况——数组当数组作为函数的实参时,只能传递数组的地址,而不能将整个数组的元素传递给函数,此时系统会将指向该数组的第一个元素的指针传递给被调用函数注意:inta[10];a表示整个数组的首地址,也表示数组中第一个元素的地址,即:a与&a[0]等价9.4.2函数参数的特殊情况——数组1.数组元素作为函数实参此时数组元素与普通变量的使用方式一样2.数组名作为函数参数实参和形参都使用数组名3.可变长度数组作为函数参数要注意越界问题4.使用指针作为函数参数9.4.3main()函数的参数格式:intmain(intargc,char*argv[]);9.5.1函数调用的一般方式1.函数语句调用把函数的调用作为独立的一条语句例如:ShowMessage();2.函数表达式调用函数的调用出现在一个表达式中例如:result=sum*Add(x,y);3.函数参数调用函数的调用作为函数的实参例如:result=Add(x,Add(y,z));9.5.2函数的嵌套调用函数的函数体中包含对另一个函数的调用,例如:intadd(inta,intb){return(a+b);}voidPrintResult(inta,intb){printf(“a+b=%d\n”,add(a,b));}9.5.3函数的递归调用一个函数在它的函数体中直接或间接的调用其自身9.6.1内部函数定义一个函数,如果这个函数只能被所在的源文件中的其他函数调用,而不能被其他源文件中的函数调用,这个函数称为内部函数,又称为静态函数。定义内部函数时,使用关键字static修饰static返回值类型函数名(参数列表);说明static关键字的含义不是指存储方式,而是指函数的调用范围只局限于本文件,因此不同源文件中的同名内部函数互不影响9.6.2外部函数外部函数是指该函数可以被其他源文件中的函数调用extern返回值类型函数名(参数列表);例如:externintadd(inta,intb);说明:C语言中,如果在定义时未指明是内部函数还是外部函数,默认是外部函数,所以可以省略extern9.7局部变量和全局变量作用域变量的有效性的范围,例如函数形式参数只有在函数调用期间才分配存储单元,调用结束时立即释放,标明形式参数在函数内才有效,离开该函数就不能被使用了按作用域范围可将变量分为局部变量和全局变量9.7.1局部变量也称为内部变量,通常是在函数的内部定义或语句块内定义,作用域仅限于函数体内或语句块内函数形式参数属于局部变量9.7.1局部变量9.7.1局部变量注意C语言中,位于不同作用域的变量可以使用相同的标识符命名,此时内层作用域中使用的变量将屏蔽外层作用域中的同名变量,直到内层变量的作用域结束为止9.7.2全局变量变量在所有的函数和语句块的外部声明,那么这个变量就是全局变量全局变量属于整个源文件,如果外部文件要使用该全局变量,需要使用extern关键字进行引用,然后才能使用全局变量的作用是函数间数据联系的渠道,由于同一个文件中的所有函数都可以引用该全局变量的值,所以如果一个函数中改变了全局变量的值,其他使用该变量的地方都会使用改变后的值9.8C语言库函数1.adb()函数2.labs()函数3.fabs()函数4.sin()函数5.cos()函数6.tan()函数7.isalpha()函数8.isdigit()函数9.isalnum()函数9.9实战练习1.定义一个标识符为Max()函数,功能是判断两个数的大小,并将较大的整数返回。2.编写函数prime(),判断给定的整数x是否是素数,在主函数输入一个整数,输出是否为素数。3.用递归法反序输出一个正整数的各位数值,如输入4532,输出2354END第十章指针第十章指针10.1指针概述10.2数组与指针10.3指向指针的指针10.4指针变量作函数参数10.5返回指针值的函数和指向函数的指针10.6实战练习本章学习内容10.1.1地址与指针将存储器的一个字节作为一个内存单元,整型占4个字节,所以整型数据占4个内存单元,字符型占1个字节,所以字符型数据占1个内存单元。为每个内存单元编号,根据编号就可以准确找到该内存单元,这个编号就称为地址。将内存比作一个旅馆,内存单元比作旅馆中的房间,那么地址就好比房间的门牌号。指针是一种变量类型,这种变量专门用来存放地址。10.1.1地址与指针例如:inti=2;10.1.2变量与指针变量的地址是变量与指针二者之间连接的纽带指针是指向一个变量的地址一个变量的地址称为该变量的指针存放变量地址的变量就是指针变量指针类型是专门用来存放内存单元地址的变量类型10.1.3指针变量1.一般形式:类型说明符*变量名;“*”表示该变量是一个指针变量变量名是指针变量名类型说明符表示该指针变量所指向的数据类型int*p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论