13.while循环 & for循环 & do while循环

本文详细介绍了C语言中的while、do-while和for循环结构,getchar函数的用法,以及字符串操作如scanf、printf和strcmp。还涉及了循环体内的条件控制和数组操作,包括阶乘计算和二分查找算法示例。
摘要由CSDN通过智能技术生成

一:while循环

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

循环结构的三种:
1.while
2.do while
3.for

1.while
与if语句非常相似
int main() //语法结构
{
    while (1)
        printf("hehe\n");

    return 0;
}

int main()
{
    int i = 1;
    while (i <= 10)          //()里的是判断表达式,expr的意思,stmt是语句的意思
    {
        if (i == 5)
            break;              //在while循环中,break用于永久的终止循环。
                                    //当i == 5时,i就break了,即跳出whlie循环。
            continue;         //在while循环中,continue的作用是跳过本次循环continue后面的代码直接去判断continue后面的代码,看是否进行下一次循环 
                                   //输出结果是1 2 3 4后死循环
        printf("%d ", i);
            i++;
    }
    return 0;
}

get char()的用法:
int main()
{
                                    //EOF - end of file - 文件结束标志
    
    int ch = getchar();
                                    //printf("%c\n", ch);
    putchar(ch);            //输出一个字符
    return 0;
}

//                                                缓冲区
int main()                           //getchar     A\n         键盘
{
    int ch = 0;
                                          //Ctrl+z - getchar 读取结束

    while ((ch = getchar()) != EOF)
    {
        putchar(ch);
    }

    return 0;
}

上面代码运用的例子:
int main()
{
    char password[20] = { 0 };
    printf("请输入密码:>");
    scanf("%s", password);                  //数组本身就是个地址,不需要取地址。
    printf("请输入密码(Y/N):>");
    //清理缓冲区
    //getchar();                                      //处理 '\n'
    int tmp = 0;
    while ((tmp = getchar()) != '\n')        //处理字符串后面一直到 \n 的字符
    {                                                       //getchar不能取字符串后面的\n和空格,所以要去除,去除方式就左边代码
        ;
    }

    int ch = getchar();
    if (ch == 'Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
    return 0;
}

3打印数字字符的代码
int main()
{
    int ch = 0;
    while ((ch = getchar()) != EOF)
    {
        if (ch < '0' || ch>'9')    //  ||  是或者的意思
            continue;

        putchar(ch);
    }
    return 0;
}

int main()               //while循环的3个部分离得太远不方便修改代码,所以就有for循环
{
    int i = 1;             //初始化
    while (i <= 10)   //判断部分
    {
        printf("%d", i);

        i++;                //调整部分
    }

    return 0;
}

二:for循环

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
    int i = 0;
    for (i = 1; i <= 10; i++)
    {
    /*    if (i == 5)
            break;*/
        if (i == 5)
            continue;   //跳过printf..,重新调整,结果是1234 6789

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

循环体内改变循环变量的例子
int main()             //不可在for循环修改循环变量,防止for循环失去控制
{
    int i = 0;
    for (i = 1;i <= 10; i++);
    {
        printf("%d ", i);
        int j = 0;
        for (j = 0;j <= 10;i++)
        {
            printf("hehe\n");
        }
    }
    return 0;           //结果是死循环打印hehe
}

int mian()
{
    int arr[10] = { 0 };
    int i = 0;
    for (i = 0;i < 10;i++)      //左闭右开的例子,推荐
    {
        printf("%d", arr[i]);
    }
    return 0;
}

int main()
{
    //for循环的三个部分都可以省略,但不建议随便省略
    //判断部分的省略 - 判断部分恒为真
    for (;;)
    {
        printf("hehe\n");
    }
    return 0;
}

int main()
{
    int i = 0;
    int j = 0;
    for (/* i = 0 */;i < 3;i++)
    {
        for (/* j = 0 */; j < 3;j++)
        {
            printf("hehe\n");
        }
    }
    return 0;    //打印结果为3个hehe
}

一道笔试题,求循环了几次:
int main()
{
    int i = 0;
    int j = 0;
    for (i = 0, j = 0;j = 0;j++)
    {
        j++;
    }
    return 0;   //循环0次,j = 0是赋值,不是等于
}

三:do while 循环

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>

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

do while语句例子:    //do while的特点:循环至少要执行一次
int main()
{
    int i = 0;
    do
    {
        //if (i == 5)         break的例子:
        //    break;         到i == 5跳出循环,不是跳出整个语句
        //if (i == 5)         continue的例子:
        //    continue;     到4之后死循环

        printf("%d ", i);
        i++;
    } while (i <= 10);   //注意要有;

    return 0;
}

练习:
1.计算n的阶乘
int main()
{
    int i = 0;
    int n = 0;
    int num = 1;
    printf("n的值为:");
    scanf("%d", &n);
    for (i = 1;i <= n;i++)
    {    
        num *= i;
    }
    printf("%d", num);
    
    return 0;
}

2.计算 1!+2!+3!
int main()       //效率低
{
    int i = 0;
    int n = 0;
    int ret = 1;
    int sum = 0;

    for (n = 1;n <= 3; n++)
    {
        ret = 1;                     //第二个for循环出来ret的值要不变,所以要加个赋值
        for (i = 1;i <= n;i++)  //i的阶乘
        {
            ret *= i;
        }
        sum += ret;
    }

    printf("%d\n", sum);
    return 0;
}

int main()       //效率高
{
    int i = 0;
    int n = 0;
    int ret = 1;
    int sum = 0;

    for (n = 1;n <= 3; n++)
    {
        ret *= n;        //阶乘
        sum += ret;  //阶乘的和
    }

    printf("%d\n", sum);
    return 0;
}

3.二分查找
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int k = 0;
    printf("要查找的数字是:");
    scanf("%d", &k);
    //再arr这个有序的数组中查找k的值
    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;
}

//welcome to china!!!
//###################
//w#################!
//we###############!!
//wel#############!!
//..
//welcome to china!!!
int main()
{
    char arr1[] = "welcome to china!!!";
    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秒,单位是毫秒,引用头文件#include <windows.h>    //新代码
        system("cls");     //清空屏幕                                                //新代码
        left++;
        right--;
    }
    printf("%s\n", arr2);

    return 0;
}

连续输入3次密码,如果错误退出程序
int main()
{
    int i = 0;
    //假设正确的密码是字符串"123456"

    char password[20] = { 0 };
    //abcdef             两个字符串的比较是对应的ASCLL码值的比较
    //abccqqqqq      所以是第一个大于第二个
    //               strcmp('abc' , 'abc')两个字符串相等,则代码为0

    for (i = 0;i < 3;i++)
    {
        printf("请输入密码:>");
        scanf("%s", password);                         //数组本来就是地址,再次提醒
        if (strcmp(password, "123456") == 0)   //err - 两个字符串的比较,不能使用==,应该使用strcmp    //新代码
        {                                                            //strcmp要引用头文件#include <string.h>
            printf("登入成功\n");                          //strlen 和 strcmp 都是用字符串,所以要用头文件#include <string.h>
            break;
        }
        else
        {
            printf("密码错误,请重新输入:>\n");
        }
    }
    if (i == 3)
        printf("三次密码均错误,退出程序\n");

    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值