C语言讲义C4
C语言程序设计c4 选择结构程序设计

例4.2 计算逻辑表达式的值。 #include <stdio.h> 程序运行结果如下: 0,0 main() 1,0 { char c='k'; 0,1 int i=1,j=2,k=3; float x=3e+5,y=0.85; printf("%d,%d\n",!x*!y,!!!x); printf("%d,%d\n",x||(i=5)&&j-3,i<j&&x<y); printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k); }
第 4章
选择结构程序设计
4.1 4.2 4.3 4.4 4.5
关系关系运算符和关系表达式 逻辑运算符和逻辑表达式
If语句及其构成的选择结构 Switch语句及其构成的选择结构 选择结构程序设计举例
4.2 逻辑运算符和表达式
逻辑运算符
种类: ! && 逻辑运算真值表
a 真 真 假Βιβλιοθήκη 假 b 真 假 真 假a>b&&x>y !a||a>b !b==c||d<a
高
//(a>b)&&(x>y)
//(!a)||(a>b)
//((!b)==c)||(d<a)
低
a+b>c&&x+y<b //((a+b)>c)&&((x+y)<b) a && b && c //(a && b) && c !!!x //!(!(!x))
C4_简单的程序

计算出两个根放在x1、 中 计算出两个根放在 、x2中
显示x1、 中存放的数据 显示 、x2中存放的数据 end
C语言与程序设计 江汉大学数计学院
韩海
12
键盘输入工具scanf
用法(格式 : 用法 格式): 格式 scanf(“格式串”,&变量 ,&变量 ,…); 格式串” 变量1, 变量 变量2, ); 格式串 变量
C语言与程序设计 江汉大学数计学院
韩海
3
一个简单的程序实例
问题:已知一个球的半径是1.736,求它的表 问题:已知一个球的半径是 , 面积和体积。 面积和体积。 main( ) { double pi=3.1415926 , r , s , v ; r = 1.736 ; s = 4 * pi * r * r ; v = 4.0 / 3 * pi * r * r * r ; } v=s*r/3; 解释程序中变量定义及语句的效果。 解释程序中变量定义及语句的效果。 Q:人如何查看变量 和v中存放的数据? :人如何查看变量s和 中存放的数据 中存放的数据?
C语言与程序设计 江汉大学数计学院
韩海
14
键入系数的求根程序
#include <stdio.h> #include <math.h> main( ) {double a , b , c , d , x1 , x2 ; scanf("a=%lf,b=%lf,c=%lf",&a,&b,&c); d=b*b–4*a*c; x1 = ( -b + sqrt(d) ) * 0.5 / a ; x2 = ( -b - sqrt(d) ) * 0.5 / a ; printf("x1=%f , x2=%f\n" , x1 , x2 ) ; }
c4数据类型及表达式

1111 1111 1111 1010 (结果为-6)
第4章 数据类型及表达式
C语言程序设计基础
乔志会
中北大学电子与计算机科学技术学院
5、按位左移运算 <<运算的作用是对参与运算的运算对象按规定 的位移数进行左移, <<运算符的左操作数是需 要移位的数据,右操作数是移位的位数,在移 位过程中高位移出的位舍弃,低位左移后补0 例:5<<3 << 0000 0000 0000 0101 (5)
C语言程序设计基础
乔志会
中北大学电子与计算机科学技术学院
六、位运算
运算符 & | ∧ 含义 按位与 按位或 按位异或 运算符 ~ << >> 含义 取反 左移 右移
(1)位运算符中除~以外,均为双目运算符,即要 求两侧各有一个运算量。 (2)运算量只能是整型或字符型的数据,不能为实 型数据。
第4章 数据类型及表达式
中北大学电子与计算机科学技术学院c语言程序设计基础中北大学电子与计算机科学技术学院c语言程序设计基础数据类型基本类型构造类型指针类型整型浮点型字符型基本型int2byte长整型long4byte短整型short2byte无符号整型unsigned2byte单精度浮点型float4byte双精度浮点型double8bytechar1bytevoid数组类型结构体类型联合体枚举类型中北大学电子与计算机科学技术学院c语言程序设计基础八进制整型常量十六进制整型常十进制整型常量小数形式指数形式直接形式八进制形式十六进制形式转义字符整型常量浮点常量字符常量符号常量基本知识定义格式初始化命名存储赋值常量变量c程中数据的表示形式中北大学电子与计算机科学技术学院c语言程序设计基础数据类型及表达式一常量程序运行过程中其值不发生改变的量1整型常量即整型常数有三种表示法1整型常量的表示法八进制整型常量十六进制整型常量十进制整型常量前缀为0数码07前缀为0x或0x数码09af或af数码中出现字母时字母的大小写应与前缀一致无前缀数码09中北大学电子与计算机科学技术学院c语言程序设计基础数据类型及表达式一常量程序运行过程中其值不发生改变的量1整型常量即整型常数有三种表示法2对整型常量的说明整型常量的类型整型常量的后缀八十六进制表示的整型常量的真值值为3276832767基本整型065535无符号整型32767或32768长整型无符号数中北大学电子与计算机科学技术学院c语言程序设计基础数据类型及表达式一常量程序运行过程中其值不发生改变的量2浮点常量也称实型常量c语言中实数用十进制表示有两种形式1小数形式2指数形式由小数点和09组成当整数或小数部分为0时0可以省略由尾数阶码标志e或e及阶码组成一般形式
C4C语言学习资料6

例:计算符号函数
输入变量x, 计算符号函数: 1 当 x>0 y = 0 当 x=0 -1 当 x<0
非0
0
x>0
0
x=0
非0
if (x>0) y = 1; else if (x==0) y = 0; else y = -1;
y=1
y=0
y = -1
例4-9
x <1
非0
0 0
x <2
非0 非0
0
逻辑与 &&
(x>1)&&(y>1)
逻辑或 ||
(x>1)||(y>1)
逻辑非 !
(x>1)
!(x>1) 即 x<=1
逻辑运算的规则-真值表
逻辑与 && 逻辑或 || 逻辑非 ! 真值表 x y x&&y x||y !x 假 假 0 0 1 假 真 0 1 1 真 假 0 1 0 真 真 1 1 0
一条语句 一条语句
4.2.1 基本的if语句
2、省略else的if结构 if (exp) statement_1
ch=getchar(); if(ch>='a'&&ch<='z') ch=ch-'a'+'A'; putchar(ch);
非0
表达式
0
语句1
ch=getchar(); if(ch>='a'&&ch<='z'){ ch=ch-'a'+'A'; putchar(ch); }
c4

