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;
}
运行结果如下: