C-分支和循环语句-TWO

本文详细介绍了C语言中的for循环和do...while循环的语法和使用,包括初始化、判断、调整部分,以及break和continue语句的作用。通过示例展示了在循环中如何控制流程,并提供了计算阶乘、查找特定数值等实际应用。同时,文章还演示了如何创建一个简单的密码验证程序,并给出了多字符汇聚效果的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FOR循环

 for循环语法:

for (/* 表达式1;表达式2;表达式3 */)
{
    /* 代码(循环语句) */
}

表达式1为初始化部分,用于初始化循环变量

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

表达式3为调整部分,用于循环条件的调整(与 a++; 相似)

例1:打印1~10的数字

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

for循环将初始化、判断、调整放在一起,让代码更明了

break在for循环中的用法和作用与在while循环中相似

continue在if语句中用法:

int main()
{
    int i = 0;
    for (i = 1; i <= 10; i++)  //初始化  判断  调整
    {
        if (i==5)
        {
            continue;
        }
        printf("%d\n", i);  //结果只是没有5,且不会发生死循环
    }
    return 0;
}
int main()
{
    int i = 1;  //初始化
    while (i<=10)  //判断
    {
        if (i==5)
        {
            continue;
        }
        printf("%d\n", i);  //只打印1 2 3 4并陷入死循环
        i++;   //调整
    }
    return 0;
}

上面的for语句和while语句执行顺序为初始化->判断->if语句->调整

在for语句中,continue执行后只跳过了printf语句,再执行调整部分

在while语句中,continue执行后可能还会跳过调整部分,改良:

int main()
{
    int i = 0;
    while (i<=9)
    {
        i++;
        if (i==5)
        {
            continue;
        }
        printf("%d\n", i);
    }
    return 0;
}

for语句的循环控制变量

                建议:不可在for循环体内修改循环变量,防止for循环失去控制

                           建议for语句的循环控制变量的取值采取“前闭后开区间”的写法(不绝对),如:

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int i = 0;
    /* 10次循环/打印,10个元素 */
    for ( i = 0; i < 10; i++)  /* <10就是开,<=就是闭 */
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

for循环的一些变种:

                变种1:

int main()
{
    for (; ;)  //for循环初始化、判断、调整都可省略
    {              //for循环判断部分被省略时,判断条件就是:恒为真
        printf("Oh\n");
    }
    return 0;
}

                变种2:

int main()
{
    int x, y;
    for (x=0, y=0; x<2 && y<5; ++x, y++)
    {
        printf("Oh ");
    }
    return 0;
}

DO...WHILE循环

 语法:

do
{
    /* 代码(循环语句) */
} while (/* 判断语句 */);  //此“;”必须输入

do...while至少循环一次,使用场景有限

例1:打印1~10

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

do...while语句中的break与continue:

int main()
{
    int i = 1;
    do
    {
        if (i==5)
        {
            break;
        }
        printf("%d ", i); //只打印1 2 3 4
        i++;
    } while (i<=10);
    return 0;
}
int main()
{
    int i = 1;
    do
    {
        if (i==5)
        {
            continue;
        }
        printf("%d ", i); //只打印1 2 3 4并陷入死循环
        i++;
    } while (i<=10);
    return 0;
}

break和continue在do...while语句中作用及用法与在while语句中相似

一些使用

计算n的阶乘:

#include <stdio.h>

int main()
{
    int n = 0;
    int i = 0;
    int m = 1;
    scanf("%d", &n);
    for ( i = 1; i <= n ; i++)
    {
        m = i*m;
    }
    printf("%d", m);
    return 0;
}

 计算1!+2!+3!

int main()
{
    int a = 1;
    int b = 1;
    int c = 1;
    int sum = 0;
    for (b=1; b<=3 ; b++)
    {
        for (a=b ; a==b ; a++)
        {
            c=c*a;
        }
        sum = sum + c;
    }
    printf("%d\n", sum);
    return 0;
}

                优化:

int main()
{
    int b = 1;
    int c = 1;
    int sum = 0;
    for (b=1; b<=3 ; b++)
    {
        c=c*b;
        sum = sum + c;
    }
    printf("%d\n", sum);
    return 0;
}

编辑一个密码程序,3次机会:

#include <stdio.h>

int main()
{
    int password = 0;
    int mistake = 0;
    printf("Please enter a 4-digit password\n");
    printf("You have a total of three chances\n");
    for (mistake=2 ; mistake>=0 ; mistake--)
    {
        scanf("%d", &password);
        if (password == 2048)
        {
            printf("You can access\n");
            break;
        }
        else
        {
            printf("Try again,you have %d more chances\n", mistake);
        }
    }
    if (mistake<0)
    {
        printf("Locked\n");
    }
    return 0;
}

                 数组版:

#include <stdio.h>
#include <string.h>

int main()
{
    int i = 0;
    char password[20] = {0};
    for ( i = 0; i < 3; i++)
    {
        printf("Please enter password:>");
        scanf("%s", password);
        if (strcmp(password,"2048") == 0) //==不能直接用来比较两个字符串是否相等
        {                                 //使用strcmp需要用头文件<string.h>
            printf("You can access\n");   //两个字符串相等时=0
            break;                        //第一个字符串更大时>0
        }                                 //第二个字符串更大时<0
        else
        {
            printf("Password is wrong\n");
        }
    }
    if (i == 3)
    {
        printf("Locked\n");
    }
    return 0;
}

在有序数组{1,2,3,4,5,6,7,8,9,10}中找到一个数:

                逐步查找:

#include <stdio.h>

int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int m = 0;
    int i = 0;
    int sz = sizeof(arr)/sizeof(arr[0]);
    scanf("%d", &m);
    for ( i = 0; i <= sz ; i++)
    {
        if (m == arr[i])
        {
            printf("Found,subscript is %d\n", i);
            break;
        }
        
    }
    if (i >= sz)
    {
        printf("Can't find\n");
    }
    return 0;
}

                二分查找:

#include <stdio.h>

int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int k = 0;
    int sz = sizeof(arr)/sizeof(arr[0]); //计算元素个数
    int left = 0; //左下标
    int right = sz-1; //右下标
    int mid = 0;
    scanf("%d", &k);
    while (left <= right)
    {
        mid = (left+right)/2;
        if (arr[mid] > k)
        {
            right = mid-1;
        }
        else if (arr[mid] < k)
        {
            left = mid+1;
        }
        else
        {
            printf("Found,subscript is %d\n", mid);
            break;
        }
    }
    if (left>right)
    {
        printf("Can't find\n");
    }
    return 0;
}

编写代码,演示多个字符从两边浮现,向中间汇聚,效果如下:

############

H##########!

He########d!

Hel######ld!

Hell####rld!

Hello##orld!

Hello,World!

代码:

#include <stdio.h>
#include <string.h>
#include <windows.h>

int main()
{
    char arr1[] = "Hello,World!"; //整型数组无需考虑\0问题,但字符或字符数组
    char arr2[] = "############"; //要考虑\0是否会引起下标加1
    int left = 0;
    int right = strlen(arr1)-1;  //strlen计算数组长度,计算结果不包含\0
    while (left<=right)
    {
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%s\n", arr2);
        Sleep(1000);  //使用Sleep函数需要头文件<windows.h>,1000指一千毫秒
        left++;
        right--;
    }
    return 0;
}

                优化执行结果的代码:

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>

int main()
{
    char arr1[] = "Hello,World!"; //整型数组无需考虑\0问题,但字符或字符数组
    char arr2[] = "############"; //要考虑\0是否会引起下标加1
    int left = 0;
    int right = strlen(arr1)-1;  //strlen计算数组长度,计算结果不包含\0
    while (left<=right)
    {
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%s\n", arr2);
        Sleep(1000);  //使用Sleep函数需要头文件<windows.h>
        system("cls");  //cls是清空屏幕的意思,使用system需要头文件<stdlib.h>
        left++;
        right--;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值