第4章数组[目的要求]1.掌握一维数组的定义和使用;2.掌握二维数组的定义和使用;3.掌握字符数组的定义和使用;4.了解多维数组。
[基本内容]1.一维数组;2.二维数组;3.字符串与字符数组;4.多维数组简介;5.数组的应用。
[重点难点]1.重点:一维数组、二维数组的应用。
2.难点:数组的越界。
[课时安排]4学时。
4.1 一维数组的定义和引用4.1.1 一维数组的定义[案例4.1] 从键盘上任意输入10个整数,要求按从小到大的顺序在屏幕上显示出来。
排序的方法有很多,本题采用冒泡法。
冒泡法的基本思想:通过相邻两个数之间的比较和交换,使排序码(数值)较小的数逐渐从底部移向顶部,排序码较大的数逐渐从顶部移向底部。
就像水底的气泡一样逐渐向上冒,故而得名。
由A[n]~A[1]组成的n个数据,进行冒泡排序的过程可以描述为:(1)首先将相邻的A[n]与A[n-1]进行比较,如果A[n]的值小于A[n-1]的值,则交换两者的位置,使较小的上浮,较大的下沉;接着比较A[n-1]与A[n-2],同样使小的上浮,大的下沉。
依此类推,直到比较完A[2]和A[1]后,A[1]为具有最小排序码(数值)的元素,称第一趟排序结束。
/*冒泡法排序*/for(i=0; i<NUM-1; i++) /*外循环:控制比较趟数*/for(j=NUM-1; j>i; j--) /*内循环:进行每趟比较*/if(data[j]<data[j-1]) /*如果data[j]大于data[j-1],交换两者的位置*/{temp=data[j];data[j]=data[j-1];data[j-1]=temp; };printf("\nthe result of sort:\n"); /*输出排序后的数据*/for(i=0; i<NUM; i++)printf("%d ",data[i]);getch(); /*等待键盘输入任一字符,目的使程序暂停*/(2)然后在A[n]~A[2]区间内,进行第二趟排序,使剩余元素中排序码最小的元素上浮到A[2];重复进行n-1趟后,整个排序过程结束。
C4 顺序结构程序设计

构 程
效数字。
序
对于s:
设 计
“.n”则表示要输出字符的个数;
如果实际位数大于所定义的精度时,则截去超过的
部分。
Copyright@ Henan Polytechnic University
C 语
指定精度时的输出结果
言
输出语句
输出结果
printf("%8.3f\n",123.55);
第 4
printf("%8.0f\n",123.55);
C语言语句概述
第
4 章
4.2
字符数据的输入输出
顺 序
4.3
格式化输入输出函数
结
构 程
4.4
顺序结构程序设计举例
序
设
计
Copyright@ Henan Polytechnic University
C
4.2 字符数据的输入输出
语
言
输出 从计算机向外部输出设备(如显示器、打印机
、磁盘等)输出数据称为“输出”
printf函数的输出格式的一般形式为:
%[标志][宽度指示符][.精度指示符][长度修饰符]格式字符
第 格式字符
4
格式字
章
符
说明
顺 d或i
序 结
o
构 程
x,X
序 设u
计f
以十进制形式输出带符号整数(正数不输出符号) 以八进制形式输出无符号整数(不输出前缀0),即输出补码
以十六进制形式输出无符号整数(不输出前缀0x), 对于x用abcdef输出;对于X用ABCDEF输出
001.60
Copyright@ Henan Polytechnic University
C语言讲义C4

{ char ch; scanf(“%c”, &ch); ch= (ch>= ‘A’&& ch<= ’Z’)? (ch+32) : ch; printf(“%c”, ch) }
输入 A a
21
4.4 switch 语句
switch语句 问题:为什么引出switch语句? 该语句为开关语句,解决多分支的情况。 格式:switch(表达式) { case (常量表达式1):语句块1; case (常量表达式2):语句块2;
3
4.1.2 逻辑运算符及其运算结果
用逻辑运算符将关系表达式或逻辑量连接起来就是逻辑表达式。
1. 逻辑运算符及其优先次序 C语言提供三种逻辑运算符: && (逻辑与) 、 || (逻辑或) 、! (逻辑非) 注:“&&”和“|| ”是“双目(元)运算符”,它要求有两个运算量 操作数。而“! ”是“单目(元)运算符”,只要求有一个运算 量。 [例]:a&&b+c 、 (a>b)||(x>y) 、!(x<y)
0 0.0 2 0.0 5 d 0.0 8 0.1 0.1 5 s 250 250 s 500 500 s 1000 1 0 0 0 s 2 0 0 0 2 0 0 0 s 3 0 0 0 3 0 0 0 s
(4) case后的“常量表达式”只起到语句标号 的作用,而不进行条件判断,故在执行完某个 case后的语句序列后,将自动转移到下一个case 继续执行。其计算过程为:
23
a. 计算表达式的值; b. 找到与表达式的值相同的case常量表达式,执行该case后边 的语句序列,之后依次往下执行语句块。 表达式
C4-2

例4.15求ax2+bx+c=0方程的根。a,b,c由键盘输入,设b2-4ac>0。 众所周知,一元二次方程式的根为
可以将上面的分式分为两项:
据此编写程序如下: #include<stdio.h> #include<math.h> main() { float a,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(disc)/(2*a); x1=p+q; x2=p-q; printf("x1=%5.2f,x2=%5.2f\n",x1,x2); }
c=getchar();
if(c>=48&&c<=57) printf("It is a number.\n");
else
printf("It is not a number"); }
3. if(表达式1) else if(表达式2) else if(表达式3) … else if(表达式m) else
4.3
顺序结构
顺序结构是按语句排列的顺序执行程序的。 使用C语言编写程序时,实现顺序结构的方法非常简单,只需将语 句按顺序排列即可。 [例4.12] 从键盘输入一个大写字母,要求改用小写字母输出。 算法:从键盘输入字符可以使用getchar()实现,大写字母转换为小 写字母就是对其ASCII码的操作,即将此大写字母的ASCII码值加 上大写A与小写a的ASCII码的差值32。
scanf(格式输入), getchar (输入字符), gets(输入字符串)。
c4-控制结构1

