学习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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值