第3章选择结构程序设计_第1页
第3章选择结构程序设计_第2页
第3章选择结构程序设计_第3页
第3章选择结构程序设计_第4页
第3章选择结构程序设计_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章选择结构程序设计3.1统计输入的一行字符中各类字符的数量3.2简单菜单选择响应3.3个人所得税计算3.4综合应用——星期几的判断本章学习目标字符型数据的输入与输出逻辑运算符与逻辑表达式多路决策判断技术else-if语句及if语句的嵌套简单菜单选择响应即switch语句Break语句的作用3.1统计输入的一行字符中各类字符的数量

3.1.1字符类型3.1.2字符型数据的输入getchar()和输出putchar()函数3.1.3逻辑运算符和逻辑表达式3.1.4多路决策判断else-if语句3.1.5程序解析3.1.1字符类型1.字符常量(1)可打印字符可直接从输出设备中打印出来的字符,是用单引号括起来的一个字符。(2)不可打印字符不可打印字符指的是该字符不能直接从输出设备输出,是将反斜杠(\)后面的字符转换成另外的意义。见表3-1表3-1转义字符及其含义字符形式

含义\n换行,将当前位置移到下一行开头\t水平制表(跳到下一个tab位置)\b退格,将当前位置移到前一列\r回车,将当前位置移到本行开头\f换页,将当前位置移到下页开头\\反斜杠字符“\”\'单引号字符\''双引号字符\ddd

1到3位8进制数所代表的字符\xhh

1到2位16进制数所代表的字符字符变量用来存放字符常量,并且只能存放一个字符。字符变量的定义形式如下:

charcl,c2;2.字符变量将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII码放到存储单元中。3.字符数据在内存中的存储形式及其使用方法【例3-1】向字符变量赋以整数。intmain(){charcl,c2;

cl=97;c2=98;printf("%c%c\n",cl,c2);printf("%d%d\n",cl,c2);return0;}运行结果:

ab9798

3.1.2字符型数据的输入getchar()和输出putchar()函数1.单个字符输入函数getchar()

该函数的功能是从标准输入设备上读入一个字符,函数的值就是从输入设备上得到的字符。getchar()函数没有参数,一般调用形式为:

c=getchar();【例3-2】从输入设备读入字符后输出该字符。源程序#include<stdio.h>intmain(){charc;c=getchar();printf("%c",c);return0;}运行结果1如果输入:a↙则输出:a运行结果2如果输入:1↙则输出:1运行结果3如果输入:welcometochina↙则输出:w2.单个字符输出函数putchar()该函数的功能从标准输出设备上输出一个字符。函数putchar()的一般调用格式为:

putchar(输出参数);【例3-3】用putchar()输出字符变量和字符常量。#include<stdio.h>intmain(){charch;printf("Enteracharacter:");/*输入提示*/ch=getchar();/*变量ch接收从键盘输入的一个字符*/putchar(ch);/*输出存放在变量ch中的字符*/putchar('?');/*输出字符常量"?"*/}运行结果Enteracharacter:a↙a?【例3-4】用putchar()输出竖排字符OK!。程序分析:用putchar('\n')输出一个换行符,使输出的当前位置移到下一行的开头,实现输出竖排字符。#include<stdio.h>main(){chara,b,c;a='O';b='K';c='!';putchar(a);putchar('\n');putchar(b);putchar('\n');putchar(c);putchar('\n');}运行结果OK!3.1.3逻辑运算符和逻辑表达式

逻辑表达式就是用逻辑运算符将逻辑运算对象连接起来的式子,它的值反映了逻辑运算的结果。c语言提供了3种逻辑运算符,见表3-2。表3-2逻辑运算符目

数单

目双

目运算符!&&||名

称逻辑非逻辑与逻辑或优先级高

——〉

低3.1.3逻辑运算符和逻辑表达式

