一、程序设计
程序设计的三种基本结构:顺序、选择、循环
选择结构(也叫分支结构) :判断所指定的条件是否满足,决定从给定的两组或多组操作选择其中的一种。
计算机的判断是通过对表达式的计算来实现,也就是关系运算、逻辑运算。
用语句来体现就是if语句和switch语句。
一、单分支if语句:
if (判断条件){
代码块
}
单分支if语句是指如果满足某种条件,就进行相应的处理。
语法格式:
if (表达式) {语句组; }
重要提示:
●“语句组”是一条独立的语句, “}”可以省略;
●“ 语句组”为多条语句的复合语句,“}” 不能省略。
步骤:
(1) 首先计算if后面一对圆括号中的表达式的值,即判断表达式是否成立;
(2)如果表达式的值为“非零”(真) ,则执行语句组,然后再去执行if语句后的下一- 条语句;
(3) 如果表达式的值为“零”(假),则跳过语句组,直接执行if语句后的下一条语句
例题:
题目一:成绩输出
从键盘输入学生成绩并输出,如果成绩大于等于60,则输出"恭喜你及格了!”,请编程实现。
#include<stdio.h>
int main()
{
float cj;
printf("请输入您的成绩:");
scanf("%f",&cj);
printf("%5.2f",cj);
if(cj>=60)
{
printf("恭喜你及格了!");
}
}
题目二:三个数字比较大小
输入3个实数,按从大到小的顺序输出。
#include<stdio.h>
int main()
{
float a,b,c,t;
printf("请输入数字a、b、c:");
scanf("%f%f%f",&a,&b,&c);
if(a<b){t=a;a=b;b=t;}
if(a<c){t=a;a=c;c=t;}
if(b<c){t=b;b=c;c=t;}
printf("%5.3f,%5.3f,%5.3f",a,b,c);
}
1、if后 面圆括号中的表达式,可以是任意合法的C语言表达式,也可以是任意类型的数据。
例: if(3) printf("OK"); 是合法的
2、If语句的表达式后不能加分号
例: if(a>b); //相当于if(a>b)空语句;
3、表达式之后只能是一条语句,如果包含多个(两个以上)语句,则必须使用复合语句,即用花括号把一组语句括起来,因为复合语句在语法上视为“一条语句"。
4、一个复合语句在语法 上视为一条语句,在一对花括号内的语句数量不限 。复合语句的花括号后面不需要再加分号。
if...else语句:
if(判断条件){
(代码块)
}else{
代码块
}
(1)语法格式
if (表达式)
{语句组1; }
else
{语句组2; }
1)计算表达式的值;
2)如果表达式的值为非0,则执行语句组1,跳过语句组2;
3)如果表达式的值为0,则跳过语句组1,执行语句组2;
4)继续执行if语句之后的下一条语句。
(2)语法说明
else不是一条独立的语句, 它只是if语句的一
部分,因此,else必须与if配对使用。
不允许单独出现这样的语句:
else printf('
11***"
例题:
题目一:成绩及格
从键盘输入学生成绩并输出,如果成绩大于等于60,则输出“恭喜你及格了!‘否则输出“请继续努力! "请编程实现。
#include<stdio.h>
int main()
{
float a;
printf("请输入成绩:");
scanf("%f",&a);
if(a>=60.00){
printf("恭喜你及格了!");
}
else{
printf("请继续努力!");
}
}
题目二:判断等腰三角形
一个三角形的三边分别用a,b, c表示,输入三个边长a、b、c,判断该三角形是否为等腰三角形。
#include<stdio.h>
int main()
{
float a,b,c;
printf("请输入三角形的三个边:");
scanf("%f%f%f",&a,&b,&c);
printf("%5.2f,%5.2f,%5.2f\n",a,b,c); //因为是if...else...的学习就默认它是三角形了哈
if(a==b||a==c||b==c){
printf("这是等腰三角形");
}else{
printf("这不是等腰三角形");
}
}
if...else if...else
if(判断条件1){
执行语句1
}else if(判断条件2){
执行语句2
}
...
else if{(判断条件n){
执行语句n
}else{
执行语句n+1
}
例题:
题目一:成绩划分
在大学的考查课的成绩评定中,经常把学生的成绩分成优秀、良好、中等、合格和不合格5个等级。其中:
小于60分的为不合格;
60-70之间的为合格;
70-80之间的为中等;
80-90分之间的良好;
90分以上的为优秀。
编写一个程序,要求输入一个学生的考试成绩,输出其分数对应的等级。
方法一:
#include<stdio.h>
int main()
{
float a;
printf("请输入成绩:");
scanf("%f",&a);
printf("%5.2f\n",a);
if(a>100||a<0){
printf("输入成绩有误!");
}else if(a>=90){
printf("优秀!");
}else if(a>=80&&a<90){
printf("良好");
}else if(a>=70&&a<80){
printf("中等");
}else if(a>=60&&a<70){
printf("及格");
}else{
printf("不及格");
}
}
方法二:
#include<stdio.h>
int main()
{
float a;
printf("请输入成绩:");
scanf("%f",&a);
printf("%5.2f\n",a);
if(a>100||a<0){
printf("输入成绩有误!");
}else if(a<60){
printf("不及格");
}else if(a<70){
printf("及格");
}else if(a<80){
printf("中等");
}else if(a<90){
printf("良好");
}else{
printf("优秀");
}
}
题目二:三角形判断
输入三个边长a、b、c,如果这三个边能构成三角形,判断该三角形是等边三角形、等腰三角形,还是其它三角形。
方法一:
#include<stdio.h>
int main()
{
float a,b,c;
printf("请输入三角形的三个边:");
scanf("%f%f%f",&a,&b,&c);
printf("%f,%f,%f\n",a,b,c);
if(a+b<=c&&a+c<=b&&b+c<=a){
printf("这不是一个三角形");
}else if(a==b&&b==c){
printf("这是一个等边三角形");
}else if(a==b||a==c||b==c){
printf("这是一个等腰三角形");
}else {
printf("这是一个其他三角形");
}
return 0;
}
方法二:
#include<stdio.h>
int main()
{
float a,b,c;
printf("请输入三角形的三个边:");
scanf("%f%f%f",&a,&b,&c);
printf("%f,%f,%f\n",a,b,c);
if(a+b>c&&a+c>b&&b+c>a){
if(a==b&&b==c){
printf("这是一个等边三角形");
}else if(a==b||a==c||b==c){
printf("这是一个等腰三角形");
}else {
printf("这是一个其他三角形");
}
}else printf("这不是一个三角形");
return 0;
}
题目三:判断字母
以下程序用于判断输入的字符是否为字母,补充完整,然后将程序改写成仅一对if-else的形式。
方法一:
#include<stdio.h>
int main()
{
char ch;
printf("请输入:");
ch=getchar();
if(ch>='A'&&ch<='Z'){
printf("ch是字母%c\n",ch);
}else if(ch>='a'&&ch<='z'){
printf("ch是字母%c\n",ch);
}else printf("ch不是字母\n");
return 0;
}
方法二:
#include<stdio.h>
int main()
{
char ch;
printf("请输入:");
ch=getchar();
if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z'){
printf("ch是字母%c\n",ch);
}else printf("ch不是字母\n");
return 0;
}
条件运算符:
基础:
这是C语言提供的唯一的三目运算符。需要三个运算对象
语法格式:
表达式1?表达式2:表达式3
?和:都为英文状态
一般为关系表达式或逻辑表达式,可以是其他任意表达式
执行流程:
先计算表达式1的值
若表达式1的值为真(非零),则计算表达式2的值,并将表达式2的值作为整个表达式的值;
若表达式1的值为假(零),则计算表达式3的值,并将表达式3的值作为整个表达式的值。
优先级:
! >算术运算符>关系运算符>&&>I>条件运算符>赋值运算符>逗号运算符
结合方向:
自右向左
应用:
简单的if-else语句,可以用条件运算符来替代
if(a>b) max= a;
else max= b;
替换:
max=(a>b)?a:b;
举例:
题目一:
方法一:
#include<stdio.h>
int main()
{
float x,y;
printf("请输入x:");
scanf("%f",&x);
if(x>3){
y=x*x+2;
printf("%f\n",y);
}else if(x<=3){ //可以把 if(x<=3)删掉,不影响程序运行
y=3*x+7*x*x;
printf("%f\n",y);
}
return 0;
}
方法二:
#include<stdio.h>
int main()
{
float x,y;
printf("请输入x:");
scanf("%f",&x);
y=x>3?x*x+2:3*x+7*x*x;
printf("%f\n",y);
return 0;
}
switch语句:
基础:
- switch
条件语句也是一种常用的选择语句,和if条件 语句不同,它只能针对某个表达式的值作出判断,根据这一个表达式的不同值决定程序执行哪一段代码。
Switch...case语句:
Switch(表达式){
case 目标值1:
执行语句1;
echo“ ”
break;
case 目标值2:
执行语句2;
break;
......
case 目标值n:
执行语句n;
break;
default:
执行语句n+1;
echo“输入的目标值不正确...”
break
}
举例:
题目一:对应星期几
输入1~7中的一个数字,输出对应的“星期几”
#include<stdio.h>
int main()
{
int day;
printf("请输入星期数字编号(1~7):\n");
scanf("%d",&day);
switch(day)
{
case 1:printf("星期一\n");break;
case 2:printf("星期二\n");break;
case 3:printf("星期三\n");break;
case 4:printf("星期四\n");break;
case 5:printf("星期五\n");break;
case 6:printf("星期六\n");break;
case 7:printf("星期七\n");break;
default:
printf("输入有误");
}
return 0;
}
题目二:成绩等级划分
使用switch语句实现学生成绩的等级划分功能。
90≤s≤100:等级为优秀;
80≤s<90:等级为良好;
70≤s< 80:等级为中等;
60≤s< 70:等级为合格;
0≤s<60:等级为不合格。
[小提示在程序设计过程中,需要适时选择多分支if语句和switch语句。
(1) switch语句 只能判断“相等”的逻辑关系,即switch后表达式的值是否和case常量值相等;
(2) switch后的表达 式不能描述某范围的数据,表达式的值是一个确定的整型或字符型数据
#include<stdio.h>
int main()
{
int score;
printf("请输入成绩:");
scanf("%d",&score);
if(score>=0&&score<100){
switch(score/10){
case 6:printf("合格");break;
case 7:printf("中等");break;
case 8:printf("良好");break;
case 9:printf("优秀");break; //printf("优秀");break;可以省略
case 10:printf("优秀");break;
default:printf("不合格");
}
}else printf("成绩输入有误!");
}
改进版
#include<stdio.h>
int main()
{
double score; //改进1
printf("请输入成绩:");
scanf("%lf",&score); //改进二
if(score>=0&&score<100){
switch((int)score/10){ //改进三
case 6:printf("合格");break;
case 7:printf("中等");break;
case 8:printf("良好");break;
case 9:printf("优秀");break; //printf("优秀");break;可以省略
case 10:printf("优秀");break;
default:printf("不合格");
}
}else printf("成绩输入有误!");
}
注意事项:
break语句不是必需的, 可以没有。
---不加break语句,匹配到目标值后,后面的执行语句都会输出,直到遇到break语句,或者一直 执行到最后。
case语句、default语句的位置问题:
---当break语句每一个case语句都存在的时候,case语句、 default语句的位置不影响结果。
---当break语句不是每一个case语句都有的时候,case语句、 default语句的位置影响结果。
if语句和switch语句之间优劣:
5. if语句和switch语句异同
if语句:
优点: if语句则可以对浮点数进行判断,还可以进行大小范围,上的判断
缺点:执行效率低,多层嵌套程序冗长,需要比较多次才能找到正确分支。
switch语句: .
缺点: switch只 能进行整数和字符型数据的判断;只能进行相等与否的判断;
优点: switch结构清晰, 可读性好,只需比较一次就能找到正确分支
因此if语句可以完全替代switch语句; switch语句不能完全 替代if语句。
感觉if语句就是将事情分成了几种状况,比如说感冒可以分为风热感冒风寒感冒,switch就是说确定风热感冒的莲花清瘟还是999感冒灵。if是对事情本身分析多种状况,switch是对事情的结果分析多种状况。
选择结构的综合应用
题目一:存款本息合计
根据定期存款的期限和相应的利率,计算本息合计。
#include<stdio.h>
int main()
{
//第一步:输入存款金额x和存款期限day;
//第二步:根据存款期限day确定存款利率;
//第三步:根据存款金额x和利率计算本息合计金额y。
//本息和=本拿+本金*年利率*年数
int day;
float x,y; //x为存款的金额,y为存款日期到达后本息合计,day为存款的时间
printf("请输入存款的金额:");
scanf("%f",&x);
printf("请输入存款时间:");
scanf("%d",&day);
if(day==3||day==6||day==12||day==24||day==36||day==60){
switch(day){
case 3:{y=x+x*0.026*3/12;printf("%f",y);
break;
}case 6:{y=x+x*0.028*6/12;printf("%f",y);
break;
}case 12:{y=x+x*0.033*12/12;printf("%f",y);
break;
}case 24:{y=x+x*0.0375*24/12;printf("%f",y);
break;
}case 36:{y=x+x*0.0425*36/12;printf("%f",y);
break;
}case 60:{y=x+x*0.0475*60/12;printf("%f",y);
break;
}
}
}else printf("日期输入有误!");
}
题目二:ATM操作流程
某银行ATM机操作界面如图,当密码输入正确后进入服务项目选择界面,然后根据需要选择相应选项。请编程模拟该操作过程。
#include<stdio.h>
int main()
{
int pwd,n; //pwd代表密码。n代表项目,假设密码是123456
printf("请输入密码:<按回车键结束>:");
scanf("%d",&pwd);
if(pwd==123456){
printf("请选择服务项目\n***1***改密\n***2***转账\n***3***电子现金\n***4***取卡\n");
printf("您要进行的选项是:");
scanf("%d",&n);
switch(n){
case 1:printf("正在进入'改密'项目,请稍后......");break;
case 2:printf("正在进入'转账'项目,请稍后......");break;
case 3:printf("正在进入'电子现金'项目,请稍后......");break;
case 4:printf("正在进入'取卡'项目,请稍后......");break;
}
}else printf("密码输入有误!");
}