C语言程序设计4
《C语言程序设计》实验四

电子科技大学计算机学院标准实验报告(实验)课程名称C语言程序设计电子科技大学教务处制表电子科技大学实验报告四学生姓名:学号:指导教师:王瑞锦实验地点:实验日期:年月日一、实验室名称:软件实验室二、实验项目名称:函数的应用及预处理三、实验学时:2四、实验原理:使用Turbo C软件(简称TC),在微型计算机上,对其程序进行编辑、编译、连接与运行。
Turbo C是一个集成环境,它具有方便、直观、易用的界面和丰富的库函数。
通过上机练习掌握在TC环境下编辑、编译、连接、和运行C程序的方法和过程。
五、实验目的1.掌握C语言中定义函数的方法;2.掌握函数传值调用的方法;3.掌握函数传址调用的方法;4.掌握递归函数的设计方法;5.掌握命令行参数的使用方法;6.掌握函数在不同文件中的编译、链接方法。
六、实验内容编程实验,完成以下上机内容,调试运行程序并完成报告1)、教材第七章习题7.4;2)、编写一个实现冒泡法排序的函数,并在主函数中从键盘上输入6个数后进行排序输出;3)、教材第七章习题7.11;4)、教材第七章习题7.15;5)、教材第七章习题7.24;6)、求解汉渃塔(tower of Hanoi)问题。
在一块平板上立有3根立柱,从左到右分别标记为A,B,C。
最初在A柱上放有6个大小不等的圆盘,并且大盘在下面,小盘在上面。
要求将这些盘从A移到C(可以借助B柱)。
条件是:每次只能移动一个盘,并且不允许把大盘放在小盘的上面。
(提示:利用函数的递归调用);七、实验器材(设备、元器件):pc硬件要求:CPU PII 以上,64M 内存,1OOM 硬盘空间即可。
软件要求:DOS3.0以上/Windows98/Me/XP/NT/2000。
八、实验步骤:实验编程与运行结果⑴编写一个求两个整数的最小公倍数的函数,两个整数由键盘输入,用主函数调用这个函数,并输出结果。
程序文件名为7_4.c,源程序清单如下:#include<stdio.h>lcd(int a,int b){int temp,num1,num2;num1=a;num2=b;while(num2!=0){temp=num1%num2;num1=num2;num2=temp;}return(a*b/num1);}main(){int t,x,y;printf("Please input two integers:");scanf("%d,%d",&x,&y);if(x>y){t=x;x=y;y=t;}printf("lcd(%d,%d)=%d\n",x,y,lcd(x,y));}运行结果:⑵编写一个实现冒泡法排序的函数,并在主函数中从键盘上输入6个数后进行排序输出。
C语言程序设计第四版PPT 谭浩强

case '8' : y="B"; case '7' : y="C"; case '6' : y="D"; default : y="E"; } printf("Level:%c\n",y);
注意: 同前;case后的数据类型; 每个case后的break语句; 使用相同语句的分支合并。
printf("It's a positive number\n");
else
printf("less than zero\n");
关系运算符
< <= == !=
> >= 优先级高 优先级低
关系运算符
算术运算→关系运算→赋值运算
优
优
先
先
于
于
例:P.92 L.8
关系表达式
➢用关系运算符连接算术表达式(或 字符/关系/逻辑/赋值表达式)形成
选择结构(分支结构)流程
Y
语句组1
条件
N
语句组2
循环结构流程
条件
N
Y
语句组
第4章 选择结构
选择结构(分支结构)流程YΒιβλιοθήκη 语句组1条件N
语句组2
选择结构实例
P.66 例3.5 一元二次方程 程序存在的问题:用户输入的数据必 须保证b2-4ac≥0,否则调用sqrt函数 会出错。 改进:P.86 例4.1 是否还有不完善之处?
文件名
尽信书,则不如无书
算法在程序中的重要性
计算机程序设计基础c语言4

