循环和分支¶
约 532 个字 156 行代码 预计阅读时间 4 分钟
循环:
- for
- while
- do while
语法¶
do while 的语法
> 0 当 while 做出错时,试试 do while
灵活:
-
for内部:
(起始条件; 条件判断; 结束条件)- 内部三处均可按需省略,保留两个分号即可
- 不一定只能有一个变量,几个条件不一定必须是只含
i的逻辑表达式
-
何时开始何时结束
#include <stdio.h> #include<stdlib.h> #include<string.h> int main(void) { int i, n = 0; char *color[20], str[15]; scanf("%s", str); while(str[0] != '#') { color[n] = (char *)malloc(sizeof(char)*(strlen(str)+1)); strcpy(color[n], str); n++; scanf("%s", str); } for(i = n-1; i >= 0; i--) printf("%s ", color[i]); return 0; }
示例¶
写无限循环遇到某条件跳出:
分支
if
switch
示例:
模拟一个内存管理操作系统的命令行界面,提供查看内存状态、分配内存、释放内存和退出操作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BLOCKS 10 // 最大内存块数
typedef struct {
int id; // 内存块 ID
size_t size; // 内存块大小
int in_use; // 是否正在使用(1 表示使用中,0 表示未使用)
} MemoryBlock;
MemoryBlock memory[MAX_BLOCKS]; // 模拟内存块数组
void initialize_memory() {
for (int i = 0; i < MAX_BLOCKS; i++) {
memory[i].id = i;
memory[i].size = 0;
memory[i].in_use = 0;
}
}
void view_memory() {
printf("\n=== 内存状态 ===\n");
for (int i = 0; i < MAX_BLOCKS; i++) {
printf("块 ID: %d, 大小: %zu 字节, 状态: %s\n",
memory[i].id,
memory[i].size,
memory[i].in_use ? "已分配" : "未分配");
}
}
void allocate_memory() {
int id;
size_t size;
printf("请输入要分配的块 ID (0-%d): ", MAX_BLOCKS - 1);
scanf("%d", &id);
if (id < 0 || id >= MAX_BLOCKS) {
printf("无效的块 ID!\n");
return;
}
if (memory[id].in_use) {
printf("块 ID %d 已被占用!\n", id);
return;
}
printf("请输入要分配的大小 (字节): ");
scanf("%zu", &size);
memory[id].size = size;
memory[id].in_use = 1;
printf("内存块 ID %d 分配成功,大小为 %zu 字节!\n", id, size);
}
void free_memory() {
int id;
printf("请输入要释放的块 ID (0-%d): ", MAX_BLOCKS - 1);
scanf("%d", &id);
if (id < 0 || id >= MAX_BLOCKS) {
printf("无效的块 ID!\n");
return;
}
if (!memory[id].in_use) {
printf("块 ID %d 未被分配,无需释放!\n", id);
return;
}
memory[id].size = 0;
memory[id].in_use = 0;
printf("内存块 ID %d 已成功释放!\n", id);
}
int main() {
int choice;
initialize_memory(); // 初始化内存状态
while (1) {
// 打印菜单
printf("\n=== 内存管理系统 ===\n");
printf("1. 查看内存状态\n");
printf("2. 分配内存\n");
printf("3. 释放内存\n");
printf("4. 退出\n");
printf("请输入你的选择 (1-4): ");
scanf("%d", &choice);
switch (choice) {
case 1:
view_memory();
break;
case 2:
allocate_memory();
break;
case 3:
free_memory();
break;
case 4:
printf("退出内存管理系统。\n");
return 0;
default:
printf("无效的选择,请输入 1 到 4 之间的数字。\n");
}
}
return 0;
}
运行示例
初始化时查看内存状态:
分配内存块:
查看内存状态:
=== 内存状态 ===
块 ID: 0, 大小: 0 字节, 状态: 未分配
块 ID: 1, 大小: 0 字节, 状态: 未分配
块 ID: 2, 大小: 1024 字节, 状态: 已分配
...
释放内存块:
查看内存状态:
退出程序:
代码解析
-
MemoryBlock结构体: - 模拟内存块的信息,包括块 ID、大小和状态。 -
initialize_memory函数: - 初始化所有内存块为未分配状态。 -
view_memory函数: - 显示当前内存的分配状态。 -
allocate_memory和free_memory函数: - 分配或释放内存块,并更新状态。 -
switch语句: - 实现不同操作之间的选择。