C语言入门(循环和分支语句、goto语句)

C语言是结构化的程序设计语言,分为:顺序结构、选择结构、循环结构。

一、switch语句

switch语句也是一种分支语句,常常用于多分支的情况。

比如:输入1,打印星期一;输入2,打印星期二……输入7,打印星期天。这种如果用if...else if...else的形式就过于复杂了,这种类型就适用于switch语句。

switch语句的形式             语句项
switch(整形表达式)           语句项一般是case语句
{   语句项;                  case (整形常量表达式):
}                                 语句
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{   int day = 0;
	scanf("%d", &day);
	switch (day)
	{case 1:
		printf("星期一\n");
		break;  //在switch语句中,没办法直接实现分支,搭配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;
}

下面展示一个switch语句的练习:

输出结果为:m=5,n=3

需要说明的是break跳出的是自己所在的switch

 二、while循环

在屏幕上打印1-10的数字                                  在while循环中,break用于永久的终止循环       

                            

 在while循环中,continue的作用是跳过本次循环continue后边的的代码

include<stdio.h>
int main()
{
	int a = 1;
	while (a <= 10)
	{
		if (a == 5)
			continue;  //经过监视操作发现,当a值为5时,代码陷入死循环,12344……
		printf("%d",a);
		a++;
	};
	return 0;

下面来介绍getchar(获取一个字符)和putchar(输出一个字符)的相关操作

如果读取正确的话,getchar返回的是读取字符的ASCII值,读取错误的话会返回EOF(end-of-file)-文件结束标志

#include<stdio.h>
int main()
{  char ch=0;
   while((ch=getchar())!=EOF)
   putchar(ch);
   return 0;
}

注:当输入ctrl+z时程序结束

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{  char password[20] = { 0 };
	printf("请输入密码\n");
	scanf("%s", password);
	printf("请确认密码(Y/N)\n");
    int tmp = 0 ;
	 while((tmp=getchar())!='\n')//此处应用循环是为了清理缓冲区,避免读取\n,直接导致程序结束
     {                           //另:用循环来处理也可以处理空格
        ;
     }
	int ch = getchar();
		if (ch == 'Y')
			printf("确认成功\n");
		else
			printf("确认失败\n");
	return 0;
}

这是getchar的应用场景。

三、for循环

while循环由初始部分、判断部分、调整部分三部分组成,在后期程序修改时较难查找,因此引入if循环。

//在屏幕上打印1-10
#include<stdio.h>
int main()
{  int i = 0 ;
   if(i=1 ; i<=10 ; i++)
   {
      printf("%d",i);
   };
   return 0;
}

for语句的注意事项:1.不可在for循环体内修改循环变量,防止for循环失去控制。

                                  2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

下面来一个for循环嵌套的试题:

最终运行结果为9

四、do...while循环

do语句的特点:循环至少执行一次,使用的场景有限,所以不适合经常使用。

下面介绍do...while循环的使用方法:

#include<stdio.h>
int main()
{   int a = 0;
    do
    {
        printf("开心\n");
        a++;
    } while (a <= 10);
    return 0;
}

五、几道经典的关于循环语句的试题

1. 用循环语句完成:计算n的阶乘

整体思路:在数据明确时,运用for循环比较简单

//计算n的阶乘
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 0;
	int n = 0;
	scanf("%d", &n);
	int mul = 1;
	for (a = 1; a <= n; a++)
	{
		mul *= a;
	};
	printf("%d\n", mul);
	return 0;
}

在C语言中,"*="是一个复合赋值运算符,用于将左操作数乘以右操作数,并将结果赋值给左操作数。例如,"a *= 6"的意思是将a乘以6,并将结果赋值给a。

2.计算1!+2!+3!

如左图,1!+2!+3!=1+2+6=9!=15,由此可以看出程序不正确,经过分析得出:mul在计算完2的阶乘后,并没有把保留下来的返回值2重置为1,导致3!的算法变成了2*1*2*3=12,所以导致最终运行结果出错。解决方法如右图:在一次循环完成后让mul重置为1。

3.在一个有序数组中查找某个数字

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int k = 1;
	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)//当left>right时,数组内所有数据搜索完毕
	{
		printf("找不到\n");
	}

	
	return 0;
}

4.编写代码,演示多个字符从两端移动,向中间汇聚

以打印”welcome to world “为例:

#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
	 char arr1[] =  "welcome to world!!!" ;
	char arr2[] =  "##################\0" ;
	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);//休眠一秒
        system("cls");//清空屏幕
		left++;
		right--;
	}

    printf("%s\n",arr2);
   return 0;
}

为了加强动画效果,可以加入Sleep函数,该函数需要引用头文件#include<windows.h> 

5.模拟登录系统,密码三次输入错误锁定

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
    int a = 0;
    char password[20] = { 0 };
    for (a = 0; a < 3; a++)
    {
        printf("请输入密码:>");
            scanf("%s",  password);//数组名不用取地址,数组名本身就是地址
            if (strcmp(password, "123456") == 0)
            {
                printf("密码正确\n");
                break;
            }
            else
            {
                printf("密码错误,请重新输入\n");
            }
    }
    if (a == 3)
    {
        printf("密码三次输入错误,已锁定\n");
    }
   
    return 0;
}

6.随意输入几个数字,使它们从大到小依次排列

输入数字,从大到小依次排列
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d %d %d", &a, &b, &c);
	if (a < b)
	{   int tmp = a;
		a = b;
		b = tmp;
	}
	if (a < c)
	{
		int tmp = a;
		a = c;
		c = tmp;
	}
	if (b < c)
	{	int tmp = b;
		b = c;
		c = tmp;
	}

	printf("%d %d %d\n", a, b, c);
	return 0;

7.输入两个数,求这两个数的最大公约数

//输入两个数,求这两个数的最大公约数
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int max = 0;
	if (a > b)
	{
		max = b;
	}
	else
	{
		max = a;
	}
	for (max ; max <= 100; max--)
	{
		if (a % max == 0 && b % max == 0)
		{
			printf("最大公约数是:%d\n", max);
			break;
		}
		
	}//最小公倍数是m*n/最大公约数
	return 0;
}

六、goto语句

goto语句可用于循环,但是多个goto语句连用会造成程序混乱。

代码陷入死循环

用goto语句写一个关机程序

goto 语句只能在一个函数范围内跳转,不能跨函数。如下图:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值