分支和循环语句(2)

简介: 分支和循环语句(2)

for循环:

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

//表达式123分别为初始化、判断、调整部分

//初始化、判断、调整部分均可以省略

//如果把判断部分省略了,就意味着判断为真

//建议大家不要轻易省略

省略初始化部分

//省略初始化部分
int main()
{
    int i = 0;
    int j = 0;
    for (; i < 3; i++) {
        for (; j < 3; j++) {
            printf("hehe\n");
        }
    }
}

运行结果:

只打印三次的原因是当i=0进入for(int ...)循环中,j循环三次调整为3时,再次进入for(i)循环i=1时此时j的值仍然是3,所以不执行printf语句,再次进入for(i)循环也是这样。

break和continue在for循环中

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

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

continue

break和continue使用范围总结

break:for 循环;while循环; do循环; switch循环

continue:for循环; while循环

do while 语句的语法

do
    循环语句;
while(表达式);
//使用do...while..语句打印1-10
int main() {
    int i = 1;
    do {
        printf("%d", i);
        i++;
    } while (i <= 10);
    return 0;
}

运行结果:

执行语句的次数要比判断语句的次数多一次,因为最后一次判断了但是不执行

//使用do...while..语句打印1-10加入break
int main() {
    int i = 1;
    do {
        if (i == 5)
            break;
        printf("%d", i);
        i++;
    } while (i <= 10);
    return 0;
}

当i=5时跳出do while循环

运行结果:

//使用do...while..语句打印1-10加入continue
int main() {
    int i = 1;
    do {
        if (i == 5)
            continue;
        printf("%d", i);
        i++;
    } while (i <= 10);
    return 0;
}

当i=5时执行continue语句,不执行下面的代码,再进入do循环,i还是5,由此反复进入死循环

运行结果:

练习:

  • 产生n的阶乘
int main() {
    int n = 0;
    //输入
    scanf("%d", &n);
    //计算n的阶乘
    int i = 0;
    int ret = 1;//ret代表累计相乘的结果
    for (i = 1; i <= n; i++) {
        ret = ret * i;
    }
    printf("%d\n", ret);
    return 0;
}

2.计算1!+2!+3!+.....+10!

int main() {
    int n = 0;
    //输入
    //计算n的阶乘
    int i = 0;
    int ret = 1;
    int sum = 0;
    for (n = 1; n <= 10; n++) {
        //计算n的阶乘
        //每一次求阶乘的时候都要更新ret,如果不更新就会在每一次的ret的结果上累乘
        ret = 1;
        for (i = 1; i <= n; i++) {
            ret *= i;//也就是ret=ret*i;
        }
        sum = sum + ret;
    }
    printf("%d\n", sum);
}

3.在一个有序数组中查找某个数字n

遍历法:

//遍历法
int main() {
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    //            0 1 2 3 4 5 6 7 8 9
    int k = 7;//要查找的数字
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);//strlen是求字符串长度的,不能用它
    int flag = 0;
    for (i = 0; i < sz; i++) {
        if (k == arr[i])
        {
            printf("找到了,下标是:%d\n", i);
            break;
        }
    }
    if (i == sz)
        printf("找不到\n");
    return 0;
}

折半查找算法(mid=left+right)/2

例如查找k=7;

int main() {
    int arr[ ] = { 1,2,3,4,5,6,7,8,9,10 };
    //             0 1 2 3 4 5 6 7 8 9
    int k = 7;//要查找的数字
    int sz = sizeof(arr) / sizeof(arr[0]);//strlen是求字符串长度的,不能用它
     //折半查找,前提是数组有序
    int left = 0;
    int right = sz - 1;
    int flag = 0;
    while (left<=right) {
        int mid = (left + right) / 2;//当lfet和right太大时,加和的结果就会可能溢出程序所允许的最大数值,导致丢失一些数据所以最好使用
        //所以最好使用:int mid=(right-left)/2+left;
        if (arr[mid] < k) {
            left = mid + 1;
        }
        else if (arr[mid] > k) {
            right = mid - 1;
        }
        else {
            printf("找到了,下标是%d", mid);
            flag = 1;
            break;
        }
    }
    if (flag == 0)
        printf("没找到\n");
    return 0;
}

其中使用:int mid=(right-left)/2+left; 原理图

4.编写代码,演示多个字符从两端移动,向中间汇聚

注意:字符串求长度用strlen

