学习C(四)
① if判断语句及其衍生的选择语句
注意if语句的各种嵌套:还是以三角形的判断为例子去复习
② 变量有效范围的概念:作用域
③ 条件触发的编程思路
④ switch case语法的使用
由作用域延伸出在case中禁止声明变量
case 负责跳入,break负责跳出,如果case中没有break,则不会跳出switch语句,而是继续执行下一个case
switch case 中对于缓存的管理至关重要。如果不需要使用到缓存,则一定清理缓存
程序的运行顺序
程序的运行顺序:
程序根据不同的语法结构,它运行的顺序也会不同
计算机语言中的语法结构:
① 顺序结构
代码从上到下,从左到右依次运行
② 分支结构
代码会先进入分支的选择条件,根据条件直接跳转到符合条件的对应分支中。这里说的直接跳转意味着代码只会执行该分支,其他分支没有执行没有判断。
③ 循环结构
代码根据循环语句中,给定的循环条件进行判断,如果满足条件,则执行一次循环语句,这个过程会一直持续到给定的循环条件不满足为止。
顺序结构的语法:
① 判断语句 if语句
语法: if(表达式1){
语句1;
}
剩余代码
判断“表达式1”是否成立(成立为1,不成立为0),如果成立,则执行语句1,执行完成后,继续执行“剩余代码”。如果不成立,则直接执行“剩余代码”
② 二选一判断语句 if else 语句
语法: if(表达式1){
语句1;
}else{
语句2;
}
剩余代码
判断“表达式1”是否成立,如果成立,则执行语句1,然后在执行“剩余代码”,如果不成立,则执行“语句2”,再执行剩余代码
③ 多选一判断语句 if else if 语句
语法: if(表达式1){
语句1;
}else if(表达式2){
语句2;
}中间若干个else if(表达式n){
语句n;
}else{
语句0;
}
剩余代码
从“表达式1”开始判断,直到找到其中某一个表达式成立,则执行对应的语句,再执行剩余代码。如果没有一个表达式成立,则执行“语句0”,再执行剩余代码
如果有多个表达式成立,则执行第一个成立的表达式对应的语句,则执行“剩余代码”
从if语句开始,我们就开始接触语法结构的嵌套使用了:
例如:判断一个三角形是否为等腰直角三角形
if(是否是一个三角形){
if(是否是等腰三角形){
if(是否是直角三角形){
printf(“是等腰直角三角形\n”);
}
}else{
}
}else{
}
在语法结构的嵌套使用中,我们需要考虑清楚整个树形结构的构成逻辑
if及衍生的选择语句中的条件触发思路:
我们可以通过在if语句中使用printf来显示是否if语句判断成功,但是这只能告知用户是否进入if语句。剩余的代码并不能判断是否做过类似的终端输出来判断是否进入过if语句。
所以,在遇到类似的需求时,我们可以在if语句中设置触发条件,一旦进入该if语句,就触发该条件。那么在之后的代码中,只需要判断我的触发点是否被触发,就能够知道是否进入过if判断语句。
分支结构:switch case 语句
语法:switch(表达式){
case 数据1:
语句1;
break;
case 数据2:
语句2;
break;
case 数据2:
语句1;
break;
…
case 数据n:
语句n;
break;
default:
语句0;
break;
}
当执行到switch case语句时,系统会先读取switch中“表达式”的值,然后去case中寻找与“表达式”相等的“数据”,然后直接执行相应语句。注意,此处并不会从“数据1”开始,一一去寻找与“表达式”数值相等的“数据”,而是整体观察,哪一个是相等的,则直接跳转。
这就意味着,如果有多个“数据”的数值与“表达式”相等的话,编译错误
如果没有一个“数据”的数值与“表达式相等”,则执行语句0
注意!!!:在switch case语句的每一个case中,禁止声明变量
注意!!:switch case 语句中,case只负责转入,不负责跳出。跳出的功能由break负责
关于break:break能够跳出分支结构以及循环,不能跳出顺序结构
变量的命名规则
①不能以数字开头命名变量(语法上禁止)
②不能以关键字作为变量的名字(语法上的禁止)
③命名变量的时候,变量的名字必须正确代表其含义。
例如:如果声明一个人的身高为1米8,则应该 int height = 180,而不是int age = 180;
④变量可以以下划线开头进行命名: int _a = 0;
如果两个变量的联系性非常的大,那么我可以为其中一个变量前面加上下划线:
例如:在编写账号登录功能的时候,应该在数据里存在一个name,然后还应该自己输入一个账号_name,然后去判断name==_name?
⑤当变量的名字拥有多重含义的时候,我们可以使用一下两种变量命名方式
例如:声明张三的身高为180,年龄为30
1:驼峰命名法
int zhangsanHeight = 180;
2:下划线命名法
int zhangsan_age = 30;
#include<stdio.h>
/*
变量的作用域与生命周期
作用域:一个变量,他仅仅只能在自己的作用域内生效。一组{}就代表了一个作用域
*/
int main(){
int a = 10;
if(1){
int a = 5;
printf("a = %d\n",a);
}
//此处,a的作用域仅仅在7~9行有效,所以在第11行的a就是未声明的
//不同作用域中,变量的名字可以重复。一旦变量名字重复,对该变量名的访问,遵循就近原则,也就是说访问处于哪一个作用域中,就会访问到哪一个作用域中的变量。
return 0;
}
if else
#include<stdio.h>
int main(){
int a = 3, b = 3;
if(a<b){
printf("a比b小\n");
}else{
printf("a不比b小\n");
}
printf("a=%d,b=%d\n",a,b);
return 0;
}
switch case
#include<stdio.h>
int main(){
char ch = 0;
scanf("%c",&ch);
while(getchar()!='\n');
switch(ch){
case '1':{
int a = 0;
break;
}
case '2':
break;
default:
break;
}
return 0;
}
#include<stdio.h>
int main(){
int i = 0;
int j = 5;
while(i<j){//i==0,j==5
switch(i){
case 0:
i++;
break;
case 1:
i+=2;
case 2:
j++;
break;
case 3:
i+=3;
break;
default:
break;
}
}
printf("i=%d,j=%d\n",i,j);
return 0;
}
switch case 被嵌套在循环语句中要清理缓存
#include<stdio.h>
int main(){
int ch = 0;
while(1){
scanf("%d",&ch);
while(getchar()!='\n');//switch case 被嵌套在循环语句中是,清理缓存的语句至关重要,否则代码的健壮性几乎为0
switch(ch){
case 1:
printf("1\n");
break;
case 2:
printf("2\n");
break;
case 3:
printf("3\n");
break;
default:
printf("0\n");
break;
}
}
return 0;
}
练习1 判断三角形类型
#include<stdio.h>
/*
从键盘输入3个值,判断是否能构成一个三角形:
如果能构成三角形,判断他是什么三角形
①直角、锐角、钝角三角形
②等腰三角形
③等边三角形
*/
int main(){
int _a = 0,_b = 0,_c = 0;
printf("请输入三角形的三条边:");
scanf("%d %d %d",&_a,&_b,&_c);
//将三条边从小到大排序,依次为a,b,c
int smaller = (_a<_b)?_a:_b;
int a = (smaller<_c)?smaller:_c;
int bigger = (_a>_b)?_a:_b;
int c = (bigger>_c)?bigger:_c;
int b = _a+_b+_c - a - c;
if(a+b>c){
if(a==b){
if(a==c){
printf("等边");
}else{
printf("等腰");
}
}
if(a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a){
printf("直角三角形\n");
}else if(a*a+b*b>c*c){
printf("锐角三角形\n");
}else{
printf("钝角三角形\n");
}
}else{
printf("不能构成三角形\n");
}
return 0;
}
练习2 判断闰年和月份天数
#include<stdio.h>
/*
从键盘输入一个年份,判断是否为闰年,如果是闰年,则要求输入月份,判断该月有几天。如果不是闰年,则提示用户,离该年最近的两个闰年是哪两年
闰年:4年1润,但是100年不闰,但是400年又一闰
*/
int main(){
int year = 0,month = 0,day = 0;
printf("请输入年份:");
scanf("%d",&year);
while(getchar()!='\n');
if((year%4==0 && year%100!=0) || year%400==0){
printf("%d年为闰年\n",year);
printf("请输入月份:");
scanf("%d",&month);
while(getchar()!='\n');
if(month==4||month==6||month==9||month==11){
day = 30;
}else if(month>12){
day = 0;
}else if(month==2){
day = 29;
}else{
day = 31;
}
printf("%d年的%d月有%d天\n",year,month,day);
}else{
printf("%d年不是闰年\n",year);
int temp = year%4;//例如2003年不是闰年,2003%4==3
int year1 = year-temp;//前一个闰年
int year2 = year+(4-temp);//后一个闰年
if(year1%100==0){
year1 -= 4;
}
if(year2%100==0){
year2 += 4;
}
printf("离%d年最近的2个闰年为%d年和%d年\n",year,year1,year2);
}
return 0;
}
练习3 转换字母大小写
/*
从键盘输入一个单一数据,如果是字母,小写转换成大写,大写转换成小写并输出。如果是数字,正数转换成负数,负数转换成正数并输出。如果是其他,则输出0
*/
#include<stdio.h>
int main(){
char ch = 0;
printf("请输入一个单一数据:");
scanf("%c",&ch);//-9
if(ch>='A' && ch<='Z'){
printf("%c\n",ch+32);
}else if(ch>='a' && ch<='z'){
printf("%c\n",ch-32);
}else if(ch>='1' && ch<='9'){
printf("-%c\n",ch);
}else if(ch=='-'){
scanf("%c",&ch);
if(ch=='\n'){
ch='0';
}
printf("%c\n",ch);
}else{
printf("0\n");
}
return 0;
}
练习4 双色球系统
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/*
假定有一个双色球系统:
系统随机生成4组10~99随机整型数
然后要求用户输入4组整型数
分别匹配每一组整型数
4个全中则一等奖
中3个则二等奖
中2个则三等奖
其他谢谢参与
举例:系统生成:40-41-42-43
用户购买:40-41-41-41
此时就是三等奖
生成一个随机数的函数为rand函数
调用rand()后,整个函数的调用就是一个数学表达式,该表达式的值就是一个随机数,但是这个随机数是一个天文数字
查看一个函数的头文件以及其他详细信息:终端输入shell指令 man+3+函数名
*/
int main(){
srand(time(0));
int _a = rand()%90+10;
int _b = rand()%90+10;
int _c = rand()%90+10;
int _d = rand()%90+10;
printf("%d-%d-%d-%d\n",_a,_b,_c,_d);
int a = 0,b = 0,c = 0,d = 0;
printf("请下注,使用-隔开数字:");
scanf("%d-%d-%d-%d",&a,&b,&c,&d);
while(getchar()!='\n');
int state = 0;
if(a==_a){state++;}
if(b==_b){state++;}
if(c==_c){state++;}
if(d==_d){state++;}
if(state==4){
printf("一等奖\n");
}else if(state==3){
printf("二等奖\n");
}else if(state==2){
printf("三等奖\n");
}else{
printf("谢谢参与\n");
}
return 0;
}
练习5 简易计算器
#include<stdio.h>
/*
使用死循环嵌套switch case 编写一个拥有 +,-,*,/,%功能简易计算器
要求:
①输入 数字 运算符 数字 回车 后,能够输出最终结果
②当仅仅输入一个q的时候,退出循环->程序退出
*/
int main(){
double num1 = 0,num2 = 0;
char ch = 0;
double res = 0;
while(1){
printf("请输入计算表达式:");
scanf("%lf",&num1);
scanf("%c",&ch);
if(ch=='q'){return 0;}
scanf("%lf",&num2);
while(getchar()!='\n');
switch(ch){
case '+':
res = num1 + num2;
break;
case '-':
res = num1 - num2;
break;
case '*':
res = num1 * num2;
break;
case '/':
if(num2 == 0.0){
res = 0;
}else{
res = num1 / num2;
}
break;
case '%':
if(num2 == 0.0){
res = 0;
}else{
res = (int)num1 % (int)num2;
}
break;
default:
break;
}
printf("%g %c %g = %g\n",num1,ch,num2,res);
}
return 0;
}