逻辑运算符的优先级与其它种类的运算符相比,其优先关系从高到低如下所示:!(逻辑非)—>算数运算—>关系运算—>&&(逻辑与)—>||(逻辑或)—>赋值运算逻辑运算符的功能见表3-3表3-3逻辑运算的真值表ab!aa&&ba||b假假真真假真假真真真假假假假假真假真真真【例3-5】写出满足下列条件的c语言表达式。ch是空格或者回车。number是奇数。year是闰年,即year能被4整除但不能被100整除,或year能被400整除。ch是英文字母解答:逻辑表达式(ch=='')||(ch=='\n')。关系表达式number%2!=0。逻辑表达式(year%4==0&&year%100!=0)||(year%400==0)。逻辑表达式(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')3.1.4多路决策判断else-if语句else-if语句是最常用的实现多路选择的方法,其一般形式为:

if(表达式1)语句1elseif(表达式2)语句2……elseif(表达式n-1)语句n-1else语句nelse-if语句执行过程

假表达式1表达式2语句1语句2语句n-1语句n真表达式n-1真假真假假……【例3-6】某百货公司为了促销,采用购物打折优惠方法:每位顾客一次购物①在500元以上者,按九五折优惠。②在1000元以上者,按九折优惠。③在1500元以上者,按八五折优惠。④在2000元以上者,按八折优惠。编写程序,计算优惠后的价格。程序分析,见图3-4,其中d用来表示折扣,m表示商品总金额。假m<500m<1000d=1真真假真假假m<1500d=0.95真d=0.90d=0.85d=0.80m<2000解题步聚:(1)定义浮点型变量:d表示折扣,m表示购物金额,amount表示优惠后的价格。(2)输入购物金额m。(3)根据流程图3-4:计算折扣d。(4)计算amount=m*d。(5)输出amount。#include<stdio.h>main(){floatm,d,amount;printf("请输入所购商品总金额:");scanf("%f",&m);if(m<500)d=1;elseif(m<1000)d=0.95;elseif(m<1500)d=0.90;elseif(m<2000)d=0.85;elsed=0.80;amount=m*d;printf("优惠价为:%6.2f\n",amount);}运行结果请输入所购商品总金额:1600↙优惠价为:1360.00【例3-7】企业发放的奖金根据利润提成。①利润(I)低于或等于10万元时,奖金可提10%;②利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;③20万到40万之间时,高于20万元的部分,可提成5%;④40万到60万之间时高于40万元的部分,可提成3%;⑤60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成;要求从键盘输入当月利润I,求应发放奖金总数?解题步聚:(1)定义变量:i表示当月利润,bonus1,bonus2,bonus4,bonus6,bonus10分别用来表示10万元、20万元、40万元、60万元、100万元的奖金,bonus表示应发放的奖金。(2)输入一个变量的值i。(3)根据当月利润i分别落入不同的提成计算段(共6种),而计算bonus。(4)最后输出bonus。#include<stdio.h>main(){longinti;intbonus1,bonus2,bonus4,bonus6,bonus10,bonus;printf("请输入当月利润:");scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.075;bonus4=bonus2+200000*0.05;bonus6=bonus4+200000*0.03;bonus10=bonus6+400000*0.015;if(i<=100000) bonus=i*0.1; elseif(i<=200000)bonus=bonus1+(i-100000)*0.075; elseif(i<=400000)bonus=bonus2+(i-200000)*0.05; elseif(i<=600000)bonus=bonus4+(i-400000)*0.03; elseif(i<=1000000)bonus=bonus6+(i-600000)*0.015; else bonus=bonus10+(i-1000000)*0.01;printf("应发放奖金:%d",bonus);}运行结果请输入当月利润:300000↙应发放奖金:225003.1.5程序解析【例3-8】输入一行字符,统计其中英文字母、数字字符和其他字符的个数。程序分析(1)定义整型变量:digit、letter和other,其中,digit表示数字字符个数,letter表示英文字符个数,other表示其他字符的个数;定义字符型变量ch。(2)然后把键盘输入字符存储到变量ch中。(3)判断键盘输入的字符ch是否是换行,如果是换行,则ch是'\n',输出digit,letter,other的值。(4)否则根据ch的值,分别判断(共3种,数字,字母,其他),进行累加。(5)重复(2)、(3)、(4),直到键盘输入换行符为止。#include<stdio.h>intmain(){

intdigit=0,letter=0,other=0; charch;

printf("请输入一行字符:");

aa:ch=getchar(); if(ch=='\n') {printf("digit=%d,letter=%d,other=%d",digit,letter,other); return0; } elseif((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))letter++; elseif(ch>='0'&&ch<='9')digit++;elseother++;

goto

aa;}运行结果请输入一行字符:please1314!↙letter=6,digit=4,other=23.2简单菜单选择响应3.2.1switch语句

