C++基础算法系列(分支结构二)

课程介绍

Switch语句介绍+讲解

  • 当出现分支比较多的时候,虽然可以用嵌套if语句来解决,但是程序结构会显得凌乱。
    C++提供了一种switch开关语句

Switch语句运行过程

  1. 表达式只被计算一次,结果为整数类型。若表达式结果不是整型,系统会强制转换为整型
  2. 表达式的值将和每一个case后面的常量表达式比较。如果常量表达式的值不是整型,系统也会强制转换为整型
  3. 如果相等,当前case下的语句块将被执行。
  4. break可以省略,但实际使用switch语句时,通常要求当执行完某个case后,就结束

Switch注意事项:

  1. 每个case语句后的常量表达式的值不能相同,否则报错.
  2. 每个case或者default后,可以包含多条语句,不需要使用{}.
  3. case顺序可以变动,不会影响执行结果.
  4. default可以省略,default后面的语句末尾可以不写break.

Switch代码演示
 

switch (表达式)
{
case 常量表达式1
     语句块1
     break;
case 常量表达式2
     语句块2
     break;


.......
case 常量表达式 n;
     语句块 n;
     break;
default
     语句块 n+1
   }

 

Switch代码练习:

实例一

请听题:根据从键盘上输入的表示星期几的数字,对应输出它的英文名称:

1 – Monday
2 – Tuesday
3 – Wednesday
4 – Thursday
5 – Friday
6 – Saturaday
7 – Sunday

#include <bits/stdc++.h>
using namespace std;
int day;
cin >> day;
int main(){
    switch(day) {
        case 1:cout<<"Monday";break;
        case 2:cout<<"Tuesday";break;
        case 3:cout<<"Wednesday";break;
        case 4:cout<<"Thursday";break;
        case 5:cout<<"Friday";break;
        case 6:cout<<"Saturday";break;
        case 7:cout<<"Sunday";break;
        default:cout<<"输错了";
    }
    return 0;
}

实例二

一个最简单的计算器支持+、-、*、/四种运算。输入只有一行,两个参加运算的数和一个(+、-、*、/)。输出运算表达式的结果。考虑下面两种情况。

(1)如果出现除数为0的情况,则输出:Divided by zero!
(2)如果出现无效的操作符(即不为+、-、*、/ 之一),则输出:Invalid operator!

3    2    1 答案出示

#include<iostream>
using namespace std;
int main(){
    int a,b;
    char c;
    cin>>a>>b>>c;
    switch (c)
{
        case '+':cout<<a+b<<endl;break;
        case '-':cout<<a-b<<endl;break;
        case '*':cout<<a*b<<endl;break;
        case '/':
        if(b == 0){cout<<"Divided by zero!\n";}
        else{cout<<a/b<<endl;break;}
        default:cout<<"Invalid operator!"<<endl;break;
}
return 0;
}

 实例三

 期末来临了,班长小Q决定将剩余班费x元,用于购买若干枝钢笔奖励给一些学习好、表现好的同学。已知商店里有三种钢笔,它们的单价分别为6元、5元和4元。小Q想买尽可能多的笔去鼓励尽可能多的同学。同时他又不想有剩余钱。请你编一程序,帮小Q制订出一种买笔的方案

【输入样例】:90
【输出样例】:1 0 21

#include <bits/stdc++.h>
using namespace std;
int main(){
    int a,b,c,money, change;
    scanf("%d", &money);
    c = money/4;
    change = money%4;
    switch (change)
{
    case 0: a=0;b=0;break;
    case 1: a=0;b=1;c--;break;
    case 2: a=1;b=0;c--;break;
    case 3: a=1;b=1;c-=2;break;
}
                 printf("%d %d %d\n", a,b,c);
    return 0;
}

实例四

1949年10月1日是星期六,现在输入一个年、月、日,问这一天是星期几?输入三个整数,分别代表年(1950-2023),月(1-12),日(1-当月最大天数)例:2022 11 17 ===》星期四