//编写代码,演示多个字符从两端移动,向中间汇聚
//welcome to bit!!!!
//******************
//w****************!
//we**************!!
//.........
//welcome to bit!!!!
#include<string.h>
#include<stdlib.h>
#include<windows.h>
int main() {
    char arr1[] = "welcome to bit!!!!";
    char arr2[] = "******************";
    int left = 0;
    int right = strlen(arr1) - 1;//字符串右下标
    while (left < right) {  //for(left=0,right=strlen(arr1)-1;left<=right;left++,right--){}
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%s\n", arr2);
        Sleep(1000);//如果想要在打印的时候停留一下,可以使用Sleep(),休息1000毫秒=1秒,使用头文件#include<windows.h>
        //system("cls");//cls是清空屏幕的意思,system()引用头文件#include<stdlib.h>,使用Sleep(1000)和system("cls")的效果是每次在屏幕上间隔1秒打印一行
        left++;
        right--;
    }
}

5.编写代码实现,模拟用户登录情景,并且只能登陆三次(只允许输入三次密码,如果密码正确,提示登录成功,如果三次均错误的话,则退出程序)

注意第8行:数组名本来就是地址,所以不用取地址&

判断两个字符串是否相等,应该使用库函数strcmp( , ),相等的话返回值为0,使用strcmp需要引用头文件#include<string.h>

#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需要引用头文件#include<string.h> 
            printf("登录成功\n");
            break;
        }
        else {
            printf("密码错误\n");
        }
    }
    if (i == 3)
        printf("三次密码均错误,退出程序\n");
    return 0;
}

猜数字游戏

  • 电脑生成一个1-100随机数
  • 猜数字

猜大了,告诉你:猜大了;

猜小了,告诉你:猜小了;

猜对了,告诉你:恭喜你,猜对了;

#include<stdlib.h>
#include<time.h>
void menu() {
    printf("****************************\n");
    printf("**********   1.play*********\n");
    printf("**********   0.exit*********\n");
    printf("****************************\n");
}
//时间戳 每一分每一秒都有不同的时间戳time(),头文件#include<time.h>
void game() {  //玩一次游戏就会调用一次game()
    //设置了随机数的生成器
    srand((unsigned int)time(NULL));  //在使用rand()之前必须使用srand(),必须配套使用
                                    //srand()在使用时,传进去一个值,这个值总是在变化
                                    //时间戳:当前计算机的时间-计算机起始时间=()秒,拿时间戳来设置随机数的生成起始点
                                    // srand()的生成起点只设置一次就好了,不要频繁的设置,所以最好放在主函数中
    //1.生成随机数
    int ret= rand()%100+1;//头文件是#include<stdlib.h>,rand()会生成0-randmax之间一个随机数
    //生成1-100之间的随机数,%100余数0-99,所以再加1,即1-100
    //printf("%d\n", ret);
    //2.猜数字
    int guess = 0;
    while (1) {
        printf("请输入数字:>");
        scanf("%d", &guess);
        if (guess < ret) {
            printf("猜小了\n");
        }
        else if(guess > ret){
            printf("猜大了\n");
        }
        else {
            printf("恭喜你,猜对了");
            break;
        }
    }
}
//RAND_MAX;点击查看最大随机数是多少,0-32767
int main() {
    int input = 0;
    do {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input) {
        case 1:
            printf("猜数字游戏:");
            switch (input);
        case 2:
            game();
            break;
        case 3:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
    return 0;
}

相关文章
|
9月前
|
Go C语言
分支语句与循环语句,详细讲解
分支语句与循环语句,详细讲解
|
10月前
|
C语言
分支和循环语句
分支和循环语句
50 1
|
10月前
|
算法 Unix 数据安全/隐私保护
分支和循环语句2
分支和循环语句2
73 0
|
9月前
|
数据安全/隐私保护
分支和循环语句(2)
分支和循环语句(2)
51 1
|
9月前
|
C语言
分支和循环语句(3)
分支和循环语句(3)
49 0
分支和循环语句(3)
|
9月前
|
C语言
分支和循环语句(1)
分支和循环语句(1)
59 0
|
算法
分支与循环语句的练习
分支与循环语句的练习
|
10月前
|
存储 缓存 Linux
分支与循环语句1
分支与循环语句1
56 0
|
10月前
|
缓存 编译器 Go
分支语句和循环语句
分支语句和循环语句
81 0
|
C语言
分支语句和循环语句(1)
分支语句和循环语句(1)
68 0