C语言基础(四)

C语言流程控制语句,主要包括以下几种:

1、分支语句


if 语句:
基于一个或多个条件执行不同的代码块。
if (condition) {  
    // 如果条件为真,则执行这里的代码  
} else {  
    // 如果条件为假,则执行这里的代码
}

2、switch 语句:
基于表达式的值选择多个代码块之一执行。
switch (expression) {  
    case constant1:  
        // 如果expression等于constant1,则执行这里的代码  
        break;  
    case constant2:  
        // 如果expression等于constant2,则执行这里的代码  
        break;  
    // 可以有多个case  
    default:  
        // 如果expression与任何case都不匹配,则执行这里的代码  
}

3、循环语句:

a、for 循环
用于重复执行一段代码固定次数或在满足特定条件时停止。
如果条件为真(即非0值),则执行循环体;如果为假(即0),则退出循环。
condition 是循环条件,决定循环是否应该继续。
for (initialization; condition; update) {  
    // 循环体  
}

b、while 循环
如果条件为真,则执行循环体;如果为假,则退出循环。
condition 是循环条件,决定循环是否应该继续。
while (condition) {  
    // 循环体  
}
c、do-while 循环
do-while循环至少执行一次循环体,然后评估循环条件。
如果条件为真,则继续执行循环;如果为假,则退出循环。
do {  
    // 循环体  
} while (condition);
do-while循环中,condition 是在每次迭代之后进行评估的,与while循环不同的是,do-while循环至少会执行一次循环体,无论条件是否为真。

 总结:

for 循环最适合在循环次数已知时使用。
while 循环在循环次数未知但可以根据条件判断时使用。
do-while 循环至少执行一次循环体,无论条件是否满足,适用于至少需要执行一次循环体的情况。

4.、跳转语句

break 语句,用于退出循环或switch语句。

continue 语句
用于跳过当前循环的剩余部分,并继续下一次循环的迭代。

测试代码1:

#include <stdio.h>  
  
int main() {  
    // 声明语句  
    int a = 0, b = 10, sum = 0;  
  
    // 复合语句(块语句)  
    {  
        int temp = a + b; // 在块内声明的局部变量temp  
        sum = temp;       // 表达式语句  
    }  
  
    // 循环语句(for循环)  
    for (int i = 0; i < 5; i++) {  
        // 选择语句(if语句)  
        if (i % 2 == 0) {  
            printf("Even: %d\n", i);  
        } else {  
            
			// continue语句  
            // continue;  
            printf("Odd: %d\n", i);  
        }  
  
        // 表达式语句(更新sum的值)  
        sum += i;  
        
        // 跳转语句(break语句)  
        if (i == 3) break; 
    }  
  
    // 表达式语句(打印sum的值)  
    printf("Sum: %d\n", sum);  
  
    // 跳转语句(return语句)  
    return 0;  
}

运行结果如下:

测试代码2:

#include <stdio.h>    
int main() {  
    int number = -20; // 可以根据需要修改这个值测试不同的条件  
    int score = 75; // 这个值用于测试`if...else if...else`链  
  
    // if语句 
    if (number > 0) {  
        printf("The number is positive.\n");  
    }  
  
    // if...else语句  
    if (number > 10) {  
        printf("The number is greater than 10.\n");  
    } else {  
        printf("The number is not greater than 10.\n");
    }  
  
    // if...else if...else语句链 
    if (score >= 90) {  
        printf("Grade: A\n");  
    } else if (score >= 80) {  
        printf("Grade: B\n");  
    } else if (score >= 70) {  
        printf("Grade: C\n"); 
    } else if (score >= 60) {  
        printf("Grade: D\n");  
    } else {  
        printf("Grade: F\n");  
    }  
  
    return 0;  
}

运行结果如下:

测试代码3:

#include <stdio.h>  
#include <ctype.h> // 引入头文件以使用isdigit(), isupper(), islower()函数  
#include <string.h> 
  
int main() {  
    char str[1000]; // 输入字符串不超过999个字符  
    int digits = 0, uppercase = 0, lowercase = 0;  
  
    printf("请输入一段字符:");  
    fgets(str, sizeof(str), stdin); // gets代替scanf读取整行,包括空格  
  
    // 去除字符串末尾的换行符 
    str[strcspn(str, "\n")] = 0;  
  
    // 遍历字符串中的每个字符  
    for(int i = 0; str[i] != '\0'; i++) {  
        if(isdigit(str[i])) {  
            digits++; // 是数字,则数字计数器加1  
        } else if(isupper(str[i])) {  
            uppercase++; // 是大写字母,则大写字母计数器加1  
        } else if(islower(str[i])) {  
            lowercase++; // 是小写字母,则小写字母计数器加1  
        }  
        // 忽略其他类型的字符,如标点符号、空格等  
    }  
  
    printf("数字个数:%d\n", digits);  
    printf("大写字母个数:%d\n", uppercase);  
    printf("小写字母个数:%d\n", lowercase);  
  
    return 0;  
}

运行结果如下:

测试代码4:

#include <stdio.h>  
int main() {  
    int distance;  
    float costPerKm, totalCost;  
  
    printf("请输入路程(公里): ");  
    scanf("%d", &distance);  
  
    // 区间划分  
    int category;  
    if (distance <= 100) {  
        category = 1; // 短途  
    } else if (distance <= 500) {  
        category = 2; // 中途  
    } else {  
        category = 3; // 长途  
    }  
  
    switch (category) {  
        case 1:  
            costPerKm = 1.5; // 短途每公里1.5元  
            break;  
        case 2:  
            costPerKm = 1.0; // 途每公里1元  
            break;  
        case 3:  
            costPerKm = 0.8; // 长途每公里0.8元  
            break;  
        default:  
            printf("无效的路程区间\n");  
            return 1;  
    }  
  
    totalCost = distance * costPerKm;  
    printf("总运费为: %.2f元\n", totalCost);  
  
    return 0;  
}

运行结果如下:

测试代码5:

#include <stdio.h>  
int main() {  
    // for循环打印1到5  
    printf("Using for loop:\n");  
    for (int i = 1; i <= 5; i++) {  
        printf("%d ", i);  
    }  
    printf("\n");  
  
    // 初始化变量用于while循环  
    int j = 1;  
    // while循环打印6到10  
    printf("Using while loop:\n");  
    while (j <= 10) {  
        if (j > 5) { // 确保只打印6到10  
            printf("%d ", j);  
        }  
        j++;  
    }  
    printf("\n");  
  
    // 初始化变量用于do-while循环  
    int k = 1;  
    // do-while循环打印1到5
    printf("Using do-while loop:\n");  
    do {  
        if (k <= 5) { // 限制打印次数匹配for循环的输出  
            printf("%d ", k);  
        }  
        k++;  
    } while (k <= 10); // 这个条件会让循环多执行几次,但由于if语句的限制,不会打印多余的内容  
    // do-while循环虽然设置了k <= 10作为条件,但打印只会在k <= 5时发生  

 
    k = 11; // 设置一个使得初始条件不满足的值  
    printf("\nDemonstrating at least one execution of do-while loop:\n");  
    do {  
        printf("%d (This is the only execution due to initial condition being false.)\n", k);  
        k++; // 尽管更新了k,由于条件已不满足,循环不会再次执行。  
    } while (k <= 10);  
  
    return 0;  
}

运行结果如下:

测试代码6:

#include <stdio.h>  
int main() {  
    // for嵌套语句打印二维数组  
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};  
    printf("Printing matrix using nested for loops:\n");  
    for (int i = 0; i < 2; i++) {  
        for (int j = 0; j < 3; j++) {  
            printf("%d ", matrix[i][j]);  
        }  
        printf("\n");  
    }  
  
    // break语句在嵌套循环中提前退出  
    printf("\nUsing break in nested loops:\n");  
    for (int i = 0; i < 5; i++) {  
        for (int j = 0; j < 5; j++) {  
            if (i == 2 && j == 2) {  
                break; // 退出内层循环,因为是最内层,所以相当于退出当前任务  
                // 如果有更内层的循环,则只会退出到上一层循环  
            }  
            printf("(%d, %d) ", i, j);  
        }  
        // 由于break,当i=2时,内层循环不会执行完,但外层循环会继续  
        if (i == 2) {  
            printf("\nBreaking out of inner loop at (2, 2).\n");  
            break; 
        }  
        printf("\n");  
    }  
  
    // continue语句跳过某些迭代  
    printf("\nUsing continue in nested loops:\n");  
    for (int i = 0; i < 5; i++) {  
        for (int j = 0; j < 5; j++) {  
            if (j == 2) {  
                continue; // 跳过当前j的迭代  
            }  
            printf("(%d, %d) ", i, j);  
        }  
        printf("\n");  
    }  
  
    return 0;  
}

运行结果如下:

测试代码7:

#include <stdio.h>  
#include <string.h>   
typedef struct {  
    char name[50];  
    int scores[3];  
    float total;  
    float average;  
} Athlete;  
  
int main() {  
    Athlete athletes[5];  
    int n = 0, i, j, score;  
  
    // while循环输入5名运动员的数据  
    while (n < 5) {  
        printf("请输入第%d名运动员的姓名: ", n + 1);  
        scanf("%s", athletes[n].name);  
  
        // do...while确保至少输入一个成绩  
        i = 0;  
        do {  
            printf("请输入第%d名运动员的第%d项成绩 (输入-1结束当前运动员输入): ", n + 1, i + 1);  
            scanf("%d", &score);  
  
            // 输入-1时结束当前运动员的成绩输入  
            if (score == -1) {  
                break;  
            }  
            // 输入为0时跳过当前成绩,不计算入总分  
            if (score == 0) {  
                continue;  
            }  
  
            athletes[n].scores[i++] = score;  
  
            // 检查是否已输入三项成绩  
            if (i >= 3) {  
                break;  
            }  
  
        } while (1);  
  
        // 计算总分和平均分  
        athletes[n].total = 0;  
        for (j = 0; j < i; j++) {  
            athletes[n].total += athletes[n].scores[j];  
        }  
        athletes[n].average = athletes[n].total / (float)i;  
  
        n++;  
    }  
  
    // 打印结果  
    for (n = 0; n < 5; n++) {  
        printf("运动员: %s, 总分: %.2f, 平均分: %.2f\n", athletes[n].name, athletes[n].total, athletes[n].average);  
        for (i = 0; i < 3; i++) {  
            if (i < (int)(athletes[n].total / athletes[n].average)) {  
                printf("  成绩%d: %d\n", i + 1, athletes[n].scores[i]);  
            }  
        }  
    }  
  
    return 0;  
}

运行结果如下:

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值