【C#】分支和循环语句

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文

目录

前言

1、分支语句(选择语句)

1.1.1 if语句

1.2.1 switch语句

2、循环语句

2.1.1 while循环

2.2.1 for循环

2.3.1 do...while()循环

3、练习(熟练掌握)

3.1 折半查找(二分查找)讲解

 4、goto语句

5、拓展

小结


前言

【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#】学习做的一个总结,记录我的学习过程,希望也能够帮助到正在学习的朋友。有什么不足或者建议还请大家提出,孩纸主打一个听劝(第一次写,真的不知道该怎么弄,脑子一片乱麻。哎.......这次内容基本上参照了资料来的,希望下一次能有自己的东西。)

  • 23
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值