C语言细讲——分支与循环
本篇博文开始细讲C语言的各个知识点。
作者:小 琛
欢迎转载,请标明出处
**
分支语句(选择结构)
1、if 语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
一个容易犯错的地方,分析以下代码的运行结果:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("abc\n");
else
printf("ABC\n");
return 0;
}
很多人都认为输出:ABC,而实际运行结果为无输出。这里提出一个非常容易犯的错误:else只与其最近的if作用
练习:编写程序,判断一个数是否为奇数
#include <stdio.h>
int main()
{
printf("请输入一个数\n"); //用户索引界面
int num=0;
scanf("%d",num); //用户输入一个数
if (num%2==0) //以此作为判断,运用if····else语句
printf("此数不是奇数\n");
else
printf("此数为奇数\n");
return 0;
}
2、switch语句
switch语句也是一种分支语句。 常常用于多分支的情况。
比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期七
如果写成 if…else if …else if 的形式太复杂,那我们就得有不一样的语法形式。 这就是switch 语句,switch语句常常用于分支多的情况。
语法结构:
switch(整型表达式)
{
case 1:语句块;break;
case 2 : 语句块;break
…
case n: 语句块;break;
default:break;
}
break:在这里表示跳出该switch模块
default:如果表达的值与所有的case标签的值都不匹配时,这个default子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句
笔者强调:
(1)常常有面试官这样问:switch语句中不可以做参数的类型有什么?笔者以加粗提示,switch语句的参数只能是整型表达式,不可以是浮点型。
(2)在编写时候养成加“break;”;的习惯,在switch语句中,我们没法直接实现分支,搭配break使用才能实现真正的分支。例如在case 1后没有加‘break;’,在case 2后加了‘break;’,你选择进入case 1模式,程序执行时执行完case 1对应的操作不会跳出而会继续执行case 2对应的操作,直到遇到‘break;‘。
(3)给每一个switch语句配置‘default‘,’,保证程序的严密性
举一个例子并以练习:求输出的m,n的值大小
#include <stdio.h>
int main()
{
int n = 1;
``int m = 2;
switch (n)
{
case 1: //没有'break;'执行后继续进入下一个case
m++; // m=3
case 2:
n++; //n=2
case 3: //switch嵌套
switch (n) //进入case 2
{
case 1:
n++;
case 2:
m++; //m=4
n++; // n=3
break; //注意这里的’break;’是嵌套switch的‘break;’
}
case 4: //这里要继续执行
m++; //m=5
break; // 跳出
default:
break;
}
printf("m = %d, n = %d\n", m, n); //正确结果:m=5,n=3
return 0;
}
循环结构
·while
·do while
·for
1、while语句
这里和if语句对比:
当条件满足的情况下,if语句后的语句执行,否则不执行。但是这个语句只会执行一次。
但是我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
那我们怎么做呢? C语言中给我们引入了:while语句,可以实现循环。
while(表达式)
{
循环体;
}
当表达式为真(即为1)时执行,那么while(1)即为死循环。
举一个while的例子:打印1-10
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10) //while语句判断
{
printf("%d ", i);
i = i+1;
}
return 0;
}
while语句中的break和continue
分析如下代码,给出结果:
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
输出结果:1234
break在while循环中的作用:
其实在循环中(无论是while循环还是后续要讲的for循环)只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。
再看这个代码:
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
}
结果:1234678910
continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
2、do···while语句
语法:
do
循环语句;
while(表达式);//同样是表达式为真(即为1)时继续执行
do语句的特点
循环至少执行一次,使用的场景有限,所以不是经常使用。
这里并不是很难,不举例。
3、for语句
语法:
for(表达式1;表达式2;表达式3)
{
循环语句;
}
表达式1为初始化部分,用于初始化循环变量的。 表达式2为条件判断部分,用于判断循环时候终止。表达式3为调整部分,用于循环条件的调整。
笔者总结:先看初始化内容,后判断是否满足表达式2(即表达式2为‘1’还是为‘0’),若满足进入循环语句,执行完循环语句后执行表达式3,再到表达式2判断,循环知道不满足表达式2此循环结束。
举一个例子:仍然是打印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;
}
for循环中也可以出现break和continue,他们的意义和在while循环中是一样的,这里不再重复。
这里注意对for语句三部分的深入理解,尤其是条件判断部分,笔者建议:判断当下状态条件判断为‘1’还是为‘0’,为1即可执行
一道某公司的笔试题:
//请问循环要循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}
正确答案:0次,易错答案1次,这道题是典型的针对条件判断部分出的题目,这里的“k=0”是给k赋值,默认判定为假(为0)。并不是“k==0”,注意单等号和双等号的区别。
针对练习:
1、 计算 1!+2!+3!+……+10!
#include <stdio.h>
int Get_result(int n) //求阶乘
{
int i = 0, j = 1;
printf("请输入您想求的某数的阶乘\n");
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
j = i*j;
}
return j;
}
int main()
{
int n,i=0,j=0;
printf("请输入您想求的某数\n");
scanf("%d", &n);
for (i = 1; i <= n; i++) //此for循环来满足从1到n
{
j = Get_result(i)+j;
}
printf("结果为%d\n", j);
return 0;
}
2、编写代码,演示多个字符从两端移动,向中间汇聚。
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main() //实现字符滚动
{
char arr1[] = "welcome to hear";
char arr2[] = "***************";
int left=0, right;
right = sizeof(arr1) / sizeof(arr1[1]) - 2;
for (left,right;left <= right;++left, --right)
{
puts(arr2);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
Sleep(1000);
}
puts(arr2);
return 0;
}
3、编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main() // 用户登录密码系统
{
int i = 0;
char arr1[4]; //注意这里要将数组大小最小定义为4,注意含有\0
char arr2[] = "123";
printf("请输入密码:\n");
for (i = 0; i<3; i++)
{
scanf("%s", arr1);
if (strcmp(arr1, arr2) == 0)
printf("登陆成功\n");
else if (i == 2)
{
printf("密码三次错误,退出程序\n");
break;
}
else
printf("密码错误,请再次输入\n");
}
return 0;
}
4、使用折半查找法,寻找对应内容在数组的下标
折半查找法:设置起初的最大值和最小值每次以中间值判断,若大,将最大值修改,若小,同样修改
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int binsearch(int input, int arr[], int len) //折半查找法
{
int left = 0;
int right = len;
int mid = 0;
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] > input)
right = mid-1;
if (arr[mid] < input)
left = mid+1;
if (arr[mid] == input)
break;
}
if (arr[mid] == input)
return mid;
else
return -1;
}
int main()
{
printf("请输入您想查找的数\n");
int arr[] = { 2, 8, 11, 56, 66, 77, 88, 99 };
int input;
scanf("%d", &input);
int len = sizeof(arr) / sizeof(arr[0]); //得到数组的大小
int index = binsearch(input, arr, len);
if (index == - 1)
printf("对不起,查无此数\n");
else
printf("此数在数组的下标为:%d\n", index);
return 0;
}
5、设计一个系统,可以输入一段字符串,将大写字母换小写,小写字母换大写,数字消除
#include <string.h>
#include <stdio.h>
int main() // 大小写转换系统
{
char arr[100] = { 0 };
int i = 0, k = 0;
gets(arr);
k=strlen(arr);
for (i = 0; i<k; i++)
{
if (arr[i] >= 'a'&& arr[i] <= 'z')
putchar(arr[i]-32);
if (arr[i] >= 'A'&& arr[i] <= 'Z')
putchar(arr[i]+32);
if (arr[i] >= '0'&& arr[i] <= '9')//判断字符为数字
{
continue;
}
}
return 0;
}
6、设计一个猜数字游戏
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void manu() //菜单函数
{
printf("欢迎参与参数游戏,范围0-100\n");
printf("规则:\n");
printf("系统将随机给出一个数,您需要去猜此数为多少\n");
printf("系统每次会提示您所给的数大于还是小于这个数,直到您猜对为止");
printf("准备好就开始吧\n");
}
int main() //猜字游戏
{
srand((unsigned int)time(NULL));
int k = 1; //定义一个变量k初值为1
while (k) //以k的值判断是否结束游戏
{
int value = 0, i, j = 0;
value = rand() % (100 + 1 - 0) + 0;//随机数的产生:int value=rand()%(MAX+1-MIN)+MIN
manu();
do
{
scanf_s("%d", &i);
j++;
if (i > value)
printf("您输入的数大了QAQ\n");
if (i < value)
printf("您输入的数小了QWQ\n");
} while (i > value || i < value);
printf("恭喜您,猜对了,您仅仅用了%d次哦\n", j);
printf("输入1重新开始游戏,输入2关闭游戏\n");
scanf_s("%d", &k); //用户选择继续游戏还是结束游戏
switch (k)
{
case 1:
k = 1; break;
case 2:
k = 0; break;
default:
printf("请输入1或0,1重新开始,0退出");
break;
}
}
return 0;
}
到此关于分支和循环语句细讲结束,下篇博文将讲述函数内容,感谢阅读
上一篇: pyltp的环境搭建和外部词典分词、外部词典词性标注
下一篇: 自然语言处理:中文分词