4.6 递归
如果一个函数在调用的过程中出现直接或者间接地调用 该函数本身,称为函数的递归调用。C语言的特点之一就是 允许使用函数的递归调用。
int fn(int a) { int x,y;
…
y=fn(x);
return (3*y);
} 在调用函数fn()的过程中,又出现再次调用fn()函数,这 就是函数的递归调用,函数fn()称为递归函数。像函数fn()这 样直接调用自身的,称为函数的直接递归调用。
在函数体中也应将变量的声明放在使用该变量之前,否则会 出现编译错误。
4.2.2 函数声明与函数原型
(一)函数声明 形式如下:
返回数据类型 函数名(形式参数类型 形式参数名); 如 float max1(float a, float b); 注意:
当被调函数的定义位于主调函数之前,可以省略函数 声明;若定义在后,则必须在主调函数之前对被调函 数进行声明。
对于有参函数,在声明时可以省略形式参数的名称, 但类型不能省略。 如 float max1(float , float);
函数声明时不要忘记语句末尾的分号“;”。
4.2.2 函数声明与函数原型
(二)函数原型 形式如下:
返回数据类型 函数名(形参类型 形参名); 返回数据类型 函数名(形参类型);
4.4 函数返回类型与返回值
2.无返回值函数 如果函数没有返回值,则定义为“空”类型,类型说明 符为“void”。无返回值函数用于完成特定的处理任务, 执行完后不向主调函数返回任何值。如
void printstar() {
printf("********"); } 如果要在主调函数中调用printstar函数,则语句为:
n!=1 n!=n×(n-1)!
C语言 第4章 选择结构程序设计

#include <stdio.h> int main() { float a,b,c,t; scanf("%f,%f,%f",&a,&b,&c); if(a>b) 如果 a>b,将a和b对换 , 和 对换 是 、 中的小者 { t=a; a=b; b=t; } a是a、b中的小者 if(a>c) { t=a; a=c; c=t; } if(b>c) { t=b; b=c; c=t; } printf("%5.2f,%5.2f,%5.2f\n",a,b,c); return 0; }
if (disc<0) 8<0为假 为假 printf(“has not real roots\n”); else 的值变为-1 的值变为 { p=-b/(2.0*a); p的值变为 的值变为0.71 的值变为 q=sqrt(disc)/(2.0*a); q的值变为 x1=p+q; x1的值变为 的值变为-0.29 的值变为 x2=p-q; x2的值变为 的值变为-1.71 的值变为 printf(“real roots:\nx1=%7.2f\n x2=%7.2f\n”,x1,x2); } return 0; }
if (disc<0) printf(“has not real roots\n”); else { p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(“real roots:\nx1=%7.2f\n x2=%7.2f\n”,x1,x2); } return 0; 复合语句 }
C语言有两种选择语句: 语言有两种选择语句: 语言有两种选择语句 (1)if语句,实现两个分支的选择结构 语句, 语句 (2)switch语句,实现多分支的选择结构 语句, 语句
《C语言程序设计》试卷4