实例四解释:

我们要求输入的日期是星期几,只需要求我们输入的
日期和1949年10月1日相差多少天。
如果相差0天,则“星期六”
如果相差1天,则“星期日”
如果相差2天,则“星期一”
如果相差3天,则“星期二”
如果相差4天,则“星期三”
如果相差5天,则“星期四”
如果相差6天,则“星期五”

代码出示

#include<iostream>
using namespace std;
int main(){
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    int leapyear1 = 1948/4-1948/100+1948/400;
    int sum1 = 1948*365+leapyear1+31*5+28+30*3+1;
    int leapyear2 = (a-1)/4-(a-1)/100+(a-1)/400;
    int isLeap = 0;
    int sum2 = (a-1)*365+leapyear2+c;
    int gap;
    if ((a%4==0 && a%100!=0) || a%400==0){isLeap = 1;}
    switch (b)
{
    case 1:gap = sum2-sum1;break;
    case 2:gap = sum2-sum1+31;break;
    case 3:gap = sum2-sum1+59+isLeap;break;
    case 4:gap = sum2-sum1+90+isLeap;break;
    case 5:gap = sum2-sum1+120+isLeap;break;
    case 6:gap = sum2-sum1+151+isLeap;break;
    case 7:gap = sum2-sum1+181+isLeap;break;
    case 8:gap = sum2-sum1+212+isLeap;break;
    case 9:gap = sum2-sum1+243+isLeap;break;
    case 10:gap = sum2-sum1+273+isLeap;break;
    case 11:gap = sum2-sum1+304+isLeap;break;
    case 12:gap = sum2-sum1+334+isLeap;break;
     default:
     break;
}
int diff = gap%7;
switch (diff)
{
case 0:printf("星期六");break;
case 1:printf("星期日");break;
case 2:printf("星期一");break;
case 3:printf("星期二");break;
case 4:printf("星期三");break;
case 5:printf("星期四");break;
case 6:printf("星期五");break;
}
return 0;
}

break有无情况

break无情况代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    cout <<"请输入A-C之间的路口名";
    char roadName;
    cin>>roadName;
    switch(roadName){  //表达式
        case 'A’:      //当表达式与case相匹配时,程序从该分支开始执行
           cout <<"A路口";
        case 'B’:
           cout <<"B路口";
        case 'C’:
           cout <<"C路口";
        default:
           cout <<"没有你要走的路口";  //当表达式的值与case值都不匹配时,程序进入default分支行
  }
  return 0;
}

break有情况代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    cout <<"请输入A-C之间的路口名";
    char roadName;
    cin>>roadName;
    switch(roadName){
        case 'A’:
           cout <<"A路口";break;
        case 'B’:
           cout <<"B路口";break;
        case 'C’:
           cout <<"C路口"; break;
        default:
            cout <<"没有你要走的路口";
   }
    return 0;
}

取地址运算符

介绍:

取地址运算符
当一个变量被定义并且被赋予值的时候,4个基本属性就必须存在了:
1. 变量名
2. 变量类型
3. 变量的值
4. 变量的存储地址

例如:

int a = 20;

 

引用 [初级]

  • 引用(reference)变量是一个别名。它是某个已经存在的变量的另外一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称(别名)或者变量名称(原名)来指向变量。引用类似于人的绰号,使用绰号和本名都能表示一个人。

  •  因为引用和原变量都指向同一个地址中的数据,所以无论通过引用还是原变量都可以去修这个数据。
#include<iostream>
using namespace std;
int main(){
    int a = 20;
    int& b = a;
    b = 30;
    cout<<a<<endl;// 输出结果30
    cout<<b<<endl;// 输出结果30
return 0;
}

课堂总结

  • switch语句:也是一种分枝结构,用来解决多分枝问题,让程序看起来有条理(容易debug)
  • 取地址运算符:地址运算符/求地址运算符/取地址符等,用来获取变量存储的地址。
  • 引用:为变量起一个别名。
  • 48
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值