【初级】2. 分支和循环


文章说明:该文章的知识点源于B站上比特鹏哥的C语言课程,结合鹏哥上课的讲义、课堂代码以及自己的理解整理形成。

C语言是结构化的程序设计语言!

  • 顺序结构 -> 代码本身就带有顺序属性
  • 选择结构 -> 分支语句
  • 循坏结构 -> 循环语句

**什么是语句:**C语言中由一个分号 ; 隔开的就是一条语句。

printf("hehe");
1+2;

1. 分支语句

1.1 if 语句

语法结构:
if(表达式)
    语句;

//双分支
if(表达式)
    语句1;
else
    语句2;

//多分支    
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;
#include <stdio.h>
int main()
{
    if(表达式)
    {
        语句列表1}
    else
    {
        语句列表2}
    return 0;
}

这里的一对 { }就是一个代码块

#include <stdio.h>
int main()
{
    int age = 0;
    scanf("%d", &age);
    if (age<18)
    {
        printf("少年\n");
    }
    else if (age>=18 && age<30) // 18 <= age < 30
    {
        printf("青年\n");
    }
    else if (age>=30 && age<50) // 30 <= age < 50
    {
        printf("中年\n");
    }
    else if (age>=50 && age<80) // 50 <= age < 80
    {
        printf("老年\n");
    }
    else
    {
        printf("老寿星\n");
    }
}

在C语言中如何表示真假?

0表示假,非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匹配的。代码的书写方法和风格非常重要。

//if书写形式的对比

//代码1
if (condition) {
    return x;
}
return y;

//代码2 -> 可读性更好
if(condition)
{
    return x;
}
else
{
    return y;
}

//代码3
int num = 1;
if (num == 5)
{
    printf("hehe\n");
}

//代码4 -> 容易发现错误
int num = 1;
if (5 == num)
{
    printf("hehe\n");
}

代码2和代码4更好,逻辑更加清晰,不容易出错。

1.2 switch语句

switchcase 后面只能是整型表达式

switch(整型表达式)
{
    语句项;
}	
//语句项是一些case语句:
case 整形常量表达式:
    语句;
#include <stdio.h>
int main()
{
    int day = 0;
    switch (day)
    {
    case 1printf("星期一\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;
    default:
        printf("输入错误\n");  
        break;
    }
    return 0;
}

在最后一个 case 语句的后面加上一条 break 语句。(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。

其中的 casedefault 语句的顺序,在满足需求的条件下,随意调换顺序都没有影响。

#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); //输出结果: m = 5, n = 3
    return 0;
}

2. 循环语句

影响循环的因素:

  1. 初始化
  2. 判断条件
  3. 调整部分

2.1 while 循环

//break 代码实例
#include <stdio.h>
int main()
{
    int i = 1;
    while (i <= 10)
    {
        if (i == 5)
            break;
        printf("%d ", i); //输出结果: 1 2 3 4
        i = i+1;
    }
    return 0;
}

在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

while 循环中, break 用于永久的终止循环。

//continue
#include <stdio.h>
int main()
{
    int i = 1;
    while (i <= 10)
    {
        if (i == 5)
            continue;
        printf("%d ", i); //输出结果: 1 2 3 4 后进入死循环
        i++; // i == 5时,printf和i++都不会执行
    }
    return 0;
}

continue 是用于终止本次循环的,也就是本次循环中 continue 后边的代码不会再执行。而是直接跳转到 while 语句的判断部分。进行下一次循环的入口判断。

//这里的代码适当的修改是可以用来清理缓冲区的.
#include <stdio.h>
int main()
{
    int ch = 0;
    while ((ch = getchar()) != EOF) //getchar函数的返回值是int类型 
       putchar(ch);
    return 0;
}

回车 \n 会触发 scanf 去读取缓存区里面的内容。

#include <stdio.h>
int main()
{
    char password[20] = {0};
    printf("请输入密码:>");
    scanf("%s", password);
    printf("请确认密码(Y/N):>");
    int ch = getchar();
    if (ch == 'Y')	printf("确认成功\n");
    else			printf("确认失败\n");
    return 0;
}

//输入123456,按下回车 -> 缓冲区:123456\n
//请输入密码:123456
//确认失败 -> 立马蹦出来 -> 原因:缓冲区还剩下\n,直接读取到ch当中。
//这个代码的作用是:只打印数字字符,跳过其他字符
#include <stdio.h>
int main()
{
    int ch = 0;
    while ((ch = getchar()) != EOF) //EOF就是-1,不是ASCII值
    {
         if (ch <0|| ch >9)
            continue;
         putchar(ch);
    }
    return 0;
}

2.2 for循环

for(表达式1; 表达式2; 表达式3)
    循环语句;

表达式1:初始化部分,用于初始化循环变量的。
表达式2:条件判断部分,用于判断循环时候终止。
表达式3:调整部分,用于循环条件的调整。

int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while (i<=10)//判断部分
{
    printf("hehe\n");
    i++;//调整部分
}

//实现相同的功能,使用for
for (i=1; i<=10; i++)
{
    printf("hehe\n");
}

在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高

在for循环中也可以出现 breakcontinue ,他们的意义和在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; 	//跳过下面的内容,跳转到for循环中的i++语句
        printf("%d ",i);
    }
    return 0;
}