《C语言程序设计》试卷四一、单项选择题(每小题1分,共35分)1、一个C程序的执行是从()。
A)本程序的main函数开始,到main函数结束B)本程序文件的第一个函数开始,到本程序文件的最后一个函数结束C)本程序的main函数开始,到本程序文件的最后一个函数结束D)本程序文件的第一个函数开始,到本程序main函数结束2、下面四个选项中,合法的用户标识符是()A)P_#$ B)2ha C)goto D)_ab3、要把整数67523赋与整型变量I,则应说明I的类型是()A)int B)long C)short D)unsigned4、已知int I; float f; 正确的表达式是()A) (int f)%I B) int(f)%I C) int (f%I) D) (int)f%I5、判断char型变量c1是否为小写字母的正确表达式是()A)'a'<=c1<='z'B)(c1>=a) && (c1<=z)C)98<=c1&&123>=c1 D)c1>='a'&& c1<='z'6、在C语言中,字符型数据在内存中以何种形式存放?()A)原码 B)BCD码 C)ASCII码D)补码7、执行以下语句后b的值为()。
int a = 5 , b = 6 , w = 1 , x =2 , y = 3 , z = 4 ;( a = w > x ) && ( b = y > z ) ;A)6 B)0 C)1 D)48、以下能正确地定义整型变量a,b和c并为其赋初值5的语句是()。
A)int a=b=c=5; B)int a,b,c=5; C)int a=5,b=5,c=5; D)a=b=c=5;9、已知:char a; int b; float c; double d; 执行语句c=a+b+c+d;后,变量c的数据类型是()A) int B) char C) float D) double10、已知字母A的ASCII码为65,以下程序段的输出结果是()char c1=‟A‟,c2=‟Y‟;printf(″%d,%d″,c1,c2);A)65,90 B)A,Y C)65,89 D)输出格式不合法11、阅读以下程序,当输入数据的形式为:25,13,10<CR>,正确的输出结果为()。
C语言程序设计习题集第4章 循环结构(答案)

