C语言第四课:分支和循环

分支语句

1.if语句

//多分支

if(表达式1)
        语句1;
else if (表达式2)
语句2;
else
语句3;

注意:如果程序里有多个if,想清楚else跟哪个if对应

左边的程序else对应错误,无法打印任何东西。右边正确

2.switch语句:实现多分支的情况

int day = 0;
    scanf("%d", &day);
    switch (day)//()内一定得是整型变量
    {
    case 1://case 整型常量表达式:
        printf("星期1\n");
        break;//停止循环(不一定句句后面加,如果上方程序都是一个意思的话,case后再加break)
    case 2:
        printf("星期2\n");
        break;
    case 3:
        printf("星期3\n");
        break;
    以此类推

3.default语句:如果表达的值跟case标签的值都不匹配,可用default

格式:default:
        printf("输入错误\n");
        break;//在每个switch语句里都放一条default子句是个好习惯,注意在后面加个break

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", m, n);
    return 0;

问m=?n=?

答案m=5 n=3

 case 2:n++;//此时n=2
    case 3:
        switch (n)//这个(n)代表从case n开始,n=2则从case 2开始
        {case 1:n++;
    case 2:m++; n++; break;

循环语句

1.while循环

while (表达式)//表达式若为数字,如果为真则循环执行 注:0为假,非0为真

int i = 1;
    while (i <= 10) {

        printf("%d ", i);
        i++;
    }
    return 0;

    int i = 0;
    while(i<=10){
        i++;
        if (i == 5)
            continue;//本次循环中continue后面的代码不会执行,而是直接跳转到while语句判断部分
        printf("%d ", i);
    }
    return 0;//打印出来的是

补充getchar

int ch = getchar();//getchar获取一个字符
    putchar(ch);//输出这个字符
    printf("%c\n", ch);//结果与putchar相同

int ch = 0;
    while ((ch = getchar()) != EOF)//EOF为end of file结束文件
    {
        putchar(ch);

如何终止循环:可以按CTRL+Z

int main()
{
    int ret = 0;
    int ch = 0;
    char password[20] = { 0 };//
    printf("请输入密码");
    scanf("%s", password);//输入密码并存放在password数组中
    while ((ch = getchar() )!= '\n')//输入后的回车相当于\n(根据ASCⅡ码,\n = 10),
        //用这个getchar先吸收掉\n,密码中若有出现空格类字符会占据缓冲区,用getchar吸出
    {
        ;
    }
    printf("确认密码(Y/N):>");
    ret = getchar();
    if (ret == 'Y')
        printf("确认成功\n");
    if (ret == 'N')
        printf("失败咯\n");
    return 0;
}

2.for循环

for(表达式1;表达式2;表达式3)

循环语句;

表达式1为初始化部分,用来初始化变量。

表达式2为条件判断部分,用于判断循环时候终止。

表达式3为调整部分,用于循环部分的调整

优势(相比于while循环)

while循环中,三个部分中间间隔可能过长,会出现漏掉或者书写不清楚的情况

int i=0;//初始化

while(i<10)//条件

i++;//调整

for循环中把以上三个部分放在一起(以下是输入1到10之间的数字)

int main()
{
    int i = 0;
    for (i = 1; i <10; i++)
    {
        printf("%d ", i);
    }
    return 0;
}

再举个例子

 int main()
{
    int i = 0;
    for (i = 1; i <=10; i++)
    {
        if (i == 5)
            continue;//5的时候不打印,跳过5打印5后面的数字
        printf("%d ", i);
        }
    return 0;//打印结果为1到10
}

int main()
{
    int i = 1;
    while (i <= 10)//1
    {
        if (i == 5)//2
            continue;
        printf("%d ", i);
        i++;/*当i=5时,这一步骤无法被执行,陷入死循环(在1和2之间反复循环),这也是while的一个弊端,三部分太散容易犯错*/
    }
    return 0;//打印结果为1到4
}

注意:(1).不可在for循环里改变循环变量,防止for循环失去控制

(2).建议采用前闭后开的写法

 for (i = 1; i <10; i++)

(3)for循环的初始化,调整,判断都可以省略,但如果被省略,那判断就是恒为真,造成死循环

3.do while循环

int i = 1;
    do
    {
        printf("%d ", i);
        i++;
    } while (i <= 10);
    return 0;

 1.int main()
{
    int ret = 1;
    int i = 0;
    int n = 0;
    scanf("%d", &n);

    for (i = 1; i <= n; i++)
    {
        ret = ret * i;
    }
    printf("ret=%d\n", ret);
    return 0;
}

2.int main()
{
    int ret = 1;
    int n = 0;
    int sum = 0;
    for (n = 1; n <= 10; n++)
    {
        ret = ret * n;
        sum = sum + ret;
    }
    printf("sum=%d\n", sum);
    return 0;
}

 3.第一种方法:硬着头皮找,可能要找n次

int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10};
    int k = 7;//写一个代码在有序数组中找到7
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);/*sizeof(arr)是求arr这个数组有多少字节的(总),sizeof(arr[0])则是求下标为0的那个成员有多少字节(个体),sizeof(arr)/sizeof(arr[0]) 可得为求出数组成员的个数*/
    for (i = 0; i <sz; i++)
    {
        if (k == arr[i])
        {
            printf("找到了,下标是:%d/n", i);
            break;
        }
    }
        if (i == sz)
            printf("找不到");
    return 0;

第二种方法:折半查找算法,即二分查找算法

int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int k = 7;
    int left = 0;//左下标
    int sz = sizeof(arr) / sizeof(arr[0]);
    int right = sz - 1;//右下标
    
    while (left<=right)
    {
        int mid = (left + right) / 2;
        if (arr[mid] > k)
        {
        right = mid - 1;
        }
        else if (arr[mid] < k)
        {
        left = mid + 1;
        }
        else
        {
        printf("找到了,下标是:%d\n", mid);
        break;
        }
    }
    if (left > right)
        printf("找不到");
    return 0;

4.#include<stdio.h>
#include<string.h>
#include<windows.h>//Sleep函数引用的库函数
#include<stdlib.h>//system函数
//welcome to xxx...
//#################
//w###############.
//we#############..
//.....
//welcome to xxx...
int main()
{
    char arr1[] = "welcome to xxx...";
    char arr2[] = "#################";
    int left = 0;
    //int right = sizeof(arr1) / sizeof(arr1[0])-2;
    //char arr[]="abc";
    //[a b c \0(字符串结尾标志)]
    // 0 1 2 3
    //最后一个.的位置对应c,所以得-2
    int right = strlen(arr1)-1;
    while (left <= right)
    {
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%s\n", arr2);
        //休息一秒
        Sleep(1000);
        system("cls");//system是执行系统命令的一个函数,cls为清空屏幕
        left++;
        right--;
    }
    return 0;
}

5.#include<stdio.h>
#include<string.h>
int main()
{
    int i = 0;
    char password[20] = { 0 };
    for(i=0;i<3;i++)
    {
        printf("请输入密码:>");
        scanf("%s",password);
        if (strcmp(password ,"123456")==0)//不能用==来比较两个字符串是否相等,应该用库函数-strcmp(string compare)
        {
            printf("登录成功\n");
            break;
        }
        else 
        {
            printf("密码错误\n");
        }
    }
    if (i == 3)
            printf("三次密码均错误,请退出\n");
        return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值