02.1 C语言分支和循环

本文详细介绍了C语言中的三种基本结构:顺序结构、选择结构和循环结构。通过实例展示了如何使用if、switch、while、for、do...while等语句进行条件判断和循环操作。同时,讲解了二分查找法、阶乘计算、模拟登录情景等实际应用,并探讨了goto语句的使用。文章适合C语言初学者阅读,帮助理解控制流程的基本概念。
摘要由CSDN通过智能技术生成

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

1. 顺序结构
2. 选择结构
3. 循环结构
这三种结构就是生活中存在的三种结构。

顺序结构就是一句一句的向下执行

选择结构 --> 分支语句

  • if
  • switch

循环结构 --> 循环语句

  • while
  • do while
  • for

分支语句

if
// 种类一
if (条件){
	语句;
}

// 种类二
if (条件){
    语句;
}else{
    语句;
}

// 种类三
if (条件)
    语句;
else if(条件)
    语句;
else
    语句;
// 如果执行的语句比较多需要加上{}

可以嵌套使用 { }表示一个代码块–为了可读性比较强,一般建议加上 { }

悬空的else

#include <stdio.h>
int main(){
	int a = 0;
    int b = 0;
    if (a==1)
        if(b == 2)
            print("hehe");
    else
        print("haha");
    return 0;
}

结果为空 ;else的就近原则,所以(a==1)不正确代码就结束了。这个悬空的else和(b==2)是一组的。

switch----常用于多分支
switch(整型表达式){
        语句项;
}
//语句项是一些case语句
case 整型常量表达式:语句;

int main(){
    int nowDay=0;
    scanf("%d",&nowDay);
    switch(nowDay){  // nowDay必须是整型常量表达式float 1.0等都是不可以的
        case 1:    // case后面也必须是整型常量表达式 float 1.0等都是不可以的
            printf("现在是星期一\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;
    }
}

int main(){
    int nowDay=0;
    scanf("%d",&nowDay);
    switch(nowDay){  
        case 1:    
        case 2:
        case 3:
        case 4:
        case 5:
            printf("现在是工作日\n");
            break;
        case 6:
        case 7:
            printf("现在是休息日\n");
            break;  // 编程的好习惯最好是加上,之后的可塑性会很好
        default:   //不满足所有的条件时执行可以写在switch中的任何地方
            printf("输入错误\n");
            break;
    }
}

case只管进入 离开是由break管理的。在最后一个case语句后面加上break语句。

default可有可无,如果存在一般是处理非法的情况。

switch语句中只要没有break就一直向下执行。

循环语句

while
while(表达式为真){
    执行语句;
}
//在想要跳出去的情况可以使用break

插曲

int main(){
    int ch = 0;
    while((ch=getchar()) != EOF){  //getchar()在键盘中获取值,输入函数
        putchar(ch);			//putchar()在显示器打印值,输出函数
    }							//EOF是文件结束标志end of file  ->  -1
    return 0;
}

break

结束循环,终止循环中的所有的内容。

continue

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

for
// 在使用while的时候如果代码量比较大那么整体就比较乱
初始化内容
    ...
while(条件判断){
    执行语句
        ...
    调整语句
        ...
}
// for循环就诞生了
for(表达式1;表达式2;表达式3){
    循环语句;
}
表达式1为初始化部分,用于初始化循环变量,表达式2条件判断部分,用于判断循环什么时候终止。表达式3为调整部分,用于循环条件的调整。

for循环使用建议

不可以在for循环内修改循环变量,防止for循环失去控制。 可以写在表达式3中。

建议for语句的循环控制变量的取值采用“前闭后开区间”的写法。

for循环的变化

for循环的三个表达式都可以省略,但是判断部分如果被省略,恒为真。

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

特点:先执行一遍循环语句。

练习
  1. 计算n的阶乘
int main(){
    int n;
    int res=1;//阶乘
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        res = res*i;
    }
    printf("res = %d",res);
}
  1. 计算1!+2!+3!+…+10!