第4章循环结构一、选择题1、有以下程序段int k=0;while(k=1)k++;while 循环执行的次数是(A)A)无限次B)有语法错,不能执行C) 一次也不执行D)执行1次2、t为int类型,进入下面的循环之前,t的值为0while(t=1){ …… }则以下叙述中正确的是(B)A) 循环控制表达式的值为0B)循环控制表达式的值为1C) 循环控制表达式不合法D)以上说法都不对3、在C程序中,与while(m)中表达式m完全等价的是(B )A) m==0 B) m!=0 C) m==1 D)m!=14、有以下程序,程序运行后的输出结果是(C).main(){int i=1,sum=0;while(i<=4){sum=sum+i;i=i+1;}printf(“%d\n”,sum);}A)4 B)5 C)10 D)死循环5、有以下程序,程序运行后的输出结果是(D ).main(){int i=1,sum=0;while(i<=4)sum=sum+i;i=i+1;printf(“%d\n”,sum);}A)4 B)5 C)10 D)死循环6、有如下程序main(){int n=9;while(n>6){n-—;printf(“%d",n);}}该程序段的输出结果是(B)A)987 B) 876 C) 8765 D) 98767、以下程序的输出结果是(B)main(){int num= 0;while(num<=2){num++;printf(“%d\n”,num);}}A) 1 B) 1 C)1 D)l2 2 23 348、有以下程序,若运行时输入3.6 2.4<回车〉,则输出的结果是( B)。
main(){float x,y,z;scanf(“%f%f”,&x,&y);z=x/y;while(1){if(fabs(z)>1。
0){x=y;y=z;z=x/y;}elsebreak;}printf(“%f\n”,y);}A)1.500000 B)1.600000 C)2。
C语言程序设计 (何钦铭 颜晖 著) 高等教育出版社第四章 课后答案
#include <stdio.h>#include <math.h>void main(){double eps,s,item,flag,denominator;s=0;item=1;flag=1;denominator=1;printf("Enter eps: ");scanf("%lf",&eps);while(fabs(item)>=eps){item=flag/denominator;s=s+item;flag=-flag;denominator=denominator+3;}printf("s=%lf\n",s);}练习4-4#include <stdio.h>void main(){int num,n;float score,total=0;num=0;n=0;printf("Please input score # 1 :");scanf("%f",&score);while(score>=0){if(score<60)num++;total=total+score;n++;printf("Please input score #%d(0~100): ",n+1);scanf("%f",&score);}printf("The average score is %.2f.\n",total/n);printf("The numbers between 0 and 59 is %d.\n",num); }#include <stdio.h>void main(){int i,j,n,num;printf("Enter n : ");scanf("%d",&n);for(i=1;i<=n;i++){printf("Please input an integer : ");scanf("%d",&num);for(j=2;j<=num-1;j++)if(i%j==0)break;if(j>num-1 && num!=1)printf("%d is a prime.\n",num);else printf("%d is not a prime.\n",num);}}练习4-8#include <stdio.h>void main(){int i,j,n;double e,product;e=1;printf("Enter n : ");scanf("%d",&n);for(i=1;i<=n;i++){product=1;for(j=1;j<=i;j++)product=product*j;e=e+1/product;}printf("e=%.2lf\n",e);}练习4-11#include <stdio.h>void main(){int i,n,min,num;printf("Enter n : ");scanf("%d",&n);for(i=1;i<=n;i++){printf("Enter an integer : ");scanf("%d",&num);if(i==1)min=num;else if(num<min)min=num;}printf("The Min number is %d.\n",min); }练习4-12#include <stdio.h>void main(){int num1,num2=0,flag=1;printf("Enter an integer : ");scanf("%d",&num1);if(num1<0){flag=-1;num1=-num1;}while(num1!=0){num2=num2*10+num1%10;num1=num1/10;}num2=flag*num2;printf("The new number is %d.\n",num2); }练习4-13#include <stdio.h>void main(){int i,j,count=0;for(i=100;i<=200;i++){for(j=2;j<=i-1;j++)if(i%j==0)break;if(j>i-1){count++;if(count%8==0)printf("%8d\n",i);else printf("%8d",i);}}printf("\n");}练习4-14#include <stdio.h>void main(){int i,f1=1,f2=1,f;printf("%8d\n",f1);printf("%8d\n",f2); /*输出前两项*/for(i=3;i<=20;i++){f=f2;f2=f1+f2;f1=f;printf("%8d\n",f2);}printf("\n");}习题4-1#include <stdio.h>void main(){int num=1,sum=0;while(num>0){printf("Enter an integer :");scanf("%d",&num);if(num<=0)break;if(num%2==0)sum=sum+num;}printf("The sum is %d.\n",sum); }习题4-2#include <stdio.h>#include <math.h>double fact(int n);void main(){int i=1;double x,item,s=0;printf("Enter x :");scanf("%lf",&x);item=x;while(fabs(item)>=0.00001){s=s+item;i++;item=pow(x,i)/fact(i);}printf("The sum is %lf.\n",s);}double fact(int n){int i;double product=1;for(i=1;i<=n;i++)product=product*i;return product;}习题4-3#include <stdio.h>void main(){int num,sum=0,count=0;printf("Enter an integer :");scanf("%d",&num);if(num<0)num=-num;while(num>0){sum=sum+num%10;num=num/10;count++;}printf("The sum is %d.\n",sum);printf("The count is %d.\n",count);}习题4-4#include <stdio.h>void main(){int i,n;double a,b,x,sum;a=2;b=1;sum=0; /*a为分子,b为分母*/ printf("Enter an integer : "); /*输入项数*/scanf("%d",&n);for(i=1;i<=n;i++) /*求前n项之和*/{sum=sum+a/b;x=a+b;b=a;a=x;}printf("The sum is %lf.\n",sum); /*输出和*/}习题4-5#include <stdio.h>void main(){int i,j,a,n;double item,sum; /*item为项变量,sum为累加和变量*/sum=0;printf("Enter two integers a and n : ");scanf("%d%d",&a,&n);for(i=1;i<=n;i++) /*求前n项之和*/{item=0;for(j=1;j<=i;j++) /*求第i项*/item=item*10+a;sum=sum+item;}printf("The sum is %lf.\n",sum); /*输出和*/}习题4-6#include <stdio.h>void main(){int i,j,k,count; /*count为换法种数,i为1分的硬币数,j为2分的硬币数,k为5分的硬币数*/count=0;for(i=1;i<=100;i++)for(j=1;j<=50;j++)for(k=1;k<=20;k++)if(i+2*j+5*k==100){printf("1分=%d, 2分=%d, 5分=%d\n",i,j,k);count++;}printf("换法种数=%d\n",count);}习题4-7#include <stdio.h>void main(){int i,m,digit,sum; /*sum为各位数字的立方和变量*/for(i=1;i<=10000;i++){/*求整数i中各位数字的立方和*/m=i;sum=0;while(m!=0){digit=m%10;sum=sum+digit*digit*digit;m=m/10;}if(i==sum)printf("%d\n",i); /*输出满足条件的整数i*/}}习题4-8#include <stdio.h>int prime(int n);void main(){int m,i;for(m=6;m<=100;m=m+2)for(i=2;i<=m-1;i++)if(prime(i) && prime(m-i)){printf("%d=%d+%d\n",m,i,m-i);break;}}int prime(int n) /*判定n是否素数的函数,返回1表示素数,返回0表示非素数*/{int i,flag;flag=1; /*初值为1*/for(i=2;i<=n-1;i++)if(n%i==0){flag=0;break;} /*置flag为0,表示非素数*/ return flag;}习题4-9#include <stdio.h>void main(){long int m,n,pow,digit; /*m为长整数变量,pow为m的幂*/printf("Enter a long integer :"); /*输入一个长整数m*/scanf("%ld",&m);/*求长整数m的幂,存放在pow变量中*/n=m;pow=1;while(n!=0){n=n/10;pow=pow*10;}pow=pow/10;/*从m的最高位开始,逐位输出各数位上的数字*/while(m!=0){digit=m/pow; /*求最高位数字*/m=m%pow;pow=pow/10; /*幂pow缩小10倍*/printf("%d ",digit);}printf("\n");}习题4-10#include <stdio.h>void main(){int i,m,n;printf("Enter an integer m :"); /*输入一个正整数m*/ scanf("%d",&m);n=m/2;printf("%d=1",m);for(i=2;i<=n;i++)while(m%i==0){printf("*%d",i);m=m/i;}printf("\n");}习题4-11#include <stdio.h>void main(void){int m, n, j, k; /* j表示最小公倍数,k表示最大公约数*/printf("Input two integer m and n : ");scanf("%d%d",&m,&n);j = m;while(j % n != 0) /* 求最小公倍数,存放在j变量中*/j = j + m;k = (m * n) / j; /* 求最大公约数,存放在k变量中*/printf("最小公倍数是%d \n最大公约数是%d\n ", j, k);}习题4-12#include <stdio.h>void main(void){int i;double h,s; /* h为高度,s为总路程*/h=100;s=100; /* 赋初值*/for(i=1;i<10;i++) /* 循环9次,求出第10次落地的总路程*/{h=0.5*h;s=s+2*h;}h=0.5*h; /* 第10次反弹的高度*/printf("第10次落地的总路程是%lf, 第10次反弹的高度是%lf\n ", s, h); }习题4-13#include <stdio.h>void main(void){int i,j;for(i=1;i<=7;i++){if(i<=4) /* 输出图形的上4行*/{for(j=1;j<=20-2*i;j++)printf(" "); /* 输出行前的空格*/for(j=1;j<=2*i-1;j++)printf("* "); /* 输出一行中的* */ }else /* 输出图形的下3行*/{for(j=1;j<=12+2*(i-4);j++)printf(" "); /* 输出行前的空格*/for(j=1;j<=2*(8-i)-1;j++)printf("* "); /* 输出一行中的* */ }printf("\n"); /* 换行*/}}习题4-14#include <stdio.h>void main(void){int x1,x2,i;x2=1; /* 赋初值:第10天的桃子数*/for(i=1;i<=9;i++) /* 循环9次,求出第1天的桃子数*/{x1=2*(x2+1);x2=x1;}printf("total=%d\n",x2); /* 输出第1天的桃子数*/}。
《C语言程序设计》教材习题答案第4章
if(++n<10) printf("%d\n",n);
else printf("%d\n",--n);
}
3、若a、b、c1、c2、x、y均是整形变量,正确的switch语句是D
switch(a-b)
{default:y=a*b;break;
case 3:
case 10:y=a-b;break;
{
day+=a[ai][i];
}
day+=d;
printf("这是该年的弟%d天\n",day);
}
7、输入一个字符,判断输入字符的种类,即区分空格、回车、数字字符、英文字母和其他字符(要求分别用if…else if和switch语句编写)。
#include<stdio.h>
void main()
{
else x=6;
else x=7;
12、有如下程序段
int a=14,b=15,x;
char c='A';
x=(a&&b)&&(c<'B');
执行该程序段后,x的值为D 1
13、有如下程序段
int score=5;
switch(score)
{
case 5:printf("very good!");
case 4:printf("Good!");
default:printf("data error!");
}
程序输出结果为D Very good! Good! Data error!
C语言程序设计第四版谭浩强程序设计和C语言
机器语言编写的1+1程序
不同的计算机有不同的机器语言
汇编语言:与机器语言对应的符号化的指令系统
汇编语言编写的1+1程序
MOV AX, 1 ADD AX, 1 汇编
10111000 00000001 00000000 00000101 00000001 00000000
执行
不同的计算机有不同的汇编语言 需要汇编(翻译)成机器语言才能执行
课程主要内容
程序设计和C语言 顺序结构程序设计 选择结构程序设计 循环结构程序设计 数组-批量数据处理 函数-模块化程序设计 指针的应用 自定义数据类型 文件的输入与输出
学习与参考资料
教材 实验指导与习题册 等级考试资料 教学课件 互联网资源
学习方法与要求
多看(例题)、多练(编程)、多交流(学习讨论) 课前预习,认真听课、积极回答问题,按质按量完
显示 Result 结束
N-S结构化流程图
完全去掉带箭头的流程线,全部算法写在一个矩形 框内。主要的流程图符号(3种基本结构):
顺序结构 A B 选择结构
真
等价于
A B
真
P
假
等价于
条件P
假
A
B
A
B
N-S结构化流程图
完全去掉带箭头的流程线,全部算法写在一个矩形 框内。主要的流程图符号(3种基本结构):
计算机中的程 序是什么?
1.口述 2.信函 3.传真
指令被逐条执行
老板 程序员
秘书
程序:为了让计算机执行某些操作或解决某 个问题而编写的一系列有序指令的集合
算法
问题:计算长方形的面积
1.接收用户输入的长方形长度和宽度两个值; 2.判断长度和宽度的值是否大于零; 3.如果大于零,将长度和宽度两个值相乘得到 面积,否则显示输入错误; 算法 4.显示面积。
C语言程序设计第4章
能够使用if语句和switch语句,进行 选择结构程序设计 会利用多分支结构解决较复杂逻辑 判断问题
目录
CONTENTS
00 案例4 百分制转换等级制 01 4.1 选择结构判定条件的构成 02 4.2单分支和双分支选择结构程序设计 03 4.3 多分支选择结构程序设计
目录
CONTENTS
04 4.4 小结 05 4.5 拓展案例
案例4 百分制转换等级制
问题描述
学生成绩管理系统中需要对老师录入的百分制转换为等 级制。百分制与等级制的对应关系如下:90-100 对应A、 80-89对应B、70-79对应C、60-69对应D、0-59对应E。
问题分析
这是一个需要根据不同条件作出相应选择的程序,根据 描述,我们可以定义float变量fScore用来存放成绩值, 从而根据题目列出下列条件表达式: fScore>=90&&fScore<=100 your grade is A fScore>=80&&fScore<=89 your grade is B fScore>=70&&fScore<=79 your grade is C fScore>=60&&fScore<=69 your grade is D fScore>=0&&fScore<=59 your grade is E
4.4 小结
(1)嵌套if-else语句和switch语句都是用来实现多分支选择结构的,它们的 应用环境不同,嵌套if-else 语句用于对多条件并列测试,从中取一的情形; switch语句用于单条件测试,从其多种结果中取一种的情形。 (2)一般情况下用switch能解决的问题,用嵌套if-else 也一样能解决,反 之用嵌套if-else 语句能解决的问题用switch也能解决,在使用时要根据具体 问题灵活运用。 (3)如果多分支选择结构中需要判断的逻辑关系只是是否相等,则最好用 switch语句。switch语句的执行效率高于嵌套if-else语句。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3)若if子句或else子句由多个语句构成,则 应该构成复合语句,如:
if(i>j) {j++;k++;} else {i++;k++;} 也可以简单写成: if(i>j) j++,k++; else i++,k++; if子句和else子句都是由逗号表达式构 成 的简单语句。
10
【 例 4.2 】输入一个整数,判断它是 奇数还是偶数。
14
表达式 1 表达式 2 表达式 3
表达式 n
语句1 语句2 语句3 语句n 语句n+1
图 4.3 嵌套的选择结构流程图
15
例:判断某一年是否为闰年
main() { int y; scanf(“%d”,&y); if(y%4==0&&y%100!=0||y%400==0) printf(“yes\n”); else printf(“no\n”); }
27
第4章 选择结构的程序设计
4.1 条件选择结构
4.2 条件分支的嵌套 4.3 开关选择结构
2
4.1 条件选择结构
4.1.1 if 语句 4.1.2 无条件选择结构
3
4.1.1 if 语句
1.if语句的简单形式 if (表达式) 语句 if语句用来判断给定的条件是否满足,根据结果 (真或假)来选择执行相应的操作。它的 执行过程是,如果表达式为真(非0),则执行其后所 跟的语句,否则不执行该语句。这里的语句可 以是一条语句,也可以是复合语句。
19
4.3 开关选择结构 switch语句
switch (表达式) { case 常量表达式1: 语句组1 case 常量表达式2: 语句组2 …… case 常量表达式n: 语句组n default : 语句组n+1}
20
在使用switch语句时,应注意:
(1)switch后面的表达式和case后面的常量表 达式可以为任何整型或字符型数据。 (2)每一个case后的常量表达式的值应当互不 相同。 (3)switch 语句组中可以不包含default分支, 如果没有default,则所有的常量表达式都不 与表达式的值匹配时,switch语句就不执行任 何操作。
16
例:分段函数
main() { int x,y; scanf(“%d”,&x); if(x<0) y=x+1; else if(x<7) y=x*5; else y=x-7; printf(“%d\n”,y);}
17
例:简单的一元二次方程求根
#include <math.h> main() { float a,b,c,x1,x2; scanf(“%f%f%f”,&a,&b,&c); x1=(-b+sqrt(b*b-4*a*c))/(2*a); x2=(-b-sqrt(b*b-4*a*c))/(2*a); printf(“%f,%f\n”,x1,x2); }
}
6
2.if-else结构
if-else型分支有时也称双选择结构,它的形式是: if(表达式) 语句1; else 语句2; 它的流程图见图 4.2 。 它的执行过程是,如果表达式的值为真(非0), 就执行语句1,否则执行语句2。这里的语句1 和语句2可以是一条语句,也可以是复合语句。
7
真(非 0)
26
3.switch语句
掌握switch语句的执行过程和使用switch语句时的注意 事项。 (1)每一个case后的常量表达式的值应当互不相同。 (2)switch 语句组中可以不包含default分支,如果没有 default,则所有的常量表达式都不与表达式的值匹配 时,switch语句就不执行任何操作。 另外,若把 default写在某些case前面,当所有的常量表达式都 不与表达式的值匹配时,switch语句就以default作 为一个入口,执行default后面的语句及连续多个 case语句,直至switch语句的结束。 (3)为了在执行某个case分支后终止switch语句的执行, 总是把break语句作为每个case分支的最后一条语句, 当执行到break语句时,使流程跳出本条switch语句。
22
【 例 4.7 】 判别某考试成绩等级是 否大于60分。
main() { char grade; printf("Input the grade: "); scanf("%c",&grade); switch(grade) { case ’A’: case ’B’: case ’C’: printf(">=60\n");break; case ’D’: printf("<60\n");break; default: printf("error\n"); } }
21
(4)default写成最后一项也不是语法上必须的, 它也可写在某个case前面(习惯上总是把 default写在最后)。若把default写在某些 case前面,当所有的常量表达式都不与表达式 的值匹配时,switch语句就以default作为一 个入口,执行default后面的语句及连续多个 case语句,直至switch语句的结束。 (5)由于case及default后都允许是语句组, 所以当安排多个语句时,也不必用花括号括起。 p66 p67 例题
24
小结
控制表达式的正确使用 (1)控制表达式并不局限于只是使用关系表达式或逻辑 表达式。任何合法的C语言表达式都可以作为控制表 达式,只要表达式的值为非零(即代表真),无论是正 数还是负数,只要不为零就代表真。 (2)对于同一个控制功能可以有多种多样的表示形式, 使得这些控制结构虽灵活但不易掌握,因此要求有较 强的逻辑判断和分析能力。 (3)由于C语言中控制功能可以是任意表达式,因此, 只有正确掌握包括关系运算符和逻辑运算符在内的各 种运算符的优先关系才能写出正确的表达式。注意, 即使关系运算符本身的优先级也不相同,例如: a==b>c相当a==(b>c),而不是(a==b)>c。
main() { int n; printf("Input a number\n"); scanf("%d",&n); if(n%2==0) printf("The number is even\n"); else printf("The number is odd\n"); }
11
4.1.2 无条件选择结构
假(0)
表达式
语句1
语句2
图 4.2 双分支选择结构流程图
8
说明:
(1)if后面的表达式可以是任意表达式。 (2)if语句中的控制表达式应该用括号括起来, 如果有else子句,则控制表达式后的语句同样 必须用分号结束,例如: if(i>j) j++; else i++; 但是分号也不能随意乱用,如果写成: if(i>j) ; j++; else i++; 使if语句后面跟了一个空语句而使语句“else i++;”变得不合法。
12
4.2 条件分支的嵌套
在一个条件分支语句中还可以包含一个或 多个条件分支语句,称为条件分支的嵌 套。 1.条件分支嵌套的一般形式 if语句嵌套的一般情况是if后和else后的 语句都可以再包含if语句。
13
2.if-else-if形式
if-else-if形式是条件分支嵌套的一种特殊 形式,它经常用于多分支处理。它的一 般形式为: if(表达式1) 语句1 else if (表达式2) 语句2 ┇ else if (表达式n) 语句n else 语句n+1
23
【 例 4.8 】在case后面嵌套switch 语句的程序。
main() { int x=1,y=0,a=0,b=0; switch(x) { case 1: switch(y) { case 0: a++; break; case 1: b++; break; } case 2: a++; b++; break; case 3: a++; b++; } printf("a=%d,b=%d\n",a,b); }
无条件分支是实现选择结构的另一种形式。 在C语言中,无条件分支语句有三种基本形式: goto语 句、break语句和continue语句。 goto 语句是无条件转向语句,其一般形式为: goto 语句标号; 语句标号用标识符表示,用来表示程序的某个位置。 goto语句的功能是使程序的执行无条件地转到标号所 在的位置。 goto语句一般来说有两个用途:一是与if语句一起构成 循环结构;另一是用于从多重循环的嵌套结构中跳出, 或从多重if嵌套结构中跳出。
18
【 例 4.5 】求解符号函数。
main() { int x,sign; printf("Please input a number\n"); scanf("%d",&x); if(x>0) sign=1; else if(x= =0) sign=0; else sign=-1; printf("The sign is %d\n",sign); } (P62 教材多一行)
4
表达式
假(0)
真(非0) 语 句
图4.1 单分支选择结构流程图
5
【 例 4.1 】 求一个整数的绝对值。