switch语句处理多分支选择问题,有3种情况

1.在switch语句的每个语句段中都使用break语句switch(表达式){case常量表达式1:语句段1;break;case常量表达式2:语句段2;break;....…case常量表达式n:语句段n;break;default:语句段n+1;break;}

例如:输入:6.1-2.6输出:3.5程序分析(1)定义字符变量operator:表示运算符,双精度变量value1,value2用来表示操作数。(2)输入变量的值value1,operator,value2。(3)用switch()语句根据变量operator进行五分支判断(+、-、*、/和其他),并计算相应的表达式,输出结果。【例3-9】输入一个形式如“操作数运算符操作数”的四则运算表达式,输出运算结果。#include<stdio.h>int

main(void){charoperator;doublevalue1,value2;

printf("请输入一个表达式:");

scanf("%lf%c%lf",&value1,&operator,&value2);

switch(operator){case'+':

printf("=%.2f\n",value1+value2);break;case'-':

printf("=%.2f\n",value1-value2);break;case'*':

printf("=%.2f\n",value1*value2);break;case'/':

printf("=%.2f\n",value1/value2);break;default:

printf("Unknownoperator\n");break;}return0;}运行结果1Typeinanexpression:6.1-2.6↙=3.5运行结果2Typeinanexpression:6.1%2.6↙Unknownoperator2.在switch中不使用break语句break语句在switch语句中是可选的,不使用break的switch语句是:switch(表达式){case常量表达式1:语句段1;case常量表达式2:语句段2;……case常量表达式n:语句段n;default:语句段n+1;}【例3-10】分析执行下面的程序,输出结果是什么。#include<stdio.h>voidmain()

{

intm=20;

switch(m)

{

case19:m+=1;

case20:m+=1;

case21:m+=1;

case22:m+=1;

}

printf("%d\n",m);

}运行结果233.在switch的某些语句段中使用break

【例3-11】输入一行字符,统计其中空格、数字字符和其他字符的个数。解题步骤:(1)定义整型变量:space、digit和other,其中,space表示空格个数,digit表示数字字符个数,other表示其他字符的个数;定义字符型变量ch。(2)然后把键盘输入字符存储到变量ch中。(3)判断键盘输入的字符ch是否是换行,如果是换行,则ch是'\n',输出space,digit,other的值。(4)否则根据ch的值,分别判断(共3种,数字,字母,其他),进行累加。(5)重复(2)、(3)、(4),直到键盘输入换行符为止。#include<stdio.h>intmain(){intblank=0,digit=0,other=0;charch;blank=0;printf("请输入一行字符:");aa:ch=getchar();switch(ch){case'':{blank++;gotoaa;

}case'0':case'1':case'2':case'3':case'4':

case'5':case'6':case'7':case'8':case'9':{digit++;

goto

aa;}case'\n':break;default:{other++;

goto

aa;}}

