1、if结构
#include <stdio.h>
int main()
{
/*
* if选择结构格式
* 第一种格式:
* if(条件表达式){
* 条件成立执行的语句
* }
* 其它语句
*
* 第二种格式:
* if(条件表达式){
* 条件成立执行的语句
* }else{
* 条件不成立执行的语句
* }
* 执行流程:
* 1.判断添加是否成立
* 2.如果条件成立, 执行if后面{}中的内容, else后面{}中的内容不会被执行
* 3.如果条件不成立, 执行else后面{}中的内容, if后面{}中的内容不会被执行
* 两个{}只有一个会被执行
*
* 第三种格式:
* if(条件表达式1){
* 条件满足执行的语句
* }else if(条件表达式2){
* 条件满足执行的语句
* }else if(条件表达式3){
* 条件满足执行的语句
* }else{
* 条件不成立执行的语句
* }
* 执行流程:
* 1.先判断if后面的条件表达式是否成立, 如果成立执行if后面{}中的内容, 其它{}中的内容不会被执行
* 2.如果if后面的条件表达式不成立, 会继续判断else if后面的条件表达式是否成立, 如果成立就执行else if后面{}中的内容
* 3.如果else if后面的条件表达式不成立, 会依次判断其它else if的条件表达式是否成立, 如果哪个成立就执行哪个后面{}中的内容
* 4.如果前面所有的条件表达式都不成立, 那么就会执行else后面{}中的内容
* 从上至下依次判断条件表达式, 哪个条件表达式成立, 就执行哪个条件表达式后面{}中的内容
* 如果所有条件表达式都不成立, 就执行else后面大括号中的内容
* 众多大括号只有一个会被执行
*/
// int age = 17;
// if(age >= 18){
// printf("开网卡\n");
// }
// printf("买饮料\n");
/*
int age = 19;
if(age >= 18){
printf("开网卡\n");
}else{
printf("回家叫家长来\n");
}
printf("买饮料\n");
*/
int age = 4;
if(age >= 18){
printf("上大学\n");
}else if(age >= 12){
printf("上中学\n");
}else if(age >= 6){
printf("上小学\n");
}else if(age >= 3){
printf("上幼儿园\n");
}else{
printf("undefined\n");
}
return 0;
}
#include <stdio.h>
int main()
{
// 1.if不用写分号
// 分号也是一条语句, 分号是一条空语句
// int age = 17;
// if(age >= 18);{
// printf("开网卡\n");
// }
// 2.if可以省略大括号
// 如果if省略大括号, 那么只有紧随其后的那条语句受到控制
// int age = 17;
// if(age >= 18)
// printf("开网卡\n");
// printf("买饮料\n");
// 3.{}可以单独出现, {}出现的时候代表是一个代码块
// {
// int age = 88;
//// printf("age = %i\n", age);
// }
// printf("age = %i\n", age);
// 4.如果if省略了大括号, 那么不能再后面直接定义变量
// 我们称之为作用域混乱
// 从表面上, num的作用域是从定义的那一行开始, 直到遇到}结束或者return为止
// 但是从实际上而言, num只有if的条件满足才会执行, 所以两者冲突
// int age = 18;
// if(age >= 18)
// int num = 666;
// printf("开网卡\n");
// 5.除了if以外elseif还有else也可以省略大括号
// 省略大括号之后的特点和if省略之后一样
// 只有紧随其后的语句受到控制
// 也不可以直接定义变量
// int age = 41;
// if(age >= 40)
// printf("40\n");
// else if(age >= 30)
// printf("30\n");
// else
// printf("other\n");
// printf("40 2222\n");
// 6.任何数值都有真假性
// if(0){
// printf("abc");
// }
/*
int age = 3;
// if(age = 18){
// printf("被执行了\n");
// }
if(18 == age){ // 在企业开发中如果要判断是否相等, 建议把常量写在前面, 把变量写在后面
printf("被执行了\n");
}
*/
/*
double num = 3.14;
// 在企业开发中一定不要使用==来判断两个小数是否相等
// 因为小数可能出现精度问题
// 如果在企业开发中要判断两个小数是否相等, 那么建议使用 >= <=
if(3.14 == num){
printf("是3.14\n");
}
*/
// 6.如果if else省略大括号的时, else会自动匹配距离自己最近的那个if
// 但是有一个前提条件, 就是这个if没有被其它的else匹配
// 注意点: 编译器会把if else看做是一个整体
// if(0)
// if(1)
// printf("A\n");
// else // 和if(1)匹配
// printf("B\n");
// else // 和if(0)匹配, 因为if(1)已经被匹配过了
// if (1)
// printf("C\n");
// else // 和if(1)匹配
// printf("D\n");
// if(0)
// if(1)
// printf("A\n");
// else if(1) // 和if(1)匹配
// printf("B\n");
// else
// printf("c\n");
// else // 和if(0)匹配, 因为if(1)已经被匹配过了
// if (1)
// printf("D\n");
// else if(1) // 和if(1)匹配
// printf("F\n");
// else
// printf("G\n");
// 7.if可以嵌套if
// if(1){
// if(0){
// printf("A\n");
// }else{
// printf("B\n");
// }
// }else{
// if(1){
// printf("C\n");
// }else{
// printf("D\n");
// }
// }
// 判断一个数是否是100~200之间的数
int num = 301;
if(num >= 100){
if(num <= 200){
printf("是100~200之间的数\n");
}else{
printf("是一个大于等于100的数, 但是不是100~200之间的数\n");
}
}
return 0;
}
1.1、if小练习
#include <stdio.h>
int main()
{
// 1.让用户输入三个整数, 找出最大值然后输出, 用if实现
// 1.定义变量保存用户输入的数据
int a, b, c;
a = -1, b = -1, c = -1;
// 2.提醒用户如何输入数据
printf("请输入三个整数, 用逗号隔开, 以回车结束\n");
// 3.接收用户输入的数据
scanf("%i,%i,%i", &a, &b, &c); // 18,10, 22
/*
// 4.先比较两个数, 取出最大值
int max = -1;
if(a > b){ // 18 > 10
max = a; // max = 18
}else{
max = b;
}
// 5.用刚才比较的最大值和剩余的数进行比较
if(max > c){ // 18 > 22
max = max;
}else{
max = c; // max = 22
}
*/
/*
int max = -1;
if(a > b){ // 18 > 10
if(a > c){ // 18 > 22
max = a;
}else{
max = c; // max = 22
}
}else{
if(b > c){
max = b;
}else{
max = c;
}
}
*/
int max = -1;
if(a > b && a > c){
max = a;
}else if(b > a && b > c){
max = b;
}else if(c > a && c > b){
max = c;
}
// 6.输出结果
printf("max = %i\n",max);
// 2.让用户输入1~7的数, 然后根据用户输入输出是星期几
return 0;
}
#include <stdio.h>
int main()
{
// 2.让用户输入1~7的数, 然后根据用户输入输出是星期几
// 1.定义变量保存用户输入的数据
int day = -1;
// 2.提示用户如何输入数据
printf("请输入一个1~7的数字, 以回车结束\n");
// 3.接收用户输入的数据
scanf("%i", &day);
// 4.判断非法输出
/*
if(day < 1 || day > 7){ // day = 8
printf("回到火星\n"); // 打印
}else{
// 5.根据输入数据输出结果
// U(YOU)SB
if(1 == day){ // 1
printf("星期一\n");
}else if(2 == day){
printf("星期二\n");
}else if(3 == day){
printf("星期三\n");
}else if(4 == day){
printf("星期四\n");
}else if(5 == day){
printf("星期五\n");
}else if(6 == day){
printf("星期六\n");
}else{
printf("星期日\n");
}
}
*/
if(day < 1 || day > 7){ // day = 8
printf("回到火星\n"); // 打印
}else if(1 == day){ // 1
printf("星期一\n");
}else if(2 == day){
printf("星期二\n");
}else if(3 == day){
printf("星期三\n");
}else if(4 == day){
printf("星期四\n");
}else if(5 == day){
printf("星期五\n");
}else if(6 == day){
printf("星期六\n");
}else{
printf("星期日\n");
}
return 0;
}
#include <stdio.h>
int main()
{
// 需求: 要求用户输入一个1~12的数, 判断是什么季节之后输出
// 3~5春季 6~8夏季 9~11秋季 12~2冬季
// 1.定义变量保存用户输入的数据
int month = -1;
// 2.提示用户如何输入数据
printf("请输入一个1~12整数, 以回车结束\n");
// 3.接收用户输入的数据
scanf("%i", &month);
// 4.排除非法数据
// 5.判断输出结果
/*
if(month < 1 || month > 12){
printf("回到火星\n");
}else if(3 == month || 4 == month || 5 == month){
printf("春季\n");
}else if(6 == month || 7 == month || 8 == month){
printf("夏季\n");
}else if(9 == month || 10 == month || 11 == month){
printf("秋季\n");
}else if(12 == month || 1 == month || 2 == month){
printf("冬季\n");
}
*/
if(month < 1 || month > 12){
printf("回到火星\n");
}else if(month >= 3 && month <= 5){
printf("春季\n");
}else if(month >=6 && month <= 8){
printf("夏季\n");
}else if(month >= 9 && month <= 11){
printf("秋季\n");
}else{
printf("冬季\n");
}
return 0;
}
#include <stdio.h>
int main()
{
/*
* 需求:
* 要求用户输入三个整数, 排序之后输出
* 例如: 用户输入的是 18,2,16 --> 2,16,18
*/
// 1.定义变量保存用户输入的数据
int a, b, c;
a = -1, b = -1, c = -1;
// 2.提示用户如何输入数据
printf("请输入三个整数, 用逗号隔开, 以回车结束\n");
// 3.接收用户输入的数据
scanf("%i,%i,%i", &a, &b, &c);
// 4.排序(相邻的两个变量进行比较, 交换位置即可)
//特点: 经过一轮两两比较之后, 最值会出现在最后
//由于最值已经出现在最后了, 所以下一轮就不用比较最后一个值了
//只有经过所有比较之后, 第一个变量没有可比较的变量, 才算排序完成
if(a > b){
int temp = a;
a = b;
b = temp;
}
if(b > c){ // 得到最值C
int temp = b;
b = c;
c = temp;
}
if(a > b){ // 得到最值B
int temp = a;
a = b;
b = temp;
}
printf("%i,%i,%i\n", a, b, c);
return 0;
}
#include <stdio.h>
int main()
{
/*
* 需求:
* 要求用户输入三个整数, 排序之后输出
* 例如: 用户输入的是 18,2,16 --> 2,16,18
*/
// 1.定义变量保存用户输入的数据
int a, b, c;
a = -1, b = -1, c = -1;
// 2.提示用户如何输入数据
printf("请输入三个整数, 用逗号隔开, 以回车结束\n");
// 3.接收用户输入的数据
scanf("%i,%i,%i", &a, &b, &c);
// 4.排序
if(a > b && b > c){
printf("%i,%i,%i", a, b, c);
}else if(a > c && c > b)
{
printf("%i,%i,%i", a, c, b);
}else if(b > a && a > b)
{
printf("%i,%i,%i", b, a, c);
}else if(b > c && c > a)
{
printf("%i,%i,%i", b, c, a);
}else if(c > a && a > b)
{
printf("%i,%i,%i", c, a, b);
}else if(c > b && b > a)
{
printf("%i,%i,%i", c, b, a);
}
return 0;
}
1.2、升级版
#include <stdio.h>
int main()
{
/*
* 需求:
* 要求用户输入四个整数, 排除之后输出
* 例如: 用户输入的是 18,2,16 --> 2,16,18
*/
// 接收
// scanf("%i,%i,%i,%i", &a, &b, &c, &d);
// 输出
// printf("%i,%i,%i,%i\n", a, b, c, d);
return 0;
}
#include <stdio.h>
int main()
{
/*
* 需求:
* 要求用户输入四个整数, 排序之后输出
* 例如: 用户输入的是 18,2,16 --> 2,16,18
*/
// 1.定义是个变量, 保存用户输入的数据
int a, b, c, d;
a = -1, b = -1, c = -1, d = -1;
// 2.提示用户如何输入数据
printf("请输入四个整数, 用逗号隔开, 以回车结束\n");
// 3.接收用户输入的数据
scanf("%i,%i,%i,%i", &a, &b, &c, &d);
// 4.进行第一轮排序
if(a > b){
int temp = a;
a = b;
b = temp;
}
if(b > c){
int temp = b;
b = c;
c = temp;
}
if(c > d){
int temp = c;
c = d;
d = temp;
}
// 5.进行第二轮排序
if(a > b){
int temp = a;
a = b;
b = temp;
}
if(b > c){
int temp = b;
b = c;
c = temp;
}
// 6.进行第三轮的排序
if(a > b){
int temp = a;
a = b;
b = temp;
}
// 7.输出结果
printf("%i,%i,%i,%i\n", a, b, c, d);
return 0;
}
#include <stdio.h>
int main()
{
/*
* 需求:
* 要求用户输入四个整数, 排序之后输出
* 例如: 用户输入的是 18,2,16 --> 2,16,18
*/
// 1.定义是个变量, 保存用户输入的数据
int a, b, c, d;
a = -1, b = -1, c = -1, d = -1;
// 2.提示用户如何输入数据
printf("请输入四个整数, 用逗号隔开, 以回车结束\n");
// 3.接收用户输入的数据
scanf("%i,%i,%i,%i", &a, &b, &c, &d);
// 4.第一轮比较
if(a > b){
int temp = a;
a = b;
b = temp;
}
if(a > c){
int temp = a;
a = c;
c = temp;
}
if(a > d){
int temp = a;
a = d;
d = temp;
}
// 5.第二轮比较
if(b > c){
int temp = b;
b = c;
c = temp;
}
if(b > d){
int temp = b;
b = d;
d = temp;
}
// 6.第三轮比较
if(c > d){
int temp = c;
c = d;
d = temp;
}
// 7.输出排序后的结果
printf("%i,%i,%i,%i\n", a, b, c, d);
return 0;
}
1.3 升升级版
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
/*
1.有两个角色 电脑 / 我
2.两个角色都可以出拳, 并且都只能出 石头/剪刀/布
3.如何判断是否是石头/ 剪刀/ 布? 0代表石头/ 1代表剪刀 / 2代表布
4.电脑的出拳必须随机生成, 用户可以通过键盘录入
*/
// 1.让电脑出拳
// 注意点: C语言中的rand函数返回的是一个伪随机数
// 以下语句在C语言中一般都是一起出现的
srand(time(NULL)); // 种一个种子
// 0 % 3 = 0, 1 % 3 = 1, 2 % 3 = 2
// 9 % 3 = 0, 10 % 3 = 1, 11 % 3 = 2
int cm = rand() % 3;
// printf("res = %i\n", res);
// 2.定义变量保存用户输入的数据
int user = -1;
// 3.提示用户如何输入
printf("0代表石头/ 1代表剪刀 / 2代表布\n");
printf("请输入一个0~2的值, 以回车结束\n");
// 3.接收用户输入的数据
scanf("%i", &user);
// 4.判断结果
/*
* 电脑 用户(输了) 用户(赢了)
* 0代表石头 1代表剪刀 2代表布
* 1代表剪刀 2代表布 0代表石头
* 2代表布 0代表石头 1代表剪刀
*
* 输了: 0-1 = -1
* 1-2 = -1
* 2-0 = 2
* 赢了: 0-2 = -2
* 1-0 = 1
* 2-1 = 1
*/
// 排除非法数据
/*
if(user < 0 || user > 2){
printf("还能不能好好的玩耍\n");
}else if(cm == 0 && user == 1){
printf("电脑出的是%i, 用户处的是%i, 电脑赢了\n", cm, user);
}else if(cm == 1 && user == 2){
printf("电脑出的是%i, 用户处的是%i, 电脑赢了\n", cm, user);
}else if(cm == 2 && user == 0){
printf("电脑出的是%i, 用户处的是%i, 电脑赢了\n", cm, user);
}else if(cm == 0 && user == 2){
printf("电脑出的是%i, 用户处的是%i, 用户赢了\n", cm, user);
}else if(cm == 1 && user == 0){
printf("电脑出的是%i, 用户处的是%i, 用户赢了\n", cm, user);
}else if(cm == 2 && user == 1){
printf("电脑出的是%i, 用户处的是%i, 用户赢了\n", cm, user);
}else{
printf("电脑出的是%i, 用户处的是%i, 打平手\n", cm, user);
}
*/
if(user < 0 || user > 2){
printf("还能不能好好的玩耍\n");
}else{
int res = cm - user;
if(-1 == res || 2 == res){
printf("电脑出的是%i, 用户处的是%i, 电脑赢了\n", cm, user);
}else if(-2 == res || 1 == res){
printf("电脑出的是%i, 用户处的是%i, 用户赢了\n", cm, user);
}else{
printf("电脑出的是%i, 用户处的是%i, 打平手\n", cm, user);
}
}
return 0;
}
2、switch结构
#include <stdio.h>
int main()
{
/*
* C语言中的第二种选择结构
* switch选择结构的格式:
*
*
* switch(表达式){
* case 表达式1: // 相当于else if
* 被表达式1控制的语句;
* break;
* case 表达式2: // 相当于else if
* 被表达式2控制的语句;
* break;
* default: // 相当于else
* 被default控制的语句;
* break;
* }
*
* 执行流程:
* 1.计算switch后面()中表达式的结果
* 2.利用计算的结果从上至下的和switch后面{}中的case的表达式的值一次比较
* 3.一旦发现switch表达式的值和case表达式的值相同, 就执行该case后面的语句
* 4.一旦某个case被执行了, 其它的case就不会执行了
* 5.如果所有case表达式的值和switch表达式的值都不相等, 那么就执行default后面的语句
*/
int day = 3;
switch(day){
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
default:
printf("Other\n");
break;
}
return 0;
}
#include <stdio.h>
int main()
{
// 需求: 判断用户输入的数字是否是100~200之间的数
int num = -1;
scanf("%i", &num);
// 在企业开发中, 能用if就用if
// if更适合对区间的判断, 或者对多条件的判断
// switch更适合对固定的几个数据进行判断
// switch理论上的性能比if要高
// if(num >= 100 && num <= 200){
// printf("是100~200之间的数\n");
// }else{
// printf("不是100~200之间的数\n");
// }
switch(num){
case 100:
case 101:
printf("是100~200之间的数\n");
....
default:
printf("不是100~200之间的数\n");
}
return 0;
}
#include <stdio.h>
int main()
{
/*
* 需求:
* 要求用户输入一个0~100的分数, 根据输入的分数输出对应的等级
* A : 90~100 99/10 = 9 100/10 = 10
* B : 80~89 87/10 = 8
* C : 70~79
* D : 60~69
* E : 60分以下
*/
// 1.定义变量保存用户输入的数据
int score = -1;
// 2.提醒老师如何录入分数
printf("请输入一个0~100的分数, 以回车结束\n");
// 3.接收用户输入的数据
scanf("%i", &score);
// 4.根据用户输入判断对应的等级
// 4.1排除非法数据
// if(score < 0 || score > 100){
// printf("你是校长的儿子吧\n");
// }else if(score >= 90 && score <= 100){
// printf("A\n");
// }else if(score >= 80 && score <= 89){
// printf("B\n");
// }else if(score >= 70 && score <= 79){
// printf("C\n");
// }else if(score >= 60 && score <= 69){
// printf("D\n");
// }else{
// printf("E\n");
// }
switch(score/10){
case 10:
// printf("A\n");
// break;
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break;
case 5:
// printf("E\n");
// break;
case 4:
// printf("E\n");
// break;
case 3:
// printf("E\n");
// break;
case 2:
// printf("E\n");
// break;
case 1:
// printf("E\n");
// break;
case 0:
printf("E\n");
break;
default:
printf("你是校长的儿子吧\n");
}
return 0;
}
2.1、 穿透问题
#include <stdio.h>
int main()
{
// 1.case的穿透问题
// 在switch中, 只要有一个case被匹配了, 其它的case和default都会失效
// break在switch中的作用, 就是跳出switch语句(结束当前的switch语句)
// 如果default是写在最后, 那么default后面的break可以省略
// int day = 1;
// switch(day){
// case 1:
// printf("星期一\n");
// break;
// case 2:
// printf("星期二\n");
//// break;
// default:
// printf("OTHER\n");
//// break; // 这里的break是可以省略的
// }
// 2.default书写的位置, 可以随便写
// 无论default是否是写在switch语句的最后, 都会最后执行
// 如果default不是写在最后的, 那么break不能省略, 省略就会发生穿透问题
// 记住一点: 永远把default写在最后
// int day = 3;
// switch(day){
// case 1:
// printf("星期一\n");
// break;
// default:
// printf("OTHER\n");
//// break;
// case 2:
// printf("星期二\n");
// break;
// }
// 3.switch后面的()中只能表达式/变量/常量, 并且必须是整型或者能够被提升为整型的
// int num = 1;
// switch(num){ // 放一个变量
// switch(2){ // 放一个常量
// switch(1 + 1){ // 放一个表达式
// switch(1.1){ // 会报错, 小数不能提升为整型
// 不会报错, char类型可以提升为int类型
// char类型底层的本质存储的是ASCII码, 而ASCII码就是整型
// switch('a'){
// case 1:
// printf("A\n");
// break;
// case 2:
// printf("B\n");
// break;
// default:
// printf("Other\n");
// }
// 4.switch的case后面只能放常量和表达式, 并且必须是整型或者能够被提升为整型的
// int num = 1;
// switch(2){
// case 1: //常量
//// case num: // 变量, 会报错
// printf("A\n");
// break;
// case 1 + 1: // 表达式
// printf("B\n");
// break;
// default:
// printf("Other\n");
// }
// 5.switch的case后面的值不能重复
// int num = 1;
// switch(2){
// case 2:
// printf("A\n");
// break;
//// case 1: // 会报错
// case 1 + 1: // 会报错
// printf("B\n");
// break;
// default:
// printf("Other\n");
// }
// 6.switch的case后面不能定义变量
// 如果要在case后面定义变量, 必须在case后面加上{}
switch(1){
case 1:{
int num = 666; // 会报错
printf("A\n");
break;
}
case 2:
printf("B\n");
break;
default:
printf("Other\n");
}
return 0;
}
#include <stdio.h>
int main()
{
/*
* 要求利用switch实现两个数的简单的计算器
* + - * / %
*/
// 1.定义变量保存用户输入的两个整数
int a, b;
// 2.定义变量保存用户输入的操作符号
char ch;
// 3.提示用户如何输入
printf("请按照如下格式输入两个整数和需要进行的计算符号\n");
printf("示例: 1 + 1 or 1 - 1\n");
// 4.接收用户输入的内容
scanf("%i %c %i", &a, &ch, &b);
// 5.判断当前用户要做什么操作
switch(ch){
case '+':
printf("%i %c %i = %i", a, ch, b, a + b);
break;
case '-':
printf("%i %c %i = %i", a, ch, b, a - b);
break;
case '*':
printf("%i %c %i = %i", a, ch, b, a * b);
break;
case '/':
printf("%i %c %i = %i", a, ch, b, a / b);
break;
case '%':
printf("%i %c %i = %i", a, ch, b, a % b);
break;
default:
printf("更多功能请使用付费版本\n");
}
// 5.进行对应的操作, 输出结果
return 0;
}
网友评论