《第3章简单的C程序设计.ppt》由会员分享,可在线阅读,更多相关《第3章简单的C程序设计.ppt(127页珍藏版)》请在三一办公上搜索。
1、第3章 简单的C程序设计,南京审计学院信息科学与技术学院孙玉星,C程序设计,本章学习内容,标识符命名;变量和常量;数据类型;(整型、浮点型、字符型)常用运算符和表达式;4.34.4运算符的优先级与结合性数据的输入输出字符输入函数getchar()字符输出函数putchar()格式输出函数printf()格式输入函数scanf()Skill:Develop a program to read/capture input and display output,C Program Structure,例2.1:一个简单的C程序例子,#include/*函数功能:计算两个整数相加之和 入口参数:整型数
2、据a和b 返回值:整型数a和b之和*/int Add(int a,int b)return(a+b);/*主函数*/main()int x,y,sum=0;printf(Input two integers:);scanf(%d%d,/*输出x和y相加之和*/,并列的两个函数其中一个是程序的入口,程序注释,编译预处理命令,C程序常见符号分类,关键字(Keyword)又称保留字(C Reserved Word)P378A word that has special meaning in C标识符(Identifier)C Standard Identifier(系统预定义标识符)A word h
3、aving special meaning but may be redefined(but is not recommended!)用户自定义标识符变量,函数名,,C程序常见符号分类,运算符(Operator)34种,详见附录C 分隔符(Separator)空格、回车/换行、逗号等 其它符号“”和“”标识函数体或语句块“/*”和“*/”程序注释的定界符 常量(Constant),标识符命名,变量名,函数名由英文字母、数字和下划线组成,大小写敏感不可以是数字开头直观,见名知意,便于记忆和阅读最好使用英文单词或其组合切忌使用汉语拼音 下划线和大小写通常用来增强可读性variablenamevar
4、iable_namevariableName不允许使用关键字作为标识符的名字 int,float,for,while,if等某些功能的变量采用习惯命名如:for语句所采用的循环变量习惯用i,j,k,Windows 风格,UNIX 风格,何谓变量(Variable)?,A name associated with a memory cell whose value can change,如何衡量变量所占空间大小?,bit,中文叫法:位Byte,中文叫法:字节Kilobyte(KB),中文叫法:KMegabyte(MB),中文叫法:兆Gigabyte(GB),中文叫法:GTerabyte(TB),
5、中文叫法:T,1 TB=1,024 GB,1 GB=1,024 MB,1 MB=1,024 KB,1 KB=1,024 B,1 B=8 b,一个位有多大?只能是“0”或者“1”,二进制一个字节有多大?可以表示数字0255之间的整数保存一个字符(英文字母、数字、符号)ASCII(美国标准信息交换码)编码(附录A),如何衡量变量所占空间大小?,Needs to be declared:变量类型 变量名;,Example:int sum;int x,y,sum=0;,变量声明(Variable Declaration),变量声明(Variable Declaration),使用变量的基本原则变量必须
6、先定义,后使用所有变量必须在第一条可执行语句前定义声明的顺序无关紧要一条声明语句可声明若干个同类型的变量声明变量是初始化变量的最好时机不被初始化的变量,其值为随机数,结果会是什么?,Example:int number1,number2;number1=25;number2=23;number1=number2;,25,23,23,变量赋值(Variable Assignment),Algorithm 变量 表达式 Syntax 变量=表达式;Rules:类型一致Expressions type must be the same as variables type,Valid Example:
7、Invalid Example:int x;int y;x=12;y=5.75;,变量赋值(Variable Assignment),Example:Calculate and display the price of a number of apples if the quantity in kg and price per kg are given.Input:quantity and pricePerkgOutput:priceProcess:price=quantity*pricePerkg,变量赋值(Variable Assignment),Example:int quantity;
8、float pricePerkg,price;quantity=5;pricePerkg=4.50;price=quantity*pricePerkg;,How does this program work?,变量赋值(Variable Assignment),Example:int quantity;float pricePerkg,price;quantity=2;pricePerkg=4.50;price=quantity*pricePerkg;,4.50,9.00,2,变量赋值(Variable Assignment),Example:int quantity;float priceP
9、erkg;float price;,变量类型(Variable Type),数据类型(Data Type),为什么要区分类型?不同类型有什么不同?数据表示形式合法的取值范围占用内存空间大小可参与的运算种类,数据类型(Data Type),基本数据类型,int整数,在目前绝大多数机器上占4个字节TC2.0,2个字节float单精度浮点数,4个字节double双精度浮点数,8个字节char字符,1个字节表示256个ASCII字符,或0255的整数,数据类型修饰符,shortshort int,简写为short,短整数,2个字节longlong int,简写为long,长整数,4个字节long do
10、uble,长双精度(高精度)浮点数,10个字节unsigned用来修饰char、int、short和long无符号整数(正整数和0),不同类型取值范围不同,C语言直接提供的任何类型都有取值范围。整数:P45、字符型:P49、浮点:P50思考题:整数范围的由来,不同类型取值范围不同,C语言直接提供的任何类型都有取值范围。当向其赋超过此范围的数值时,结果会怎样呢?产生数值类型溢出,得到一个不正确的结果。,小蛇能吞下大象吗?,typeoverflow.c,何谓类型溢出(Overflow)?,生活中的例子:千年虫问题阿利亚娜号火箭发射失败现象与危害:溢出后的数值是可预料的,但不同平台会有所不同当程序从
11、高位计算机向低位计算机移植(比如从64位系统移植到32位系统)时,以前从不出现的溢出问题可能出现,during execution of a data conversion from 64-bit floating point to 16-bit signed integer value.The floating point number which was converted had a value greater than what could be represented by a 16-bit signed integer.This resulted in an Operand Err
12、or.,解决方案?,预先估算运算结果的可能范围,采用取值范围更大的类型。1+2+3+1!+2!+3!+13+23+33+在运算还没开始之前就判断运算数是否在合理的取值范围内。如果超出,则停止运算,转错误处理。,100!=9.3326215443944*10157,13+23+n3=(1+2+3+n)2=(n(n+1)/2)2=5050*5050,不同类型占用的内存字节数不同,因为同种类型在不同的平台其占字节数不尽相同。如int在16位、32位和64位系统分别占2、4和8个字节。不要对变量所占的内存空间字节数想当然用sizeof获得变量或者数据类型的长度现象与危害:在平台间移植时会出现问题,导致
13、数据丢失或者溢出,注意!,sizeof到底是什么?,C语言的关键字,并非函数计算类型占用的字节数两种语法形式 sizeof(类型)结果为类型占用的字节数 sizeof(表达式)结果为表达式值所属类型占用的字节数 一般都使用sizeof(变量名),现场演示例2.3在TC和VC的运行结果,#include main()printf(Data type Number of bytesn);printf(-n);printf(char%dn,sizeof(char);printf(int%dn,sizeof(int);printf(short int%dn,sizeof(short);printf(l
14、ong int%dn,sizeof(long);printf(float%dn,sizeof(float);printf(double%dn,sizeof(double);,不同类型数据在内存中的存储形式不同,字符型整型实型N=S2j,所占位数决定实数的取值范围,所占位数决定实数的精度,常量(Constant),A value that will not changeConsists of:整型(e.g.0 67-2 123L 123u 022 0 x12)缺省为int实型(e.g.2.3 1.2e-5 2.73F 2.73L)缺省为double字符型(e.g.z 3$n)用开头的字符为转义字
15、符,代表1个字符字符串(e.g.UKM 1 5a),字符常量,转义字符一些特殊字符(无法从键盘输入或者另有它用)用转义字符表示,字符常量,字符常数就是一个普通整数,也可参与各种数学运算每个字符具有一个0255之间的数值,可从ASCII表查出注意:5和整数5的区别5的ASCII码值是53 字符的数学运算在密码学内 用得比较多,例2.5:小写字母转换为大写字母,#include main()char ch=b;printf(%c,%dn,ch,ch);ch=b-32;printf(%c,%dn,ch,ch);,#include main()char ch=b;printf(%c,%dn,ch,ch
16、);ch=b-(a-A);printf(%c,%dn,ch,ch);,b,98B,66,b,98B,66,相当于97-65,字符串常量,用双引号括住的由0个或多个字符组成的字符序列I am a string表示空字符串除注释外,是唯一可以出现中文的地方C语言内部用0表示字符串的结束x和x是不同的里定义了一系列专门的字符串处理函数转义字符也可在字符串中使用字符串tNameAddressn的长度?15,宏常量,#define 标识符 字符串宏常量也称符号常量一般采用全大写字母表示 宏定义不是语句,而是一种编译预处理命令,例2.2:计算圆的周长和面积,#include#define PI 3.141
17、59#define R 5.3main()printf(area=%fn,PI*R*R);printf(circumference=%fn,2*PI*R);,area=88.247263circumference=33.300854,相当于执行#include main()printf(area=%fn,3.14159*5.3*5.3);printf(circumference=%fn,2*3.14159*5.3);,宏替换,例2.2:计算圆的周长和面积,#include#define PI 3.14159;#define R 5.3;main()printf(area=%fn,PI*R*R)
18、;printf(circumference=%fn,2*PI*R);,相当于执行#include main()printf(area=%fn,3.14159;*5.3;*5.3;);printf(circumference=%fn,2*3.14159;*5.3;);,语法错误,为什么需要常量?,假如不使用常量,直接使用常数,会有什么影响?程序的可读性变差容易发生书写错误当常数需要改变时,要修改所有使用它的代码,工作量大,还可能有遗漏解决方案:避免使用幻数(直接使用的常数不知道什么意义的数字)把幻数定义为宏常量,运算符(Operator),34种,详见附录D常见的运算符算术运算符赋值运算符类型强
19、转关系运算符逻辑运算符增和减位运算符,运算符和操作数(Operator and Operand),What are operator and operand?,表达式 Expression,An expression may contain 2 or more operators 每一个表达式都有一个值,算术运算符(Arithmetic Operators),Multiplication(*),addition(+)and subtraction(-)are the simplest to use Division(/)is easy,but some precautions need to
20、be taken Modulus(%)is the one that normally confuses novices So,lets study in detail the Division and Modulus,算术运算符(Arithmetic Operators),除法(Division),Example:,整数除法(Integer Division),8/2=4,Example:,12/5=2,整数除法(Integer Division),Example:,实数除法(Floating Division),12.0/5=2.4,What will be the answer if a
21、n integer is divided by 0?验证题:请大家上机实验除以零会出现什么情况,Something to ponder,求余(Modulus),It returns the remainder that occurs after performing the division of 2 operandsRule:操作数必须是整数,Example:,12%5=2,12,5,2,10,2,求余(Modulus),How about if one of the operands is a negative integer?,Something to ponder,Example:,-
22、7%3=-1,-7,3,-2,-6,-1,求余(Modulus),Example:,7%-3=1,7,-3,-2,6,1,求余(Modulus),Example:,12.0%3=?,求余(Modulus),An expression may contain 2 or more arithmetic operators Main issue:运算顺序ORDER OF PRECEDENCE 优先级,算术表达式(Arithmetic Expression),Examples:,5+6,5+6*2,2.5+6 2*2,12/6.0 2*2,=11,=22 or 17?,=?,=?,=17,算术表达式(
23、Arithmetic Expression),Wait a minute,优先级(Order of Precedence)High:*/%Low:+-All operators have a precedence level.不同优先级时的运算顺序:High precedence level operators are evaluated before lower ones.相同优先级时的运算顺序:Operators of the same precedence level are evaluated from left to right(左结合),算术表达式(Arithmetic Expre
24、ssion),Example:,?,4,8.5,2.5+6,4,4.5,2.5+6 2*2=,算术表达式(Arithmetic Expression),4.5,巧妙使用圆括号改变运算顺序All expressions in parentheses must be evaluated prior to values outside bracketsNested parenthesized expressions must be evaluated from the inside out,with the innermost expression evaluated first,Example:,
25、(9(3+2)*3=?,算术表达式(Arithmetic Expression),赋值语句(Assignment Statement),There are 3 types of assignment:Simple简单赋值Multiple多重赋值Shorthand简写的复合赋值,简单赋值Simple Assignment,Syntax:变量=表达式;,Every assignment expression has a value,#include main()float price,discount,total;printf(“Buying price:“);scanf(“%f”,Buying
26、price:_,Buying price:10.00Discount rate:_,2.50,Buying price:10.00Discount rate:0.25_,Buying price:10.00Discount rate:0.25The total price is 2.50_,Example:,简单赋值Simple Assignment,Syntax:变量1=变量2=表达式;,多重赋值Multiple Assignment,Example:int number,total;float start_x,start_y;.number=total=0;start_x=start_y=
27、100.0;,多重赋值Multiple Assignment,从右向左赋值,Syntax:变量x=变量x 运算符op 表达式;变量x 运算符op=表达式;,简写的复合赋值Shorthand Assignment,这种形式看起来更直观,且执行效率一般也更高一些,Whenever the expression on the right contains the variable on the left(to which the value is assigned),Example:num=num+5;,15+5,20,20,简写的复合赋值Shorthand Assignment,Expressio
28、ns can also be stated using shorthand assignment operators,Example:num+=5;,similar to num=num+5,简写的复合赋值Shorthand Assignment,已知 int a=3;执行 a+=a-=a*=a 后,变量a的值?a+=a-=a*=a a+=a-=9 a+=0 a=0,简写的复合赋值Shorthand Assignment,3,9,0,0,简写的复合赋值Shorthand Assignment,自动类型转换,相同类型数据的运算结果,还是该类型不同类型数据的运算结果,是两种类型中取值范围大的那种l
29、ong double double float long int short char,自动类型转换,取值范围小的类型赋值给取值范围大的类型是安全的反之是不安全的若大类型的值在小类型能容纳的范围之内,则平安无事 但是,浮点数转为整数,会丢失小数部分,非四舍五入反之,转换后的结果必然是错误的,具体结果与机器和实现方式有关避免如此使用,好的编译器会发出警告,Example:int x=10;float y;y=(float)x;,(float)10,10.000000,类型强转(Casting),消除从大到小的警告x=(int)y;通过下面方式把表达式的值转为任意类型(类型)表达式,不改变x,Ex
30、ample:int total,number;float average;average=total/number;,15/2,7,类型强转(Casting),两个整数运算的结果还是整数,不是浮点数,Example:int total,number;float average;average=(float)total/number;,15.000000/2,7.500000,类型强转(Casting),关系运算符(Relational Operators),优先级 算术运算符=!=赋值运算符左结合,a b=cd=a bch a+1 d=a+b c3=x=5b-1=a!=c,(a b)=cd=(
31、a b)ch(a+1)d=(a+b)c)(3=x)=5(b-1)=a)!=c,char ch=w;int a=2,b=3,c=1,d,x=10;,001110,Symbol Description&与(AND)当且仅当两者都为真,则结果为真|或(OR)只要两者中有一个为真,结果就为真!非(NOT),逻辑运算符(Logical Operators),!&|,高,低,逻辑运算符(Logical Operators),优先级!算术运算符关系运算符&|赋值运算符左结合,复合表达式(Compound Expression),Arithmetic,relational and mantic operato
32、rs can be integrated/combined in one expression,Example:!(c a),!(1),!(15 2),0,一般整数的逻辑值如何判断是0还是1?规则:整数0的逻辑值为0,非零整数的逻辑值是1,复合表达式(Compound Expression),Example:!c a,!12,!15 2,02,0,Example:(a=1)&(b=5),(2=1)&(b=5),1&(b=5),1&(5=5),1&1,1,复合表达式(Compound Expression),复合表达式(Compound Expression),Example:短路求值(a=1)
33、&(b=5),(0=1)&(b=5),0&(b=5),0,Example:短路求值(c=(b*3)|(a=3),(c=(5*3)|(a=3),1|(a=3),(15=15)|(a=3),1,复合表达式(Compound Expression),实例ch是英文大写字母(ch=A)&(ch=Z)判断某一年year是否是闰年的条件是满足下列二者之一能被4整除,但不能被100整除;能被400整除;year%4=0&year%100!=0|year%400=0优先级:%=(!=)&|(year%4=0)&(year%100!=0)|(year%400=0),复合表达式(Compound Expressi
34、on),增一和减一运算符(Increment and Decrement),n+,n-,+n,-n+让参与运算的变量加1,-让参与运算的变量减1作为后缀(postfix)运算符时,先取n的值,然后加/减1,增一和减一运算符(Increment and Decrement),n+,n-,+n,-n+让参与运算的变量加1,-让参与运算的变量减1作为后缀(postfix)运算符时,先取n的值,然后加/减1作为前缀(prefix)运算符时,先加/减1,然后取n的值,Example:j=+i-2,similar to i=i+1;j=i 2;,4,6,前缀(Prefix)增一和减一运算符,Example
35、:j=i+-2,similar to j=i 2;i=i+1;,后缀(Postfix)增一和减一运算符,3,6,增一和减一运算符,良好的程序设计风格提倡:在一行语句中,一个变量只能出现一次增1或者减1运算过多的增1和减1运算混合,不仅可读性差,而且因为编译器实现的方法不同,导致不同编译器产生不同的运行结果,逗号运算符,表达式1,表达式2,表达式n先计算表达式,然后计算表达式,,最后计算表达式n的值,并将表达式n的值作为逗号表达式的值.int a,b,c;(a=2),(b=3),(c=a+b);逗号运算符的优先级最低,左结合,优先级与结合性,()-.!+-+-*&(类型)sizeof*/%+-=
36、!=&|&|?:=+=-=*=/=%=&=|=,能背下优先级表的人凤毛麟角用括号来控制运算顺序,更直观、方便,并减少出错的概率多数为左结合,少数为右结合:一元运算符赋值运算符条件运算符(第四章介绍),字符输入输出函数,字符输出函数putchar(ch)输出一个字符ch字符输入函数getchar()无参数函数值为从输入设备接收的字符,#include main()char ch;printf(Press a key and then press Enter:);ch=getchar();printf(You pressed);putchar(ch);putchar(n);,运行程序,Press
37、a key and then press Enter:,A,You pressed,A,例2,What does this statment mean?,格式输出函数,格式printf(格式控制字符串,输出项表列);printf(a=%d b=%f,a,b);可以输出若干任意类型的数据,函数名,可选输出表列,普通字符,%c character以字符形式输出单个字符%s string 输出一个字符串%d decimal 以带符号十进制整数输出%f float 以小数形式输出浮点数(6位小数)%e exponent 以标准指数形式输出(6位小数)%g 选用%f,%e中输出宽度较小的一种格式%o o
38、ctal 以八进制无符号整数输出(无前导0)%x hex 以十六进制无符号整数输出(无前导0 x)%u unsigned 以十进制无符号整数输出,printf格式字符P62,printf Function-Character,Format for character:%c,Example:printf(“%c%c%c”,U,K,M);,U K M_,printf Function-Character,Example:printf(“%c%c%c”,U,K,M);,UKM_,printf Function-Character,Example:char1=U;char2=K;char3=M;pri
39、ntf(“%c%c%c”,char1,char2,char3);,U K M_,Example:printf(“Name:%snStudent No:%s”,“Ali Bakar”,“A92333”);,Name:Ali BakarStudent No:A92333_,printf Function-String,printf Function-String,Example:printf(“Name:%snStudent No:%s”,“Ali Bakar”,“A92333”);,Name:Ali BakarStudent No:A92333_,printf Function-Float,Fo
40、rmat for float:%f General format:%m.nf,Example:printf(“Value is:%10.4f”,32.6784728);,Value is:32.6785,最小域宽,小数位数,printf Function-Float,Example:printf(“Value is:%10f”,32.6784728);,Value is:32.678473,printf Function-Float,Example:printf(“Value is:%10.5f”,32.6784);,Value is:32.67840,Example:printf(“Valu
41、e is:%5f”,32.6784728);,Value is:32.678473,printf Function-Float,Example:printf(“Value is:%.3f”,32.6784728);,Value is:32.678,printf Function-Float,printf Function-Float,#include main()int age;float height;age=21;height=1.73;printf(“Ali is%d years old and his height is%.5f metersn”,age,height);,Ali is
42、 21 years old and his height is 1.73000 meters_,21,1.73,Example:,m 表示数据占用的最小宽度 数据宽度大于m,按实际宽度输出 数据宽度小于m时,补空格n 对实数表示输出n位小数 对字符串表示最多输出的字符个数l 长整型整数,加在d、o、x、u前L long double型数,加在f、e、g前-改变输出内容的对齐方式 缺省为右对齐,printf附加格式说明符,格式输入函数,格式scanf(格式控制字符串,地址表列);scanf(%d,%f”,c 以字符形式输入单个字符s 输入字符串,以非空字符开始,遇第一个 空白字符结束d 以带符号
43、十进制形式输入整型数据f 以小数形式输入浮点数e 以标准指数形式输入o 以八进制无符号形式输入(无前导0)x 以十六进制无符号形式输入(无前导0 x),scanf格式字符,HIT-C Programming,scanf Function,Example:printf(“Key-in a character and a number:“);scanf(“%c%d”,m,Key-in a character and a number:m103,103,Key-in a character and a number:m103Character:m_,Key-in a character and a
44、number:m103Character:mNumber:103_,#include main()int day,month,year;scanf(“%d%d%d”,16 12 2005,16,12,2005,16 12 2005Day:16,Month:12,Year:2005_,scanf Function,#include main()int day,month,year;scanf(“%d%d%d”,16 12 2005,scanf Function,scanf(“%d,%d,%d”,16,12,2005,scanf(“day=%d,month=%d,year=%d”,day=16,m
45、onth=12,year=2005,scanf Function,#include main()char c1,c2,c3;scanf(“%c%c%c”,.,a b c,abc,m 表示数据占用的宽度l 加在d、o、x、u前:输入长整型 加在f、e 前:输入双精度型L 加在f、e 前:输入long double型h 加在d、o、x 前:输入短整型*本输入项在读入后不赋给相应的变量,scanf附加格式说明符,scanf附加格式说明符,#include main()char c1,c2,c3;scanf(“%c%*c%c”,.,a b c,abc,a&b,格式输入函数常见错误,scanf(%d,%
46、fn”,几点忠告不要拘泥于细节不要死记硬背在使用中慢慢掌握,本章知识点,字符输入函数getchar()字符输出函数putchar()格式输入函数scanf()格式输出函数printf()难点格式控制问题,标识符的命名规则数据类型变量(声明、赋值、初始化)常量运算符及其优先级和结合性算术赋值类型强转关系逻辑增一/减一位运算 sizeof,数据类型表达式作业,数据类型表达式作业,C语言实验指导书实验二实验指导书上机实验题实验一 熟悉上机环境和顺序结构编程练习,习题2,输入输出作业,验证课本第三章所有例题(不需要交)课本P84 6第六题:做以下修改:密码规律:大写字母用其小写字母的后续第7个字母代替
47、;小写字母用其大写字母的后续第7个字母代替例:Happy-oHWWFC语言实验指导书实验三实验指导书上机实验题实验一 熟悉上机环境和顺序结构编程练习,习题1,输入输出作业,输入输出作业,完成加法运算程序的编写(要求两个操作数和+操作符都要屏幕输入)。即在屏幕上输入12+3,返回结果是15 并测试多种输入方式 如:12+3 12+3 12 3 请分析各不同输入方式后结果有什么不同,为什么!请思考如何以任意格式输入结果都正确?,输入输出作业,改错题:下列程序完成分别输入一个整数一个字符一个实数,并将输入的信息原样输出。,#include main()int a;char b;float c;printf(Please input an integer:);scanf(%d,程序存在一处逻辑错误请你们找出出错位置,并改正,位操作运算符,&按位与运算|按位或运算按位异或运算,按位右移运算按位求反,位操作运算符,P66,3.4(2)逻辑运算与位运算的不同main()int x=12,y=8;printf(n%5d%5d%5d,!x,x|y,x,0 1 1 65523 12 8-13 12 8,逻辑非的结果不是按位取反,正数的补码与其原码相同,负数的补码为其反码加1,