版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高级程序设计语言2004-9-15第一章 C语言概述2004-9-15计算机基本结构2004-9-15计算机基本结构CPU
(CentralProcessingUnit)主存储器运算器控制器外设输入设备输出设备主机计算机2004-9-15程序设计语言程序设计语言:是人和计算机之间交换信息所用的一种工具。是用来编写计算机程序的工具;计算机将严格按照程序运行和工作,并提供产生的结果。即人通过程序的形式向计算机提出服务要求,计算机按程序自动进行工作2004-9-15程序设计语言程序设计语言包括:机器语言汇编语言高级语言2004-9-15机器语言与汇编语言机器语言:机器语言就是能够被计算机直接识别和执行的机器指令。机器指令是CPU提供的基本功能(与计算机体系结构相关)机器指令是二进制代码是计算机唯一能够直接执行的程序语言编程、阅读程序比较困难汇编语言:用助记符表示的机器语言,即符号化的机器语言计算机不能直接执行汇编语言程序,需要转化为机器语言与计算机体系结构相关2004-9-15机器语言与汇编语言例:X=10,Y=17,计算SUM=X+Y0A11...A00000020601A20300F400DATA SEGMENTX DB 10Y DB 17SUM DB 0DATA ENDS... MOV AL,X ADD AL,Y MOV SUM,AL HLT 机器语言程序汇编语言程序2004-9-15高级(programming,程序设计)语言高级语言:又称为算法语言,是一种接近于自然语言的计算机程序设计语言。这种语言通常由:基本字符集,词法规则,语法规则,语义规则等构成。一般由两部分内容组成:对数据的描述对处理过程(操作)的描述独立于计算机体系结构计算机不能直接执行高级语言程序,需要转换(高级语言程序→汇编程序→机器指令)2004-9-15高级(programming,程序设计)语言例:X=10,Y=17,计算SUM=A+BDATA SEGMENTA DB 10B DB 17SUM DB 0DATA ENDS... MOV AL,A ADD AL,B MOV S,AL HLT 汇编语言程序...int A,B,SUM;A=10;B=17;SUM=A+B;...C语言程序2004-9-15高级(程序设计)语言高级程序语言与自然语言自然语言程序设计语言人与人信息交流的工具(人具有思维、推理能力)人-机对话的工具(计算机具有计算与逻辑判断的能力)语法规则灵活(可以省略,颠倒)严格遵循语法规则表达方式多样算法多样2004-9-15高级(programming,程序设计)语言源程序(高级语言成语)“转换”成目标程序(机器指令)的方法:编译方式:将源程序一次性地转换成等价的目标程序。此后,可以多次直接运行这个目标程序。翻译方式:"运行"源程序的"当时"逐个语句地进行"翻译"并立即"运行"这一句的功能,直到最后一个语句为止2004-9-15编译方式与翻译方式编译方式:翻译方式2004-9-15C语言的历史C语言产生与UNIX操作系统(OperatingSystem)密切相关标准化1983年,美国标准化组织(ANSI,AmericanNationalStandardsInstitute)成立C语言工作小组,发表C语言标准:ANSIC1987年,ANSI发表新的C语言标准:87ANSIC1989年,国际标准化组织(ISO,InternationalStandardizationOrganization)接纳ANSIC,标准,发表ISOC标准2004-9-15C语言的特点语言简洁、紧凑,使用方便、灵活(32个关键字,9中控制语句)运算符丰富(34种表达式)丰富的数据类型结构化的控制语句,程序模块化(函数是基本模块)语法限制不严格,程序设计自由度大能够进行位操作(即对存储单位进行操作)高效率的目标代码可移植性好(与汇编比较)2004-9-15"Hello,world"例1“Hello,world”C程序是由函数(function)和变量组成(variable)main函数:C程序总是从main函数开始执行代码在main函数中调用其它函数来完成相应的工作“其它函数”:用户自行编写的函数库函数(libraryfunctions)函数之间通信的一种方式是:调用者提供一组参数(arguments)给被调用函数#include<stdio.h>main(){ printf("hello,world\n");}函数名参数表2004-9-15"Hello,world"printf函数是一个库函数的参数“hello,world\n”:字符串(characterstring/stringconstant)\n:由\开头的字符:用于表示难于输入、特殊的控制字符换行符(newlinecharacter
)#include<stdio.h>main(){
}printf("hello,world\n");函数名2004-9-15#include<stdio.h>intmax(intx,inty);
main(){inta,b,c;/*announcement,variablesdefination*/scanf("%d%d,",&a,&b); /*inputthevalueofaandb*//*callmaxfunction,gettheresult,andassignittoc*/
c=max(a,b);printf("max=%d\n",c);/*outputthevalueofc*/return;}/*definemaxfunction,functionvalueisinteger*/intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}例2 比较两个整数的大小,输出其中较大的数2004-9-15“Hello,world”C程序的格式一条语句(statement)占一行;运算符之间应用空格(blanks)分割;语句缩进(indentation):4个空格/一个tab的举例,突出程序的逻辑结构{}(braces)位置函数定义:均置与行首其余情况:{在行尾}在行首2004-9-15程序程序包括两个方面:对数据的描述,即数据结构(datastructure)对操作的描述(操作步骤),即算法(algorithm)操作的对象是数据,操作的目的是对数据进行加工处理,以获取结果算法:解决”做什么”和”怎么做”的问题语句(statements)只是算法的具体体现沃思公式:数据结构+算法=程序2004-9-15算法的概念算法(广义):为解决一个问题而采用的方法和步骤。算法多样性不同的算法具有简单和复杂的分别,但首要保证算法正确性,再考虑算法的质量。计算机算法:是计算机为解决一个问题而采用的方法和步骤。计算机算法的两大类:数值运算算法:目的求数值解非数值运算算法:应用广泛2004-9-15简单算法举例例2.1求5!思考:给定正整数n,求n
应具有通用性、灵活性累加,累乘等运算问题的基本算法累计结果(total):需要设定初值;变化量(i):正确确定每次参与运算的变化量累次计算,直到i到达预期范围total=totalOPERATOR(运算符)i;改变i值,重复计算应用:例2.42004-9-15简单算法举例例2.3判断2000-2500年中的每一年是否闰年,将结果输出。仔细确定判断条件,逐步缩小判断范围对范围的确定要保证无遗漏2004-9-15算法的特性有穷性:要确定合理的限定范围确定性有零个或多个输入有一个或多个输出有效性2004-9-15怎样表示一个算法算法表示的方法:自然语言:通俗易懂,但文字冗长,不严格,易出现歧义性传统流程图:直观形象,易于理解用图框表示各种操作。用流程线表示各图框的执行顺序要注意避免无规律的流程转向结构化流程图(N-S流程图)算法全部的矩形框内无流程线伪代码PAD图2004-9-15程序设计的三种基本结构顺序结构:自顶向下,无分支,无转移选择结构:有分支,需条件判断循环结构:有转移,某些语句需要重复执行当型(While型)循环直到型(Until型)循环这三种基本结构可以组成任意复杂的算法。2004-9-15顺序结构顺序结构:自顶向下顺序执行,无分支,无转移AB流程图表示法ABN-S图表示法ab2004-9-15选择结构(选取结构、分支结构)选择结构:有分支,需条件判断无论条件p是否成立,只能执行A,B两个分支中的一支A、B分支中,可以有一支是“空语句”(图2.16)AB流程图表示法N-S图表示法pYes/成立NO/不成立ABp成立不成立ab2004-9-15循环结构(重复结构)当型(While型)循环流程顺序:“判断
执行
再判断
再执行
...”由判断条件P决定重复执行的次数,循环次数可控当P不成立时,停止循环循环体内应该有使循环停止的操作A流程图表示法N-S图表示法p成立不成立A当p成立ab2004-9-15循环结构(重复结构)直到(Until型)型循环先执行,再判断(即操作A至少要执行一次)重复执行,直到条件满足(即条件不成立时,重复执行)流程图表示法N-S图表示法p不成立成立A直到p成立Aab2004-9-15基本结构的特点基本结构的特点:只有一个入口只有一个出口结构内部每一部分都能被执行到结构内不存在“死循环”由基本结构所构成的算法属于”结构化”的算法不存在无规律的转向,只在结构内部才存在分支和跳转2004-9-15伪代码(pseudocode)伪代码:用文字和符号描述算法格式自由,书写方便,修改容易一般在设计算法时使用数据类型(Type)数据类型:是数据结构的表现形式决定了该类型的变量或者常量的取值范围决定了该类型的变量或者常量可以执行哪些操作例:"inti" i是整数类型的变量,其取值范围为-32768~32767之间的整数;可以执行的操作:加、减、乘、除、求余(算术运算);比大小(关系运算)等实数无此操作运算符(Operators)与表达式(Expressions)运算符:定义了对不同数据类型变量或者常量的基本操作(运算)算术运算符(ArithmeticOperators)关系运算符(RelationalOperators)逻辑运算符(LogicalOperators)赋值运算强制类型转换表达式(Expressions):通过运算符将变量、常量连接起来,产生新值常量与变量常量(Constants):是指在程序执行过程中值不发生改变的量。常量也有数据类型常量分为直接常量(字面常量)和符号常量(SymbolicConstants)直接常量,例:50,3.14,'A',“abc”符号常量,例:#define PRICE 30符号常量符号常量:是一种特殊形式的常量,即用一个标识符表示一个常量。定义形式
#define常量名(标识符)常量值使用符号常量:含义清楚;在需要改变一个常量时能做到“一改全改”编程风格在程序中不要出现“magicnumbers”(例如:
x=100*50+78),而符号常量名可以指明每一个常量的含义符号常量名使用大写字母符号常量举例例:计算某类食品的价格,要求从键盘读入购买该食品的数目,输出总价格。#include<stdio.h>#definePRICE 28Main(){ int num; printf("inputnumber:"); scanf("%d",&num); printf("total=%d",num*PRICE); return0;}变量(Variable)程序执行过程中,其值可以改变的量称为变量。它用变量名(标识符)来表示,在内存中占据一定内存单元。变量变量名:一个变量有一个名字变量在内存中占据一定的存储单元,在该存储单元中存放变量的值——变量值变量名是一个符号地址在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。变量名与变量值例:inta=3;......3...............3a变量名变量值存储单元80A580A680A780A880A980AA80AB80AD变量a
地址
内存
标识符(包含变量名)的命名规则标识符(identifier):用来标识变量名、符号常量名、函数名、数组名、文件名等的有效字符序列称之为标识符。命名规则只能由字母(a~z,A~Z)、数字(0~9)和下划线('_')三种字符组成例:不合法的标识符 bass-9 firstone 第一个字符只能是字母或下划线一般只有库函数才有以'_'为首字母标识符用户一般不用'_'作为标识符的首字母,避免冲突区分字母大小写例如:int a,A;/*a和A是两个不同的整型变量*/标识符(包含变量名)的命名规则关键字(Keywords)保留关键字(保留字):在C语言中具有特定含义,专门用作C语言特定成分的一类标识符,例如:intfloatcharifelsewhilefor例:
intfor;X某些系统有标志符长度限制(建议不超过8字符)。内部表示符长度可以为31bytes选择变量名和其他标志符时,应注意做到“见名知义”声明(Declarations)变量声明(Declarations):指定数据类型;列出将要使用的变量格式:
数据类型 变量名1,变量名2,...变量名n;一切变量,都要先声明,后使用!数据类型概述内容:基本数据类型数据在内存中的存储形式(即类型在计算机内部如何表示的)取值范围限定符基本数据类型基本数据类型char:字符型,1个字节长度,可以存放系统本地字符集(characterset)中的一个字符int:整型,其存储空间长度通常反映了机器中整数的自然长度(字长)float:单精度浮点型double:双精度浮点型char(字符型)char:字符型,长度为一个字节字符在内存单元中存放的是其对应的ASCII码(8bit的0、1二进制序列)例字符'a',在内存中占一个字节(8bits)
'a'类型长度决定了类型的取值范围,char的取值范围(ASCII码取值):0~28-1(0~255)ASCII码(P364)‘0’48;‘A’65;‘a’9701100001补充1:字长bit:在计算机中采用二进制,代码只有“0”和“1”,其中无论是“0”或是“1”在CPU中都是一“位”。字长:CPU在单位时间内(同一时间)能一次处理的二进制数的位数叫字长。例:8位CPU:即能一次处理8位数据的CPU。32位的CPU:就能在单位时间内处理字长为32位的二进制数据。字节和字长的区别:由于常用的英文字符用8位二进制就可以表示,所以通常就将8位称为一个字节。字长的长度是不固定的,对于不同的CPU、字长的长度也不一样。8位的CPU一次只能处理一个字节,而32位的CPU一次就能处理4个字节,同理字长为64位的CPU一次可以处理8个字节。补充2:补码(1/3)源码:计算机中采用一组二进制序列来存储数值,其中最高位为符号为(0为正,1为负)。例:(+10)源=00001010例:(-10)源=10001010例:十进制:10-10=10+(-10)=0
源码:00001010
+10001010
=10010100=-20X
补充2:补码(2/3)反码:正数的反码=源码负数的反码=除符号位外,源码的其余各位逐位取反例:(-10)源=10001010,则(-10)反=11110101补码:正数的补码=源码=反码负数的补码=反码+1例:(-10)补=11110110例:(10)补+(-10)补=00000000补=(0)10
例:(9)10+(-6)10=(9)补+(-6)补 =00001001+11111010=00000011=(3)10补充2:补码(3/3)例:(5)10+(-6)10=-1
(5)补+(-6)补=00000101+11111010=11111111补=(-1)10补码的设计目的是:使符号位能与有效值部分一起参加运算,从而简化运算规则。所以,在计算机内部数值都被表示成为补码的形式。int(整型)整型数据在内存中以二进制补码来表示int其存储空间长度通常=机器字长通常int长度为32bit/16bit,其中第一个bit表示符号位(0:正,1:负)例:intnum=120;例:intnum=-120;如果int长度为16bit,取值范围是-216-1~216-1-1,(-32768~32767)00000000011110001111111110001000浮点型(实数型)实数有两种表示形式:十进制数形式,由数字和小数点组成例:123.4,5.0指数形式,字母e之前必须有数字,e之后必须为整数例:123.4e0=123.4,1.234e2=123.4,
123.4e-2=1.234规范化的指数形式(C中实数的指数形式的输出)字母e之前的小数部分,小数点左边应有且只有一位(非0)数字例:4.321e-02,4.321e+02浮点型在内存中的存放形式以float型为例:按指数形式存储(小数)符号位+小数部分+(指数)符号位+指数部分例:12.345在内存中一般占4个字节(32bit)C标准未定义具体格式,一般C编译器以24bit表示小数部分(包括符号位),8bit指数部分(包括指数的符号位)小数部分位越多,有效数字越多,数值范围越小float型的有效数字为7位数符小数阶符指数01.234501浮点型float型:单精度浮点类型,典型长度:32bit,典型有效数字:7位double型:双精度浮点类型,典型长度:64bit;典型有效数字:15~16位例:floatf=
1.2345678;f的有效数字只有7位,即1.234567,超出7位的部分直接舍去(8被舍去)f的指数形式的输出为:1.234567e+00限定符(qualifiers)限定符(即修饰符)用于限定基本数据类型主要用于改变数据类型在内存中的长度
改变类型的取值范围格式:限定符1[限定符2]类型例:shortint例:unsignedshortint3类限定符short和long(限定整型)signed和unsigned(限定字符和整型)longdouble(限定浮点型)short和longshort和long:用于限定整型,提供不同长度的整数型例: shortintsh;
longintcounter;通常,int:16/32bit,shortint:16bit,
longint:32bit编译器会跟据机器的硬件特性自主选择整型的长度。基本规则:shortint和int至少为16bitlongint至少为32bitshortint类型的长度≤int类型长度
≤longint类型长度signed和unsignedsigned和unsigned:用于限定char类型和所有整型(包括shortint类型、int类型、longint类型)
unsigned限定的类型的数值总是非负(0,正整数)signed限定的类型的数值有正、有负例:unsignedchar:取值范围0~28-1=255例:signedchar:取值范围-128~127例:unsignedint:取值范围0~216-1=65535signed和unsigned注意:signed和unsigned可以限定所有整型例:unsigendint
signdlongint当整数没有限定符时,默认是有符号的(即类型内存结构中有1bit的符号位)例:intnum;/*长度为16bit,其中1bit符号位,15bit数据*/字符型没有限定符时,是否有符号位由编译系统决定longdoublelongdouble(高精度浮点数),类型长度≥double(双精度类型)longdouble型:典型长度:128bit;典型有效数字:18~19位基本数据类型详述每一种类型:内存中的存放形式分类常量(表示的方法,特殊的常量)变量(类型的声明与定义,取值范围)细节问题整型数据整型分类有符号型:[signed]int:基本整型短整型([signed]short[int])长整型([signed]long[int])无符号型:无符号整型(unsignedint)无符号短整型(unsignedshort)无符号长整型(unsignedlong)在内存中的存放形式(P41,P44)取值范围(P43)整型数据整型常量基本型(int)常量表示方法:十进制数,例:12、345、0八进制数(以0开头),例:012、045十六进制数(0x开头),例:0x12、0x345长整型(long)常量表示方法:常数后加后缀L(l)例:43210L(43210l);0x10ACA870L;1234L无符号整型常量表示方法:常数后加后缀U(u)例:4321U;43210UL;-1234U(=64302);1234U整型数据整型变量分类(P42)定义格式(P44)细节问题:溢出避免溢出:根据估计变量值的范围,定义相应类型的整型变量实型数据(浮点型)实型变量的分类(P46)单精度(float) 例:float x,y;双精度(double) 例:doublez;长双精度(longdouble) 例:longdoublet;在内存中的存放形式:按指数形式存放取值范围和有效数字长度(P46)取值范围由小数部分和指数部分共同决定内存中,小数域的长度决定的该种类型浮点数的有效位数。例如:float型,小数部分为24bit,小数域的长度为24-1=23bit,223=8388608,有7位有效数字数符小数阶符指数小数部分指数部分实型数据(浮点型)细节问题:舍入误差(P47):一个浮点型数据的有效数字长度有限的,在有效位以外的数据会被省去,这样可能会产生误差例3.4实型数据实型常量两种表示方法:十进制数形式和指数形式例:10.0(实数常量)而10(整型常量)例:1.234e4也可以在实常量加后缀F(f)实型变量分类(P46)定义格式(P47)字符型数据字符数据的存储字符在内存单元中存放的是其对应的ASCII码(P374),且一个字符占用一个字节的存储空间C语言中,字符型数据可以视为是一种特殊的整型数据(8bit的整数)。字符型数据可以赋值为整数值(ASCII值,0~255),字符数据可以以字符形式输出,也可以用整数形式输出。例3.6可以对字符型数据进行算术运算例3.7字符数据的存储(续)在TurboC中把字符处理为带符号的整数ASCII码取值为0~255,所以ASCII码值为128~255间的字符,最高位为1(即符号位)例:求下段代码的输出
char c=130
printf("c=%d",c);解:C在内存中:
10000010补=-126
所以打印出来c=-12610000010字符型数据字符常量一般字符常量的表示:撇号(单引号)括起来的单个字符例:'a';'F','0','+'特殊字符常量(键盘无法直接输入):特点由'\'转义字符引导(P48)例:'\n':换行符例:'\\':反斜杠例:'\016':对应ASCII码值为14的字符(见P374)字符型数据字符串常量用双引号括起来的字符序列例:"abcd","a"(区别字符常量'a')存储形式(P52)系统自动在字符串的末尾加上一个字符串结束标记‘\0’,以此判断字符串是否结束。程序中长度为n个字符的字符串常量,在内存中需要用n+1个字节空间来存储它。举例:字符串“string”的存储string\01151161141051101030字符型数据字符变量字符变量用来存放字符常量只能放一个字符例:charch='a';变量赋初值C语言允许在定义变量时对变量进行初始化,即对变量赋初值。例::
对变量进行初始化,允许只对定义的变量的一部分赋初值。例:inta,b,c=25;
例:inta,b=c=25;
XC语言中若有几个变量初值相同,必须分别赋值。对字符型变量初始化时,既可以将字符用单引号括起来直接赋值,也可以使用该字符的ASCII码进行赋值。例:charch=‘A’; charch=65;inta=2;inta;a=2;基本的算术运算符:+-*/%乘法运算(*),例:2*y,而2y和2∙y都是非法的除法运算(\),两个操作数中:均是整数,其值为整数。例:8/3=2有一个负整数操作数,结果向零取整。例:-5/3-2有一个浮点数,其结果为double型模运算(%),例:7%4=3两个操作数必须都是整型算术运算符算术表达式算术表达式:用算术运算符和括号将运算对象(操作数)连接起来,符合C语法规则的式子运算对象(操作数):包括常量、变量、函数例:x+sqrt(a+b)/(abs(a-b)+x)
=运算符(包括算术运算符)具有优先级与结合性算术表达式求值时,先确定优先级,例*、/、%、+、-相同优先级,根据运算符的结合性(结合方向)确定执行顺序算术运算符结合方向:从左向右例如:x+y*3/(z-8)算术表达式强制类型转换符将一个表达式的值转换为所需类型的值强制类型转换符格式:(类型名)(表达式)例:a是int型,而(double)a:将a的值转换为double型例:(int)(x+y)(区别:(int)x+y)强制类型转换符并不改变操作变量的类型值,例3.8强制类型转换符自增、自减运算符(++,--)++i,--i:先自增/减,再使用i(i值已修改)i++,i--:先使用i(i值已修改),再自增/减例:例:j=i++;j=i;i=i+1;j=++i;i=i+1;j=i;区分:j=i+1;/*i值未变*/j=++i;/*i值改变*/自增、自减运算符自增、自减运算符只能用于变量,而不能用于常量和表达式例:PRICE++X;5++X;(a+b)++X;(-b)++X自增、自减运算符优先级高于算术运算符,结合方向“自右向左”例:如果i=3,那么printf("%d",-i++)输出是几?i值又为几?格式:变量=表达式/常量/变量例:a=(x+y);x=3;x=y;作用:将等号右边的表达式/常量/变量的值赋值给等号左边变量区别赋值运算符与数学中的”等于“赋值,例赋值运算符i=3;j=i;3i存储单元3j存储单元整型与浮点型浮点型数据
整型变量:取整(舍掉实数的小数部分)整型数据
浮点型变量(单,双精度):数值不变,以浮点形式存储到变量中浮点型间double型数据float型变量:截取前面7位有效数字存放到变量中,注意避免数值范围溢出float型变量
double型数据:数值不变,有效数字扩展到16位赋值结果与类型转换整型之间长度相同的有符号和无符号的整型数间:原样赋值整型包括:char,short,int,long负值
无符号整型变量,无符号整数
整型变量间转换时,数值会变化。例3.9赋值结果与类型转换1111111111111111intb=-1;1111111111111111unsigneda=b;/*a=216-1=65535*/赋值结果与类型转换整型之间长度不同的有符号整型数(char,short,int,long)间:短数据
长变量:需要符号扩展
符号扩展:若最高位为1(负值),变量高字节补1,反之补0。例11111110charc='\376';1111111111111111inta=c;赋值结果与类型转换整型之间长度不同的有符号整型数(char,short,int,long)间:长数据
短变量:将数据低字节位原封不动地送到变量中例1000000000001000intb=a;/*b=-32760*/00000000011000001000000000001000longa=6324232L;几个需要注意的问题子表达式的求值顺序运算符的结合规律实参数的求值顺序第三章数据类型、运算符与表达式C语句概述语句(statement):指示计算机完成一定操作任务的指令。一条语句
编译
若干条机器指令声明:数据的描述,而语句:对数据的操作每条语句以分号(;)结束C程序结构C程序源程序文件1源程序文件2源程序文件N预处理指令全局变量声明函数1函数n函数首部函数体局部变量声明执行语句C语句的分类控制语句选择语句:if–else;switch循环语句:for()~while()~do~while()转向语句break;continuegoto;returnC语句的分类函数调用语句格式:函数名(参数表);例:printf("Helloworld\n");表达式语句格式:表达式;例:i++;例:a=x+y;重要的表达式语句:赋值语句格式:赋值表达式;例:a=3; 例:if((a=b)>0)t=a;/*区别与赋值表达式的区别,P69*/区别:赋值表达式可以包含在其它表达式中,赋值语句不行C语句的分类空语句格式: ;功能:什么也不做应用:循环语句中的空循环体,例
for(i=0;I<1000;i++)
;在程序开发过程中起到占位的作用,例
...
;/*某一功能暂时未完成,有待今后补齐代码*/C语句的分类复合语句(语句块)格式:
{
语句1;
语句2;
...
语句N;
}复合语句中}后无分号复合语句在语法上相当于一条语句在复合语句中(语句块中),可以声明变量数据的输入、输出C语言没有专门的输入/输出(I/O)语句I/O操作由标准库函数提供源文件必须包含I/O库函数所对应的头文件(stdio.h)方法:在源文件顶部,添加#include"stdio.h"标准I/O设备标准输入设备:键盘标准输出设备:显示器字符输出函数putchar功能:向标准输出(显示器)输出一个字符调用方式:putchar(c);参数c可以是字符型或者整型常量、变量、表达式例: 例:#include"stdio.h"main(){charc1='a',c2=97;putchar(c1);putchar(c2);putchar('a');putchar(97);}#include"stdio.h"main(){putchar('a');putchar('\n');putchar('\141');}字符输入函数getchar功能:从标准输入(键盘)输入一个字符调用方式:getchar();使用注意无参数,函数返回值就是从标准输入得到的字符输入时,按回车后,才开始接收字符只能接收第一个字符,多余的字符将省略getchar()得到的字符可以赋给字符型,整型变量,或作为表达式的一部分例:c=getchar()+('a'–'A');字符输入函数getchar例:例:#include"stdio.h"main(){charc;printf("Enteracharacter:");c=getchar();putchar(c);}#include"stdio.h"main(){printf("Enteracharacter:");putchar(getchar());}格式输出函数printf功能:向标准输出(显示器)按照指定格式输出任意类型的数据。调用方式:printf(格式控制,输出表);例:printf("Answer=%d\n",11);例:printf("Helloworld!\n");双引号括起来的字符串要输出的内容,包括:常量、变量、表达式格式控制格式控制符的组成:普通字符:原样输出例:printf("a+b=12,\141\n");格式转换说明:将要输出的数据转换为指定格式输出每一个格式转换说明都由%引导,而以格式字符结束例:printf("%d%f%c",a,f1,'a');有多少个的格式转换说明,就对应有多少个数据参数
intprintf(格式转换说明,参数1,参数2,...);
格式转换说明格式转换说明组成:%-7.3f引导符格式字符表示左对齐输出,省略表示右对齐输出表示输出最小宽度表示输出精度表示引导精度值格式转换说明例:printf("%d",12345);输出:例:printf("%7d",12345);输出:例:printf("%-7d",12345);输出:例:printf("%4d",12345);输出:例:printf("%-4d",12345);输出:例:printf("%7.3d",12345);输出:01234567812345
1234512345--123451234512345格式转换说明例:printf("%f",1.2345);输出:例:printf("%7f",1.2345);输出:例:printf("%-7f",1.2345);输出:例:printf("%3f",1.2345);输出:例:printf("%9f",12345);输出:例:printf("%9.3f",12345);输出:例:printf("%.3f",12345);输出:例:printf("%-9.3f",12345);输出:0123456781.2345001.2345001.2345001.2345001.2345001.2341.2341.234格式转换说明例:printf("%s","hello");输出:例:printf("%9s","hello");输出:例:printf("%-4s","hello");输出:例:printf("%.3s","hello");输出:例:printf("%9.3s","hello");输出:例:printf("%-9.3s","hello");输出:012345678hellohellohellohelhelhel------格式转换说明注意:printf函数默认是右对其输出宽度值m:输出的最小宽度,如果没有指定精度,按数值的实际长度输出如果数值的位数>m,则直接按数值的位数输出如果数值的位数<m,则补齐位数(默认用空格)精度值:整型:输出数值的最小位数,如果数值的位数>m,则直接按数值的位数输出浮点型:指定实数小数点后的位数字符串:指定输出字符串的最大位数(超出的截断)格式字符格式字符:指定输出数据的类型和相应的格式整型格式字符(P73-P74)d:带符号的十进制整型u:无符号的十进制整型o:以无符号的八进制整型x:以无符号的十六进制整型ld:带符号的十进制长整型整型格式字符例(P74例4.3)a:1111111111111111b:1111111111111110#include"stdio.h"main(){unsignedinta=65535;intb=-2;printf("a=%d,%o,%x,%u\n",a,a,a,a);printf("b=%d,%o,%x,%u\n",b,b,b,b);}输出:a=-1,177777,ffff,65535b=-2,177776,fffe,65534格式字符c:输出一个字符s:输出字符串例:#include"stdio.h"main(){charc='a';printf("c=%c,%c\n",c,97);printf("%s\n","CHINA");}格式字符e:以指数形式输出实型数据;f:以小数形式输出实型数据;g:自动选择f格式或e格式中宽度较小的一种输出实数,且不打印无效的0。注意:单精度型数据,用%f输出,前7位有效,且小数点后固定位6位双精度型数据,用%lf输出,前16位有效,且小数点后固定位6位printf函数注意事项输出数据类型要与格式说明相匹配,包括类型、格式格式字符x,e,g可以是大写字母X,E,G除x,e,g外的格式字符均为小写如若输出字符“%”,在“格式控制”中用连续两个“%”即可长度修正符:h(short):只能修饰整型数据l(long):修饰整型数据——输出长整型,修饰浮点型——输出双精度格式输入函数scanf功能:将用户从标准输入输入的数据存储到由变量地址所指定的内存空间。调用格式:scanf(格式控制,变量地址表);“格式控制”部分同printf函数,但有区别(无精度控制)。“地址表”由变量地址组成,表明每个输入项应在存储单元的首地址。获取变量首地址的格式:&变量名例:#include"stdio.h"main(){charc;inti;
scanf("%c%d",&c,&i)}......变量c
地址
内存
80A580A680A780A880A980AD变量i
格式输入函数scanf格式控制:与printf函数中的格式控制相似每一个格式转换说明都由%引导,而以格式字符结束例:scanf("%d%i%f",&i1,&i2,&f);格式字符(P80)对于无符号整型,可使用u,o,x格式符i,表示可以用十进制(123),也可用八进制(0123),和十六进制(0x123)输入;而格式符d只能输入十进制整型附加格式说明字符:l,h,*,域宽(P80)scanf函数注意事项输入数据的分割采用隐含的分隔符:空格、回车、Tab键根据格式中指定的域宽分隔数据项(不提倡)采用用户指定的分隔符,即在格式控制字符串内除格式说明以外的其它字符,输入数据时都应照样输入例:scanf("input%d,%d",&a,&b);
在输入时应键入:input2,3输入无符号数据时,应采用o,x格式符引例计算函数值:输入xX=0?
YNy=1y=six/x
输出y#include"stdio.h"#include"math.h"main(){floatx,y;printf("inputx:\n");scanf("%f",&x);if(x!=0.0)y=sin(x)/x;elsey=1;printf("y=%f",y);}关系运算符关系运算实际上是“比较运算”<<=>>=(优先级相同)==!=(优先级相同)优先级:算术运算符关系运算符赋值运算符结合方向:从左向右例:c>a+b
c>(a+b)a==b>ca==(b>c)a=b==ca=(b==c)低高低高关系表达式关系表达式:用关系运算符将两个表达式(算术表达式,字符表达式,关系表达式,逻辑表达式,赋值表达式)连接起来的式子例:x+y>5'a'=='A' 字符量比较:根据ASCII值(4*2)>(4==2) 关系表达式的值:“真”(1)或“假”(0)
例:a=3,b=2,c=1则:a>b的值为真,表达式的值为1a>b==c的值为真,表达式的值为1b+c<a的值为假,表达式的值为0b+c<=a的值为真,表达式的值为1例:a=3,b=2,c=1,如果d=a!=
b==c,则d=1逻辑运算符逻辑运算符:&&逻辑与例:a&&b,若a,b都为真,则逻辑表达式值为真。||逻辑或例:a||b,若a,b都为假,则逻辑表达式值为假,(换言之:a,b中有一个为真,则逻辑表达式值为真)。!逻辑非例: !a,若a为真,则逻辑表达式值为假;反之依然。真值表(P89)逻辑运算符优先级:!&&||结合顺序:!:从右向左&&和||:从左向右例:!a||b&&x>y&&c
(!a)||
b&&(x>y)&&c低高低高!(非)
算术运算符关系运算符&&
||赋值运算符各种运算符的优先级12345逻辑表达式逻辑表达式:用逻辑运算符将关系表达式或逻辑量连接起来的式子逻辑量:用来进行判断的变量或者常量C编译系统认为:值等于零:假非零值:真例:若a=4,在a&&1中,a就是逻辑量,代表真逻辑表达式的值:真为1,假为0例:若a=4,则:!a 0a&&-5 1a||0 1a&&0 0逻辑表达式例:a=3,b=2,c=1则:a>b&&b>c(a>b)&&(b>c)a!=b&&b!=c(a!=b)&&(b!=c)!a||c>a(!a)||(c>a)例:5>3||
2&&
!8<4-!0,结果为1例:判断某年year是否是闰年(闰年:能被4整除,且不能被100整除,或者能被400整除)year%4==0&&year%100!=0||year%400==0
例:x≤a+1,并且y≤b,C语言逻辑表达式:x<=a+1&&y<=b例 的定义域(x>2||x<1)&&x!=0if语句if语句的三种形式:条件执行格式:if(判断条件p)
语句A;例:例A空p真假if(a>0)printf("a=%dispositive\n",a);...if(x>y){ temp=x;x=y;y=temp;}...条件执行注意:语句A可以是复合语句判断条件P是一个表达式,如果值为0
假,非0
真例:例:例:if('a')printf("OK\n");x=-1;
if(x)printf("OK\n");y=0;
if(y)printf("OK\n");例:任给a,b,c三数,按从大到小顺序输出(1/2)例:任给a,b,c三数,按从大到小顺序输出方法:判断-交换若a<b,则a,b交换若a<c,则a,c交换a最大若b<c,则b,c交换c最小判断——ifelse语句交换:需引入临时变量
tmp=a;a=b;b=tmp;例:任给a,b,c三数,按从大到小顺序输出(2/2)交换a,bBa<b真假输入a,b,c交换a,cBa<c真假交换b,cBb<c真假输出a,b,c#include"stdio.h"main(){inta,b,c;inttmp;printf("Inputa,b,c:\n");scanf("%d%d%d",&a,&b,&c);if(a<b){tmp=a;a=b;b=tmp}if(a<c)tmp=a;a=c;c=tmp;}if(b<c){tmp=b;b=c;c=tmp;}printf("%d,%d,%d\n",a,b,c);}if语句——分支选择if语句的三种形式:分支选择格式:if(判断条件p)
语句A;
else
语句B;例:注意:else部分不能单独存在,它必须是if语句的一部分语句A、B都可以是复合语句ABp真假if(a>0)printf("a=%dispositive\n",a);elseprintf("a=%disnotpositive\n",a);if语句例:输入一个整数,判断奇偶#include"stdio.h"main(){inta;printf("Inputinteger:\n");scanf("%d",&a);if(a%2)printf("%disanodd\n",a);elseprintf("%disaeven\n",a);}if语句——阶梯式if语句的三种形式:多分支选择(称为
阶梯式ifelse或elseif语句)格式:if(判断条件p1)
语句A1
elseif(判断条件p2)
语句A2
elseif(判断条件p3)
语句A3
else
语句A4注意:执行顺序:从上向下逐个判断条件pi,一旦发现条件pi满足,执行Ai,并跳过剩余的阶梯最后一个else表示除了以上所有条件(p1、p2、p3)外的情况下,有时可以省略else与最近的if语句匹配A1p2p1真假真假A2p3真假A3A4if语句例:评价学生成绩,规则:score>=90,Ascore>=80,Bscore>=60,Cscore<60,D#include"stdio.h"main(){intscore;printf("Inputscore:\n");scanf("%d",&score);if(score>=90)printf("%dgreedisA\n",score);elseif(score>=80)printf("%dgreedisB\n",score);elseif(score>=60)printf("%dgreedisC\n",score);else printf("%dgreedisD\n",score);printf("finish\n");
}if语句例:判断输入的字符是数字、大写字母、小写字母或其他字符。#include<stdio.h>intmain(){ charc; printf("Enteracharacter:"); c=getchar(); if(c>='0'&&c<='9') printf("Digit!\n"); elseif(c>='A'&&c<='Z') printf("Uppercase!\n"); elseif(c>='a'&&c<='z') printf("Lowercase!\n"); elseprintf("Othercharater!\n");}if语句的嵌套标准格式
if(P1)
if(P2)
A1;
else
A2;
else
if(P3)
A3;
else
A4;P1真假P2真假P3真假A1A2A3A4if语句的嵌套标准格式
if(P1)
if(P2)
A1;
else
A2;
else
if(P3)
A3;
else
A4;格式1
if(P1)
A1;
else
if(P2)
A2;
else
A3;格式2
if(P1)
if(P2)
A1;
else
A2;
else
A3;else与最近的if语句匹配
if(P1)
if(P2)
A1;
else
if
(P3)
A3;
else
A4;if语句的嵌套注意:else与最近的if语句匹配例:
if(x>0)
if(y==1)printf("1");
elseprintf("2");通过加{}可以改变else的层次例
if(x>0){
if(y==1)printf("1");
}
elseprintf("2");例:断某一年是否是闰年(被4整除且不被100整除,或者被400整除)#include"stdio.h"main(){intyear,flag;scanf(“%d”,%year);if(year%400==0)flag=1;elseif(year%4==0) if(year%100==0)flag=0; elseflag=1;elseflag=0;if(flag) printf("%disleapyear\n",year);else printf("%disnotaleapyear\n",year);}flag=1year%4year%400真假真假
year%100真假flag=0flag=1flag=0输入yearflag真假输入闰年输入非闰年例:断某一年是否是闰年(被4整除且不被100整除,或者被400整除)#include"stdio.h"main(){intyear,flag;scanf(“%d”,%year);if(year%400==0)flag=1;elseif(year%4==0) if(year%100==0)flag=0; elseflag=1;elseflag=0;if(flag) printf("%disleapyear\n",year);else printf("%disnotaleapyear\n",year);}if(year%4!=0)flag=0;elseif(year%100!=0)flag=1;elseif(year%400==0)flag=1;elseflag=0;if(year%4==0&&year%100||year%400==0)flag=1;elseflag=0;条件运算符唯一的三目运算符格式:表达式1?表达式2:表达式3例:x=a>b?a:b
等价if(a>b)x=a;
elsex=b;优先级:高于赋值运算赋,低于算术、条件、逻辑运算符结合方向:从右向左例:a>b?a:c>d?c:d等价a>b?a:(c>d?c:d)
switch语句和break语句switch语句:是专门用于实现多分支选择的语句break语句:终止switch语句的执行格式:
switch语句的一般形式:
switch(表达式){
case常量表达式1:语句1
case常量表达式2:语句2
……
case常量表达式n:语句n
[default:语句n+1]
}执行过程:计算表达式若与常量表达式i一致,开始执行,直到遇到break语句或switch语句的}时结束若与所有常量表达式均不一致,执行default后的语句switch语句switch语句中的“表达式”和case后面的“常量表达式”的结果值的类型应该一致。每一个case的常量表达式的值必须互不相同,否则出现矛盾现象。各个case的出现次序不影响执行结果。执行完一个case后面的语句后,流程控制转移下一个case继续执行。default语句为选择项,可有可无。另外,default后面可以不加break语句。多个case可以共用一组执行语句,如例:
…
case‘A’:
case‘B’:
case‘C’:printf(“>60\n”);break;Grade的值为‘A’、‘B’、‘C’时都执行同一组语句。概述循环结构:在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。实现循环的四种语句用goto语句和if语句构成循环;(不提倡)用while语句;(while型循环,先判断,再执行)用do-while语句;(先执行,再判断)用for语句;(多功能)goto语句以及用goto语句构成循环goto语句功能:无条件地转向语句标号所在的语句行出开始执行格式为:goto语句标号;语句标号:属于标识符,命名规则与变量相同不提倡使用,会破坏结构化,例: 例:求1+2+3…+100的和
for(...)for(...){...if(disaster)gotoerror;}...error:printf(“ERROR\n”);#inclu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防跌倒坠床护理程序
- 液化气体生产工达标知识考核试卷含答案
- 丁基橡胶装置操作工QC管理模拟考核试卷含答案
- 砖瓦烧火工测试验证评优考核试卷含答案
- 26年居家监测内容清单
- 26年PR疗效判定实操要点手册
- 26年注册研究操作指引
- 26年胸膜间皮瘤评估实操指引
- 探索旅游业新篇章-全球视野下的亚太增长机遇
- 汽车金融变革之路-深度解析行业发展趋势及策略
- 2026下半年湖南益阳市资阳区事业单位招聘工作人员16人易考易错模拟试题(共500题)试卷后附参考答案
- 2026浙江杭州市西湖区人民政府西溪街道办事处招聘编外合同制工作人员2人笔试模拟试题及答案解析
- 2026年科目1驾驶技术模拟题库及完整答案详解
- 六化建设培训
- 2026年甘肃省平凉市辅警人员招聘考试真题解析含答案
- TSG08-2026《特种设备使用管理规则》全面解读课件
- 《2026年化学制药企业安全风险防控专项工作方案》解读
- 四川绵阳科技城发展投资(集团)有限公司招聘笔试题库2026
- PDCPD材料可行性研究报告
- 药品信用档案管理制度
- 【答案】《以案说法》(中南财经政法大学)章节作业慕课答案
评论
0/150
提交评论