注:

  1. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制。
  2. 建议 for 语句的循环控制变量的取值采用“前闭后开区间”写法。 for(i=0; i<10; i++)
//for循环的变种:
#include <stdio.h>
int main()
{
    //代码1 -> 部分省略(慎重省略)
    for (;;)
    {
        printf("hehe\n");
    }
    //->for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。
    
    //代码2 -> 慎重省略
    int i = 0;
    int j = 0;
    //如果省略掉初始化部分,这里打印多少个hehe?
    for (i=0; i<10; i++)
    {
        for (j=0; j<10; j++) //省略这行的j=0,只打印3次hehe
        {
            printf("hehe\n");
        }
    }

    //代码3-使用多余一个变量控制循环
    int x, y;
    for (x=0, y=0; x<2 && y<5; ++x, y++)
    {
        printf("hehe\n");
    }
    return 0;
}
//请问循环要循环多少次? -> 0次
#include <stdio.h>
int main()
{
    int i = 0;
    int k = 0;
    for (i=0,k=0; k=0; i++,k++) //注意判断条件的k=0,k被赋值为0
        k++;
    return 0;
}

2.3 do…while 循环

do
    循环语句;
while(表达式);

循环至少执行一次,使用的场景有限,所以不是经常使用。

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        printf("%d\n", i++);
    }while (i<10);
    return 0;
}

在do…while循环中也可以出现 breakcontinue ,他们的意义和在while‘循环中是一样的。

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        if(5 == i)
            break;
        printf("%d\n", i++);
    }while(i<10);
    return 0;
}

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        if(5 == i)
            continue;
        printf("%d\n", i++);
    }while(i<10); //continue跳到while里面的判断条件
    return 0;
}

有序数组的查找使用二分查找法(折半查找),代码如下:

int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int left = 0;
    int right = sizeof(arr)/sizeof(arr[0])-1;
    int key = 7;
    int mid = 0;
    while (left<=right)
    {
        mid = (left+right)/2;
        if (arr[mid]>key)
        {
            right = mid-1;
        }
        else if (arr[mid] < key)
        {
            left = mid+1;
        }
        else
            break;
    }
    if (left <= right)
        printf("找到了,下标是%d\n", mid);
    else
        printf("找不到\n");
}
//实现一个二分查找函数:
int bin_search(int arr[], int left, int right, int key)
{
    int mid = 0;
    while (left<=right)
    {
        mid = (left+right)>>1;
        if (arr[mid]>key)
        {
            right = mid-1;
        }
        else if (arr[mid] < key)
        {
            left = mid+1;
        }
        else
        {
            return mid;//找到了,返回下标
        }
    }
    return -1;// 找不到
}
//编写代码,演示多个字符从两端移动,向中间汇聚。
#include <stdio.h>
#include <string.h>
#include <Windows.h>

int main()
{
    char arr1[] = "welcome to bit...";
    char arr2[] = "#################";
    int left = 0;
    int right = strlen(arr1) - 1;
    printf("%s\n", arr2);
    //while循环实现
    while (left <= right)
    {
		Sleep(1000);    //睡眠1秒
        system("cls");  //清空屏幕
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        left++;
        right--;
        printf("%s\n", arr2);
    }
    return 0;
}
//猜数字游戏实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void menu()
{
    printf("**********************************\n");
    printf("***********  1.play     **********\n");
    printf("***********  0.exit     **********\n");
    printf("**********************************\n");
}
//RAND_MAX--rand函数能返回随机数的最大值。
void game()
{
    int random_num = rand()%100+1;
    int input = 0;
    while (1)
    {
        printf("请输入猜的数字>:");
        scanf("%d", &input);
        if(input > random_num)
        {
            printf("猜大了\n");
        }
        else if(input < random_num)
        {
            printf("猜小了\n");
        }
        else
        {
            printf("恭喜你,猜对了\n");
            break;
        }
    }
}
int main()
{
    int input = 0;
    srand((unsigned)time(NULL));
    do
    {
        menu();
        printf("请选择>:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            break;
        default:
            printf("选择错误,请重新输入!\n");
            break;
        }
    }while(input);
    return 0;
}

2.4 goto 语句

多层循环这种情况使用 break 是达不到目的的。它只能从最内层循环退出到上一层的循环。

最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。使用 goto 一次跳出两层或多层循环

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

