2.52k likes | 2.65k Views
课程教学内容 第 1 章 C 语言概述 第 2 章 C 语言程序基础 第 3 章 程序控制结构 第 4 章 数组 第 5 章 函数(递归难) 第 6 章 复杂数据类型 第 7 章 链表和树 (难). 第一章 C 语言概述 本章重点 ①程序与算法的关系及算法描述工具 ②编写 C 程序的过程 ③ C 程序的基本结构和组成 ④ C 程序的编程风格. 1 . 1 初步认识简单的 C 程序 1 . 1 . 1 实例 【 例 1.1】 下列程序的功能是什么? #define PI 3.14159 // 编译预处理命令
E N D
课程教学内容 • 第1章 C语言概述 • 第2章 C语言程序基础 • 第3章 程序控制结构 • 第4章 数组 • 第5章 函数(递归难) • 第6章 复杂数据类型 • 第7章 链表和树 (难)
第一章 C语言概述 • 本章重点 • ①程序与算法的关系及算法描述工具 • ②编写C程序的过程 • ③ C程序的基本结构和组成 • ④ C程序的编程风格
1.1初步认识简单的C程序 • 1.1.1 实例 • 【例1.1】下列程序的功能是什么? • #define PI 3.14159 // 编译预处理命令 • #include "stdio.h" // 编译预处理命令 • void main() //主函数 • { double r,c,s; //变量类型定义 • printf("请输入圆的半径:");//输入提示 • scanf("%lf",&r); //输入圆的半径 • c=2*PI*r; //计算? • s=PI*r*r; //计算? • printf(“圆的周长是:%f\n”,c); //输出? • printf(“圆的面积是:%f\n”,s); //输出? • }
【例1.2】下列程序的功能是什么? • #include "stdio.h" /* 编译预处理命令*/ • int min(int m,int n)/*自定义函数*/ • { int z;/*定义变量*/ • if(m>n) z=n;/*分支结构*/ • else z=m; • return(z);/*返回值*/ • } • void main() //主函数 • { int x,y; //定义变量 • scanf("%d,%d",&x,&y);//输入两个整数 • y=min(x,y);//调用max函数后返回最大值 • printf("min=%d\n", y);//输出最大值 • }
1.1.2 C程序的构成 • (1)一个C程序是由一个或多个函数构成,但有且仅有一个主函数。因此,函数是C程序的基本语法单位。每个函数中又可调用系统中提供的库函数,也可以是用户自己定义的函数。这一特点,使得C程序更容易实现模块化。因此一个简单C程序的基本结构为: 预编译命令 若干函数
(2) 一个函数由两部分组成。即函数的首部和函数体, • 如主函数的首部为 :void main( ) • 而自定义函数的首部为:int min(int m,int n ) • 函数体包括声明部分和执行部分,用大括号{ }括起来构成一 • 个整体。声明部分是用来定义程序中所用到的变量和对所调用函数 • 的声明。 • 变量的定义是对数据的描述。 • 如:int z; 定义一个整型变量z。 • void main() //主函数 • { int min(int m,int n) ;//函数声明 • int x,y; //定义变量 • scanf("%d,%d",&x,&y);//输入两个整数 • y=min(x,y);//调用max函数后返回最大值 • printf("min=%d\n", y);//输出最大值 • } • 执行部分是对操作的描述,也就是算法的描述。
(3) C程序书写格式自由,一行内可以写几个语句, 一个语句可以分写在多行上。 • (4) C程序总是从main函数开始执行的,与main函数的位置无关。在【例1.2】中也可将自定义函数min放在主函数main之后,此时应该在主函数的声明部分增加函数的原型声明。 • (5) 每个语句和数据声明的最后必须有一个分号。
1.1.3算术表达式、赋值表达式、关系表达式及表达式语句的初步认识1.1.3算术表达式、赋值表达式、关系表达式及表达式语句的初步认识 • 由+(加)、—(减)、*(乘)、/(除)、 %(求余)等算术运算符与运算对象组成的表达式,称为算术表达式,这些运算符的优先级次序为:优先级最高是*、%、/,然后是+、-.如: 2/5的值为0,2.0/5的值为0.4,2%5的值是2,3%5*2-2/5+2.0/5的值是6.4。 • 由赋值符号(如“=”)构成的表达式,称为赋值表达式。如赋值表达式x=(-b+sqrt(b*b-4*a*c))/(2*a)的作用是将赋值“=”右边表达式的值赋给x。 • 由大于(>)、小于(<)、大于等于(>=)、小于等于( <=)、 等于(==)和不等(!=)等关系运算符与运算对象组成的式子,称为关系表达式。其中>、<、>=、<=优先级高于==、!=。如x>=3表示x大于或等于3,若x的值为21,则结果为真(用1表示)。
1.1.4 输入输出函数的初步认识 • 格式输入函数sanf的一般形式: scanf(“格式控制”, 输出表列); ①格式说明符:以%开头; ②普通字符(含转义字符):原样输入。 用“,”间隔变量地址表 例如:scanf("%d,%d",&x,&y);
printf(“格式控制”, 输出表列); ①格式说明符:以%开头; ②普通字符(含转义字符):原样输出。 用“,”间隔 表达式、常量和变量 • 格式输出函数printf的一般形式: 转义字符见2.2表2-3。 例如:printf("min=%d\n", y);
1.1.5预处理命令的初步认识 • 在C语言中,将程序的编译过程分为预处理和正式编译两个阶段。预处理阶段的任务是把C程序中的以“#”开头的命令按照各自的功能进行处理。即用#include命令中头文件的实际代码替代该命令,用#define命令所指定的字符串替代程序中所有符号常量,经过预处理之后的C程序不再含有“#”开头的命令。正式编译阶段的任务是对经过预处理之后的代码进行语法和词法分析、生成中间代码、优化代码,最终生成目标代码程序。
1.1.6变量与数据类型的初步认识 • 在程序执行过程中,其值可以改变的量称为变量。为区别不同的变量,每个变量都有名字,这个名字叫变量名。变量名是按照标识符的命名规则取名。 • 所谓标识符就是用来对变量、宏名、函数、数组等数据对象命名的有效字符序列。C语言的标识符必须是以字母或下划线开头,由字母、数字和下划线组成的字符序列。 • 例如:sum,_total, month, Student_name,lotus_1_2_3,BASIC, li_ling是正确的标识符, • 而M.D.John, $123,3D64,a>b是不正确的标识符。
在C程序中所有的变量都必须遵循“先定义后使用”的原则,即任何变量都必须属于某数据类型,其中作用是为程序中的变量分配存储单元,并决定数据的存放形式。在C程序中所有的变量都必须遵循“先定义后使用”的原则,即任何变量都必须属于某数据类型,其中作用是为程序中的变量分配存储单元,并决定数据的存放形式。 • 变量定义的一般格式为: • 类型名称 变量名列表;
选择描述方法 利用C语言描述算法中的操作 分析问题 构建算法 描述算法 根据C程序结构完整C程序代码 编写C程序步骤 • 1.2 初写简单的C程序 • 1.2.1编写一个简单C程序的步骤 • 通过对C程序的模仿、改写、调试,也许能够逐步读懂简单C程序,在此基础上,可按照如图所示的步骤来编写C程序。
1.2.2简单C程序编写实例 • 【例1.3】若含Fe2O3 75%的赤铁矿石为x吨,可炼出含杂质4%的生铁为y吨,编写程序完成其功能。 • 〖问题分析〗 • 由题意:x吨赤铁矿石中含纯Fe2O3的质量为:x吨×75% • 根据化学方程式: • 高温 • Fe2O3+3CO==== 2Fe+3CO2 • 160112 • x吨×75%(1-4%)y • 由此可得到方程式:160*(1-4%)*y=112*x*75%
〖算法描述〗 • 算法描述方法很多,常用的有自然语言、流程图、N-S图等描述方法。例1.3的算法可描述为: • 〖描述方法1〗用自然语言表示 • 步骤1:输入含Fe2O3 75%的赤铁矿石的质量x。 • 步骤2:按照公式计算y的值。 • 步骤3:输出可炼出含杂质4%的生铁质量y的值。
开始 输入x 根据公式计算y 输出y 结束 流程图 • 〖描述方法2〗 用流程图表示如图所示。
〖描述方法3〗用N-S流程图如图所示。 N-S流程图
1.2.3 算法及描述方法 • 1.算法的概念及特征 • 要编写一个问题的程序,必须首先构建该问题的算法。所谓算法(Algorithm)就是对解决某问题所采用的方法和步骤的描述。
【例1.6】输入3个数,找出其中的最大值并输出。【例1.6】输入3个数,找出其中的最大值并输出。 • 分析:假如这三个数分别用a,b,c表示,其中的最大值用max表示。由于计算机一次只能比较两个数,我们首先可以将a和b进行比较,把其中大的数放入max中,再将max与c比较,又将大的数放入max中。最后将max输出,此时max中的值就是a,b,c中的最大值。由此可以将求解这一问题的算法描述为: • 第1步:输入a,b,c。 • 第2步:a,b中大的一个数放入max中。 • 第3步:将c与max中大的数放入max中。 • 第4步:输出max。
开始 输入a,b,c 输入a,b,c 将a,b中大的数放在ma中 将c,max中大的数放在max 输出max 将a,b中大的数放在max中 将c,max中大的数放在max中 输出max (b) 结束 (a) 图1.18 求三个数最大值的算法流程图
2.三种基本结构的表示 • 1966年,Bohra和Jacopini提出了程序的三种基本结构:顺序结构、选择(或分支)结构、循环结构,它们构成了实现一个算法的基本单元。
顺序结构 • 顺序结构是一种最基本、最简单的程序结构。如图所示,先执行A,再执行B,A与B是按照顺序执行。 A B A B (b)N-S图 (a)流程图
N Y P T F A B 条件p A B • 选择(或分支)结构 • 根据条件是否成立而去执行不同的程序模块。在如图中,当条件P为真时,执行A,否则执行B,即要么执行A,要么执行B。 (b)N-S图 (a)流程图
条件P A • 循环结构 • 循环结构是指重复执行某些操作,重复执行的部分称为循环体。如图所示为当型循环结构,当条件P为真时,反复执行A,直到条件P为假时才终止循环。其中A就是循环体,A被重复执行的次数称为循环次数。循环结构除当型循环外,还有直到型循环。 N 条件P Y A (a)流程图 (b)N-S图
1.3 C语言的编程风格 • 1.确保应用程序与用户交互性 • 程序应该给予相应的提示信息 • 输出数据时,应该让用户知道输出数据的含义 • 2.确保程序可读性 • 格式(如每行最好写一个语句)、注释 • 3.确保程序结构清晰 • 清晰的程序结构可通过多层次缩进、大括号的位置对齐、程序的模块化等来体现。大括号的位置有两种。 • 作业: • 1.完成所有课后作业 • 2.实践教材习题
第2章 C语言程序基础 • 本章重点 • ① 常量与变量的概念 • ② C程序数据类型 • ③ 运算符和表达式 • ④ 数据类型的转换 • ⑤ 数据的输入输出 • ⑥ 预处理 • C语言中将数据类型分为基本数据类型、指针数据类型和复杂数据类型等。
2.1 基本数据类型 • 【例2.1】比较基本数据类型之间的异同。 • 〖编写程序〗 • #include"stdio.h" • void main() • { • int x=10; • int y=0x10; • short int z=010; • long a=-1u; • char c='A'; • float r=1.5111111; • double s=1.5111111; • printf("测试基本类型所占空间数(字节):\n"); • printf("%10s%10s%10s%10s%10s%10s\n","int","short","long","float","double","char"); • //输出表头 • printf("%10d%10d%10d%10d%10d%10d\n", sizeof(int),sizeof(short),sizeof(long),sizeof(float),sizeof(double),sizeof(char));
printf("%10s%10s%10s%10s%10s%10s\n","进制数","x","y","z","a","c");//输出表头printf("%10s%10s%10s%10s%10s%10s\n","进制数","x","y","z","a","c");//输出表头 • printf("%10s%10d%10d%10d%10d%10d\n","十进制",x,y,z,a,c); • printf("%10s%10o%10o%10o%10o%10o\n","八进制",x,y,z,a,c); • printf("%10s%10x%10x%10x%10x%10x\n","十六进制",x,y,z,a,c); • printf("r=%4.2f\n",r); • printf("r=%20.16f\n",r); • printf("s=%4.2lf\n",s); • printf("s=%20.16lf\n",s); • }
2.2常量和变量 • 据数据在程序执行过程中值是否改变,将数据分为常量和变量。在程序执行过程中,值不能改变的量称为常量,值可以改变的量称为变量。
变量占用的内存空间的第一个字节的地址就是变量的地址。如图所示,整型变量x,它占用了4个字节的存储空间,它的第一个字节的地址为1001,则变量x的地址为1001。变量占用的内存空间的第一个字节的地址就是变量的地址。如图所示,整型变量x,它占用了4个字节的存储空间,它的第一个字节的地址为1001,则变量x的地址为1001。 int x=10 x的地址为1001 10
2.3 运算符和表达式 • C语言中的运算符和表达式非常丰富,运算符包括算术运算符、赋值运算符、条件运算符、逗号运算符和位运算符等,由运算符将运算对象(操作数)连接起来的式子就称为表达式。常量、变量和函数都可看作是最简单的表达式。
2.3.1 算术运算符 • 【例2.2】将组成一个三位正整数的百位、十位、个位数字按逆序输出。 • 〖问题分析〗 • 根据题意,只要将一个三位正整数进行分解,得到百位、十位、个位数字后,即可实现逆序输出。
〖编写程序〗 • #include <stdio.h> • void main( ) • { • int bai,shi,ge,a; • printf("Please input an integer(3):"); • scanf("%d",&a); // 输入一个3位正整数 • bai=a/100; // 分解百位数字 • shi=(a%100)/10; // 分解十位数字 • ge=a%10; // 分解个位数字 • printf("\n%d %d %d\n",ge,shi,bai); // 输出结果 • }
2.3.2 关系运算符 关系运算符及其含义 由关系运算符将两个运算对象连接起来的表达式称为关系表达式。 关系表达式的运算结果是一个逻辑值。通常用1表示逻辑“真”,用0表示逻辑“假”。
2.3.3 逻辑运算符 • && 逻辑“与”运算符,当两个运算对象都是非0时,运算结果为“真”。 • || 逻辑“或”运算符,当两个运算对象都是0时,运算结果为“假”。 • ! 逻辑“非”运算符,当运算对象为0时,运算结果为“真”。
2.3.4 赋值运算符 • C语言中将符号“=”称为赋值运算符,其左边必须是变量。赋值运算符分为简单赋值运算符和复合赋值运算符。 • 1.简单赋值运算符 • 一般形式为: • 变量名=表达式 • 其功能是将 “=”右边表达式的值赋予左边的变量。 • 2.复合赋值运算符 • 在赋值运算符“=”左边加上其他二目算术运算符或位运算符构成复合赋值运算符。例如,x+=8;表示将变量x的值加8后再赋予变量x,即等效于x=x+8。
2.3.5条件运算符 • 条件表达式的一般形式为: • 表达式1?表达式2:表达式3 • 其功能是先计算表达式1的值,若值为真(非0),则将表达式2的值作为条件表达式的值;否则将表达式3的值作为条件表达式的值。 • 例如,min=(a<b)?a:b; 其功能是判断a<b是否成立,如果成立,将变量a的值赋予变量min;如果不成立,则将变量b的值赋予变量min。
2.3.6 逗号运算符 • C语言中的符号“,”是一个特殊的符号,既可作为分隔符,也可以作为逗号运算符。在变量的说明定义和函数的参数中,作为分隔符。“,”作为逗号运算符时,是一个双目运算符,逗号表达式的一般形式为: • 表达式1,表达式2,…,表达式n • 其功能是从左至右依次计算表达式1的值,表达式2 的值…,最后计算表达式n的值,并将表达式n的值作为逗号表达式的值。 • 例 • x=(a=1),(b=2),(a+b) ; 执行该语句后,变量x的值为3。
2.3.7 位运算与位表达式 • 1.位运算符 C语言中常用的位运算符见表所示。 (1)除“~”运算符是单目运算符外,其余位运算符均为双目运算符。 (2)如果双目位运算的运算对象的位数不同,系统将自动将其右对齐,不足的位上用符号位补齐,即正数用“0”补齐,负数用“1”补齐。
2.按位“与”运算 • 【例2.3】将整数a的高八位清0,保留低八位。 • 〖问题分析〗 • 根据按位“与”运算的运算规则:任何值“与”1结果还是其本身,任何值“与”0结果为0。根据题意,只要将变量a“与”0000000011111111(127),即可将a的高八位清0,保留低八位。
〖编写程序〗 • #include <stdio.h> • void main( ) • { • int a; • printf("Please input a:"); • scanf("%d",&a); • a=a&127; • printf("%d\n",a); • }