printf("blank=%d,digit=%d,other=%d\n",blank,digit,other);return0;}【例3-12】简单菜单选择响应,根据菜单选择要启动的操作系统,选择1:启动windows;选择2:启动linux;选择3:启动unix;选择4:启动solaris。程序分析(1)定义字符变量ch。(2)用printf()函数输出菜单。(3)键盘输入单个字符赋给变量ch。(4)用switch()语句根据用户输入编号ch进行五分支操作,当用户输入编号1~4,启动相应的操作系统;输入其他值,显示警告信息。3.2.2程序解析#include<stdio.h>Intmain(){ charinputchar; inputchar='\0';

printf("\n");

printf("PLEASESELECTSTARTOS\n");

printf("1WINDOWSos\n");printf("2LINUXos\n"); printf("3UNIXos\n"); printf("4SOLARISos\n"); ch=getchar();

switch(ch) { case'1':

printf("WINDOWSstarting\n"); break; case'2':

printf("LINUXstarting\n"); break;

case'3':

printf("UNIXstarting\n"); break; case'4':

printf("SOLARISstarting\n"); break; default:

printf("WARNING........\n");

printf("SYSTEMERROR,POWEROFF.\n"); }}运行结果1PLEASESELECTSTARTOS;1WINDOWSos2LINUXos3UNIXos4SOLARISos1↙WINDOWSstarting运行结果2PLEASESELECTSTARTOS;1WINDOWSos2LINUXos3UNIXos4SOLARISos5↙WARNING........SYSTEMERROR,POWEROFF.3.3个人所得税计算3.3.1多分支结构与嵌套的if语句它的一般形式如下:if(表达式1)if(表达式2)语句1else语句2elseif(表达式3)语句3else语句4【例3-13】显示学生成绩与等级,要求如下:①90分以上者,等级为A;②80分以上者,等级为B;③60分以上者,等级为C;④其它等级为D;解题步骤:(1)定义int变量x:表示学生成绩。(2)输入变量x。(3)用嵌套的if语句进行判断,输出学生成绩等级。main(){intx;

printf("pleaseinputx(0<=x<=100):");

scanf("%d",&x);

if(x>100||x<0)

printf("x=%ddataerror!\n",x);else{if(x>=90)

printf("x=%disgradeA!\n",x);elseif(x>=80)printf("x=%disgradeB!\n",x);

elseif(x>=60)printf("x=%disgradeC!\n",x);elseprintf("x=%disgradeD!\n",x);}}运行结果1pleaseinputx(0<=x<=100):86↙x=86isgradeB!运行结果2pleaseinputx(0<=x<=100):110↙x=110isdataerror!【例3-14】一元二次方程求解程序分析(1)定义float变量:a,b,c:表示一元二次方程系数,d表示判别式,a2=2*a,x1,x2表示根。(2)输入变量a,b,c。(3)用嵌套的if语句进行判断:若a=0,解一元一次方程;否则,解一元二次方程;若d>0,输出实根,否则输出复根。

if(d>=0){x2=sqrt(d)/a2;

printf("realroot:\n");/*输出实根*/printf("root1=%.2f,root2=%.2f\n",x1+x2,x1-x2);}else{x2=sqrt(-d)/a2;

printf("complexroot:\n");/*输出复根*/printf("root1=%.2f+%.2fi\n",x1,x2);printf("root2=%.2f-%.2fi\n",x1,x2);}}}运行结果1Inputa,b,c

0,2,4↙root=-2运行结果2Inputa,b,c

2,3,4↙root=-2complexroot:root1=-0.75+1.20iroot2=-0.75+1.20i3.3.2程序解析【例3-15】设计个人所得税计算程序。“税法”规定,工资、薪金所得,使用超额累进税率,以每月收入额减去2000元后的余额,为应纳税所得额。其税率见表3.4。(程序见书上)表3.4税率表级数全月应纳税所得额税率(%)级数全月应纳税所得额税率(5%)1不超过500元5640000

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论