2.45k likes | 2.72k Views
C 语 言 程 序 设 计 但愿她是你知识大厦的又一块基石。 但愿她是开启你智慧的又一把钥匙! 学习目的 学习掌握 C 语言的语法结构。 学习结构化程序设计的一般方法,提高分析能力和综合能力。 能够用 C 语言编程解决一定的实际问题。 学习方法 结构化程序设计的思想方法。 方 法 解决特定问题的一般方法。 算 法 语言基本元素、基本构词方法、 句法、结构等规则的集合 。 语 法 第一章 C 语言概论 1.0 高级语言的概念 机器语言 汇编语言 高级语言 特点:二进制表示、面向机器、直接运行。
E N D
C 语 言 程 序 设 计 但愿她是你知识大厦的又一块基石。 但愿她是开启你智慧的又一把钥匙!
学习目的 • 学习掌握C语言的语法结构。 • 学习结构化程序设计的一般方法,提高分析能力和综合能力。 • 能够用C语言编程解决一定的实际问题。
学习方法 结构化程序设计的思想方法。 方 法 解决特定问题的一般方法。 算 法 语言基本元素、基本构词方法、 句法、结构等规则的集合。 语 法
1.0 高级语言的概念 机器语言 汇编语言 高级语言 特点:二进制表示、面向机器、直接运行。 特点:符号化的机器语言、面向机器、翻译后运行。 特点:类自然语言、面向问题、翻译后运行。 2+3 ADD 2,3 010100100011 2+3 高级语言程序 翻译系统 二进制机器语言 编译或解释程序。
1.1 C语言的特点 C语言是由Dennis M Ritchie和Brian W Kernighan于1972 年在B语言的基础上提出的,他们用C语言重写了在PDP –11小型 机上的Unix,并取得了成功。 C语言的特点: ⑴C语言具有完善的功能和非常高的效率。 ⑵C语言可以对硬件操作,是介于汇编语言和高级语言之间的一种语言。 ⑶C语言是结构化的程序设计语言。 ⑷C语言具有丰富的数据类型和运算类型。 ⑸C 语言具有良好的移植性。 ⑹C语言书写灵活,表达简洁。
1.2 C语言的基本程序结构 实例:输入两个数及其运算关系,输出运算结果。 int fun(int x,char op,int y) { int z; switch(op) { case ‘+’: z=x+y; break; case ‘-‘ : z=x-y; break; case ‘*’: z=x*y; break; case ‘/’ : z=x/y; break; } return z; } #include <stdio.h> void main(void) { char ch; int a, b; int c; scanf(“%d%c%d”,&a,&ch,&b); c=fun(a,ch,b); printf(“a%cb=%d”,ch,c); } 子函数 主函数 ⒈程序是由函数组成的,函数是由语句组成的。其中主函数有且唯一,主函数名位main。子函数可有可无也可以有多个。 ⒊C语言的语句用;作为结束,因此一句可以用一行或几行书 写,但不能割裂构词。 ⒉C语言的系统构词必须用小写,用户构词可以大小写混用。 ⒋各词之间用一个或几个space分隔。
1.3 C语言的词法 ⒈ C语言的字符集 ⑴字母:A、a、B、b…、Z、z 52个 ⑵数字符号:0、1…、9 10个 ⑶特殊符号:+ - * /… 20个 ⒉保留字 系统占用词(共32个) auto、break、case、char、const、continue、default、do、 double、else、enum、extern、float、for、goto、if、int、 long、register、return、short、signed、sizeof、static、 struct、switch、typedef、union、unsigned、void、volatile、 while 建议不要使用: define、undef、include、ifdef、ifndef、endif、line、error、 elif、pragma
⒊标识符 作 用:用户为各种自定义数据命名。 组成规则: ⑴字母和数字以及 下划线_ 组成。 ⑵以字母和 下划线_ 开头。 ⑶长度不超过31个字符。 ⑷不能使用保留字。 注 意:系统区分大小写字母。 aBc Abc _iArea _fLoad iStatus faS 2Ab int ERROR!
1.4 计算机算法的概念 ⒈算法(Algorithm)的定义: 广义地讲:算法是解决问题的逻辑步骤,是对特定问题求解步骤的一种描述。 计算机算法:是用程序解决问题的逻辑步骤,是指令的有限序列。 只有通过算法能够描述出来的问题,才能够通过计算机求解。能够用算法描述的问题称为可以形式化的问题。 正确的算法有三个条件: ⑴每个逻辑步骤有可以实现的语句来完成; ⑵每个步骤间的关系是唯一的; ⑶算法要能终止(防止死循环)。
算法举例 • ⒈求数列n=1+2+…+m的值n,当n>10000时结束。 • 步骤:①n=0 • ②m=0 • ③m加1 • ④n加m • ⑤判n是否大于10000 • 如果满足关系结束; • 不满足关系继续执行③。 ⒉欧几里德求m,n(m>n)的最大公约数算法 ①m除以n的余数为k ②如果k不为0,nm,kn ③重复①。 ④如果k为0,n为最大公约数。
⒉算法与计算方法 计算方法(Computational Method): 求数学近似解的方法,如SinX=X-X3/3!+X5/5!-X7/7!+… 算法(Algorithm):逻辑步骤,过程。 ⒊算法的特征 • 有穷性:有限次完成; • 确定性:各步骤之间的关系要确定; • 有输入:有原始数据输入; • 有输出:有结果输出; • 可行性:可以编程实现; • 高效性:执行速度快、占用资源少; • 健壮性:对数据响应正确。
算法确定性举例 死过程 图书馆l 医院h ab if( d min)b l else if(to h)b h,h l else if (to s)b s,s l end 如果走近路 如果路过医院 商店A 如果路过教室 三岔路口b 教室s
⒋算法的表示 • 自然语言 • 伪 代 码 • 流 程 图 ab if(to h)b h,h l else if(to s)b s,s l else if(d min)b l end
1.5 程序流程图 概念:以特定的图形符号加上说明,表示算法的图 ,称为流程 图或框图。 规则:从上到下,从左到右。 符号及其意义: 流程线 端点框 处理框 判断框 连接点 I/O框 过程框
流程图描述算法举例 用框图描述函数 1 x 0 y = -1x < 0 start A 输入x 输出y no yes x 0? end y=-1 y=1 A
1.6 程序设计的一般方法 ⒈程序的开发过程 开始 A ⑴系统描述 ⑵需求分析 描述系统功能 ⑶结构分析 分析设计,算法描述 ⑷详细设计 编码 ⑸代码调试 ⑹单元测试 调试 ⑺系统测试 ⑻运行维护 ——Steve Mc Connell 编辑 完成 编译 yes 语法错? no 连接、运行 ⒉上机过程 yes 逻辑错? no A
1.7 预备知识 ⒈计算机中数值的表示方法 数值型数据的表示有三个要素: ⑴数值的绝对值; ⑵符号; ⑶小数点。 计算机内部的量都是用二进制表示的。数学表示称为真值,计 算机内部的表示称为机器数。真值转换为机器数称为编码。 计算机的计数系统是有模系统。有模系统当计数值超过系统的 “模”时系统重新计数。 如:时钟从9点,调整到6点有两种方法: 9- 3=6 9+9=12+6 12位计数系统的模,3,9互为补数。
符号的表示:补码 计算机内部的量都是用二进制表示的。数学表示称为真值,计 算机内部的表示称为机器数。真值转换为机器数称为编码。 补码编码方式:2n+x。 8bit表示一个数: 100000000 + 01010110 +1010110 01010110 100000000 - 01010110 -1010110 10101010 最高位表示符号,其余位数表示数值。1代表-, 0代表+。
小数点的表示 约定的小数点位置。 • 定点表示 定点纯小数 0.1010100 01010100 定点纯整数 -1010110 10101010 • 浮点表示 约定的小数点位置。 表示的量为: M2N M称为尾数,用定点纯小数表示。 N称为阶码,用定点纯整数表示。 ⒉字符的表示 计算机中字符数据,用ASCII码表示,如A表示成65。
思考题: ⒈用程序流程图描述算法 1 x > 0 y = 0 x = 0 -1 x < 0 ⒉用框图描述,欧几里德求最大公约数算法。 ⒊从生活或学习中找出可以用算法描述的一件事,并加以抽象 的描述。
主 要 内 容 ⒈数据及其表示方法; ⒉数据的基本运算; ⒊基本输入输出。 以上三个问题是程序设计的最基本问题!
2. 0 预备知识 ⒈计算机中数值的表示方法 数值型数据的表示有三个要素: ⑴数值的绝对值; ⑵符号; ⑶小数点。 计算机内部的量都是用二进制表示的。数学表示称为真值,计 算机内部的表示称为机器数。真值转换为机器数称为编码。 计算机的计数系统是有模系统。有模系统当计数值超过系统的 “模”时系统重新计数。 如:时钟从9点,调整到6点有两种方法: 9- 3=6 9+9=12+6 12位计数系统的模,3,9互为补数。
符号的表示:补码 计算机内部的量都是用二进制表示的。数学表示称为真值,计 算机内部的表示称为机器数。真值转换为机器数称为编码。 补码编码方式:2n+x。 8bit表示一个数: 100000000 + 01010110 +1010110 01010110 100000000 - 01010110 -1010110 10101010 最高位表示符号,其余位数表示数值。1代表-, 0代表+。
小数点的表示 约定的小数点位置。 • 定点表示 定点纯小数 0.1010100 01010100 定点纯整数 -1010110 10101010 • 浮点表示 约定的小数点位置。 表示的量为: M2N M称为尾数,用定点纯小数表示。 N称为阶码,用定点纯整数表示。 ⒉字符的表示 计算机中字符数据,用ASCII码表示,如A表示成65。
1/2 ? 2.1 基本数据类型 数据是对客观事物特征的符号化表示,客观事物不同,表示的 方法也不同(人数以整数表示,圆面积用小数表示,灯的状态用开 关表示,信件要用文字表示),计算机的处理方法也不同,因此根 据程序处理的数据对象,应规定数据的类型。 计算机由于工程的限制,只能在有限精度和有限范围内在工程 上近似地描述操作的对象——数据。 数据类型不同时: ⑴数据的外部表示方式和内部存储方式不同; ⑵表示的范围和精度不同; ⑶对数据的处理方式不同。
C语言的数据类型 整 型 int 基本类型 字符型 char 浮点型 float double C语言的数据类型 构造类型 枚举型 enum 数组、结构、联合。 指针类型 空类型 void
2.2 常量(Constant)及其类型 ⒈常量的概念 在程序中不能改变的量称为常量。常量的类型由数据的外部表 现形式确定。 ⒉常量的外部形式及其确定的类型 ⑴整型常量的表示 整型常量根据表示的范围可以有长整型和一般整型,还可以表 示为十进制、八进制、十六进制。其中八进制、十六进制不能有符 号。 一般整型的表示 进 制 表示举例 范 围 字节数 十 进 制 2304 -32768 ~ +327672 八 进 制 04400 0 ~ 0177777 2 十六进制 0xaa00 0x0000 ~ 0xffff 2 长整型的表示 进 制 表示举例 范 围 字节数 十 进 制 -21234l -231 ~ +231-14 八 进 制 04400l 0 ~ 01777777777 4 十六进制 0xaa00l 0x0000----0xffffffff 4
⑵浮点型常量的表示(只有十进制表示) 浮点型常量有两种表示方式:小数表示方法,指数表示方法。 不区分单、双精度。 小数表示方式规则:一个小数点、符号和至少一位数字。 指数表示方式规则: -2.0 1. 0.11113 -15. 指数部分,两位整数。 规则:ne±m 表示 n×10m n小数部分,整型常量或小数形式表示的实型常量。 n决定精度,一般精度为7位;m决定范围,范围10-38到10+38,当超过范围时称为“溢出”,小于10-38称为下溢,当0处理,大于10+38,称为上溢,系统出错! 123.456表示为 0.123456E+3 -10000000表示为 -1e+7 0.0000123表示为 0.123e-4
⑶字符常量的表示 表示ASCII字符集中的一个字符。字符有一个整型值,即该字符 的ASCII码值。表示方法:’a’ 、 ’!’。撇号定界的一个字符。 ⑷字符串常量的表示 值为:97 双引号“定界的字符序列。系统会在最后一个字符后加NULL( ASCII码值为0),标志字符串的结束。 ’a’ 和 ”a”的区别? ⑸转义字符 如:”HEFEI ””hello” 内部 ’a’ :97 ”a”: 97NULL 转义字符是C语言表示字符的特殊方法,用来表示ASCII字符集 中的控制字符,以及系统占用字符如:”。 表示方法:① \字符;②\八进制(十六进制整数,小于256) \a 表示BELL \b 表示BACKSPACE 字母 \n 表示换行 \r 表示回车 \t 表示TAB \\ 表示\ \? 表示? 符号 \’ 表示’ \” 表示” \0 表示NULL printf(“\007”); printf(“语文\n数学\n”); 八进制十六进制数 \0x41 \0101 代表’A’
2.3 变量(Variable) ⒈变量的概念 变量是在程序中可以改变的量,变量具有三个特征: ⑴变量有名,用标识符命名; ⑵变量有类型; ⑶在程序中可以改变。 变量对应于内存中某一地址下的几个单元,变量名作为程序引 用变量的标志。变量的类型确定了变量在内存中所占单元的数量及 其表示的方式。变量的地址可以通过&运算获得。 int a; 整型变量占两个内存单元。 a变量的引用标志 &a对应a的地址。 内存 变量必须先说明后使用!说明的目的是确定变量的名字和类型。
int a,b,c; ⒉变量的说明 形式: type 变量名表;/*以,分隔的标识符表*/ 基本类型说明符:int、char、float、double 类型说明词,包括基本类型说明和修饰说明。 修饰类型说明符:unsigned/signed、short/long short a,b,c; int e,f,g; long _qs,num; ⑴整型变量说明 ①有符号整型变量说明 说明符 所占字节数 范围 int 2 -32768 ~ +32767 short [int] 2 -32768 ~ +32767 long [int] 4 -2147483648 ~ +2147483647 ②无符号整型变量说明 unsigned d,e,f; 说明符 所占字节数 范围 unsigned 2 0 ~ 65535 unsigned short 2 0 ~ 65535 unsigned long 4 0 ~ 4294967295
⑵字符型变量的说明 说明符 所占字节数 范围 char 1 -128 ~ +127 unsigned char 1 0 ~ 255 ⑶浮点型变量的说明 说明符 所占字节数 范围 精度 float 4 10-38 ~ 10+38 7位 double 8 10-306 ~10+306 16位 浮点型变量包含精度和范围两个概念。 ⑴超过精度位数后的位数值不确定。 float a; a=1.1111111111; 超出精度部分,不准确。 ⑵超过范围溢出(Overflow)。 当运算结果大于10+38称 为上溢,系统出错。 当运算结果小于10-38称 为下溢,当0处理。 float a,b,c; a=1.234e+20 b=2.345e+21 c=a*b 超出1038,溢出。
2.4 算术运算与表达式 程序重要的一点是对数据按照算法进行处理(运算)。C 语言 的运算功能强大。数据通过运算符连接的式子称为表达式,表达式 根据运算对象及运算关系得到一个值。分类介绍如下: ⒈变量赋值运算 格式: V=expression;/* 将expression的值赋给变量V*/ int a=2; /*说明赋值,编译时赋值。*/ int b; b=3+2; /*说明后赋值,执行时赋值。*/ 说明: ⑴ =是赋值号(动词); ⑵ 赋值运算的左值只能是变量。 int a=2.5 ; /* 2a */ ⑶ 赋值号两边类型应该一致,如不一致,以变量类型转换。 a=a+2; iCount=iCount+10; a+2=12; /*Error!*/
⒉算术运算 功能:完成各种类型数据的加、减、乘、除及求余数运算。 ⑴双目算术运算(两个运算对象参加的运算) 注意:乘号不能省略! 只能对整型或字符型数据运算。 余数符号与被除数相同。 -12%(-5) -12%5-2
⑵自加、自减运算(单目运算) 说明: ①运算对象只能是一个变量。 2++; /* Error !*/ ②前置是先运算,后引用,而后置则是先引用,后运算。 int i, x; i=5; x=i++;/* x=i;i=i+1;*/ i=5; x=++i;/* i=i+1;x=i;*/
⑶算术赋值运算 说明: ①运算对象的左值只能是一个变量。 (a+2)+=5; /*Error !*/ ②%=运算的对象,必须是整性。
⑷算术运算的说明 ①运算中的类型问题 运算对象的类型相同,运算结果取运算对象相同的类型。 int a; float b; b=2/3; /* 0b 0.0*/ a=5.0/2.0; /*2.5a 0 */ 运算对象的类型不同,先将低等类型转换为高等类型后再进行 运算,运算结果取高等类型。等级原则如下: char int long double float 2*16.0+15.0 float double 运算时可以实行类型的强制转换,格式如下: (type)expression 只对当前表达式起作用。 double (float)a/(int)’c’+(float)(a+10)
②运算的优先级 表达式的运算是分步骤进行的。因此当一个表达式中出现多种 运算时,存在优先级的问题。 算术运算的优先级如下: ++、- -、(type) *、/、% 3*4+6/a- 6%3 +、- 相同优先级,结合顺序从左到右! a=b=c+=2 =、op= c=c+2 b=c a=b 相同优先级,结合顺序从右到左! 可以用( )调整优先级。
⒊其他运算 ⑴三项条件运算 格式: e1 ? e2 : e3 e1、e2、e3为表达式,当e1非0时,运算结果取e2的值;当e1 为0时,取e3的值。 int a=3,b=4,d; d=(a+=2,++b)*5 int a=2,b=3,c=-1,d; d=a?b:c; /*d为3*/ a=0; d=a?b:c; /*d为-1*/ int a,b,c; b=sizeof a; /*b的值为2 */ c=sizeof(float); /* c的值为4*/ ⑵逗号表达式 格式: e1, e2, e3,…,en ; 用,分隔的表达式,取值为en; ⑶sizeof 运算 形式: sizeof 数据对象; sizeof(类型说明符);
C语言常用数学函数 为方便用户使用,C语言系统定义了大量函数。数学函数主要目 的是求解常用数学函数,如sinX等。数学函数的原型定义在系统的 math.h头文件中。在使用此类函数时,应在程序的开始出加如下语 句: #include <math.h> 使用方法: 作为一个运算项参加表达式运算。 y=sqrt(sin(x)*sin(x)+cos(x)*cos(x)) 函数的参数(自变量)、函数的值 都是double类型。
2.5 基本数据输入输出 C 语言没有输入输出语句,输入输出是通过系统定义的标准函 数来实现的。 I/O函数的原型定义在stdio.h头文件中,在引用I/O函数时,应 在程序开始处加预处理语句包含头文件。 #include <stdio.h> ⒈输入输出的概念 输入输出指的是内存变量或程序和外部设备间的数据交换。 输入 内 存 外 设 输入输出函数要描述: ⑴输入输出的量; ⑵输入输出的格式; ⑶输入输出的设备。 输出
用,分隔的常量、变量、表达式表。 格式描述。 ⒉格式输入输出函数 ⑴输出函数printf( ) 格式: printf(“输出格式字符串”,输出项列表); 输出格式字符串可包含以下内容: ①普通字符 ,如:a= ②转义字符,如:\n 对于普通字符和转义字符在相应位置原样输出,其中%用%%。 printf(“\nabcd%%”); 输出结果: abcd% ③格式说明符组,说明输出项列表中的各项的输出格式。格式 说名符组用%为开始标志。内容包含对一项输出对象的格式说明。
格式说明类型表 格式说明符应和输出的列表项对应,产生相应的输出。其中输 出的表项应与格式说明符类型一致。 printf(“a=%5d\nb=%f”, 2+3, 5.34);
格式说明串的一般形式和意义 % - m.nl 格式类型字符 整型长度,缺省短整型,l长整型。 宽度.精度(位数),宽度:输出总列数,精度:小数位数(或字符位数)。 对齐方式:缺省为右对齐,-为左对齐。 #include <stdio.h> void main(void) { float a; a=1.232326 ; printf(“a=%10.4f”,a); } 格式说明标志 CHAP2EX1
各种类型数据输出举例 ⑴字符型输出 char a=’b’; printf(“%5c, %-5c,%c” ,a ,a-32,’s’+1); 输出结果: ƀƀƀƀb,B ƀƀƀƀ,t ⑵字符串输出 #include <stdio.h> void main(void) { char chString[ ]="China"; printf("%s,%6s,%-6s\n",chString,chString,chString); printf(“%4s%6.2s%-6.2s","Hefei","Hefei","Hefei"); } m.n,m为总输出列数, n 截取输出字符数。 China, ƀChina, Chinaƀ HefeiƀƀƀƀHeHeƀƀƀƀ 宽度不够,原样输出。
⑶整型输出 #include <stdio.h> void main(void) { unsigned int a=65535; int b=-2; printf("a=%d,%o,%x,%u", a, a, a, a); printf("\nb=%6d%8o%5X%6u",b, b, b, b); } a=-1,177777,ffff,65535 b=-2177776FFFE65534
⑷浮点数输出 include <stdio.h> void main(void) { float f=123.456; printf("%f,%10f,%10.2f,%-10.2f\n",f ,-f ,f ,-f); } 123.456001,-123.45600,123.46,-123.46 符号占一位! 小数保留两位,四舍五入截断。
⑵输入函数scanf() 格式: scanf(“格式说明字符串”,输入变量地址列表); 说明: ①输入时不能使用%u; ②m域宽可自动截取,空格可以作为数据分隔符。 void main(void) { int i,j; scanf("%3d%3d",&i,&j); printf("%d\n%d",i,j); } 123456 void main(void) { int i,j; scanf("i=%d,j=%d",&i,&j); printf("\n%d\n%d",i,j); } CHP2EX2 scanf(“%7.2f”,&a); ERROR! ③实型变量输入时不能规定精度; ④数据输入用SPACE分隔,当格式字符用其他字符隔离,输入 时也应在对应位置上输入相同的字符; ⑤输入项只能是变量,且必须用地址形式。