for(...)
    for(...)
    {
        for(...)
        {
            if(disaster)
                goto error;
        }
    }
    …
error:
    if(disaster)
         // 处理错误情况
//该例子可以使用循环的实现方式来替换掉goto语句
#include <stdio.h>
int main()
{
    char input[10] = {0};
    system("shutdown -s -t 60");
again:
    printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
    scanf("%s", input);
    if(0 == strcmp(input, "我是猪"))
    {
        system("shutdown -a");
    }
    else
    {
        goto again;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: “WPF初级教程.pdf”是一本关于WPF(Windows Presentation Foundation)初级教程的PDF文件。WPF是微软开发的一种用于创建Windows应用程序的框架。这个教程的目的是帮助初学者学会如何使用WPF框架来构建用户界面、管理布局、处理事件和数据绑定等。 这本教程通常会从介绍WPF的基础知识开始,例如控件、布局、样式和模板等。接着,学习者将会学习如何使用XAML(可扩展应用程序标记语言)来创建界面,以及如何使用C#或其他.NET语言与界面进行交互。 教程中会涵盖一些常见的WPF控件,例如按钮、文本框、列表框、下拉菜单等,并且教你如何对这些控件进行样式和行为的定制。此外,教程还会涉及到WPF的动画、转换和绑定等高级主题。 通过学习这本教程,初学者将能够理解WPF的基本概念和原理,并能够使用WPF来创建简单的Windows应用程序。然而,需要注意的是,WPF是一个非常庞大和复杂的框架,仅仅依靠这本初级教程可能无法覆盖所有细节和高级特性。 因此,为了更深入地学习和掌握WPF,学习者可能需要更多的其他资源和实践经验。这本初级教程可以作为一个入门的起点,但是要想提高技能并开发更复杂的应用程序,需要继续学习和探索WPF的更多高级特性和最佳实践。 ### 回答2: 《WPF初级教程.pdf》是一本介绍WPF(Windows Presentation Foundation)初级知识的教程。WPF是一种可以用于创建Windows应用程序的开发框架,它提供了丰富的用户界面设计工具和功能,能够实现更加现代、灵活和可定制化的用户体验。 这本教程的目的是帮助读者快速入门WPF开发。书中首先介绍了WPF的基本概念和架构,包括WPF应用程序的结构、XAML语法以及WPF的核心组件和控件。读者通过学习这些内容,能够对WPF的工作原理有一个基本的了解。 接着,教程逐步引导读者学习如何使用WPF创建各种界面元素,包括窗口、容器、按钮、文本框、列表框等。通过实际的案例和示例代码,读者可以了解如何使用XAML来定义界面元素和布局,并学会如何通过C#代码来处理用户交互和界面逻辑。 教程还介绍了WPF的样式和主题,包括如何为界面元素定义样式和模板,以及如何应用和切换不同的主题。这些内容帮助读者了解如何创建个性化、美观的界面。 此外,教程还包括了一些进阶主题,如数据绑定、命令系统、动画和3D图形等。这些内容能够帮助读者进一步提升WPF开发的技能和能力,实现更加复杂和高级的功能。 总之,《WPF初级教程.pdf》是一本适合初学者的教程,通过系统、清晰的介绍,帮助读者掌握WPF的基本知识和技巧,为进一步学习和开发WPF应用奠定基础。读者可以利用这本教程来快速入门WPF开发,并通过实践和深入学习,不断提升自己的技能。 ### 回答3: “WPF初级教程.pdf”是一本关于WPF(Windows Presentation Foundation)初级教程的电子书。WPF是微软开发的一种用于创建Windows应用程序界面的技术。这本教程旨在帮助初学者了解WPF的基本概念和使用方法。 首先,这本教程会简要介绍WPF的背景和优势。它会解释WPF与传统Windows Forms应用程序的区别,如可扩展性和可重用性。此外,教程还会强调WPF的XAML(可扩展应用程序标记语言)语法,它是用于定义WPF界面的标记语言。 教程还会详细介绍WPF的核心概念,如控件、布局和样式。它会解释如何使用WPF的内置控件库,如按钮、文本框和列表框,并演示如何通过WPF的布局系统来设计灵活的界面。此外,教程还会介绍如何创建和应用样式,以及如何使用数据绑定来实现界面与数据的交互。 在学习WPF的过程中,这本教程还提供了一些实践项目和练习题,帮助读者巩固所学的知识。例如,读者可以尝试创建一个简单的WPF界面,或者使用数据绑定将界面与后端数据源连接起来。 总之,这本WPF初级教程是为那些想要入门WPF技术的初学者而设计的。通过学习这本教程,读者可以获得基本的WPF知识,并能够开始使用WPF来创建自己的Windows应用程序界面。这本教程提供了足够的实例和练习,帮助读者巩固所学内容,并为进一步学习和深入研究WPF奠定了坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值