int main(){
    int sum = 0;
    //控制10次和
    for(int n=1;n<=3;n++){
        //计算阶乘  每次算的时候应该res从0开始
        int res=1;//阶乘
        for(int i=1;i<=n;i++){
            res = res*i;
        }
        sum+=res;
    }
    printf("sum = %d",sum);
}
  1. 在一个有序数组中查找具体的某个数字n。编写int binsearch(int x,int v[],int n);功能:在v[0]<=v[1]<=v[2]<=…<=v[n-1]的数组中查找x。
//可以遍历  但是没有进步性  这里使用的是二分查找
int main() {
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int find = 7;
    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] > find) {
            right = mid - 1;
        } else if (arr[mid] < find) {
            left = mid + 1;
        } else {
            printf("找到了,下标是:%d", mid);
            break;    
        }
    }
    if (left>right){     // 如果因为没有跳出来的情况是这样的
        printf("找不到啊!\n");
    }
    return 0;
}
  1. 编写代码,演示多个字符从两端移动,并向中间汇聚。
//举例打印hello
//#####
//h###o
//he#lo
//hello
#include <string.h>
#include <windows.h>
#include <stdlib.h>

int main() {
    char arr1[] = "hello world!";   //后期可以改成键盘输入
    char arr2[] = "************";   //后期可以通过计算arr1的长度然后生成一个这样的字符串
    int left = 0;
    int right = sizeof(arr1) / sizeof(arr1[0]) - 2;  // 因为获取到的是长度而且最后还有一个“\0”的结束标志,所以在这里要减2
    // int right = strlen(arr1)-1;    //使用函数获取长度  这时仅仅需要-1就可以了
    while (left <= right) {
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%s \n", arr2);
        Sleep(500);    //休息一秒
        system("cls");       //#include <stdlib.h>中的函数,执行系统命令"cls"
        left++;
        right--;
    }
    return 0;
}
  1. 编写代码实现,模拟登录情景,并且只能登录三次(只允许输入三次密码,如果密码正确则提示登录,如果三次输入错误,则退出程序)
#include <string.h>
int main() {
    int i = 3;
    char password[20] = {0};
    for (i = 0; i < 3; i++) {
        printf("请输入密码:");
        scanf("%s", password);
        if (strcmp(password, "123456") == 0) {   
            //双等号不能用来比较两个字符串相等,应该使用库函数-strcmp  如果相同返回值是0
            //如果左边大于右边返回大于0的数,小于返回小于0的数,等于返回0
            printf("登录成功\n");
            break;
        } else{
            printf("密码错误!\n");
        }
    }
    if (i == 3) {
        printf("三次密码输入错误,退出程序");
    }
    return 0;

goto语句

int main(){
    printf("hhh");
    goto A;
    printf("hhh123");
    A:
    printf("xxx");
    return 0;
}

goto语句一般用于跳出深层循环

一个关机程序

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

int main() {
    char input[20] = {0};
    //shutdown -s -t 60
    //system()- 执行系统命令的函数
    system("shutdown -s -t 60");    //需要#include <stdlib.h>
    again:
    printf("请注意,你的电脑在1分钟内关机。在这输入\"I'm a pig.\"我可以取消关机\nplease input:");
    scanf("%s", input);
    //C语言不能直接进行等于,需要借助函数
    if (strcmp(input, "I'm a pig.")) {//需要#include <string.h>
        system("shutdown -a");
    } else {
        goto again;
    }
    return 0;
}
//可以不适用goto实现
int main() {
    char input[20] = {0};
    //shutdown -s -t 60
    //system()- 执行系统命令的函数
    system("shutdown -s -t 60");   
    while (1) {
        printf("请注意,你的电脑在1分钟内关机。在这输入\"I'm a pig.\"我可以取消关机\nplease input:");
        scanf("%s", input);
        if (strcmp(input, "I'm a pig.")) {
            system("shutdown -a");
            break;
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黎丶辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值