欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言细讲——分支与循环

程序员文章站 2022-06-12 16:09:47
...

本篇博文开始细讲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;
}

到此关于分支和循环语句细讲结束,下篇博文将讲述函数内容,感谢阅读

相关标签: 作者:小