- 809.00 KB
- 2022-08-23 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
第1章C语言概述1.3C语言的基本符号1.C语言的基本符号(1)26个英文字母(大写和小写字母表示两种不同的符号);(2)10个阿拉伯数字(0,1,2,……,9);(3)其它特殊符,以运算符为主(+,-,*,/,=,%,<,>等)。2.标识符标识符是一种特定的字符序列。主要用来表示程序中使用的变量名、数组名、函数名和其它由用户自定义的数据类型名称等。标识符的构成与书写规则:(1)只能由英文字母、数字和下划线构成,长度为1~32。(2)必须以字母或下划线开头。(3)严格区分大、小写字母。(4)不能以关键字作为标识符。(5)系统内部使用了一些下划线开头的标识符,为防止冲突,建议用户尽量避免使用下划线开头的标识符。(6)标识符选用应尽量做到“见名知意”,即选用有含义的英文单词或缩写。如sum,name,max,year,total等。3.关键字关健字又称保留字,它是C语言系统的专用名字,共有32个。根据关键字的作用分为四类:(1)控制语句关键字(12个)break,case,continue,default,do,else,for,goto,if,return,switch,while(2)数据类型关键字(12个)char,enum,double,long,float,int,short,signed,struct,unsigned,union,void(3)存储类型关键字(4个)auto,extern,register,static(4)其他关键字(4个)\nconst,sizeof,typedef,volatile【例1.1】找出下列符号中合法的标识“abc”so5Abcab1file_name_buf0pageintprintfyellow_reda&bup.tofilename解:合法的标识有:so5,Abc,a,b1,file_name_buf,yellow_red。1.4C语言程序结构1.4.1C语言程序的总体结构C语言程序由一个且只能有一个main()函数(又称主函数)和若干个其他函数结合而成的,或仅由一个main()函数构成。例如:[例1.2]仅由一个main()函数构成;[例1.3]由一个main()函数和一个其他函数max()构成。 【例1.2】从键盘上输入圆的半径radius的值,求圆的面积。voidmain(){floatradius,area,pi=3.;printf("Pleaseinputaradius:");scanf("%f",&radius);area=pi*radius*radius;ptintf("area=%f\n",area);}程序运行结果:Pleaseinputaradius:1.5↙area=7.69 【例1.3】由一个main()函数和一个其他函数max()构成的C语言程序。intmax(intx,inty)/*函数max()的功能是求2个整数的较大值*/{retum(x>y?x:y);} voidmain()/*主函数main()*/{intnuml,num2;printf("Inputthefirstintegernumber:");scanf("%d",&numl);\nprintf("Inputthesecondintegernumber:");scanf("%d",&num2);printf("max=%d\n",max(numl,num2));} 程序运行情况:Inputthefirstintegernumber:6↙Inputthesecondintegernumber:9↙max=9 C语言程序结构如下:1.4.2函数的一般结构任何函数都是由函数说明和函数体两部分组成,结构如下: [函数类型]函数名(函数参数表)函数说明部分{说明语句部分;执行语句部分;函数体部分} \n注:常用的语法符号约定[……]方括号表示可选(既可以指定,也可以缺省)。……省略号表示前面的项可以重复。|两侧的项必选其一。1.函数说明由“[函数类型]函数名(函数参数表)”三部分组成。函数参数表格式为:数据类型参数[,数据类型参数2……]例如:intmax(intx,inty) 注意:在旧标准中,函数可以缺省参数表。但在新标准中,函数不可缺省参数表;如果不需要参数,则用“void”表示。2.函数体注意:(1)函数体中的说明语句,必须在所有可执行语句之前。下面程序中“int max;”的位置是非法的:voidmain(){intx,y; /*变量定义语句:定义2个整型变量x、y*/x=3; /*可执行的赋值语句:将3赋值给变量x*/y=6;/*可执行的赋值语句:将6赋值给变量y*/intmax;/*变量定义语句:出现在可执行语句后,非法!*/max=x>y?x:y;printf("max=%d\n",max);}\n解决办法很简单,请读者自己思考。(2)如果不需要使用变量,也可以缺省说明语句。1.4.3源程序书写格式1.所有语句都必须以分号“;”结束。2.一行内可写几条语句,一条语句也可写在几行上。3.允许使用注释,以增强程序的可读性。 注释格式:/*注释内容串*/ (1)“/*”和“*/”必须成对使用。(2)注释的位置,可以单占一行,也可以跟在语句的后面。(3)如果一行写不下,可另起一行继续写。(4)注释中允许使用汉字。在非中文操作系统下,看到的是一串乱码,但不影响程序执行。第2章数据类型、运算符和表达式【本章要点】本章主要介绍C语言的变量和常量的基本概念;各种数据类型的定义;变量赋值和初始化的方法;基本运算符的运算规则、优先级和表达式。该章是C语言程序设计最基础的部分,通过本章学习要求学生能定义各种数据类型,根据要求运用运算符建立一般表达式和编写简单程序。2.1C语言的数据类型C语言的数据类型如下:\n本章将介绍基本类型中的整型、实型和字符型三种数据。各数据类型在系统中占用字节数及取值范围如表2.1所示。表2.1 各种基本类型关键字、TurboC环境中占用字节数及取值范围类型关键字所占字节数取值范围说明int2-32768~32767有符号基本整型unsigned20~65535无符号基本整型short2-32768~32767有符号短整型unsignedshort20~65535无符号短整型long4-~有符号长整型unsignedlong40~无符号长整型float410-37~1038单精度实型double810-307~10308双精度实型char10~255字符型2.2 常量与变量程序运行过程中,其值不能被改变的量称为常量,其值可以改变的量称为变量。\n2.2.1 常量常量主要:整型常量、实型常量、字符型常量和符号常量。1.整型常量整型常量有三种形式:(1)十进制整数:由数字1~9开头,其余各位由0~9组成。如123、-789、0等。(2)八进制整数:由数字0开头,其余各位由0~7组成。在书写时要加前缀“0”(零)。如012,表示八进制数12。(3)十六进制整数:由数字0x或0X开头,其余各位由0~9与字母a~f(0X开头为A~F)组成。在书写时要加前缀“0x”或“0X”开头。如0x36,代表十六进制数36。注意:(1)在C语言中10,010,0xl0是3个数值完全不同的整数。(2)整型数可longint、shortint和unsignedint等若干种。(3)长整型数在书写时加一个后缀“L”。(4)整型数又可以是正数和负数。例如:123,-123,0123,-0123,0x789,-0x789是合法的;16、020、0xl0在计算机中的内部表示都相同。2.实型常量实型常量又称实数、浮点数,有两种表现形式:(1)十进制实数:由数字和小数点组成。如0.149,123.0。(2)指数形式:用带指数记数法来表示,如123E2或123e2(注意书写)。3.字符型常量字符型常量有:字符常量、字符串常量和转义字符三种。(1)字符常量字符常量构成:用一对单引号括起来的单个字符。例如:'A'、'a'、'X'、'?'、'$'等都是字符常量。字符常量的值:就是该字符的ASCII码值,可以和数值一样参加运算。例如:字符'A'的数值为十进制数65。(2)字符串常量字符串常量构成:用一对双引号括起来的字符序列。例如:"abc"、"CHINA"、"yes"、"1234"、"Howdoyoudo."等,都是字符串常量。字符串长度:字符中的字符个数。例如,"Howdoyoudo."、"Goodmorning."和""的长度分别为14、13和0。\nC语言规定:字符串存储时,系统在末尾自动加一个'\0'符号作为字符串的结束标志。例如:字符串为“CHINA”内存中实际存储为:注意:字符常量与字符串常量的区别。例如:字符常量'A'与字符串常量"A"的区别是:①定界符不同:字符常量使用单引号,而字符串常量使用双引号;②长度不同:字符常量长度为1,字符串常量长度可为任意值(0或某个整数);③存储要求不同:字符常量存储的是字符的ASCII码值,而字符串常量,除了要存储有效的字符外,还要存储一个结束标志'\0'。(3)转义字符转义字符:C语言中用来表示键盘上的控制符和功能符的特殊符号。例如:回车换行符、换页符等。形式:反斜杠"\"后面跟一个字符或一个数值。例如:'\n',为换行,'\101'与'\x41'都表示字符'A'。表2.2 常见转义字符转义字符表示含义\\将\转义为字符常量中的有效字符(\字符)\'单引号字符\"双引号字符\n换行,将当前位置移到下一行开头\t横向跳格,横向跳到下一个输出区\r回车,将当前位置移到本行开头\f走纸换页,将当前位置移到下页开头\b退格,将当前位置移到前一列\v竖向跳格\ddd1到3位8进制数所代表的字符\xhh1到2位16进制数所代表的字符【例2.1】转义字符的使用#includevoidmain()\n{printf("ㄩabㄩc\tㄩde\rf\tg\n");/*ㄩ表示一个空格*/printf("h\ti\b\bjㄩk");}程序运行后在显示屏上的输出结果如下:fㄩㄩㄩㄩㄩㄩㄩgdehㄩㄩㄩㄩㄩㄩjㄩk若在打印机上输出,则结果如下:fabㄩcㄩㄩㄩgdehㄩㄩㄩㄩㄩㄩjik#flash#(4)符号常量在C语言中用符号来代替常量称为符号常量。习惯上,符号常量名用大写,变量名用小写,以示区别。【例2.2】 符号常量的使用。/*程序功能:计算圆的面积*/#include#definePI3.voidmain(){floatr,s;r=5.0;s=PI*r*r;printf("Areais%f",s);}程序中用#define命令行定义PI代表常量3.。运行结果为:注意:使用符号常量的好处是:(1)含义清楚。定义符号常量名时应考虑“见名知意”。(2)在需要改变一个常量时能做到“一改全改”。(3)符号常量的值在其作用域内不能改变,也不能再被赋值。Areais78.2.2.2 变量变量:在程序运行过程中其值可以改变的量。变量属性:变量名、变量类型(内存中占用存储单元)和变量的值(图2.1)。(1)变量名:变量的名字──变量名。变量命名:遵循标识符命名规则,最好取名时考虑“见名知意”。\n例如:max表示求最大值、sum表示求和等。(2)变量类型:整型变量、实型变量和字符变量三种。不同类型的变量,占用的内存单元(字节)数不同。(2)变量值:变量在程序运行过程中的取值。在程序中,通过变量名来引用变量的值。1.整型变量(1)整型变量分类根据占用内存字节数的不同,整型变量分为4类:基本整型(int)、短整型(short[int])、长整型(long[int])和无符号整型。无符号基本整型(unsigned[int])和无符号短整型(unsignedshort表示)和无符号长整型(用unsignedlong表示)三种。(2)整型变量占用字节数与值域各种类型的整型变量占用的内存字节数,随系统而异。在DOS系统下使用的TurboC中:表2.1 整型变量在TurboC环境中占用字节数及取值范围类型关键字所占字节数取值范围说明int2-32768~32767有符号基本整型unsigned20~65535无符号基本整型short2-32768~32767有符号短整型unsignedshort20~65535无符号短整型long4-~有符号长整型unsignedlong40~无符号长整型注:对于其它系统中设基本整型占用内存字节数为n,其值域为:-2n*8-1~(2n*8-1-1);无符号整型变量的值域为:0~(2n*8-1)。例如,图2.2是在TurboC系统中:int与unsigned最大值。\n(3) 整型变量的定义所有变量都必须“先定义,后使用”。例如:inta,b;/*定义变量a、b为整型*/unsignedshortc,d;/*定义变量c、d为无符号短整型*/longe,f; /*定义变量e、f为长整型*/注:变量定义一般是放在一个函数的开头的声明部分。【例2.3】整型变量的定义与使用。#includevoidmain(){inta,b,c,d;/*定义a,b,c,d为整型变量*/unsignedu;/*定义u为无符号整型变量*/a=12;b=-24;u=10;c=a+u;d=b+u;printf("a+u=%d,b+u=%d\n”,c,d);}运行结果为:a+u=22,b+u=-142.实型变量C语言的实型变量,分为两种:(1)单精度型(float):占4个字节(32位)7位有效数字。(2)双精度型(double),占8个字节15位有效数字。例如:floatx,y; /*定义x、y为单精度实数*/doubleb; /*定义b为双精度实数*/\nlongdoublec;/*定义c为长双精度实数*/3.字符变量字符变量的类型关键字为char,占用一个字节内存单元。(1)变量值的存储字符变量在内存中占一个字节。以该字符的ASCII码值(无符号整数)存储到内存单元中。例如:charchl,ch2; /*定义两个字符变量:chl,ch2*/chl='a';ch2='b'; /*给字符变量赋值*/存储如图2.3所示:(2)特性C语言中字符型数据与整型数据之间可以通用。例如:①字符型数据既可以以“字符形式”或者“整数形式”输出。【例2.4】 字符变量的字符形式输出和整数形式输出。#includevoidmain(){charch1,ch2;ch='a';ch2='b';printf("ch1=%c,ch2=%c\n",ch1,ch2);/*字符形式输出*/printf("ch1=%d,ch2=%d\n",ch1,ch2);/*整数形式输出*/}程序运行结果:ch1=a,ch2=bch1=97,ch2=98注意:字符数据占一个字节,它只能存放0-255范围内的整数。②允许对字符数据进行算术运算。\n【例2.5】 字符数据的算术运算。#includevoidmain(){charch1,ch2;chl='a';ch2='B';printf("ch1=%c,ch2=%c\n",ch1-32,ch2+32);/*字母的大小写转换*/}程序的运行结果:ch1=A,ch2=b2.3 变量赋初值变量赋初值又称为变量初始化,有其两种方法:(1)先定义一个变量,然后再给它赋一个值,例如:inta;a=8;(2)在定义变量的同时就对变量进行初始化,例如:charch='a';floatb=2.345;intx,y=3;/*部分变量赋初值,对y赋初值3*/【例2.6】 变量赋初值#include"stdio.h"voidmain(){intx,y=3;charch;ch='a';printf("%d%d%c",x,y,ch);}运行结果如下:2513a注:x没有进行初始化,输出为随机不定值251,下次可能是其他的结果。2.4 各类数值型数据间的混合运算在同一个表达式中出现多种数据类型的混合运算时,先将各种类型数据转换成同一类型数据,然后才能运算求值。转换规则如图2.4所示。\n(1)规范化图2.4中水平方向的向左箭头的转换为规范化转换。(2)保值转换图2.4中向上方向的向上箭头的转换为保值转换(即将类型等级较低转换成等级较高的)。例如:有如下定义:intm;floatn;doubled;longinte;对表达式:('c'+'d')*20+m*n-d/e转换过程是:(略)2.5 C语言的运算符和表达式C语言表达式是由运算符、常量及变量组成;运算符(即操作符)是对运算对象(又称操作数)进行某种操作的符号。有二元(双目)、一元(单目)运算符。对于运算符应从以下不几个方面掌握:1.运算符号2.运算规则,即所进行的操作3.运算的优先级别4.运算顺序5.运算对象6.运算结果本节重点介绍基本运算符及表达式。\n2.5.1 算术运算符和算术表达式1.五种基本算术运算符 +(加法)、-(减法/取负)、*(乘法)、/(除法)、%(求余数)运算规则与代数运算基本相同,但有以下不同之处需要说明:(1)除法运算/两个整数相除商为整数,小数部分被舍弃。例如:5/2=2而:5.0/2=2.5。(2)求余数运算%参加运算的两操作数均为整型数据,否则出错。结果是整除后的余数。在TurboC中运算运算结果的符号与被除数相同。例如:7%3=1,7%-3=1,(商分别为2、-2)。-7%3=-1,-7%-3=-1;(商分别为-2、2)。2.表达式和算术表达式(1)表达式的概念。表达式:用运算符和括号将常量、变量和函数等连接起来符合C语言语法规则的式子。单个常量、变量或函数构成的表达式称为简单表达式。(2)算术表达式的概念。算术表达式:用算术运算符和括号将常量、变量和函数等连接起来的符合C语言语法规则的式子。例如:3+6*9、(x+y)/2–1、5-a等,都是算术表达式。(3)表达式求值①运算顺序例如:先乘除后加减。②结合性同级运算的结合方向称为结合性。例如:算术运算符的结合方向是“从左至右”,即先左后右,称左结合。3.强制类型转换一般格式为:(<要转换成的数据类型名>)(<被转换的表达式>)功能:将一个表达式强制转换成所需类型。例如:\n(double)a 将变量a的值转换成double型(int)(x+y)将x+y的结果转换成int型(float)5/2等价于((float)5)/2,将5转换成实型,再除以2(=2.5)(float)(5/2)将5整除2的结果(2)转换成实型(2.0)注意:强制转换类型得到的是一个所需类型的中间量,原表达式类型并不发生变化。例如,x原定为float型,则(double)x只是将变量x的值转换成一个double型的中间量,其x的数据类型并未转换成double型,仍为float型。4.自增(++)、自减(--)运算符自增(++)运算是使单个变量的值增1;自减(--)运算使单个变量的值减1。自增、自减运算符都有两种用法:(1)前置运算:运算符放在变量之前:++变量、--变量先使变量的值增(或减)1然后再以变化后的值参与其他运算,即先增(减)、后运算。(2)后置运算:运算符放在变量之后:变量++、变量--变量先参与其他运算,然后再使变量的值增(或减)1,即先运算、后增(减)。例如:如果i的原值等于3,则执行下面的赋值语句:①j=++i;(i的值先增1变成4,再赋给j,j的值为4)②j=i++;(先将i的值3赋给j,j的值为3,然后i增1变成4)【例2.7】 自增、自减运算符的用法与运算规则示例#includevoidmain(){intx=6,y;printf("x=%d\n",x);/*先输出x的初值*/y=++x;/*前置运算:x先增1(=7),然后再赋值给y(=7)*/\nprintf("y=++x:x=%d,y=%d\n",x,y);/*后置运算:先将x的值(=7)赋值给y(=7),然后x再减1(=6)*/y=x--printf("y=x--:x=%d,y=%d\n",x,y);}程序运行结果:x=6y=++x:x=7,y=7y=x--:x=6,y=7说明:(1)自增、自减运算常用于循环语句中使循环控制变量加(或减)1。(2)自增、自减运算符不能用于常量和表达式。例如,5++、--(a+b)等都是非法的。(3)连续使用同一变量进行自增或自减时很易出错。例如:(x++)+(x++)+(x++)=?(假设x的初值=3)解:表达式的值等于9,变量x的值变为6。为什么?请思考。(4)书写时最好采用能理解的写法,避免误解。如:不要写成i+++j形式,可产生(i++)+j或i+(++j)二义性,最好写成(i++)+j或i+(++j)的形式。但C语言规定:从左到右取尽可能多的符号组成运算符。i+++j应理解为(i++)+j。(5)在printf()函数中从右向左计算。例如:设i的初值为5:Printf(“%d,%d”,i,i++);输出结果为:6,52.5.2 关系运算符和关系表达式关系运算就是将两个数据进行“比较运算”,判定两个数据是否符合给定的关系,如果条件成立结果为“真”;否则条件不成立结果为“假”。1.关系运算符及其优先次序(1)关系运算符<(小于),<=(小于或等于),>(大于),>=(大于或等于),==(等于),!=(不等于)\n注意:“等于”关系运算符是双等号“==”,而不是单等号“=”(赋值运算符)。关系运算符优先级:(2)关系运算符优先级前4个优先级相同,后2个相同,且前4个高于后2个。即:(<、<=、>、>=)→(==、!=)(3)与其运算的优先级关系运算符的优先级低于算术运算符,但高于赋值运算符。即:算术运算符→(<,<=,>,>=)→(==,!=)→赋值运算符2.关系表达式关系表达式:用一个关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式或字符表达式等)连接起来,进行关系运算的式子。例如:a>b,a+b>c-d,(a=3)<=(b=5),'a'>='b',(a>b)==(b>c)都是合法的关系表达式。关系表达式的值是一个逻辑值(非“真”即“假”)。C语言中用整数“1”表示“逻辑真”,用整数“0”表示“逻辑假”。例如,假设intx=3,y=4,z=5,则:(1)x>y的值为0。(2)(x>y)!=z的值为1。(3)x=0”。如果需要描述“x>=0”且“x=0)&&(x=0,并且x<10*/(x<1)||(x>5)/*x5*/!(x==0)/*否定x=0,即:x不等于0时,条件成立*//*year能被4整除,同时不能被100整除;或者,year能被400整除*/(year%4==0)&&(year%100!=0)||(year%400==0)逻辑运算符的运算规则:①&&:当且仅当两个运算量为“真”结果为“真”,否则为 “假”。② ||:当且仅当两个运算量为“假”结果为“假”,否则为“真”。③!:当运算量为“真”时结果为“假”;当运算量为“假”时结果为“真”。例如,假定x=5,则(x>=0)&&(x5)的值为“假”。(2)逻辑运算符的运算优先级①逻辑运算符优先级逻辑非的优先级最高,逻辑与次之,逻辑或最低。即:!(非)→&&(与)→||(或)②与其他种类运算符的优先关系!(非)→算术运算→关系运算→&&(与)→||(或)→赋值运算2.逻辑表达式逻辑表达式:用逻辑运算符将1个或多个表达式连接起来,进行逻辑运算的式子。例如:“(year%4==0)&&(year%100!=0)||(year%400==0)”就是一个判断年份是否是闰年的逻辑表达式。逻辑表达式的值:是一个逻辑值(非“真”即“假”)。整数“1”表示“逻辑真”、用“0”表示“逻辑假”。例如:假设num=12,则:(1) !num的值=0。(2) num>=1&&num<=31的值=l。(3) num||nun>31的值=1。3.说明(1)逻辑运算符两侧的操作数可以是任何类型的数据,如实型、字符型等。(2)在计算逻辑表达式时,不一定所有的表达式都要求解。①对于与运算,只要一个操作数为“假”,结果为“假”。不需求解第二个操作数。\n②对于或运算,只要一个操作数为“真”,结果为“真”。不需求解第二个操作数。例如:假设intm、n、a、b、c、d;m=n=a=b=c=d=1;表达式:(m=a>b)&&(n=c>d)结果为0:计算时,因(m=a>b)的值为0,不需计算表达式(n=c>d)。因(n=c>d)是“真”还是“假”,其值都为“假”。2.5.4 赋值运算符和赋值表达式1.赋值运算符号“=”就是赋值运算符,它的作用是将一个表达式的值赋给一个变量。赋值运算符的一般形式为: <变量>=<赋值表达式>注意:被赋值的变量必须是单个变量,且必须在赋值运算符的左边。例如:x=5 /*将5赋值给变量x*/y=(float)5/2/*将表达式的值(=2.5)赋值给变量y*/当表达式值的类型与变量类型不一致,系统自动将表达式的值转换成被赋值变量的数据类型后再赋值给变量。2.复合赋值运算在赋值符“=”之前加上其他双目运算符可构成复合赋值符。复合赋值运算的一般格式为:<变量><双目运算符>=<表达式>它等价于:<变量>=<变量>双目运算符(表达式)例如:x+=3 /*等价于x=x+3*/y*=x+6/*等价于y=y*(x+6),而不是y=y*x+6*/C语言中有10种复合赋值运算符:+=,-=,*=,/=,%=;/*复合算术运算符(5个)*/&=,^=,|=,<<=,>>=;/*复合位运算符(5个),将在本节后面介绍*/3.赋值表达式赋值表达式:由赋值运算符或复合赋值运算符将一个变量和一个表达式连接起来的表达式。一般格式: <变量>[<复合赋值运算符>]=<表达式>赋值表达式也有一个值,被赋值变量的值,就是赋值表达式的值。例如:“a=5”为赋值表达式,a的值“5”就是表达式的值。\n2.5.5 条件运算符和条件表达式1.一般格式:<表达式1>?<表达式2>:<表达式3>C语言中唯一的一个三目运算符,三个表达式类型可以各不相同。但通常“表达式1”为逻辑表达式或关系表达式。2.运算规则计算“表达式1”的值为非0(“真”),则结果等于“表达式2”的值;否则,结果等于“表达式3”的值。3.运算符的优先级别与结合性条件运算符的优先级,高于赋值运算符,但低于关系运算符和算术运算符。其结合性为“从右到左”(即右结合性)。例如:设a=2,c='a', f=3.0则下列表达式a>0?a:-a结果为2f==3.0?a<=c:a>=c结果为1(f>0)?((a>0)?2:1):((a>0)?1:0)结果为2(a>=0)?(a=1):(a=0)结果为1【例2.8】从键盘上输入一个字符,如果它是大写字母,则把它转换成小写字母输出;否则,直接输出。 voidmain(){charch;printf("Inputacharacter:");scanf("%c",&ch);ch=(ch>='A'&&ch<='Z')?(ch+32):ch;printf("ch=%c\n",ch);}2.5.6 逗号运算符和逗号表达式用逗号运算符“,”连接起来的式子称为逗号表达式。逗号运算符又称顺序求值运算符。1.一般形式:<表达式1>,<表达式2>,……,<表达式n>。2.求解过程:从左至右,依次计算各表达式的值,最后“表达式n”的值即为整个逗号表达式的值。例如:a=3*5,a*4的值=60\n先求解a=3*5得a=15;再求a*4=60,所以逗号表达式的值=60。又例如:(a=3*5,a*4),a+5的值=20:注意:并不是任何地方出现的逗号,都是逗号运算符。很多情况下,逗号仅用作分隔符。2.5.7 求字节数运算求字节数运算运算符:sizeof(类型/变量)功能:sizeof运算符求变量或类型的字节长度。例如:sizeof(double)为8sizeof(int)为2floatf;inti;i=sizeof(f)的值为4。2.5.8 位逻辑运算TurboC中按位逻辑运算符如表2.3。表2.3位逻辑运算符操作符名称运算规则主要用途&按位与对应位均为1时才为1,否则为0屏蔽数的某些位,其余位保留不变|按位或对应位均为0时才为0,否则为1将一个数的某(些)位置1,其余位保留不变^按位异或对应位相同时为0,不同时为1使一个数的某(些)位翻转,其余各位不变~按位取反各位求反,即1变0,0变1说明:(1)所有操作数都必须首先转换成二进制数再按位运算。(2)位运符优先级别:~→&→|→^(1)位双目运算符优先级别低于关系运算符,高于逻辑运算符,运算自左向右运算。\n关系运算符→(&→|)→逻辑运算符(4)~运算符自右向左运算;&、|是自左向右运算。例如:设有定义:inta=3,b=9,,则有:2.5.9 位移运算和位运算赋值运算符1.位移运算位移运算符如表2.4所示 表2.4位移运算符操作符名称运算规则说明<<左移a<>右移a>>b,a右移b位使操作数各位右移,移出的低位舍去,高位:(1)对无符号数和有符号中的正数,补0(2)有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”优先级别:(<<,>>)仅次于算术双目运算符,运算方向从左向右运算。(1)左移运算符左移运算符把一个数的二进位全部左移若干位。例如:b<<3将b的各位数字左移3位,右补0。若b=13,即二进制数,左移3位得,即十进制数104。二进制数左移1位相当于该数乘以21,左移2位相当于该数乘4。……(2)右移位运算符例如:b>>2将b的各二进位右移2位。移到右端的低位被舍弃,对无符号数,高位补0。如b=14时:b为,b>>2为:10↑此二位舍弃右移一位相当于除以2,右移n位相当于除以2n。右移时,应注意符号位问题。补入0的称为“逻辑右移”。补入1的称“算术右移”。例如:,m为八进制数。\nm:01101m>>1:10110(逻辑右移时)m>>1:10110(算术右移时)2.位运算赋值运算符位运算赋值运算符如表2.5所示。表2.5位运算赋值运算符操作符名称运算规则说明&=|=^=<<=>>=位与赋值位或赋值按位异或赋值位左移赋值位右移赋值a&=b,等价于a=a&ba|=b,等价于a=a|ba^=b,等价于a=a^ba<<=b,等价于a=a<>=b,等价于a=a>>b操作数均为整型位运算赋值运算符优先级:6个运算符同级,与赋值符级别相同,运算方向自右向左运算。例如:设a=6,b=3,a,b均为无符号整型,则:b&=a,结果a不变,b为2a<<=b,结果b不变,a为482.5.10.运算符的优先级与结合性结合性就是指操作数两侧的运算符相同优先级时,该操作数是先与左边,还是先与右边的运算符结合。若先与左面的运算符结合,称为左结合性(即从左至右运算)。反之,称为右结合性(从右至左运算)。C语言的9类运算符优级先级以及结合性如表2.6所示。表2.6运算符的优先级与结合性优先级运算符含义运算类型结合性1最高()[]->.园括号、函数参数表数组元素下标指向结构成员结构体成员自左至右\n2!~++---(类型)*&Sizeof逻辑非按位取反自增1自减1求负强制类型转换指针运算符求地址运算符长度运算符单目运算自右至左3*/%乘法、除法、求余运算符双目运算自左至右4+-加法、减法运算符双目运算自左至右5<<>>左移、右移运算符移位运算自左至右6<<=>>=小于、小于等于大于、大于等于关系运算自左至右7==!=等于、不等于运算符关系运算自左至右8&按位与位运算自左至右9^按位异或位运算自左至右10|按位或位运算自左至右11&&逻辑与逻辑运算自左至右12||逻辑或逻辑运算自左至右13?:条件运算三目运算自右至左14=+=-=*=/=%=>>=<<=&=^=!=赋值、运算赋值双目运算自右至左15最低,逗号运算(顺序求值)顺序运算自左至右总结得出:结合性:除单目运算符、条件运算符和赋值运算符是右结合性外,其他运算符都是左结合。优先级顺序:表中第1级最高,……,第15级“,”号运算符最低。第3章顺序程序设计【本章要点】C语言是结构化程序设计语言,提供了功能丰富的控制语句,本章开始陆续介绍C语言的控制语句:顺序结构、选择结构和循环结构。本章主要介绍三种结构化设计的基本概念,格式输入输出函数printf()和scanf(),字符输入输出函数putchar()和getchar()等内容,要求重点掌握顺序结构设计的基本思想及程序编写方法,熟练掌握常见输入、输出库函数的调用。\n3.1C语句概述任何高级语言编写的程序,都是由语句组成。C语言的语句分为如下五大类:(1)表达式语句:表达式后面加一个分号就构成了一个表达式语句。例如:sum=a+b;/*赋值语句*/i++;/*自加运算表达式语句*/x=1,y=2;/*逗号表达式语句*/(2)函数调用语句。函数调用语句由一个函数加一个分号构成。例如:printf(“ThisisaCstatement.”);(3)复合语句:用花括号{}将多个语句组合在一起称为复合语句,又称为语句块(block)。例如:{intx,y;z=x+y;printf(“d%”,z);}(4)空语句:只有一个分号(;)的语句称为空语句。在程序中空语句经常被用作循环体,比如常见的用于延时的一种循环语句。例如:for(i=0;i<=1000;i++)\n;(5)控制语句控制程序执行顺序,实现基本结构的语句,有下面九种:①if-else语句(条件语句)②switch语句(多分支选择语句)③for语句(循环语句)④while语句(循环语句)⑤do-while语句(循环语句)⑥continue语句(结束本次循环语句)⑦break语句(终止执行循环语句或switch语句)⑧goto语句(转向语句)⑨return语句(函数返回值语句)3.2程序的三种基本结构C语言是结构化程序设计语言,结构化程序设计的结构主要有:顺序结构、选择结构和循环结构三种。1.顺序结构顺序结构是最基本、最简单的程序结构,它由若干语句块从上到下依次排列次序顺序执行。顺序结构如图3.1所示,先执行A块,再执行B块,两者是从上到下的顺序执行关系。\n2.选择结构选择结构就是根据给定条件从两条或多条可能的分支中选择一个分支执行。如图3.2,图3.3,图3.4所示 \n3.循环结构循环结构是由循环控制条件来控制循环体是否执行。这种结构也有两种形式:“当型循环”和“直到型循环”(1)当型循环结构如图3.5所示,当条件P成立时,反复执行A操作,直到条件P不再成立时才跳出循环。(2)直到型循环结构如图3.6所示,先执行A操作,再判断条件P是否成立,若P成立,则再执行A操作,如此反复,直到条件P不成立时跳出循环。\n3.3赋值语句赋值语句的组成:在赋值表达式的后面加上一个分号。基本形式为:变量=表达式;例如:X=8X=Y/5-3是表达式。而X=8; /*将整数8赋给变量X*/X=Y/5-3;/*将表达式Y/5-3的值赋给变量X*/就是赋值语句。注意:(1)C语言中的赋值号“=”是一个运算符,而在其他大多数高级语言中赋值号不是运算符。(2)要区别赋值表达式和赋值语句。例如:if((a=b)>0)t=a;此处if语句中a=b是赋值表达式而不是赋值语句。3.4格式输入与输出信息从计算机的外部设备流入计算机称为输入。从计算机主机流向外部设备称为输出。C语言中没有输入输出语句,而是由输入输出函来实现的输入/输出的。C标准函数库中包含的常用输入输出函数有:格式输出函数printf()格式输入函数scanf()单个字符输出函数putchar()单个字符输入函数getchar()使用标准输入输出库函数时,要用编译命令“#include”将有关头文件“stdio.h”包括到用户的源文件当中。即:#include或\n#include“tdio.h”stdio是standardinput&output(标准输入与输出)的缩写。3.4.1printf()函数(格式输出函数)一般格式:printf(格式控制”,输出列表);例如:printf(“a=%d,b=%c\n”,a,b)功能:向默认输出设备(一般是显示器)输出“输出列表”中各数据项。1.格式控制格式控制也称“控制字符串”,是由双引号括起来指定输出格式的字符串。他由格式说明、控制字符和普通字符三部分组成:(1)格式说明构成:由“%”字符开始后面跟有各种格式字符。作用:以说明输出数据的类型、形式、长度、小数位等格式。C语言提供的常用printf()函数格式说明如表3.1所示:表3.1printf()函数格式说明及应用举例格式说明功能实例输出结果说明%d,%i输出带符号的十进制整数intx=-1;printf(“%d”,x);-1%u输出无符号十进制整数intx=153;printf(“%u,x”);153%x,%X输出不带前导符0X或0x的无符号十六进制整数intx=2000;printf(“%X”,x);7D0%x表示符号a-f以小写形式表示;%X表示符号A-F以大写形式表示%o输出无符号形式八进制整数intx=2000;printf(“%o”,x);3720不带前导符0%f输出小数形式的单、双精度实数floatx=123.456;printf(“%f”,x);123.默认6位小数%e,%E输出科学计数法形式的实数floatx=123.456;printf(“%e”,x);1.23456e+02尾数部分6位数字(包括1位整数位,1位小数点)%c输出单个字符charx=’a’;printf(“%c”,x);a%s输出字符串charx[8]="abcdfg\0";printf("%s",x);abcdfg必须以\0结束或给定长度(2)控制字符控制字符用于控制设备的动作,如下表中制表符“\t”、换行符“\n”等。\n常见控制字符转义字符表示含义\n换行,将当前位置移到下一行开头\t横向跳格,横向跳到下一个输出区\r回车,将当前位置移到本行开头\f走纸换页,将当前位置移到下页开头\b退格,将当前位置移到前一列\v竖向跳格例如:printf(“x=%d\n”,x);(3)普通字符除格式说明和控制字符之外,其他字符均属普通字符,打印时按原样输出。例如:printf(“x=%d,%c”,12,6*8);其中“x=”和“,”都是普通字符。输出结果是:x=12,482.输出列表输出列表:就是需要输出的各数据项表达式,表达式之间用逗号分隔。注意:(1)表达式可以由变量构成,也可以由常量构成;(2)表达式之间的逗号不是逗号表达式,而是确定计算顺序的分隔符,自右向左进行的计算。3.附加说明符在%与格式字符间插入附加说明符,组成:“%<附加说明字符><格式符>”输出格式来达到更高输出格式要求。常用附加说明符如表3.2所示:表3.2printf()函数附加格式说明\n附加说明符意义l用于长整型,可以加在格式符d、o、x、u的前面m(正整数)数据输出的最小宽度,当数据实际宽度超过m时,则按实际宽度输出,如实际宽度短于m,则输出时前面补0或空格。.n(正整数)对实数表示输出n位小数,对字符串,表示从左截取的字符个数-输出的字符或数字在域内向左对齐,默认右对齐+输出的数字前带有正负号0在数据前多余空格处补0#用在格式字符o或x前,输出八进制或十六进制数时带前缀0或0x【例3.1】输出整型、长整型、无符号整型数据#include“stdio.h”voidmain(){inty=20;longa=1024;unsignedb=54321;printf(“%d,%ld,%u\n”,y,a,b);printf(“%+8d,%+8ld,%+8u\n”,y,a,b);printf(“%08d,%08ld,%08u\n”,y,a,b);/printf(“%-8d,%-8ld,%-8u\n”,y,a,b);printf(“%o,%lo,%o\n”,y,a,b);printf(“%#x,%#lx,%#x\n”,y,a,b);printf(“%8o,%8lo,%8o\n”,y,a,b);printf(“%-8x,%-8lx,%-8x\n”,y,a,b);}运行结果如下:(ㄩ代表空格)20,1024,54321ㄩㄩㄩㄩㄩ+20,ㄩㄩㄩ+1024,ㄩㄩㄩ54321,,20ㄩㄩㄩㄩㄩㄩ,1024ㄩㄩㄩㄩ,54321ㄩㄩㄩ24,2000,0x14,0x400,0xd4321ㄩㄩㄩㄩㄩㄩ24,ㄩㄩㄩㄩㄩ2000,ㄩㄩ14ㄩㄩㄩㄩㄩㄩ,400ㄩㄩㄩㄩㄩ,d4321ㄩㄩㄩ【例3.2】输出字符和字符串#include“stdio.h”voidmain(){charch=’a’;printf(“%c\n”,ch);\nprintf(“%-3c\n”,ch);printf(“%3c\n”,ch);printf(“%s\n”,”programing”);printf(“%15s\n”,”programing”);printf(“%-15s\n”,”programing”);printf(“%10.5s\n”,”programing”);/printf(“%-10.5s\n”,”programing”);}运行结果如下:aaㄩㄩㄩㄩaprogramingㄩㄩㄩㄩㄩprogramingprogramingㄩㄩㄩㄩㄩㄩㄩㄩㄩㄩprogrprogrㄩㄩㄩㄩㄩ【例3.3】输出实型数据#include“stdio.h”voidmain(){floatx,y;doublea;x=.111;y=123.468;a=.33333;clrscr();printf(“%f\n”,x);printf(“%f\n”,a);printf(“%10f,%10.2f,%.2f,%-10.2f\n”,x,x,x,x);printf(“%e\n”,x);printf(“%e\n”,a);printf(“%10e,%10.2e,%.2e.%-10.2e\n”,a,a,a,a);printf(“%f,%e,%g”,y,y,y);}程序运行结果如下:...,ㄩ.11,.11,.11ㄩ1.11111e+053.33333e+083.33333e+08,ㄩㄩㄩ3.3e+08,3.3e+08.3.3e+08ㄩㄩㄩ123.,1.23468e+02,123.468\n4.在使用printf()函数时,还应注意以下问题(1)转换说明与输出参数不一致时可能产生错误。printf()函中格式符串中的数目多于列表参数个数时,则会输出错误数据;如果格式符串中的数目少于列表参数个数,则多出的参数不被输出。例如:#include“stdio.h”voidmain(){inti=-6,x=5;floaty=123.456;printf(“%d,%d\n”,i);printf(“%-4d,%f”,i,y,x);}输出结果为:-6,2509/*多余格式符输出错误数据*/-6ㄩㄩ,123./*x未被输出*/(2)“f”格式符一般为7位有效数字,双精度一般为16位。例如:①#include“stdio.h”voidmain(){floatx=.111,y=.222;printf("%f",x+y);}输出结果为:./*前7位是有效数字,后面数字无意义*/②#include“stdio.h”voidmain(){doublex=.11111,y=.22222;printf("%lf",x+y);}输出结果为:./*可达16位是有效数字,小数点保留6位*/3.4.2scanf()函数(格式输入函数)一般形式:\nscanf("格式控制",地址列表);功能:从键盘向程序中的变量输入一个或若干个任意类型的数据。例如:scanf("%d,%d",&a,&b);1.格式控制格式控制与printf基本相同,由格式说明、附加说明字符和普通字符三部分组成。"%<附加说明字符><格式符>"格式字符如表3.3所示,附加说明字符如表3.4所示。表3.3scanf函数格式说明及作用格式字符作用%d,%i输入带符号的十进制整数%u输入无符号十进制整数%x,%X输入无符号的十六进制整数(不区分大小写)%o输入无符号形式八进制整数%f输入实数,可以用小数形式或指数形式输入%e,%E,g%,G%与%f作用相同,%e、%f、%g可以互相替换使用%c输入单个字符%s输入字符串,将字符串送到一个字符数组中,在输入时以非空字符开始,遇到回车或空格字符结束表3.4scanf函数附加格式说明及作用格式修饰符作用L或l用在格式字符d、o、x、u的前,表示输入长整型数据,用在f或e前,表示输入double型数据。h用在格式字符d、I、o、x前,表示输入短整型数据m指定输入数据所占宽度,不能用来指定实数型数据宽度,应为正整数*表示该输入项在读入后不赋值给相应的变量2.地址列表地址列表:用逗号分隔的若干接收输入数据的变量地址。各变量地址间用逗号“,”分隔。变量地址组成:由地址运算符“&”后跟变量名组成。例如:#includevoidmain(){inta,b,c;/*%d%d%d”表示要按十进制整数形式输入3个数*/\nscanf(“%d%d%d”,&a,&b,&c);printf(“a=%d,b=%d,c=%d\n”,a,b,c);}运行时按以下方式输入a,b,c的值:3ㄩ4ㄩ5↙(输入a,b,c的值,用空格间隔)a=3,b=4,c=5(输出a,b,c的值)注:输入数据时,在两个数据之间以一个或多个空格间隔,也可以用Enter键、Tab键分隔,不能用逗号作为两个数据的分隔符。下面输入均为合法:①3ㄩ4ㄩ5↙②3↙45↙③3(按Tab键)4↙5↙如下面的输入不合法:3,4,5↙3.使用scanf()函数时应注意的问题(1)地址列表中的各个参量都是变量地址,而不是变量名。例如:设a、b分别为整型变量和浮点型变量,则scanf("%d%f",&a,&b);是合法的。而scanf("%d%f",a,b);是非法的。(2)普通字符在输入数据时,在对应位置上输入相同字符。例如:scanf("%d,%d",&a,&b)输入时应用如下形式:3,4↙以下输入格式是不对的:3ㄩ4↙3:4。又如:scanf(”%d:%d:%d”,&x,&y,&z);输入形式应为:12:13:14。(3)对于实型数据,输入时不能规定其精度。例如:scanf(“%6.3f”,&x);是不合法的。(4)在用“%c”格式输入字符时,空格字符和“转义字符”都将作为有效的字符输入。\n例如:scanf("%c%c%c",&c1,&c2,&c3);如果输入:aㄩbㄩc↙则字符'a'→c1,字符'ㄩ'→c2,字符'b'→c3。正确输入方法是:abc↙(中间没有空格)(5)在输入数据时,遇到下列情况时,输入数据认为结束:l遇空格或按“回车”或“跳格”(Tab)键;l遇宽度结束,如“%3d”,只取3列;l遇非法输入;例如:scanf("%d%c%f",&a,&b,&c);若输入123a456o.26↙¯ ¯¯a bc123→a,字符a→b,456→c注:第3个数4560.26错打成456o.26,由于456后面出现了英文字母“o”,就认为此数据结束,则将会把456送给c,后面的数据将不被接受。(6)当使用多个scanf()函数连续给多个字符变量赋值时,例如:#includevoidmain(){charc1,c2;scanf(“%c”,&c1);scanf(“%c”,&c2);printf(“c1is%c,c2is%c”,c1,c2);}运行该程序时如果输入:A↙输出结果为:c1isA,c2is↙(即C2接收了一个回车符↙,而没有被赋值)如果输入:AB↙输出结果为:c1isA,c2isB。(7)对于unsigned型变量所需的数据,可以用%u,%d或%o,%x格式输入。\n3.5字符数据的输入输出函数3.5.1putchar函数(字符输出函数)格式:putchar(c);c为字符型或整型常量、变量或表达式。功能:向终端(显示器)输出一个字符,如果c为整型,则输出ASCII码值等于参数c的字符。例如:putchar(“a”)/*输出结果为:a*/putchar(97)/*输出结果为:a*/注意:使用本函数是必须要用文件包含命令:#include。例如:#includevoidmain(){charx,y,z;x=’B’;y=’Y’;z=’E’;putchar(x);putchar(y);putchar(z);}运行结果为:BYE用putchar()函数可以输出也可以输出屏幕控制字符如果将上面例题的最后一行改为:putchar(x);putchar(‘\n’);putchar(y);putchar(‘\n’);putchar(z);运行结果为:BYE其次putchar()函数还可输出转义字符(见表2.2)。putchar(‘\101’);/*输出结果为字母:a*/putchar(‘\\’’);/*输出结果为单引号:’*/putchar(‘\\”’);/*输出结果为双引号:”*/\nputchar(‘\255’);/*输出结果为图形符号:!*/3.5.2getchar()函数(字符输入函数)格式:getchar();功能:从键盘(或系统默认的输入设备)输入一个字符。例如:charx;x=getchar();putchar(x);运行结果:A↙(通过键盘输入’A’,按回车键)A(输出变量x的值’A’)注意:(1)getchar()函数没有参数。(2)该函数只能接收一个字符。(3)使用函数前需加上文件包含命令:#include。例如:#includevoidmain(){putchar(getchar());}【例3.4】字符输入输出函数的使用#includevoidmain(){charc1,c2;charc3=’X’;c1=getchar();c2=getchar();putchar(c1);putchar(c2);putchar(c3);}运行时若输入A↙输出结果为:AX\n3.6顺序结构程序设计举例顺序结构是最简单的一种程序结构。程序流程自顶向下顺序执行。本节举例说明顺序结构程序设计的基本方法。【例3.5】从键盘输入一个小写字母,输出其对应的大些字母及其相应的ASCII码值。分析:从ASCII码表中得知:小写字母的ASCII码-32=大写字母ASCII码程序如下:#includevoidmain(){charch1,ch2;ch1=getchar();ch2=ch1-32;printf("\nletter:%c,ASCII=%d",ch1,ch1);printf("\nletter:%c,ASCII=%d",ch2,ch2);}运行结果为:a↙letter:a,ASCII=97letter:A,ASCII=65【例3.6】输入三角形的三边长,求三角形的面积。分析:根据数学知识可知求三角形的面积公式为:area=(注:s=(a+b+c)/2)程序如下:#include#includevoidmain(){floata,b,c,s,area;scanf("%f,%f,%f",&a,&b,&c);s=(a+b+c)/2;\narea=sqrt(s*(s-a)*(s-b)*(s-c));/*调用函数库中求平方根函数sqrt()*/printf("a=%7.2f\nb=%7.2f\nc=%7.2f\narea=%7.2f\n",a,b,c,area);}运行情况如下:3.4,4.5,5.6↙a=ㄩㄩㄩ3.40b=ㄩㄩㄩ4.50c=ㄩㄩㄩ5.60area=ㄩㄩㄩ7.65【例3.7】求方程的根。a,b,c由键盘输入,设。分析:根据数学知识可得一元二次方程的根为:x1=,x2=可以将上面的分式分为两项:p=,q=则x1=p+q,x2=p-q程序如下:#include#includevoidmain(){floata,b,c,disc,x1,x2,p,q;scanf("a=%f,b=%f,c=%f",&a,&b,&c);disc=b*b-4*a*c;p=-b/(2*a);q=sqrt(b*b-4*a*c)/(2*a);x1=p+q,x2=p-q;printf("x1=%5.2f\nx2=%5.2f\n",x1,x2);}运行情况如下:a=1,b=3,c=2↙x1=-1.00x2=-2.00