提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文
目录
前言
【C语言学习】分支循环语句的介绍以及代码示例,总结
选择语句
if
switch
循环语句
while
for
do......while()
goto语句
1、分支语句(选择语句)
1.1.1 if语句
语法结构:
if(表达式)
{
语句;
}
if(表达式)
{
语句1;
}
else
{
语句2;
}
多分支:
if(表达式1)
{
语句1;
}
else if(表达式2)
{
语句2;
}
else
{
语句3;
}
代码示例:
//代码1
//输入一个年龄(整数),大于或等于18->打印“成年”,小于18->打印“未成年”
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
}
//代码2
//输入一个年龄(整数)
//小于18->少年;大于等于18并且小于30->青年;大于等于30并且小于50->中年
//大于等于50并且小于80->老年;大于等于80->老寿星
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("少年\n");
}
else if(age>=18 && age<30)
{
printf("青年\n");
}
else if(age>=30 && age<50)
{
printf("中年\n");
}
else if(age>=50 && age<80)
{
printf("老年\n");
}
else
{
printf("老寿星\n");
}
}
注:如果表达式的结果为真,则语句执行。
在C语言中,0表示假,非0表示真。
1.1.2 悬空else
有这样一段代码,判断运行结果
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
改正:
//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
else的匹配:else与它最近的那个if相匹配
1.1.3 小练习
a. 判断一个数是否为奇数
b. 输出1-100之间的奇数
//判断一个数是否为奇数 奇数除以2余1
//余数为1,为奇数,反之,则不是
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 2 == 1)
{
printf("是奇数\n");
}
else
{
printf("不是奇数");
}
return 0;
}
//输出1—100之间的奇数(利用for循环)
#include<stdio.h>
int main()
{
int i = 0;
for (i = 0; i < 100; i++)
{
if (i % 2 == 1)
{
printf("%d ", i);
}
}
return 0;
}
1.2.1 switch语句
switch语句适用于多分支的情况
例如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
1.2.1 语法结构
switch(整型表达式)
{
语句项;
}//语句项就是一些case语句
case 整型常量表达式:
语句;
1.2.2 在switch语句中的break
//输入1-7之间的数,输入几,就打印星期几
#include <stdio.h>
int main()
{
int day = 0;
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;
}
return 0;
}
如果不添加break:
不是我们想要的效果。
break实际上是把语句划分为不同的分支部分。
编程好习惯:在最后一个case语句后面加上break语句。
1.2.3 default语句
如果表达的值与所有的case标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。 程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢? 你可以在语句列表中增加一条default子句,把下面的标签
default:
写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
示例:
1.2.4 小练
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{//switch允许嵌套使用
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
2、循环语句
2.1.1 while循环
语法结构
while(表达式)
{
循环语句;
}代码如下(示例):
示例:
//在屏幕上打印1-10的数字
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i++;
}
return 0;
}
2.1.2 while循环中的break和continue
break介绍
示例:
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i++;
}
return 0;
}
这里的输出结果是? 1 2 3 4
break在while循环中的作用:只要在循环中遇到break,就会停止后面的所有循环,直接终止循环。
(用于永久终止循环)
continue介绍
示例:
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
{
continue;
}
printf("%d ", i);
i++;
}
return 0;
}
输出结果为? 1 2 3 4 死循环
continue在while循环中的作用就是: continue是用于终止本次循环的,也就是本次循环continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
2.2.1 for循环
语法结构:
for(表达式1;表达式2;表达式3)
{
循环语句;
}
表达式1 为初始化部分,用于初始化循环变量的。
表达式2 为条件判断部分,用于判断循环时候终止。
表达式3 为调整部分,用于循环条件的调整。
示例:
//在屏幕上打印1-10的数字
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
2.2.2 for循环中的break和continue
在for循环中也可以使用break和continue,它们的意义与在while循环中基本相同。
但还是有一些差异:
//代码1
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}
printf("%d ", i);
}
return 0;
}
//代码2
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
}
return 0;
}
这里代码输出的结果是什么? 代码1 1 2 3 4
代码2 1 2 3 4 6 7 8 9 10
for循环的使用建议:
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
2.3.1 do...while()循环
语法结构:
do
{
循环语句;
} while(表达式);
do...while()循环的特点: 循环至少执行一次,使用的场景有限,所以不是经常使用。
示例:
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);
}while(i<10);
return 0;
}
2.3.2 do...while()循环中break和continue
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (5 == i)
{
break;
}
printf("%d ", i);
i++;
} while (i < 10);
return 0;
}
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (5 == i)
{
continue;
}
printf("%d ", i);
i++;
} while (i < 10);
return 0;
}
与while相同
3、练习(熟练掌握)
1. 计算 n的阶乘。
2. 计算 1!+2!+3!+……+10!
3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)
4. 编写代码,演示多个字符从两端移动,向中间汇聚。
5. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。
//n的乘阶
#include<stdio.h>
int main()
{
int a = 1;
int n = 0;
scanf_s("%d", &n);
int i = 0;
for (i = 1; i <= n; i++)
{
a = a * i;
}
printf("%d的乘阶为:%d\n", n, a);
return 0;
}
//计算 1!+2!+3!+......+10!
#include<stdio.h>
int main()
{
int a = 1;
int sum = 0;
int i = 0;
for (i = 1; i < 11; i++)
{
a = a * i;
sum += a;
}
printf("1!+2!+3!+......+10!=%d\n", sum);
return 0;
}
//在一个有序数组中查找具体的某个数n(二分查找)
#include<stdio.h>
int main()
{
int k = 0;
scanf_s("%d", &k);
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);//求元素个数
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
//编写代码,演绎多个字符从两端移动,向中间汇集
#include<stdio.h>
int main()
{
char arr1[] = "welcome to here!";
char arr2[] = "################";
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
//优化
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
char arr1[] = "welcome to here!";
char arr2[] = "################";
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);//睡眠1秒--引头文件‘string.h’
system("cls");//清空屏幕--引头文件‘windows.h’
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
//模拟登录
#include<stdio.h>
#include<string.h>
int main()
{
char password[20] = { 0 };
int i = 0;
for (i = 0; i < 3; i++)
{
printf("请输入密码:>");
scanf("%s",password);
//if(password == "123456")错误(err)--两个字符串比较不能用‘=='
//应该使用'strcmp'--引用头文件‘string.h’
if (strcmp(password,"123456") == 0)//判断输入密码是否与原密码相同
{
printf("登录成功\n");
break;
}
else if(i<2)//若密码输入错误,进行提醒,循环,3次
{
printf("密码错误,请重新输入\n");
}
}
if (i == 3)
{
printf("三次密码均错误,退出程序\n");
}
return 0;
}
3.1 折半查找(二分查找)讲解
以上述问题3为例。
假如在 arr[] = { 1,2,3,4,5,6,7,8,9,10 }中找我们想要查询的数的下标,通过二分查找法可以使查找效率更高。
1 2 3 4 5 6 7 8 9 10
对应下标: 0 1 2 3 4 5 6 7 8 9
left right
将查询数组中左右两边的元素的下标分别赋给left、right
假设我们要查询的数为7(key = 7)
mid = (left + right)/2,通过arr[mid]与key进行比较
第一次: mid = (0+9)/2 =4, arr[mid]=5<key left=mid+1=5 right=9值不变
第二次查找范围变成 6 7 8 9 10
5 6 7 8 9
left right
第二次: mid = (5+9)/2 =7, arr[mid]=8>key right=mid-1=6 left=5值不变
第三次查找范围变成 6 7
5 6
left right
第三次: mid = (5+6)/2 =5, arr[mid]=6<key left=mid+1=6 right=6值不变
第四次查找范围变成 7
6
left
right
第四次: mid = (6+6)/2 =6, arr[mid]=6=key 找到了
在每次查询之后,范围都会是原来的一半,故而效率比对数组元素一个一个进行对比高。
通过上述我们可以发现: left总是小于或等于right的,循环才能正常进行,所以循环的条件为left<=right;当left>right时,证明找不到我们想要查找的数,故而得不到其下标
4、goto语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程。
例如:一次跳出两层或多层循环。 多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
goto语言真正适合的场景如下:
for (...)
for (...)
{
for (...)
{
if (disaster)
goto error;
}
}
…
error :
if (disaster)
// 处理错误情况
示例:
//关机代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60");
while (1)
{
printf("电脑将在1分钟内关闭,请输入:我是猪,取消关机!\n请输入:>");
scanf("%d", &input);
if (0 == strcmp(input, "hi"))
{
system("shutdown -a");
break;
}
}
return 0;
}
也可以通过循环的方式来实现:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");
while(1)
{
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
break;
}
}
return 0;
}
5、拓展
猜数字游戏
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//游戏菜单
void menu()
{
printf("#####################\n");
printf("####### 1.play ######\n");
printf("####### 0.exit ######\n");
printf("#####################\n");
}
//猜游戏的实现
//1.生成一个0—100之间的随机数
//2.猜数字
// a.与生成数相比 大了——猜大了
// b. 小了——猜小了
// c. 相等——恭喜你,猜对了
//RAND_MAX--rand函数能返回随机数的最大值
void game()
{
//rand—随机生成一个0—32767之间的数
int ret = rand()%100+1;//% 生成0—99之间的一个数,+1———产生0—100之间的一个数
int gess = 0;
while (1)
{
printf("请输入猜的数字>:");
scanf("%d", &gess);
if (gess > ret)
{
printf("猜大了\n");
}
else if(gess < ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//time—时间戳
do
{
menu();//打印菜单
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
小结
以上是我对这几天【C#】学习做的一个总结,记录我的学习过程,希望也能够帮助到正在学习的朋友。有什么不足或者建议还请大家提出,孩纸主打一个听劝(第一次写,真的不知道该怎么弄,脑子一片乱麻。哎.......这次内容基本上参照了资料来的,希望下一次能有自己的东西。)