9
调用标准函数应注意以下几点:
(1)要在程序中包含相应的头文件。 )要在程序中包含相应的头文件。 例如: 例如: #include〈stdio.h〉 #include〈math.h〉 #include是编译预处理命令,其作用是将将某个 已经存在的文件包含到程序中来。 (2)在表达式中调用函数,实际上是执行一段预 )在表达式中调用函数, 先设计好的程序,求出结果后返回调用点。 先设计好的程序,求出结果后返回调用点。所以 函数的值又称函数的返回值。 函数的值又称函数的返回值。
19
格式字符串的一般形式为: 格式字符串的一般形式为:
%[flags][width][.preቤተ መጻሕፍቲ ባይዱ][F|N|H|L][type] 即: % [标志 输出最小宽度][.精度 长度]类型 标志][输出最小宽度 精度][长度 类型 标志 输出最小宽度 精度 长度
说明: 说明:
1、标志: 、标志: -:结果左对齐,右边填空格;默认为右对齐。 结果左对齐, 结果左对齐 右边填空格;默认为右对齐。 +:输出正负号。 :输出正负号。 空格:输出值为正时空格代替,为负时负号。 空格:输出值为正时空格代替,为负时负号。 2、输出最小宽度:用十进制数表示输出的最少位数。 、输出最小宽度:用十进制数表示输出的最少位数。 3、精度:以”.”开头,后跟十进制整数。 开头, 、精度: 开头 后跟十进制整数。 输出数字:表示小数位数。 输出数字:表示小数位数。 输出字符:表字符个数。 输出字符:表字符个数。 实际位数>精度数 则截去超过部分。 精度数, 实际位数 精度数,则截去超过部分。 4、长度:l和h两种。 两种。 、长度: 和 两种 l:表示按长整型或 表示按长整型或double输出。 输出。 表示按长整型或 输出 h:表示按短整型输出。 表示按短整型输出。 表示按短整型输出
c4-运算符和表达式

----运算符和表达式C语言的运算符按其在表达式中与运算对象的关系(连接运算对象的个数)可以分为:单目运算符:一个运算符连接一个运算对象-a “-“双目运算符:一个运算符连接两个运算对象a+b “+”三目运算符:一个运算符连接三个运算对象a>b? a:b “? :”表达式是由常量、变量、函数、运算符以及圆括号(),按照一定的规则组成,不管表达式的形式如何,都会计算出一个结果,该结果的类型由参与运算的数据和运算符决定学习运算符应注意:1.优先级:指同一个表达式中不同运算符进行计算时的先后次序。
先乘除后加减2.结合性:结合性是针对同一优先级的多个运算符而言的,它是指同一个表达式中相同优先级的多个运算应遵循的运算顺序。
●算术运算符和表达式基本算术运算符:+ -(减号) * / % -(负号)优先级:- ---->* / % -----> + -(2) (3) (4)结合方向:从左向右例如a*b*c*d/e/r说明:1.“-”为负号时,右结合性2.两整数相除,结果为整数如5/2 = 2-5/2.0 = -2.53.%要求两侧均为整型数据5%2 = 1-5%2 = -11%10 = 15%1 = 05.5%2 ( )●自增、自减运算符自增自减运算符: ++(自增运算符) --(自减运算符)作用:使变量值加1或减1前置++i, --i (先执行i=i+1或i=i-1,再使用i值)后置i++,i-- (先使用i值,再执行i=i+1或i=i-1)例1设j和k是整型变量●j=3; k=++j; // k的值为4 j的值为4●j=3; k=j++; // k的值为3 j的值为4●j=3; printf(“%d”,++j); // 输出4 j的值为4●j=3; printf(“%d”,j++); // 输出3 j的值为4设a,b,c是整型变量◆a=3;b=5;c=(++a)*b; // a的值为4 c的值为20◆a=3;b=5;c=(a++)*b; // c的值为15 a的值为4说明:1.”++”,”–“不能用于常量和表达式如5++,(a+b)++ 错误的表达方式2.优先级:- ++ -- ------>* / % ----->+ -2 3 43.++ --结合方向:自右向左例2:#include <stdio.h>void main(){int a=3;printf("%d",-a++); //但是++放在后面输出-3 a变成4printf("%d",a); //输出4}#include <stdio.h>void main(){int a=3;printf("%d",-++a);printf("%d",a);}赋值运算符和表达式简单赋值运算符符号:=格式:变量名=表达式作用:将表达式的值赋给一个变量例如:a=3c=d+2复合赋值运算符种类:+= -= *= /= %=含义:变量名+=表达式等价于变量名=变量名+表达式例如a+=3 等价于a=a+3a/=3 等价于a=a/3x*=y+8 等价于x=x*(y+8)说明:1.赋值运算符优先级:142.结合方向:自右向左3.赋值表达式的值与左边变量值相等,且可嵌套如a=3 该表达式的值为3例3 a,b,c都是整型变量a=b=c=5 // c的值5 b的值5 a的值5 整个表达式的值也等于5 a=(b=5) // b的值5 a的值5 整个表达式的值也等于5a=5+(c=6) //c的值6 a的值11 整个表达式的值也等于11a=(b=4)+(c=6) //b的值4 c的值6 a的值10 整个表达式的值也等于10 a=(b=10)/(c=2) //b的值10 c的值2 a的值5 整个表达式的值也等于5例4int a=12;a+=a-=a*a; //4.左侧必须是变量,不能是常量或表达式例如3=x-2*y // 错误a+b=3 // 错误逗号运算符和表达式1逗号运算符:,2逗号表达式形式:表达式1,表达式2,……表达式n n个分量表达式例如3*5,a*4,a+53优先级: 154结合性:从左向右5逗号表达式的值:等于表达式n的值6用途:常用于循环for语句中例5a=3*5,a*4 //a的值为15 整个逗号表达式的值是60a=3*5,a*4,a+5 // a的值为15 整个逗号表达式的值是20例6 x=(a=3,6*3) //赋值表达式a的值为3 x的值为18x=a=3,6*a // 逗号表达式a的值为3 x的值为3 整个表达式的值为18例7 int a=1,b=2,c=3;printf(“%d,%d,%d”,a,b,c); //printf(“%d,%d,%d”,(a,b,c),b,c); //练习:#include <stdio.h>void main(){int x,y=7;float z=4;x=(y=y+6,y/z);printf("x=%d\n",x);}关系运算符和表达式关系运算符1种类:< <= == >= > != //注意== 和=的区别2优先级别:6 或76:>< >= <=7: == !=3结合方向:自左向右4关系表达式的值:是逻辑值“真”或“假”,用1和0表示例8 int a=3,b=2,c=1,d,f;a>b //1(a>b)==c //1b+c<a //0d=a>b //1f=a>b>c //0例9 int a=0;float b=0.5;float x=0.3;则a<=x<=b的值为例5>2>7>8在C中是允许的,值为0例int i=1, j=7,a;a=i+(j%4!=0);则a的值为例…a‟>0 结果为 1…A‟>100 结果为0例应避免对实数作相等或不等的判断如 1.0/3.0*3.0==1.0 结果为0可改写为:fabs(1.0/3.0*3.0-1.0)<1e-6 1逻辑运算符和表达式1.逻辑运算符种类:! && ||2.形式: a&&b a || b !a运算规则: && 逻辑与当两者都为真时结果为真,只要有一个为假,结果为假雪是黑的&&5>2|| 逻辑或当两者都为假时结果为假,只要有一个为真,结果为真雪是白的||李宇春是男的!逻辑非真的变假假的变真C语言中,运算量: 0表示“假”,非0表示“真”运算结果: 0表示“假”,1表示“真”3.优先级:! 2 从右往左(结合方向)&& 11 从左往右(结合方向)|| 12 从左往右(结合方向)例int a=4,b=5;!a // 0a&&b // 1a||b //1!a||b //14&&0||2 //15>3&&2||8<4-!0 // 1‘c’&&‘d’//14短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出整个表达式的值时,才执行该运算符例a&&b&&c //只在a为真时,才判别b的值;只在a、b都为真时,才判别c的值例a||b||c //只在a为假时,才判别b的值;只在a、b都为假时,才判别c的值条件运算符以及表达式1.条件运算符: ? :2.形式:expr1? expr2: expr3执行过程当expr1为真时,整个表达式的值为expr2的值,当expr1为假时,整个表达式的值为表达式expr3的值例如a>b?a:b a大于b 值为a的值a不大于b 值为b的值3.优先级:134.结合方向:自右向左例如:b>0?a+b:a-b 相当于a+|b|a>b?a:b>c?b:c a>b?a:(b>c?b:c)例题#include <stdio. h>void main(){int a,b;printf("请输入两个整数:");scanf("%d%d",&a,&b);printf("最大数为%d",a>b?a:b); }。
C4-控制结构

基本if语句示例
//比较输入的两个数的大小,并将较大者赋给变量x,较小者赋给变量y #include<stdio.h> void main() { int a,b,x,y; scanf(“%d,%d”,&a,&b); if(a>b) { 复合语句 x=a; y=b; } 两个复合语句只会执行一个 else { x=b; y=a; } printf(“a=%d, b=%d\n x=%d, y=%d\n”, a, b, x, y); }
自动化系 王雷
if语句嵌套示例
//输入三个数a、b、c,输出其中最大者 //算法描述(自然语言)
如果a>b 则 如果a>c 则a最大,输出a 否则c大,输出c 否则 如果b>c 则b最大,输出b 否则c大,输出c
自动化系 王雷
if语句嵌套示例
#include<stdio.h> BEGIN void main() a 输入一个整数 { b 输入一个整数 int a, b, c; c 输入一个整数 scanf(“%d,%d,%d”,&a,&b,&c); IF (a>b) if (a>b) IF (a>c) if (a>c) printf(“a最大\n”); 输出”a最大” ELSE else printf(“c最大\n”); else 输出”c最大” ELSE if (b>c) printf(“b最大\n”); IF (b>c) else printf(“c最大\n”); } 输出”b最大” ELSE 输出”c最大” END
自动化系 王雷
基本if语句
基本if语句
简单if语句:if (表达式) 语句1 表达式值非0,则执行语句1,否则不执行; 选择if语句:if (表达式) 语句1 else 语句2 表达式值非0,则执行语句1,否则执行语句2
C4_c语言_输入3个小写字母输出其ASCII码值和对应的大写字母

printf("%d\n",a);
printf("%d\n",b);
sum=a+b;
avg=sum/2;
printf("整数a和b的和sum=%f\n整数a和b的平均数avg=%f\n",sum,avg2输入3个小写字母,输入其ASCII码值和对应的大写字母
printf("请输入3个小写字母\n");
char a1,a2,a3,b1,b2,b3;
scanf("%c,%c,%c",&a1,&a2,&a3);
printf("这三个小写字母%c,%c,%c对应的ASCII码值分别是%u,%u,%u\n",a1,a2,a3,a1,a2,a3);
b1=a1-('a'-'A');
b2=a2-('a'-'A');
b3=a3-('a'-'A');
printf("这三个小写字母%c,%c,%c对应的大写字母分别是%c,%c,%c\n",a1,a2,a3,b1,b2,b3);
/*
//demo3输入一个十进制数将其转化为一个8位的二进制数输出
int c;
int a[8]={0};
printf("please input a number:\n");
}
printf("1-abc\0123\?\n");
printf("2-\"def\"456\\n\n");
c4-function,c语言

High Level Language Programming
Slide: 4-16
Function definition函数定义
下面add函数的功能是求两个参数的和, 并将和值返回调用函数。函数中的错误 是: void add(float a, float b) void add(float a, float b) { float c; c=a+b; return c; float add(float a, float b) }
Functions 函数
High Level Language Programming
Slide: 4-3
Outline
1. 函数原型(prototype)。函数definition定义和函数原
型prototype说明declaration的方法及二者区别,调用。 2. 掌握函数的参数传递方式与函数调用方法实参 argument,形参parameter。 3. 理解掌握variable变量的scope作用域和storage class存 储类的概念。
x=max(max(a, b), c);
High Level Language Programming
Slide: 4-20
程序举例(4)
#include <stdio.h> main( ) {int a=5, b=10; 分析一下程序,写出运行结果。 printf("a=%d, b=%d\n", a, b); fun(a, b); /*函数调用*/ printf("a=%d, b=%d\n", a, b); } int fun(int x, int y)/*现代风格函数定义*/ {x=3; y=3; a=5 , b=10 return; a=5 , b=10 }
c4PPT课件

§4.3 if语句
一、if语句的三种格式
格式1:if (表达式) 语句;
执行过程:
Байду номын сангаас
表达式
不成立
成立
执行语句
格式2:if (表达式) 语句1;
else
语句2;
执行过程:
表达式
成立
不成立
执行语句1
执行语句2
10
格式3:if (表达式1) 语句1; eles if (表达式2) 语句2; eles if (表达式3) 语句3; …… eles if (表达式n-1) 语句n-1; eles 语句n;
scanf("%d%d",&a, &b);
max=a;
if ( max<b ) max=b;
printf("The max of a and b : %d\n", max); }
max<b
成立
max=b
不成立
以上两个程序等价
13
例C4_302.C:从键盘输入被除数a和除数b,求商。
main( ) { int a,b;
成立
max=a
a>b?
不成立
max=b
if语句中进行条件判断 的“表达式”必须用(
)括起来且不可省略
12
例C4_301.C:求a和b两数中较大的一个。
#include <stdio.h>
例C4_3011
main( )
/* 程序功能:求a和b的最大值 */
{ int a,b,max; printf("Input a and b=");
c4

4.2.3 外部变量(extern) 外部变量(extern)
(一)外部变量是全局变量 在一个文件中,定义在所有函数之外 的变量称为外部变量 外部变量。 外部变量 int a=3,b=5; /*外部变量*/ main() {printf(“%d,%d\n”,a,b);} fun(void) {printf(“%d,%d\n”,a,b);} 全 程 有 效
4.1.5 函数的嵌套调用
C语言中允许在调用一个函数的过程中 又调用其他函数,这种调用称为嵌套调用 嵌套调用。 嵌套调用 main函数 ① { u=f1(i,t); } f1函数 { ② f2函数 ③ {
④ c=f2(b-1,b+1); …... ⑥ ⑤ } ⑦ }
4.1.5 函数的递归调用
一个函数直接或间接地调用自身,称 函数的递归调用。 为函数的递归调用 函数的递归调用 递归方式和递归终止条件组成。 递归由递归方式和递归终止条件 递归方式和递归终止条件 例题:递归计算n!的函数rfact( )。 例题:递归计算 !的函数 。 long rfact( int n) { if (n<=1) return (1); else return(n*rfact(n-1)); }
(一)传值调用的过程是: 传值调用的过程是: (1)形参与实参各占一个独立的存储空间。 (2)形参的存储空间是函数被调用时才分配 的。实参与形参的结合方式为“值结合 值结合”。 值结合 (3)函数返回时,临时存储区也被撤销。 传值调用的特点是: (二)传值调用的特点是: 函数中对形参变量的操作不会影响到调 用函数中的实参变量,即形参值不能传回给 形参值不能传回给 实参。 实参 函数只有一个入口和一个出口,且函数 只能返回一个值 返回一个值。 返回一个值
C4选择结构程序设计解析

优先级次序: ! (逻辑非)14 算术运算符13/12 关系运算符10/9 &&(逻辑与)5 ||(逻辑或)4 赋值运算符2
6
2.逻辑表达式
由逻辑运算符和运算对象所组成的表达式称为逻辑表达 式。逻辑运算的对象可以是C语言中任意合法的表达式。 例如:表达式(a>b)&&(x>y) 当a大于b且x大于y时,结果为“真”,用数值1来表示;否 则,结果为“假”,用数值0来表示。
2018/10/15 16:48:14 长江大学计算机科学学院 5
4.1.3 逻辑运算符与逻辑表达式
1.逻辑运算符及其优先级
C语言提供了三种基本的逻辑运算符。逻辑代数的其它 逻辑运算都可以转化为这三种逻辑运算的组合。
表4.2 逻辑运算符及其优先级
5 4 14 右结合
2018/10/15 16:48:14 长江大学计算机科学学院
例4.4 编写一程序实现符号函数的功能。
#include <stdio.h> void main() { int x, y ; printf("Enter x:"); scanf("%d", &x ); y= -1; 程序运行情况如下: if (x!=0) Enter x:8<CR> { if(x>0) y=1; } x= 8, y= 1 else y=0; printf("x=%d, y=%d\n", x, y); }
例:“非完全求解”
#include "stdio.h" void main() {int x,a,b,c; a=1;b=2;c=3; x=(a-1)&&(++b)&&(++c); printf("1:a=%d,b=%d,c=%d,x=%d\n",a,b,c,x); a=1;b=2;c=3; x=a&&(b-2)&&(++c); printf("2:a=%d,b=%d,c=%d,x=%d\n",a,b,c,x); a=1;b=2;c=3; x=a&&(++b)&&(++c); printf("3:a=%d,b=%d,c=%d,x=%d\n",a,b,c,x); }
C4-一维数组

C4-⼀维数组//// main.m// c4-⼀维数组//// Created by dlios on 15-7-3.// Copyright (c) 2015年 LIMURAN. All rights reserved.//#importint main(int argc, const char * argv[]) {// 最⼩公倍数// int m = 0, n = 0;// scanf("%d%d",&m,&n );// int num= m>n?m:n;// // 定义⼀个变量⽤来保存找到的最⼩公倍数// int minNum=0;// for (int i=num; i>=1; i++) {// if (0 == i % m && 0 == i % n ) {// minNum=i;// break;// }// }// printf("%d\n",minNum);// 最⼤公约数// int m=0,n=0;// scanf("%d%d",&m,&n );// int num=m// 定义⼀个变量⽤来保存找到的最⼤公约数// int maxNum=0;// for (int i=num; i>=1; i--) {// 两个数的最⼤公约数肯定⼩于等于较⼩的那个数,如果int i = min, i>=1,i-- 则表⽰从较⼩的那个数开始找公约数,然后加break,这样从⼤到⼩找到的第⼀个数就是最⼤公约数,然后进⾏⼀个break,停⽌运⾏.如果int i= 0;开始的话找到的所有公约数还要进⾏⼀个⼤⼩的⽐较才能找到最⼤公约数,⽐较⿇烦,所以i 从min开始⽐较简单.// if (0==m%i&&0==n%i ) {// maxNum=i;// break;// }// }// printf("%d\n",maxNum);//// 辗转相除法// int m=0,n=0;// scanf("%d%d",&m,&n );// while (m%n!=0) {// // temp 是临时将m n 的值带⼊的⼀个数// int temp=m%n;// // 把n的数给m// m=n;// // 结果给n// n=temp;// }// printf("%d\n",n);//// 定义⼀个最简单的⼀维数组// int arr[5]={1,2,3,4,5};// printf("%d\n",arr[4]);// 数组越界,如果为arr[5]的话,还是会出结果,但是超过了数组下标的范围.是错误的// c语⾔⾥,系统⾯对数组越界会产⽣⼀个警告,当前要访问的元素超过了下标的最⼤值,OC⾥数组越界会产⽣崩溃现象.// 遍历数组//所谓遍历数组就是把数组⾥的所有数据都运⾏⼀遍,所以会⽤到循环,所以会有for循环// int arr[5]={2,1,6,4,9};// for (int i=0; i<5; i++) {// printf("%d\n",arr[i]);// }////// @@@ 定义⼀个长度为20的整形数组// int a[20]={};// for (int i=0; i<20; i++) {// a[i]=arc4random()0;// printf("%d\n",a[i]);// } // for循环进⾏的是⼀个for⾃带的整个⼤括号的⾥循环,所定义的i也是整个for循环⾥的i ,所以这个i 只在这个循环⾥有意义,在这个循环⾥printf所输出的是⼀个数组,他的含义是从当i=0开始,i=0<20成⽴,进⾏下⼀步就是输出a[0],然后进⾏i++操作,当i++之后,i=1,i<20,还是成⽴,继续输出a[1],⼀直进⾏这样的循环操作,所以printf是在整个for循环⾥⾯的,在上⼀个找最⼤公约数题中是整个for循环结束之后才输出结果,所以printf是在整个循环的外⾯,和for是并列关系.//// @@ 定义⼀个长度为20,范围在30-70的整形数组,并找到最⼤值和最⼩值以及他们的总和和坐标// int sum=0;// int a[20]={};// for (int i=0; i<20; i++) {// a[i]=arc4random()%(70-30+1)+30;// printf("%d\n",a[i]);// sum+=a[i ];// }// printf("和为%d\n",sum);// int max=0,min=70,maxIndex=0,minIndex=0;// // 找到最⼤值和它的坐标// for (int i=0; i<20; i++)// i代表的是数组每个数据的位置⽽不是数据,如i=0时代表的是当i=0时a[0]这个数据,在这个题中,数据的长度为20,所以i从0开始取,到20结束,⼀共取了20个数. 做这道题时我错把i的值当成了取值的范围就是30-70,也就是i=0开始,i<40,结果输出数据发⽣了错误,因为发⽣了溢出现象,数据的长度只有20,⽽我范围定义了40.// {// if (max// max=a[i];// maxIndex=i;// }// if (min>a[i]) {// min=a[i];// minIndex=i;// }// }// printf("最⼤值为%d 它的坐标是%d\n",max ,maxIndex);//// printf("最⼩值为%d 它的坐标是%d\n",min,minIndex);// 在这⾥我⽤了if条件来找到整个数组的最⼤值,最⼩值以及它们的坐标,因为如果⽤如// max=a[i]>max?a[i]:max;// maxIndex=i;//这种⽅法来找到最⼤值和最⼩值的话,输出的坐标是有问题的,因为坐标是在for循环⾥的,每循环⼀次i加⼀次,所以以这种⽅法输出的i是整个i的最⼤值⽽不是数据最⼤值相应的坐标.如果⾮要⽤这种办法的话必须对i再进⾏判断,这样⽐较⿇烦,所以选择if条件,因为if条件⾥的i所对应的值就是要求的值//// 练习2// 复制两个数组// 1.定义两个数组,并且长度相同// int arr[20]={},b[20]={};// 我在下⾯的程序中定义了数组的长度为20,但是刚开始a,b两个我并没有写数组的长度,所以运⾏的时候虽然出了结果但是运⾏结果还是有些问题// // 给其中的⼀个数组进⾏随机赋值,范围30-70之间// for (int i=0; i<20; i++) {// arr [i] = arc4random()%(70-30+1)+30;1`// // 给b数组进⾏赋值操作// b[i ]=arr[i];// printf("%d\n",b[i]);//// }//// 把1000种情况对应的循环写出来// int arr[28]={};// 28是指⼀千个数内如三位数的个位,⼗位,百位之和,因为个位,⼗位,百位之和不会超过28,所以定义数组的长度为28// for (int i=0; i<10; i++) // 定义百位数// {// for (int j=0; j<10; j++) // 定义⼗位数// {// for (int k=0; k<10; k++) // 定义个位数// {// a[i+j+k]++;// }// }// }// for (int i=0; i<28; i++) {// printf("%d\n",a[i]);// }// ⽣成两个数组,每个数组都有10个元素,元素取值范围20-40之间,数组对应元素相加,放到另外⼀个数组中// int a[10]={},b[10]={},sum[10]={};// for (int i=0; i<10; i++) {// a[i]=arc4random()%(40-20+1)+20;// b[i]=arc4random()%(40-20+1)+20;// sum[i]=a[i]+b[i];/ 两个数组对应元素相加就是简单的将两个数组相加就会得到第三个数组// printf("%d\n",sum[i]);// }//// 冒泡排序// int arr[6]={2,1,5,6,3,4};// for (int i=0; i<6-1; i++)// 外部循环的-1:循环执⾏到还有两个数没有排序的时候,值需要把未排序的两个数交换就可以了.执⾏次数为数组个数-1// {// // 内部循环-1:为了防⽌数组越界,在内部循环处-1// for (int j=0; j<6-1-i; j++) //j为下标,j<6-1-i,-i是为了避免不必要的⽐较// {// if (arr[j]>arr[j+1]) {// int temp=0;// temp =arr[j];// arr[j]=arr[j+1];// arr[j+1]=temp;// }// }// }// for (int i=0; i<6; i++) {// printf("%d\n",arr[i]);// }// 重新写⼀遍冒泡排序// for (int i=0; i<6-1; i++) {// for (int j=0; j<6-1-i; j++) {// if (arr[j ]>arr[j+1]) {// int temp=0;// temp=arr[j ];// arr[j ]=arr[j+1];// arr[j+1]=temp;//////// }// }// }// for (int i=0; i<6; i++) {// printf( " %d ",arr[i]);// }//// 随机产⽣⼗个数[20-40] 并且对⼗个数记性从⼤到⼩排序// 1 定义⼀个长度是10的数组// 2 产⽣随机数对数组进⾏赋值操作// 3 对已经赋值完成的数组进⾏排序// 4 打印排序结果// int arr[10]={};// 定义步骤// for (int i = 0; i < 10; i++) {// arr[i]=arc4random()%(40-20+1)+20;// 赋值步骤,不可以写在冒泡排序内// }// for (int i=0; i<10-1; i++) {//// for (int j=0; j<10-1-i; j++) {// if (arr[j]>arr[j+1]) {// int temp=0;// temp=arr[j ] ;// arr[j]=arr[j+1];// arr[j+1]=temp;// }// }// printf("%d ",arr[i]);// }////// 字符数组和字符串// int arr[6]={1,2,3,4,5,6};// 写⼀个字符数组// char str[6]={'i','P','h','o','n','e'};// for (int i=0; i<6; i++) {// printf("%c ",str[i]);// }// 下标是5得元素进⾏赋值// str[5]={'w'};//// 字符串// char str[]="iPhone";// // 字符数组// char str1[]={'i','P','h','o','n','e',};//// sizeof() 是⽤来计算他在空间⾥占多少字节// int arr[5]={1,3,2,6,4};// printf("%ld\n",sizeof(int));// 区别在于:字符串⽐字符数组在结尾的地⽅有⼀个'\0','\0'是字符串结束的标志,有'\0'的字符数组才可以称为字符串// 打印字符串//// printf("%s\n",str);// %s打印就是通过寻找字符串的结束标志'\0',碰到'\0'才会结束打印// 关于字符串的⼀些功能函数// char str[]="iPhone";// 字符串长度// printf("%ld ",strlen(str ));// strlen 是⾁眼能看见的字符个数相同// printf("%ld ",sizeof (str ));// sizeof是字符串所占的空间⼤⼩,包括'\0'// 字符串的拷贝// char newStr[10]="";// strcpy(newStr,str);// printf("%s ",newStr);// 如果⼀个东西被const所修饰,这部分在整个循环⾥就不会发⽣变化 // 字符串的拼接// char str1[20]="I have";// char str2[20]="iPhone";//// strcat(str1, str2 );// printf(" %s ", str1 );// 被拼接的字符串长度要⾜够长//字符串的⽐较// char str1[]="abc";// char str2[]="dcd";//// strcmp(str1, str2);// printf("%d\n",strcmp(str1, str2));//打印出%d为整数,其实为字母在askii码表的位置// 打印字符串中得空格数// char str[]=" jfkdlsjkl jdklsjd jdfkslaj fjdklsj uiw fdjisao ";// // ⽤来记录空格数的// int count=0;// // 遍历字符串// for (int i=0; i// if (str[i]==' ') {// count++;// }// }// printf("%d ",count);// // 将字符串倒转//// char str[]="afhnpue";// // 反向输出// for (int i=strlen(str)-1; i>=0; i--) {// printf("%c",str[i]);// }// printf("\n");//// 倒转// int len=strlen(str);// for (int i=0; i// char c=str[i];// str[i]=str[len-1-i];// 找到对应交换的位置// str[len-1-i]=c;//// }// printf("%s\n",str);// 5.编程在⼀个已知的字符串中找最长单词,假定字符串中只含字母和空格,空格⽤来分隔不同单词。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
仅执行表达式为真的else if后的内嵌语句,若所有的 表达式值都为0,则执行最后一个else后的内嵌语句.
15
例如:
已知
1
y(x)
0
1
x0 x0 x0
x的值,输出y值。
编一个程序,输入一个
程序为:
main( ) { int x, y;
30
输入: 1989 结果为: 1989 is not a leap year 输入: 2000 结果为: 2000 is a leap year
例2 运输公司对用户计算运费。距离(s)越远,每公里运 费越低。折扣为d (discount),每公里每吨货物的基本 运费为p (price),货物重w (weight),总运费f (freight) ,
的值, 为“ 0 ”时,取表达式3的值。
如: max=a>b ? a : b 若 a=3, b=2, 则 max=
说明: (1) 条件运算符优于赋值运算符。
(2) 条件运算符的结合方向为“自右向左”。
例1:当a=1,b=2,c=3, d=4 时,
表达式 a>b ? a : c>d ? c : d , 值为:? 4
scanf(“%d”,&x); if(x<0) y=-1; else if(x= = 0) y=0; else y=1; printf(“x=%d, y=%d\n”, x, y);
}
16
main( ) { int x, y; scanf(“%d”,&x); if(x>=0) if (x= = 0) y=0; else y=1; else y=-1
scanf(“%d”,&x); y=0;
if(x>=0) if (x> 0) y=1;
else y=-1; printf(“x=%d, y=%d\n”, x, y); }
19
4.3.3 条件运算符
C语言增设了一个条件操作符,它是唯一的三目操作符。
格式: 表达式1 ?表达式2:表达式3
功能: 判断表达式1的值,该值为“非0”,则取表达式2
default : printf(“error ”);
}
若gread= ‘A’时,输出结果为? 当 grad= ‘B’时,输出结果为: 70 ~ 84
26
流程图为:
grade
输出
输出
输出
输出
“85-100” “70-84” “60-69” “<60”
输出 “error”
27
(5) case和default 的次序可以交换。
else 语句2
内嵌if
else
} if( ) 语句3
else 语句4
内嵌if
或
if( )
{ if( ) 语句1} (内嵌if )
else
语句 2
注:每个else都与距其最近的 if 配对。
14
•I if 语句的常用格式: • if(表达式1) 语句 1
else if(表达式2) 语句 2 else if(表达式3) 语句 3
25
例如:根据考试成绩的等级打印出百分制分数段: 上述程序可写成多分支情况:
switch( grade )
{ case 'A' : printf(“85~100\n”) ; break; case 'B' : printf(“70~84\n”); break; case 'C': printf(“60~69\n”); break; case 'D' :printf(“<60\n”); break;
如: x>y ? 1.2 : 6 , 当x>y成立时条件表达式的值为1.2 ,否则为 实型数据6.0。 c=x>y ? 1 : ‘s’ , 当x>y成立时c=1, 否则c= ‘s’。
[例]: main( )
{ char ch;
scanf(“%c”, &ch);
ch= (ch>= ‘A’&& ch<= ’Z’)? (ch+32) : ch;
!(非)
(高)
算术运算符
关系运算符
&& 和 ||
赋值运算符 (低)
[例4]
a+b<c&&c==d ((a+b)<c)&&(c==d)
a-!d||m>n+3
(a-(!d))||(m>(n+3))
a=5>3>4 7
4.2 程序的三种基本结构及其框图表示方法 1.顺序结构
A B
先执行A操作,再执行B操作,两者是顺序执行关系。
f=p * w * s * (1- d), 设 c=s/250。
0
0.02
d
0.05 0.08
0.1
0.15
s 250 250 s 500 500 s 1000 1000 s 2000 2000 s 3000 3000 s
31
程序为:
main( )
{ int c,s;
float p, w, d , f ;
例如: x != y s - d<= f a>b+c b<d = = c c = = e>d
(s-d)<=f a>(b+c) (b<d)==c c==(e>d)
2
2. 关系表达式
关系表达式就是将两个表达式用关系运算符连接起 来。 如:(a>b)>(b<c) 、‘a’<‘b’ 、x>y 、s+f>d 关系表达式的值为逻辑值,“真”或“假”. 注意: C语言没有逻辑型数据,关系表达式的真、假 是以 数值“1”代表“真”,以“0”代表“假”。 [例1]: a=3, b=2, c=1 , 下列表达式的值是?
[例]:a&&b+c 、 (a>b)||(x>y) 、!(x<y)
a&&b
a、b均为真,则a&&b为真。
a||b
a、b之一为真,则a||b为真。
!a
若a为真,则!a为假。
优先次序:(高) ! && || (低)
4
2. 逻辑表达式 用逻辑量与逻辑运算符组成逻辑表达式。 注意: 如何判断一个逻辑量为“真、假”,我们用“非 0” 代表“真”,用“0”代表“假”。
printf(“%c”, ch) }
输入 A
a
21
4.4 switch 语句
switch语句
问题:为什么引出switch语句?
该语句为开关语句,解决多分支的情况。
格式:switch(表达式)
{ case (常量表达式1):语句块1;
case (常量表达式2):语句块2;
case (常量表达式m):语句块m;
23
a. 计算表达式的值; b. 找到与表达式的值相同的case常量表达式,执行该case后边
的语句序列,之后依次往下执行语句块。
表达式
语句序列1
语句序列2
··· ···
语句序列n
语句序列n+1
24
若每个语句序列的最后一条语句均为break语句,则执行流程为: 表达式
语句序列1 语句序列2 ······ 语句序列n 语句序列n+1
第四章 选择结构
本章要点: 正确使用逻辑表达式 掌握用if语句实现选择结构 掌握条件运算符的使用
1
4.1 关系运算符和逻辑运算符
4.1.1 关系运算符及其运算结果
1. 关系运算符及其优先次序
算术运算符 (高) 关系运算符
C语言中的关系运算符有6种:
赋值运算符 (低)
<、<=、>、>=、==、!=
优先次序:前4种同级,高于后2种(后2种同级)
else printf("%d",y);
3. if(表达式) {语句序列1} else {语句序列 2}
例: if(x>y)
{t=x;x=y;y=t;}
else
printf(“max=%d\n",x);
13
2. if语句的嵌套 在if语句中又包含一个或多个if语句的形式。
一般格式如下:
if( )
} if( ) 语句1
printf(“x=%d, y=%d\n”, x, y); }
17
main( ) { int x, y;
scanf(“%d”,&x); y=-1;
if(x!=0) if (x> 0) y=1; else y=0;
printf(“x=%d, y=%d\n”, x, y); }
18
main( ) { int x, y;
case 'y' : case 'Y': printf(“You are right.\n”); }
29
例1 写一程序,判断某一年是否闰年。 其中:leap代表闰年的信息,leap=1闰年,leap=0 非闰年 程序为:
main( ) { int year, leap;
scanf(“%d”, &year); leap=0; if((year%4= =0 && year%100!=0)||(year%400= =0)) leap=1; if(leap= =1) printf(“%d is ”, year); else printf(“%d is not ”, year); printf(“a leap year\n”); }