1、 变量的赋值有三种方法:在定义变量的同时为变量赋初值,格式为:=;例如,int a=10;利用赋值语句为变量赋初值,格式为:=;例如,a=10+3;利用格式化输入函数为变量赋初值,格式为:例如,scanf(%d,&a);定义后的变量其值是随机的、不确定的,只有定义后的变量其值是随机的、不确定的,只有通过赋值操作,其值才是确定的,才能被使用。通过赋值操作,其值才是确定的,才能被使用。#includestdio.hvoid main()int score,grade;printf(请输入成绩:);scanf(%d,&score);/*输入成绩*/if(score89)/*90100分,积点5*/g
2、rade=5;else if(score79)/*8089分,积点4*/grade=4;else if(score69)/*7079分,积点3*/grade=3;else if(score59)/*6069分,积点2*/grade=2;else /*590分,积点0*/grade=0;printf(成绩%d的对应积点是%dn,score,grade);程序运行情况如下:程序运行情况如下:请输入成绩:请输入成绩:7676成绩成绩7676的对应积点是的对应积点是3 3【例【例2.52.5】计算学习成绩积点】计算学习成绩积点问题int i,sum;i=1;sum=0;sum=sum+i;i=i+1;
3、sum=sum+i;i=i+1;:sum=sum+i;i=i+1;1001nn如何避免出现这种情况?如何避免出现这种情况?重复重复100次同样的语句,次同样的语句,程序显得很笨拙。程序显得很笨拙。问题1001nn#include int main()int i,sum;i=1;sum=0;while(i=100)sum=sum+i;i+;printf(Sum=%dn,sum);return(0);运行结果为运行结果为:sum=5050#include int main()int i,sum;i=1;sum=0;do sum=sum+i;i+;while(i=100);printf(Sum=%d
4、n,sum);return(0);whilewhile和和do-whiledo-while循环比较循环比较#include main()int sum=0,i,n;scanf(%d,&n);i=5;while(i=n)sum=sum+i;i+;printf(%dn,sum);#include int main()int sum=0,i,n;scanf(%d,&n);i=5;do sum=sum+i;i+;while(i=n);printf(%dn,sum);试分析:当分别输入试分析:当分别输入5 5和和4 4时,两个程序段分别输出什么?时,两个程序段分别输出什么?#include int ma
5、in()int i,sum;i=1;sum=0;for(i=1;i=100;i+)sum=sum+i;printf(Sum=%dn,sum);return(0);#include int main()int i,sum;i=1;sum=0;while(i max,bmax,则则maxbmaxb。(4 4)若)若c c maxmax,则,则maxcmaxc。(5 5)输出)输出maxmax,maxmax即为最大数。即为最大数。n有穷性:n确定性:n有效性:n有零个或多个输入。n有一个或多个输出。从理论上说,算法可以用任何形式的语言和符号来描述,如自然语言、程序设计语言、流程图、N-S图、PAD图
6、和伪代码等。从理论上说,算法可以用任何形式的语言和符号来描述,如自然语言、程序设计语言、流程图、N-S图、PAD图和伪代码等。用伪代码表示的算法如下:IF x is positive THENprint xELSEprint x也可以用汉字伪代码,例如,若x为正 打印x否则打印x也可以中英文混用,例如,IF x 为正print xELSEprint x C 语言程序设计进阶篇 在在C C语言中,任何数据呈现给用户的形式只有两语言中,任何数据呈现给用户的形式只有两种:常量和变量。而无论数据是常量还是变量,都种:常量和变量。而无论数据是常量还是变量,都必须属于各种不同的数据类型。必须属于各种不同的
7、数据类型。在一个具体的在一个具体的C C语言系统里,每个数据类型都有语言系统里,每个数据类型都有固定的表示方式,这个表示方式实际上就确定了可固定的表示方式,这个表示方式实际上就确定了可能表示的数据范围和它在内存中的存放形式。能表示的数据范围和它在内存中的存放形式。C C语言为数据提供了丰富的类型,这些数据类型语言为数据提供了丰富的类型,这些数据类型主要分为:基本数据类型、构造数据类型、指针类主要分为:基本数据类型、构造数据类型、指针类型和空类型四大类。型和空类型四大类。n基本数据类型最主要的特点是,其值不可以再分解为其它类型。基本类型基本类型整型整型字符型字符型浮点型浮点型单精度单精度双精度双
8、精度枚举枚举短整型短整型长整型长整型整型常量即整数,按不同的进制区分整型常量即整数,按不同的进制区分,整数有三种整数有三种表示方法:表示方法:l八进制数:八进制数:以以0 0开始的数,如:开始的数,如:0606、01060106、06770677等。等。l十六进制数:十六进制数:以以0X0X或或0 x0 x开始的数,如:开始的数,如:0X0D0X0D、0XFF0XFF、0 x4e0 x4e、0 x1230 x123等。等。l十进制数:十进制数:以非以非0 0开始的数,如:开始的数,如:220220、-560-560、+369+369等。等。5.2.5.2.整型数据整型数据1、整型变量的分类 整
9、型变量分为四种:基本型、短整型、长整型、无符号型n类型说明符 数的范围 分配字节数int -21474836482147483647 short int -3276832767 signed int -3276832767 unsigned int 0 4294967295 long int -21474836482147483647unsigned long 04294967295 n超过变量所能表示的范围,产生计算错误:溢出.一般形式:类型说明符 变量名标识符例如:int a,b,c;long x,y;unsigned p,q;n允许在一个类型说明符后,说明多个相同类型的变量。各变量名之间
10、用逗号间隔,类型说明符与变量名之间至少用一个空格间隔。n最后一个变量名之后必须以“;”结尾。n变量定义必须放在变量使用之前。十进制数形式十进制数形式由数码由数码0 90 9和小数点组成。例如:和小数点组成。例如:0.00.0、25.025.0、5.7895.789、0.130.13、5.05.0、300.300.、-267.8230-267.8230等均为合法的实数。等均为合法的实数。注意,必须有小数点。注意,必须有小数点。5.3.1 5.3.1 实型常量实型常量 实型常量也称为实数或浮点数。在实型常量也称为实数或浮点数。在C C语言中,实数只采语言中,实数只采用十进制,它有两种形式:十进制数
11、形式和指数形式。用十进制,它有两种形式:十进制数形式和指数形式。由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为:a E n(a为十进制数,n为十进制整数)其值为 a*10n。如:如:2.1E5(2.1E5(等于等于2.12.1*10105 5)3.7E-2(3.7E-2(等于等于3.73.7*1010-2-2)0.5E7(0.5E7(等于等于0.50.5*10107 7)-2.8E-2(-2.8E-2(等于等于-2.8-2.8*1010-2-2)以下则不是合法的实数:345(无小数点)E7(阶码标志E之前无数字)-5(无阶码标志)53.-E3(负号位置
12、不对)2.7E (无阶码)标准允许浮点数使用后缀。后缀为“f”或“F”即表示该数为浮点数。如356.f和356.是等价的。注意:实型常量不分单、双精度,都按双精度double型处理。因此:因此:(1 1)十进制小数形式十进制小数形式:必须有小数点。必须有小数点。(2 2)指数形式指数形式:字母:字母e e前必须有数字,字母前必须有数字,字母e e后后必须为整数必须为整数 ,规范化的指数形式输出。,规范化的指数形式输出。#include main()printf(%fn,356.);printf(%fn,356);printf(%fn,356.f);结果为:课堂练习课堂练习1:分析下面程序的运行
13、结果。:分析下面程序的运行结果。5.3.2 5.3.2 实型变量实型变量 1 1 实型数据在内存中的存放形式实型数据在内存中的存放形式 实型数据一般占实型数据一般占4 4个字节(个字节(3232位)内存空间,按指数位)内存空间,按指数形式存储。如实数形式存储。如实数3.141593.14159在内存中的存放形式如下:在内存中的存放形式如下:+.3141591数符数符 小数部分小数部分 指数指数 小数部分占的位(小数部分占的位(bitbit)数愈多,数的有效数字愈)数愈多,数的有效数字愈多,精度愈高。多,精度愈高。指数部分占的位数愈多,则能表示的数值范围愈大。指数部分占的位数愈多,则能表示的数值
14、范围愈大。实型变量分为:单精度(float型)、双精度(double型)。实型变量定义的格式和书写规则与整型相同。例如:float x,y;double a,b,c;2.2.实型变量的分类实型变量的分类3 实型数据的舍入误差 由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的。不同的编译器下处理的精度不同。课堂练习课堂练习2 2:分析下面程序的运行结果。:分析下面程序的运行结果。#includemain()float a,b;a=123456.789e5;b=a+20;printf(%fn,a);printf(%fn,b);运行结果(运行结果(VC+VC+):):123456
15、78848.00000012345678848.000000 可见一个大数与一小数可见一个大数与一小数间运算会产生什么结果间运算会产生什么结果?5.4.1 字符常量1 1、字符常量、字符常量字符常量是用单引号括起来的一个字符字符常量是用单引号括起来的一个字符 。例如:。例如:aa、AA、33、=、+、?注意英文字母区分大小写。注意英文字母区分大小写。字符常量特点:字符常量特点:字符常量只能用单引号括起来。字符常量只能用单引号括起来。字符常量只能是单个字符,不能是字符串。字符常量只能是单个字符,不能是字符串。字符可以是字符集中任意字符。如字符可以是字符集中任意字符。如55不同于不同于5 5。转义
16、字符 转义字符是一种特殊的字符常量。转义字符以反斜线“”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。转义字符主要用来表示那些用一般字符不便于表示的控制代码。常用的转义字符及其含义如下表:转义字符转义字符转义字符的意义转义字符的意义ASCII代码代码n换行换行10t横向跳到下一制表位置横向跳到下一制表位置9b退格退格8r回车回车13f走纸换页走纸换页12反斜线符反斜线符92单引号符单引号符39 双引号符双引号符34a鸣铃鸣铃7ddd13位八进制数所代表的字符位八进制数所代表的字符 xhh1 12 2位十六进制数所代表的字符位十六进制数所代表的字符 广
17、义地讲,语言字符集中的任何一个字符均可用转义字符来表示。表中的ddd和xhh正是为此而提出的。ddd和hh分别为八进制和十六进制的ASCII代码。如101表示字母“A”(见附录I),102表示字母“B”,134表示反斜线,X0A表示换行等。常见字符的值:常见字符的值:20H-20H-空格空格 30H-0-3930H-0-39H-9 H-9 41H-A 41H-A 61H-a 61H-a 内码内码(ASCII(ASCII码码)在在3232126126范围内为可显示字符。范围内为可显示字符。运行结果运行结果:a bABC xyz AB 字符串常量是由一对双引号括起来的字符序列。例如,“CHINA”
18、、“C Language”、“$abc!”等都是合法的字符串常量。字符串常量和字符常量之间的区别:字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加1。增加的一个字节中存放字符0(ASCII码为0)。例如:字符串例如:字符串 C program C program 在内存中所占的字节为:在内存中所占的字节为:C program0aa和和“a”a”的区别是的区别是:“A”“A”存储方式存储方式为为A 0但但 AA存储方式为存储方式为:A举例在C语言中,可以用一个标识符来表示一个常量,称为符号常量。符号常量在使用之前必须先定义。其一般形式为:#define 标识符 常量 例
19、如:#define PI 3.1415926 符号常量一经定义,以后在程序中所有出现该标识符的地方均以该常量值代替。符号常量的标识符习惯上用大写字母表示,变量标识符用小写字母表示,以示区别。运行结果运行结果:s=19.634954#include stdio.h#define PI 3.1415926void main()float s,r;r=2.5;s=PI*r*r;printf(s=%fn,s);【例【例5.25.2】符号常量的使用。】符号常量的使用。5.4.2 字符变量字符变量用来存储字符常量,即单个字符。字符变量用来存储字符常量,即单个字符。说明形式:说明形式:char char 字
20、符变量名;字符变量名;字符变量在内存中占一个字节,其定义的格字符变量在内存中占一个字节,其定义的格式和书写规则都与整型变量相同。例如:式和书写规则都与整型变量相同。例如:char a,b;char a,b;运行结果运行结果:x,y120,121【例【例5.35.3】整型数据与字符数据的相互输出。】整型数据与字符数据的相互输出。#include stdio.hvoid main()char a,b;a=a;b=b;a=a-32;b=b-32;printf(%c,%cn%d,%dn,a,b,a,b);运行结果运行结果:A,B65,66【例【例5.4】大小写字母转换】大小写字母转换。5.5.1 数据
21、输入输出的概念及在C语言中的实现 C C语言不提供输入语言不提供输入/输出语句,数据的输入输出语句,数据的输入/输输出是通过函数调用语句来实现的。出是通过函数调用语句来实现的。在在C C标准函数库标准函数库中提供了一些输入中提供了一些输入/输出函数,它是以标准的输入输出函数,它是以标准的输入/输出设备(键盘、显示器等)为输入输出设备(键盘、显示器等)为输入/输出对象的。输出对象的。常用的输出函数有常用的输出函数有printfprintf()()函数和函数和putcharputchar()()函数。函数。输入函数有输入函数有scanf()scanf()和和getchargetchar()()。使
22、用标准输入输出库函数时要用到“stdio.h”文件,因此源文件开头应有以下预编译命令:#include 或#include stdio.h二者的区别:二者的区别:使用尖括号使用尖括号表示在包含文件目录中去查表示在包含文件目录中去查找找(包含目录是由用户在设置环境时设置的包含目录是由用户在设置环境时设置的),而不在,而不在源文件目录去查找;源文件目录去查找;使用双引号使用双引号则表示首先在当前的则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己文件所在的目录来选择某一种用户编程时可根据自己文件所在的目录来选择某一
23、种命令形式。命令形式。功能:按用户指定的格式,把指定的数据显示到显示器屏幕上。一般形式:printf(“格式控制字符串”,输出表列);其中 格 式 控 制 字 符 串 用 于 指 定 输 出 格 式;输出表列中给出了各个输出项;要求格式字符串和各输出项在数量和类型上应该一一对应。#include stdio.hvoid main()int a=88,b=89;printf(%d%dn,a,b);printf(%d,%dn,a,b);printf(%c,%cn,a,b);printf(a=%d,b=%dn,a,b);运行结果运行结果:888988,89X,Ya=88,b=89 类型:类型字符用以
24、表示输出数据的类型;标志:-、+分别表示输出数据左、右对齐;输出最小宽度:用十进制整数来表示输出的最少位数。精度:精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。长度:长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出。在在C C中格式字符串的一般形式为:中格式字符串的一般形式为:标志标志输出最小宽度输出最小宽度.精度精度长度长度 类型类型格式字符格式字符意意 义义d以十进制形式输出带符号整数以十进制形式输出带符号整数(正数不输出符号正数不输出符号)o以
25、八进制形式输出无符号整数以八进制形式输出无符号整数(不输出前缀不输出前缀0)x,X以十六进制形式输出无符号整数以十六进制形式输出无符号整数(不输出前缀不输出前缀Ox)u以十进制形式输出无符号整数以十进制形式输出无符号整数f以小数形式输出单、双精度实数以小数形式输出单、双精度实数e,E以指数形式输出单、双精度实数以指数形式输出单、双精度实数g,G以以%f或或%e中较短的输出宽度输出单、双精度实数中较短的输出宽度输出单、双精度实数c输出单个字符输出单个字符s输出字符串输出字符串【例【例5.65.6】运行并分析程序的执行结果。】运行并分析程序的执行结果。#include stdio.hvoid ma
26、in()int a=15;float b=138.3576278;double c=35648256.3645687;char d=p;printf(a=%d,%5d,%o,%xn,a,a,a,a);printf(b=%f,%lf,%5.4lf,%en,b,b,b,b);printf(c=%lf,%f,%8.4lfn,c,c,c);printf(d=%c,%8cn,d,d);a=15,15,17,fb=138.357620,138.357620,138.3576,1.38358e+02c=35648256.364569,35648256.364569,35648256.3646d=p,p 说明
27、:(1)C语言的格式化输入/输出比较繁琐,在以GUI为主流的应用程序的输入输出中较少使用(scanf()函数则用不到),但它的另一种形式sprintf()函数中的格式化数据处理则经常会用到。(2)如何获得有关sprintf()函数的用法知识?请使用微软开发者网络Microsoft Developer Network(MSDN)。它是一个有关计算机软件设计知识的海洋,是微软平台的软件开发和应用人员的最好的获取知识的工具。(3)读者从现在开始,应该逐步学会如何获取书本上没有的知识,从MSDN、Internet。请查阅字符串输出函数puts()的用法。功能:按用户指定的格式从键盘上把数据输入到指定的
28、变量之中。一般形式 scanf(“格式控制字符串”,地址表列);其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串。地址表列中给出各变量的地址。例如:scanf(“%d,%d”,&a,&b);5.5.3 5.5.3 scanfscanf函数函数(格式输入函数格式输入函数)变量的地址和变量值的关系如下:在赋值表达式中给变量赋值,如:a=567则a为变量名,567是变量的值,&a是变量a的地址。【例5.7】运行并分析程序的执行结果。#include stdio.hvoid main()int a,b,c;printf(input a,b,c:);scanf(%d%d%d,&a
29、,&b,&c);printf(a=%d,b=%d,c=%dn,a,b,c);运行结果运行结果:input a,b,c:7 8 9 a=7,b=8,c=9【例5.8】输入格式字符串#include void main()char a,b;printf(input character a,bn);scanf(%c%c,&a,&b);printf(%c%cn,a,b);由于由于scanfscanf函数函数“%c%c”%c%c”中没有空格,输入中没有空格,输入M NM N,结果输出只有结果输出只有M M。而输入改为。而输入改为MNMN时则可输出时则可输出MNMN两字符。两字符。试一试试一试:“%c%c
30、”:“%c%c”中加上空格会怎样中加上空格会怎样?(?(分别输入分别输入MNMN或或M,N)M,N)scanf()格式控制串%c%c之间有空格时,输入的数据之间可以有空格间隔。如果格式控制串中有非格式字符,则输入时也要输入该非格式字符。注意:注意:1、putchar 函数(字符输出函数)功能:在显示器上输出单个字符。一般形式为:putchar(字符变量);例如:putchar(A);(输出大写字母A)putchar(x);(输出字符变量x的值)putchar(101);(也是输出字符A)putchar(n);(换行)5.5.4 5.5.4 字符数据的输入输出字符数据的输入输出【例5.9】运行并
31、分析程序的执行结果。#include void main()char a,b,c;a=B;b=o;c=k;/*以下书写方式不提倡*/putchar(a);putchar(b);putchar(b);putchar(c);putchar(t);putchar(a);putchar(b);putchar(n);putchar(b);putchar(c);运行结果运行结果:Book Book功能:从键盘上输入一个字符。其一般形式为:getchar();通常把输入的字符赋予一个字符变量,构成赋值语句,如:char c;c=getchar();使用getchar函数还应注意几个问题:getchar函数只
32、能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符。使用本函数前必须包含文件“stdio.h”。#include main()int x,z;float y;printf(“Input 1020304050n”);scanf(“%2d%5f%3d”,&x,&y&z);printf(“x=%d y=%f z=%dn”,x,y,z);程序运行后输入 1020304050,输出结果是:x=10 y=20304.000000 z=50 2.#include main()char a;a=getchar();putchar(a);putchar(n);输入字符,程序的输出结果是:
33、3.#include main()char ch=A;printf(“ch(1)=%d,ch(2)%cn”,ch,ch+1);程序输出的结果是:4.#include main()double a;int b;b=a=10/4;printf(“%d,%fn”,b,a);程序输出结果是:如果需要准确的结果应该怎么改写程序?如果需要准确的结果应该怎么改写程序?2,2.000000a0a00a01a02a1a10a11a12a2a20a21a22120300120000010003(4)若对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度必须指定。系统会根据总个数,确定数组行数。
34、例如:int b23=1,2,3,4,5,6;等价于 int b 3=1,2,3,4,5,6;定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。例:int a 4=1,2,3,6,7,8,9;这样写法,能通知编译系统,数组有三行。int a345;a023=5;n字符数组的定义和引用n字符数组的初始化n字符数组的输入和输出n常用字符串函数C语言的基本数据类型中,无字符串C语言使用字符数组处理字符串char c10;char c11010;for(i=0;i字符串2,函数值为正整数。(3)若字符串1str2)(B)if(strcmp(str1,str2)(C)if(strcmp(
35、str2,str1)0)(D)if(strcmp(str1,str2)0)例 若有语句:char s110,s210=“books”,则能将字符串books赋给数组s1的正确语句是:(A)s1=“books”;(B)strcpy(s1,s2);(C)s1=s2;(D)strcpy(s2,s1);全局变量c1、c2的作用范围全局变量p、q的作用范围2100 a 1000 p 123.2100.#include“file2.c”file2.c file1.cABBA包含包含A2000B1366CNULL可以声明结构体类型:typedef struct int month;int day;int year;DATE;DATE 是新类型名,它代表上面定义的一个结构体类型。可以用DATE定义变量:DATE birthday;DATE *p;还可以进一步:1、typedef int NUM100;(定义NUM 为整型数组类型)NUM n;(定义n 为整型数组变量)2、typedef char *STRING;(定义STRING为字符指针类型)STRING p,s10;(p为字符指针变量,s为指针数组)3、typedef int (*POINTER)();(定义POINTER 为指向函数的指针 类型,该函数返回整型值)POINTER p1,p2;(p1,p2为POINTER类型的指针变量)