1、C 语言基础知识总结主要内容:1.C 数据类型2.简单的算术运算和表达式3.键盘输入和屏幕输出4.选择控制结构5.循环控制结构总结风格:分条罗列,主要是知识点,有例题不多0一、C 数据类型1.C 语言处理两种数据:常量和变量2.常量:整形常量、实型常量、字符常量、字符串常量、枚举常量3.整形常量:正整数、负整数、零 eg: 10,-30,04.实型常量:实数、小数、浮点数 eg: 3.14,-0.56,18.05.字符常量:字符型常量、用单引号括起来的任意字符 eg: x X ? , 96.字符串常量:用双引号括起来的一个或多个字符 eg: “x“ “Hello“ “Y78“7.在 C 程序中
2、,整型常量可以用十进制、八进制、十六进制形式表示,但编译器都会自动将其转换成二进制存储8.整型常量的类型:长整型、短整型、有符号、无符号。9.不同进制的整型常量的表示形式:1)十进制:09 数字组合,可带正负号 eg: 256,-128,0,+72)八进制:0 开头,后面跟 07 数字组合 eg: 021,-0173)十六进制:0x(0X) 开头,后跟 09,af(AF)数字组合 eg:0x12,-0x1F10.不同类型的整形常量的表示形式:1) 有符号整型常量:默认 int 型定义为有符号整数,无需 signed eg:10,-30,02) 无符号整形常量:常量值后跟 u 或 U,只能表示=
3、0 的数 eg:30u,256U3) 长整型常量:常量值后跟 l 或 L eg:-256l,1024L4) 无符号长整型常量:常量值后跟 LU、Lu 、lU 、 lu eg:30lu11.C 程序中,实型常量两种表示形式:小数、指数12.不同形式的实型常量的表示形式:1) 十进制表示形式:数字和小数点组成,必须要有小数点,整数部分可省略 eg:0.123, -12.35, .982) 指数形式:e 或 E 代表以 10 为底的指数, e 左边是数值部分(有效数字,可以是整数、小数,不能省略),e 右边是指数部分( 必须是整数形式) eg:3.45e-613.实型常量有单精度和双精度之分,无有符
4、号和无符号之分14.不同类型的实型常量表示形式:1)单精度实型常量:常量值后跟 F 或 f eg:1.25F,1.25e-2f2)双精度实型常量(double):实型常量默认按双精度处理 eg:0.123,-12.35, .983)长双精度实型常量(long double):常量值后跟 L 或 l eg:1.25L15.变量:在程序执行过程中可以改变的量16.变量在必须先定义后使用,定义时需要声明变量的类型和变量名,一般形式:类型关键字 变量名;17.关键字是 C 语言预先规定具有特殊意义的单词,类型关键字用于声明变量的类型18.标准 C 语言编写的程序都是以 main()作为开头,指定了 C
5、 程序执行的起点,在 C 程序中只能出现一次,称为主函数19.C 程序总是从 main 函数开始执行,与他在程序中的位置无关,main 函数主体部分称为语句,用括起来,一般 C 语句以 ;结束20.变量的类型决定了编译器为其分配内存单元的字节数、数据在内存单元中的存放形式、该类型变量合法的取值范围以及该类型变量可参与的运算种类21.变量名是用户定义的标识符,用于标识内存中具体的存储单元,存放的数据称为变量的值22.新数据存放于存储单元时,旧数据将会被修改,反应变量的值是可以改变的123.变量名的命名规则:1)标识符只能由英文字母、数字、下划线组成2)标识符必须以字母或下划线开头3)不允许使用
6、C 关键字为标识符命名4)标识符可以包含任意多个字符,但一般会有最大长度限制,预编译器有关,一般不会超过,最好不超过 8 个字符注意:标识符区分大小写eg:x y3 _imax ELSE X A_to_B (合法)eg:7x int #No bad one re-input(不合法)24.标准 C 规定所有变量必须在第一条可执行语句之前定义25.在同一条语句中可以同时定义多个相同类型变量,多个变量之间用逗号分隔,没有顺序要求26.在使用标准输入/输出函数时,必须在程序开头加上编译预处理命令27.中 stdio 为头文件,std 是 standard,i 为 input,o 为 output,h
7、 为 head28.编译预处理命令#include 的作用:将在输入/输出函数的头文件 stdio.h 包含到用户源文件中29.%d 按十进制整数个格式输出,%f 按十进制小数格式输出,一般输出 6 位小数,%c 输出一个字符,n 换行,双引号内字符原样输出30.不同类型的数据在内存中占用不同大小的存储单元,他们所能表示的数据的取值范围各不相同,不同类型的数据表示形式及其可以参与的运算种类也不同31.定义整型变量时,只要不指定为无符号型,其隐含类型为有符号型,signed 通常省略不写32.C 程序中每个变量的值都是按字节编址,都被存储在内存中特定的存储单元中,这个存储空间实际是一个线性地址表
8、,即每个字节的存储空间对应一个唯一的地址33.1 个字节等于 8 个二进制位,即 8 个位为一个字节,一个字节可以表示的整数最小为0,最大 255,即 8 个位可以表示 0-255 之间的数,一个二进制位的值只能是 0 或 134.同种类型在不同的平台所占字节数不同,要计算数据类型所占内存空间的字节数需要用sizeof()运算符35.sizeof 是 C 语言关键字,不是函数名,sizeof(变量名)计算一个变量所占内存的字节数36.计算不同类型运算符的表达式时,要考虑运算符的优先级和结合性37.正数的反码、补码与原码都相同,负数的补码等于反码加 138.在计算机内存中负数都是用补码来表示39
9、.对于实数,无论小数海曙指数形式,在计算机内存中都采用浮点形式来存储40.浮点数分为阶码、尾数两部分,实数 N=S*pow(r,j),S 为尾数(无论正负,规定用存小数) ,j 为阶码(无论正负,必须是整数),r 是基数 eg:10.0111=0.100111*pow(2,10)41.阶码所占位数决定实数的取值范围,尾数所占位数决定实数的精度,尾数的符号决定实数的正负,阶码和尾数的字节大小与编译器有关42.float 型变量能接收实型常量的 7 位有效数字,double 型变量能接收 16 位43.运算符的优先级:单目运算算术运算关系运算 逻辑运算条件运算赋值运算 逗号运算9.计算并输出一个三
10、位整数的个位、十位、百位数字之和#includevoid main()int x=321;int a,b,c,sum;a=x%10;/a=1b=(x/10)%10;/b=2c=x/100;/c=3sum=a+b+c;printf(“a=%d,b=%d,c=%dnsum=%dn“,a,b,c,sum);10.涉及算术运算的复合赋值运算符有 5 个:+=,-=,*=,/=,%=11.增 1 运算符也称自增运算符,减 1 运算符也称自减运算符,都是一元运算符,只有一个操作数必须是变量不能是常量或表达式12.自增自减运算符作为前缀时,先执行加 1 或减 1 然后使用;自增自减运算符作为后缀时,先使用再
11、执行加 1 或减 1;13.考虑优先级与结合性的实例m=-n+=m=-(n+)=m=-n,n=n+1;/正面:-和+ 都是一元运算符,优先级相同,此时要考虑结合性,结合性都是右结合的,所以先算+ 后算-/反面:如果等价 m=(-n)+就不合法了,因为表达式不能进行自增操作14.scanf 函数和 printf 函数都是 C 的标准输入/ 输出函数, for(i=1;i#define f(x) x*xvoid main()int b;b=f(4+4); /b=4+4*4+4=24,解释见 5)printf(“b=%dn“,b);9) 例题:#include#define f(x) x*xvoid
12、 main()int b;b=f(4+4)/(2+2); /b=4+4*4+4/(2+2)=21 解释见 6)printf(“b=%dn“,b);10) 例题:#include#define f(x) x*xvoid main()int b;b=f(4+4); /b=(4+4)*(4+4)=644printf(“b=%dn“,b);11) 例题:#include#define f(x) (x*x)void main()int b;b=f(4+4)/(2+2); /b=(4+4)*(4+4)/(2+2)=16printf(“b=%dn“,b);16.const 常量1) const 常量只能在定
13、义时赋初值,因为编译器将其放在只读存储区,不允许在程序中修改2) const 常量的定义一般形式: const 类型名 标识符=字符串;/ 将标识符声明为具有该数据类型的 const 常量3) const 是一种类型修饰符,const 常量具有数据类型,编译器要对其进行类型检查17.表达式中的自动类型转换:1) 表达式中,操作数类型相同,运算的结果类型与操作数类型相同2) 表达式中,操作数类型不相同,编译器自动将所有操作数进行类型提升,转换成同一类型,所占字节最大,再计算18.赋值中的自动类型转换:1) 赋值运算符左侧变量与右侧表达式类型不同时,发生自动类型转换:右侧表达式的值转换成左侧变量的
14、类型19.强制类型转换:1) 强制类型转换运算符是一元运算符2) 强制类型转换也称强转,是将表达式的值转换为任意类型,并不改变变量本身的数据类型3) 强转一般形式:(类型)表达式4) 演示强制类型转换运算符的使用#includevoid main()int m=5;printf(“m/2=%dn“,m/2);/m=2printf(“(float)(m/2)=%fn“,(float)(m/2);/m=2.000000printf(“(float)m/2=%fn“,(float)m/2);/m=2.500000printf(“m=%dn“,m);/m=5,只是将 m 强转为实型数据,并不改变 m
15、的数据类型20.常用的标准数学函数:1) 使用 C 标准数学函数,要在程序开头加上编译预处理命令:#include2) 例:已知三角形三边长为 a,b,c,计算三角形的面积#include#include5void main()float a,b,c,s,area;printf(“Input a,b,c:“);scanf(“%f,%f,%f“,s=(a+b+c)/2;area=(float)sqrt(s*(s-a)*(s-b)*(s-c);printf(“area=%fn“,area);21.赋值运算符的左侧不能出现表达式,变量与变量之间可以赋值例 1:若有定义:int a,b,c;下列表达式
16、中哪一个是合法的 C 语言赋值表达式(C、D)A)a=7+b=c=7 B)a=b+=c=7 C)a=(b=7,c=12) D)a=3,b=a+5,c=b+2 /A.7+b 表达式不能做左值 B.b+表达式不能做左值 C.逗号表达式 a=12 D.依次赋值例 2:下面不正确的赋值语句是(B)A)a=+a B)a=b+=10 C)a+=b D)a=1a/D.算术运算符优先级高于赋值运算符,先算 1a再将其结果赋给 a例 3:若有下列定义:int a=3,b=2,c=1;以下选项错误的赋值表达式是(A)A)a=(b=4)=3 B)a=b=c+1 C)a=(b=4)+c D)a=1+(b=c=4)/A
17、.先计算圆括号里的值等于 4,然后按照赋值表达式的顺序从右向左计算,将 3 赋值给 4这是不对的,即赋值号左侧只能是变量,不能出现表达式 b=46三、 键盘输入和屏幕输出1.字符常量:把字符放在一对单引号内,适用于多数可打印字符2.转义字符:以反斜线()开头,也是放在一对单引号内,适用于控制字符(如回车符,换行符)3.常用的转义字符:1) n 换行 8) a 响铃报警提示音2) r 回车(不换行) 9) “ 一个双引号3) 0 空字符 10) 一个单引号4) t 水平制表 11) 一个反斜线5) v 垂直制表 12) ? 问号6) b 退格 13) ddd 1 到 3 位八进制 ASCII 码
18、值所代表的字符 7) f 走纸换页 14) xhh 1 到 2 位十六进制 ASCII 码值所代表的字符4.n,是将光标移到下一行起始位置, r 是将光标移到当前行的起始位置5.t,是水平制表符,相当于按下 Tab 键,每次按下 Tab 键并不是从当前光标位置向后移动一个 Tab 宽度,而是移到下一个制表位实际移动的宽度视当前光标位置距相邻的下一个制表位的距离而定6.制表位,屏幕上的一行被分为若干个域,相邻域之间的交接点称为制表位,每个域的宽度就是一个 Tab 宽度,多数习惯上为 47.当转义序列出现在字符串中时,是按单个字符计数的8.一个整形数在内存中是以二进制形式存储的,而一个字符在内存中
19、也是以其对应的ASCII 码的二进制形式存储的,但 char 型数据在内存中只占一个字节,而 int 型数据在 16 位系统中占 2 个字节,32 位系统占 4 个字节9.在 ASCII 码取值范围内,char 型数据可以和 int 型数据进行混合运算,char 型数据也能以int 型输出,直接输出其对应的 ASCII 码的十进制值10.字符的输入/输出:1) getchar()和 putchar()是标准函数库中专门用于字符输入/输出的函数,功能是只能输入/输出一个字符2) 例:从键盘输入一个大写英文字母,将其转换为小写字母显示在屏幕上#includevoid main()char ch;c
20、h=getchar();/键盘输入一个字符,再按回车表示输入结束,字符存入变量 ch,注意:getchar()没有参数,直接返回读入的字符ch=ch+32;putchar(ch);/第二次按回车,将显示转换后的结果putchar(n);/注意:putchar()内一定要有参数,参数就是待输出的字符,可以是可打印字符,也可是转义字符11.数据的格式化屏幕输出:1) 函数 printf()的一般格式:printf( 格式控制字符串); 或者 printf(格式控制字符串,输出值7参数表);2) 格式控制字符串包括:格式转换说明符,需要原样输出的普通字符3) 函数 printf()的格式转换说明符:
21、%d 输出带符号十进制整数,整数符号省略%u 输出无符号十进制整数%o 输出无符号八进制整数,不输出前导符 0%x 输出无符号十六进制整数(小写) ,不输出前导符 0x%X 输出无符号十六进制整数(大写) ,不输出前导符 0x%c 输出一个字符%s 输出字符串%f 以十进制小数形式输出实数,包含单,双精度,隐含 6 位小数,但并非全是有效数字,单精度有效 7 位,双精度 16 位%e 以指数形式输出实数(小写 e 表示指数部分) ,小数点前有且仅有一位非 0 数字%E 以指数形式输出实数(大写 E 表示指数部分)%g 自动选取 f 或 e 格式中宽度较小的一种使用,不输出无意义的 0% 输出%
22、4) 输出值参数表:需要输出的数据项的列表,可以是变量或表达式,逗号隔开,类型与格式转换说明符相匹配5) 每个格式转换说明符与输出值参数表中的输出值参数一一对应,没有输出值参数,格式控制字符串就不需要格式转换说明符6) 例:从键盘输入一个大写英文字母,将其转换为小写字母和其十进制 ASCII 码值显示在屏幕上#includevoid main()char ch;printf(“Please enter a key:“);ch=getchar();ch=ch+32;printf(“%c,%dn“,ch,ch);/printf(“%c“,ch)putchar(ch),printf(“n“)putc
23、har(n)7) 函数 printf()中的格式修饰符:在 %和格式符中间插入格式修饰符,用于输出格式的微调,如:指定输出域宽、精度、左对齐等英文字母 l 修饰格式符 d,o,x,u 时,用于输出 long 型数据英文字母 L 修饰格式符 f,e,g 时,用于输出 long double 型数据英文字母 h 修饰格式符 d,o,x 时,用于输出 short 型数据输出域宽 m m 为整数,输出时占 m 列,若 m0,当数据宽度小于 m 时,域内右靠齐,左补空格,当数据宽度大于 m 时,修饰符失效,按实际宽度输出,若 m 有前导符0,左边多余位补 0;若 mvoid main()const do
24、uble pi=3.14159;double r,circum,area;printf(“Please enter r:“);scanf(“%lf“,circum=2*pi*r;area=pi*r*r;printf(“输出没有宽度和精度的值:“);printf(“circum=%f,area=%fn“,circum,area);printf(“输出没有宽度和精度的值:“);printf(“circum=%7.2f,area=%7.2fn“,circum,area);/域宽为 7,占 7 个字符宽度,小数点也算一个字符,精度为 2,小数点后保留 2 位12.数据的格式化键盘输入:1) 函数 sc
25、anf()的一般格式:scanf( 格式控制字符串,参数地址表);2) 格式控制字符串:包括格式转换说明符,分隔符3) 格式转换说明符以%开始,以格式字符结束,用于指定各参数的输入格式4) 函数 scanf()的格式转换说明符:%d 输入十进制整数%o 输入八进制整数%x 输入十六进制整数%c 输入一个字符,空白字符( 包括空格、回车、制表符)也作为有效字符输入%s 输入字符串,遇到第一个空白字符 (包括空格、回车、制表符 )时结束%f 或%e 输入实数,以小数或指数形式输入均可 % 输入一个% 5) 参数地址表:由若干变量的地址组成的列表,用逗号分隔6) 函数 scanf()中的格式修饰符:
26、在% 和格式符中间插入格式修饰符英文字母 l 加在格式符 d,o,x,u 之前,用于输入 long 型数据;加在 f,e 之前,用于输入 double 型数据英文字母 L 加在格式符 f,e 之前,用于输入 long double 型数据英文字母 h 加在格式符 d,o,x 时,用于输入 short 型数据输出域宽 m m 为正整数,指定输入数据的宽度,系统自动按此宽度截取所需数据显示精度 .n n 为 0 或正整数,scanf()没有精度格式修饰符,输入时不能规定精度忽略输入修饰符* 表示对应的输入项在读入后不赋给相应的变量 7) 函数 scanf()输入数值型数据时,被认为输入结束的几种情
27、况:遇空格符、回车符、制表符;达到输出域宽;遇非法字符输入8) 如果函数 scanf()的格式控制字符串中存在除格式转换说明符以外的其他字符,必须将这些字符原样输入#includevoid main()9int a,b;scanf(“%d %d“, /以空格作为分隔符,等价于 scanf(“%d%d“,/实际输入时,空格、回车符、制表符都可作为分隔符,即输入:12 空格 34 12 回车 34 12 制表符 34 均可, #includevoid main()int a,b;scanf(“%d,%d“,/输入时必须以逗号作为分隔符,即只能输入: 12,34printf(“a=%d,b=%dn“
28、,a,b);#includevoid main()int a,b;scanf(“a=%d,b=%d“,/输入时必须将“a=“和“b=“原样输入,即只能输入:a=12,b=34printf(“a=%d,b=%dn“,a,b); #includevoid main()int a,b;scanf(“%2d%2d“,/输入时将前两位数读入存到 a 中,接着两位存到 b 中,然后结束读取,即输入:1234,或 123456 结果一样printf(“a=%d,b=%dn“,a,b); #includevoid main()int a,b;scanf(“%d %d“,printf(“a=“%d“,b=“%d
29、“n“,a,b);/输出 a=“12“,b=“34“#includevoid main()10int a,b;scanf(“%d%*c%d“,/任意字符都可作为分隔符,即输入:12,34 或 12?34 或12+34 结果都一样printf(“a=%d,b=%dn“,a,b);#includevoid main()int a,b;scanf(“%2d%*2d%d“,/忽略两位,输入 123456 printf(“a=%d,b=%dn“,a,b);/输出 a=12,b=56对于程序#includevoid main()int a,b;scanf(“%d %d“,printf(“a=%d,b=%d
30、n“,a,b);如果输入 12 34a 回车,则结果 a=12,b=3,程序在遇到非法字符 a 时,会导致程序输入终止,此时 a 会读入 12,b 会读入 3如果输入 123a 回车,则结果 a=123,b=-858993460,程序在遇到非法字符 a 时,会导致程序输入终止,此时 a 会读入 123,而 b 未能读入指定数据项数如果在 scanf()函数中忘记在变量前加取地址运算符 char op; /输入:12 空格+空格 3 回车/ 输出:12 -858993460=-858993448printf(“Enter data1+data2n“);/输入:12 空格 3 回车/输出:12 3
31、=15scanf(“%d%c%d“,/输入:12+3 回车/输出:12+3=15printf(“%d%c%d=%dn“,data1,op,data2,data1+data2);2) 先输入一个数据后再输入字符型变量时,输入一个数据后,输入的回车符将被当做有效字符读给字符型变量11例:编程从键盘先后输入 int 型、char 型和 float 型数据,要求每输入一个数据就显示这个数据的类型和数据值#includevoid main()int a;char b;float c;printf(“Please input an integer:“);scanf(“%d“,printf(“integer
32、:%dn“,a);/在输入一个整型数据后,输入的回车符被当做有效字符读给了字符型变量 b 了 printf(“Please input a character:“);scanf(“%c“,printf(“chracter:%cn“,b);printf(“Please input a float number:“);scanf(“%f“,printf(“float:%fn“,c);14.%c 格式符存在问题的解决方法1) 用函数 getchar()将数据输入时存入缓冲区中的回车符读入,以避免被后面的字符型变量作为有效字符读入#includevoid main()int a;char b;floa
33、t c;printf(“Please input an integer:“);scanf(“%d“,printf(“integer:%dn“,a);getchar();/将存于缓冲区中的回车符读入,避免在后面作为有效字符读入/函数 getchar()的返回值是一个回车符,已经避免了错误,不需要再将其赋给字符型变量使用printf(“Please input a character:“);scanf(“%c“,printf(“chracter:%cn“,b);printf(“Please input a float number:“);scanf(“%f“,printf(“float:%fn“,
34、c);122) 在 %c 前面加一个空格,将前面数据输入时存于缓冲区的回车符读入,避免被后面的字符型变量作为有效字符读入#includevoid main()int a;char b;float c;printf(“Please input an integer:“);scanf(“%d“,printf(“integer:%dn“,a);printf(“Please input a character:“);scanf(“ %c“,/在%c 前面加空格,将存于缓冲区中的回车符读入printf(“chracter:%cn“,b);printf(“Please input a float numb
35、er:“);scanf(“%f“,printf(“float:%fn“,c);/解释:在%c 前加空格为什么能将存于缓冲区中的回车符读入因为如果函数 scanf()的格式控制字符串中存在除格式转换说明符以外的其他字符,必须将这些字符原样输入,所以在%c 前加空格,就必须在输入字符型数据前先原样输入空格,而空格,回车符,制表符在函数 scanf()输入数值型数据时都代表输入结束,由实践可知,空格符、回车符、制表符在输入时等效所以,缓冲区中的回车将代替需要原样输入的空格,因此,实际上,在%c 前增加空格或者Tab 键都可以完成,并且与增加的数量无关,且可以混合增加3)*经典例题:编程实现键盘任意输
36、入字符,统计字母、数字、空格、其他字符数量首选字符串的方法:#include#define N 100int main()char aN;int i,m=0,n=0,b=0,c=0;printf(“请输入字符:n“);gets(a); for(i=0;ai!=0;i+)if(ai=aint a,b,c,d;a=b=c=d=0;printf(“请输入字符:n“);doch=getchar();getchar();/清除缓冲区的回车键,不然会当做第二个字符读入if(ch!= )/用 Tab 键控制输入结束,他在程序中只会出现一次并且统计一次, /然后结束,所以要去掉它,可以使用 if 语句,也可在
37、前面初始化为 d=-1if(ch=a初值依次为 4,3,2,1,经计算 m=(avoid main()int a,b,max;printf(“Enter a,b:“);scanf(“%d%d“,if(ab) /单分支:if(表达式 P) 语句 Amax=a; if(avoid main()int a,b,max;printf(“Enter a,b:“);scanf(“%d%d“,if(ab) max=a; 16else max=b;printf(“max=%dn“,max);8.条件运算符是 C 语言中唯一的三元运算符,需要三个操作数9.条件运算符例题:计算输出两整数最大值条件运算符(一般形式
38、):表达式 1?表达式 2:表达式 3含义:若表达式 1 为非 0,则结果为表达式 2 的值,否则是表达式 3 的值#includevoid main()int a,b,max;printf(“Enter a,b:“);scanf(“%d%d“,max=ab?a:b; printf(“max=%dn“,max);10.多分支控制条件语句(一般形式 ):if(表达式 1) 语句 1 else if(表达式 2) 语句 2.else if(表达式 m) 语句 melse 语句 m+111.条件语句在语法上只允许每个条件分支中带一条语句,而要在分支里处理多条语句就要使用花括号,构成复合语句12.随机
39、数的使用方法:1) 符号常量 RAND_MAX 在头文件#include中定义,标准 C 规定RAND_MAX 不大于双字节整数的最大值 327672)随机函数 rand()产生的是一个在 0RAND_MAX 之间的整数 ,即0,32767 之间的整数3) 利用求余运算 rand()%b 可将函数 rand()生成的随机数变化到0,b-14) 利用 rand()%b+a 可将随机数的取值范围平移到a,a+b-1例:产生 1100 的随机数: rand()%100+113.例题:猜数游戏:计算机想一个数,人猜对了提示 Right!,否则提示 Wrong!,并告诉大小#include#includ
40、evoid main()int magic,guess;magic=rand(); /随机数printf(“Please guess a number:“);scanf(“%d“,if(guessmagic) /多分支 17printf(“Wrong!Too big!n“); /复合语句else if(guessvoid main()int data1,data2;char op;18printf(“Enter your expression:“);scanf(“%d%c%d“,switch(op)case +:printf(“%d+%d=%dn“,data1,data2,data1+data
41、2);break;case -:printf(“%d-%d=%dn“,data1,data2,data1-data2);break;case *:case x:case X:printf(“%d*%d=%dn“,data1,data2,data1*data2);break;case /:if(0=data2)/也可写成 data2=0,写 0=data2 的好处: /因为赋值表达式左值必须是变量,如果把= 误写成=,会提示错误printf(“Division by zero!n“);elseprintf(“%d/%d=%dn“,data1,data2,data1/data2);break;de
42、fault:printf(“Invalid operator!n“);/break;这句一般不需要,因为没有 break 就会依次执行下面的步骤直到 break 或者switch 的 /这里已经是 switch 的 了16.例题:编程实现简单计算器功能,能进行浮点数运算,操作数与运算符之间可加入任意多个空格#include#includevoid main()float data1,data2;char op;printf(“Enter your expression:“);scanf(“%f %c%f“,switch(op)case +:printf(“%f+%f=%fn“,data1,da
43、ta2,data1+data2);19break;case -:printf(“%f-%f=%fn“,data1,data2,data1-data2);break;case *:case x:case X:printf(“%f*%f=%fn“,data1,data2,data1*data2);break;case /:if(fabs(data2)1int flag=1;printf(“Enter a,b,c:“);scanf(“%f,%f,%f“,if(a+bcprintf(“Enter score:“);scanf(“%d“,if(score100)mark=-1;/这个 if 语句很重要,
44、如果去掉,边界测试 101109,-1-9 会出错else21mark=score/10;switch(mark)case 10:case 9:printf(“%d-优!n“,score);break;case 8:printf(“%d-良!n“,score);break;case 7:printf(“%d-中!n“,score);break;case 6:printf(“%d-及格!n“,score);case 5:case 4:case 3:case 2:case 1:case 0:printf(“%d-不及格!n“,score);break;default:printf(“Input e
45、rror!n“); 20.对输入非法字符的检查与处理1)例:输入两个整型数,计算并输出两个整数的最大值#includevoid main()int a,b,max;printf(“Enter a,b:“);scanf(“%d,%d“,max=ab?a:b;printf(“max=%dn“,max);/隐含问题:在 Visual C+下1.如果输入 3.2,1 则输出 32.如果输入 1,3.2 则输出 33.如果输入 q 则输出-858993460/解决办法:22#includevoid main()int a,b,max,ret;doprintf(“Enter a,b:“);ret=scan
46、f(“%d,%d“,if(ret!=2)/返回在遇到非法字符前已成功读入的数据项数/但是 scanf()函数不做类型检查,所以输入 1,3.2 会输出 3printf(“Input error!n“);while(getchar()!=n);elsemax=ab?a:b;printf(“max=%dn“,max);while(ret!=2);21.位运算符的使用1)位运算是对字节或字内的二进制数位进行测试、抽取、设置或移位等操作2) 位运算的操作对象只能是 char 和 int 类型3) C 语言中共有 6 种位运算符,只有按位取反是单目运算符,其他都是双目运算符4)关系运算和逻辑运算的结果要
47、么是 0,要么是 1,而位运算结果可为任意值,但每一位都只能是 0 或 15)6 种位运算符:按位取反 用于加密处理,一次求反加密,二次求反解密左移位 按位与 x 反码加一 1000 0000 0000 1101 -13printf(“%5d%5d%5dn“,!x,x|y,xprintf(“%5u%5d%5dn“,x,x|y,xprintf(“%5d%5d%5dn“,x,x|y,x24输出: 0 1 1 4294967283 12 8-13 12 8五、循环控制结构1.循环:包括计数控制的循环和条件控制的循环2.结构化程序设计的三种基本结构:顺序结构、选择结构、循环结构3.循环结构的类型:1)当型循环结构:for 语句( 适合循环次数已知,计数控制的循环)2)直到型循环结构:while 语句、do-while 语句( 适合循环次数未知,条件控制的循环)4.while 语句1)一般形式为:while(循环控制表达式 ) |语句系列 |循环体 |2)循环控制表达式在执行