四、控制流
4.1 条件语句
#include <stdio.h>
int main() {
int score = 85;
// if-else if-else
if (score >= 90) {
printf("优秀\n");
} else if (score >= 60) {
printf("及格\n");
} else {
printf("不及格\n");
}
// switch语句
int day = 3;
switch (day) {
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
case 5:
printf("工作日\n");
break;
default:
printf("周末\n");
break;
}
// 嵌套条件
int age = 20;
int hasTicket = 1;
if (age >= 18) {
if (hasTicket) {
printf("可以入场\n");
} else {
printf("请购票\n");
}
} else {
printf("未成年人禁止入场\n");
}
return 0;
}
4.2 循环语句
#include <stdio.h>
int main() {
// for循环
printf("for循环:\n");
for (int i = 1; i <= 5; i++) {
printf("第%d次循环\n", i);
}
// while循环
printf("\nwhile循环:\n");
int count = 0;
while (count < 5) {
printf("计数:%d\n", count);
count++;
}
// do-while循环(至少执行一次)
printf("\ndo-while循环:\n");
int n = 0;
do {
printf("至少执行一次:%d\n", n);
n++;
} while (n < 3);
// 嵌套循环:打印乘法表
printf("\n乘法表:\n");
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
printf("%d×%d=%-3d ", j, i, i * j);
}
printf("\n");
}
// break和continue
printf("\nbreak和continue示例:\n");
for (int i = 1; i <= 10; i++) {
if (i == 5) {
continue; // 跳过5
}
if (i == 8) {
break; // 到达8退出循环
}
printf("%d ", i);
}
printf("\n");
return 0;
}
五、数组
5.1 一维数组
#include <stdio.h>
int main() {
// 数组声明与初始化
int arr1[5]; // 声明,未初始化
int arr2[5] = {1, 2, 3, 4, 5}; // 完整初始化
int arr3[] = {1, 2, 3, 4, 5}; // 自动推断大小
int arr4[5] = {1, 2}; // 部分初始化,其余为0
// 访问数组元素
arr2[0] = 10;
printf("arr2[0] = %d\n", arr2[0]);
// 遍历数组
printf("数组元素:");
for (int i = 0; i < 5; i++) {
printf("%d ", arr2[i]);
}
printf("\n");
// 计算数组长度
int len = sizeof(arr2) / sizeof(arr2[0]);
printf("数组长度:%d\n", len);
// 求数组元素和
int sum = 0;
for (int i = 0; i < len; i++) {
sum += arr2[i];
}
printf("数组和:%d\n", sum);
// 查找最大值
int max = arr2[0];
for (int i = 1; i < len; i++) {
if (arr2[i] > max) {
max = arr2[i];
}
}
printf("最大值:%d\n", max);
return 0;
}
5.2 二维数组
include
int main() {
// 二维数组声明与初始化
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 访问元素
printf("matrix[1][2] = %d\n", matrix[1][2]); // 7
// 遍历二维数组
printf("二维数组:\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%3d ", matrix[i][j]);
}
printf("\n");
}
// 矩阵转置
int trans[4][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
trans[j][i] = matrix[i][j];
}
}
printf("\n转置矩阵:\n");
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
printf("%3d ", trans[i][j]);
}
printf("\n");
}
return 0;
}
5.3 字符数组与字符串
#include <stdio.h>
#include <string.h>
int main() {
// 字符串初始化方式
char str1[] = "Hello"; // 自动添加\0
char str2[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 手动添加\0
char str3[20] = "Hello"; // 预留空间
// 输出字符串
printf("str1: %s\n", str1);
printf("str2: %s\n", str2);
// 字符串输入
char name[50];
printf("请输入姓名:");
scanf("%s", name); // 注意:不能有空格
printf("你好,%s\n", name);
// 读取带空格的字符串
char fullName[100];
getchar(); // 清除缓冲区
printf("请输入全名:");
fgets(fullName, sizeof(fullName), stdin);
printf("全名:%s", fullName);
// 字符串常用函数
char str4[20] = "Hello";
char str5[20] = "World";
// strlen:获取字符串长度(不包括\0)
printf("str4长度:%zu\n", strlen(str4));
// strcpy:字符串复制
strcpy(str4, "Hi");
printf("复制后:%s\n", str4);
// strcat:字符串连接
strcat(str4, " ");
strcat(str4, str5);
printf("连接后:%s\n", str4);
// strcmp:字符串比较
int cmp = strcmp("apple", "banana");
if (cmp < 0) {
printf("apple < banana\n");
} else if (cmp > 0) {
printf("apple > banana\n");
} else {
printf("相等\n");
}
return 0;
}
六、函数
6.1 函数定义与调用
#include <stdio.h>
// 函数声明(原型)
int add(int a, int b);
void printMessage(const char* msg);
int factorial(int n);
int main() {
// 函数调用
int result = add(5, 3);
printf("5 + 3 = %d\n", result);
printMessage("Hello, C!");
int fact = factorial(5);
printf("5! = %d\n", fact);
return 0;
}
// 函数定义:有返回值,有参数
int add(int a, int b) {
return a + b;
}
// 无返回值函数
void printMessage(const char* msg) {
printf("%s\n", msg);
}
// 递归函数
int factorial(int n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
6.2 参数传递
#include <stdio.h>
// 值传递:形参是实参的副本
void swap_value(int a, int b) {
int temp = a;
a = b;
b = temp;
printf("交换后(函数内):a=%d, b=%d\n", a, b);
}
// 地址传递(指针传递)
void swap_pointer(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 数组作为参数(退化为指针)
int sum_array(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum;
}
int main() {
int x = 10, y = 20;
// 值传递:实参不会被修改
printf("交换前:x=%d, y=%d\n", x, y);
swap_value(x, y);
printf("交换后(函数外):x=%d, y=%d\n", x, y);
// 地址传递:实参被修改
swap_pointer(&x, &y);
printf("地址传递后:x=%d, y=%d\n", x, y);
// 数组作为参数
int numbers[] = {1, 2, 3, 4, 5};
int len = sizeof(numbers) / sizeof(numbers[0]);
int total = sum_array(numbers, len);
printf("数组和:%d\n", total);
return 0;
}