🎓博主介绍:精通 C、Python、Java、JavaScript 等编程语言,具备全栈开发能力。日常专注于分享编程干货、算法解析、项目实战经验,以及前沿技术动态。让我们一起在技术的道路上不断探索,共同成长!
C语言必背18个经典程序:搞定这些才算真正入门
1. 引言
C语言作为一门广泛应用于系统软件、嵌入式开发等领域的编程语言,其重要性不言而喻。对于初学者而言,掌握一些经典的C语言程序是快速入门并提升编程能力的有效途径。本文将详细介绍18个C语言经典程序,帮助你更好地理解C语言的语法和编程思想。
2. 基础运算类程序
2.1 两数相加
功能:实现两个整数的相加并输出结果。
代码示例:
#include <stdio.h>
int main() {
int num1, num2, sum;
printf("请输入两个整数:");
scanf("%d %d", &num1, &num2);
sum = num1 + num2;
printf("两数之和为:%d\n", sum);
return 0;
}
步骤:
- 定义三个整型变量
num1
、num2
和sum
。 - 使用
printf
函数提示用户输入两个整数。 - 使用
scanf
函数读取用户输入的两个整数。 - 将两个整数相加并赋值给
sum
。 - 使用
printf
函数输出两数之和。
2.2 求平均值
功能:计算三个数的平均值并输出。
代码示例:
#include <stdio.h>
int main() {
float num1, num2, num3, average;
printf("请输入三个数:");
scanf("%f %f %f", &num1, &num2, &num3);
average = (num1 + num2 + num3) / 3;
printf("平均值为:%.2f\n", average);
return 0;
}
步骤:
- 定义四个浮点型变量
num1
、num2
、num3
和average
。 - 使用
printf
函数提示用户输入三个数。 - 使用
scanf
函数读取用户输入的三个数。 - 计算三个数的平均值并赋值给
average
。 - 使用
printf
函数输出平均值,保留两位小数。
3. 选择结构类程序
3.1 判断奇偶数
功能:判断一个整数是奇数还是偶数并输出结果。
代码示例:
#include <stdio.h>
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
if (num % 2 == 0) {
printf("%d 是偶数\n", num);
} else {
printf("%d 是奇数\n", num);
}
return 0;
}
步骤:
- 定义一个整型变量
num
。 - 使用
printf
函数提示用户输入一个整数。 - 使用
scanf
函数读取用户输入的整数。 - 使用
if-else
语句判断该整数是否能被 2 整除,根据结果输出是奇数还是偶数。
3.2 比较三个数的大小
功能:比较三个整数的大小,输出最大的数。
代码示例:
#include <stdio.h>
int main() {
int num1, num2, num3, max;
printf("请输入三个整数:");
scanf("%d %d %d", &num1, &num2, &num3);
if (num1 >= num2 && num1 >= num3) {
max = num1;
} else if (num2 >= num1 && num2 >= num3) {
max = num2;
} else {
max = num3;
}
printf("最大的数是:%d\n", max);
return 0;
}
步骤:
- 定义四个整型变量
num1
、num2
、num3
和max
。 - 使用
printf
函数提示用户输入三个整数。 - 使用
scanf
函数读取用户输入的三个整数。 - 使用嵌套的
if-else
语句比较三个数的大小,找出最大的数并赋值给max
。 - 使用
printf
函数输出最大的数。
4. 循环结构类程序
4.1 打印九九乘法表
功能:使用嵌套循环打印九九乘法表。
代码示例:
#include <stdio.h>
int main() {
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= i; j++) {
printf("%d * %d = %d\t", j, i, i * j);
}
printf("\n");
}
return 0;
}
步骤:
- 定义两个整型变量
i
和j
作为循环控制变量。 - 使用外层
for
循环控制行数,从 1 到 9。 - 在内层
for
循环中,控制每行的列数,列数从 1 到当前行数。 - 在内层循环中,使用
printf
函数输出乘法表的每一项。 - 每行输出完后,使用
printf("\n");
换行。
4.2 计算 1 到 100 的和
功能:使用循环计算 1 到 100 的整数之和并输出结果。
代码示例:
#include <stdio.h>
int main() {
int i, sum = 0;
for (i = 1; i <= 100; i++) {
sum += i;
}
printf("1 到 100 的和为:%d\n", sum);
return 0;
}
步骤:
- 定义两个整型变量
i
作为循环控制变量,sum
用于存储累加和,初始化为 0。 - 使用
for
循环从 1 到 100 遍历每个整数。 - 在每次循环中,将当前整数累加到
sum
中。 - 循环结束后,使用
printf
函数输出 1 到 100 的和。
5. 数组类程序
5.1 数组元素求和
功能:计算一个整型数组中所有元素的和。
代码示例:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int i, sum = 0;
for (i = 0; i < 5; i++) {
sum += arr[i];
}
printf("数组元素的和为:%d\n", sum);
return 0;
}
步骤:
- 定义一个包含 5 个元素的整型数组
arr
并初始化。 - 定义两个整型变量
i
作为循环控制变量,sum
用于存储累加和,初始化为 0。 - 使用
for
循环遍历数组的每个元素。 - 在每次循环中,将当前数组元素累加到
sum
中。 - 循环结束后,使用
printf
函数输出数组元素的和。
5.2 查找数组中的最大值
功能:找出一个整型数组中的最大值并输出。
代码示例:
#include <stdio.h>
int main() {
int arr[5] = {3, 7, 2, 9, 5};
int i, max = arr[0];
for (i = 1; i < 5; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
printf("数组中的最大值为:%d\n", max);
return 0;
}
步骤:
- 定义一个包含 5 个元素的整型数组
arr
并初始化。 - 定义两个整型变量
i
作为循环控制变量,max
用于存储最大值,初始化为数组的第一个元素。 - 使用
for
循环从数组的第二个元素开始遍历。 - 在每次循环中,比较当前元素和
max
的大小,如果当前元素大于max
,则将当前元素赋值给max
。 - 循环结束后,使用
printf
函数输出数组中的最大值。
6. 函数类程序
6.1 阶乘函数
功能:定义一个函数计算一个整数的阶乘,并在 main
函数中调用该函数。
代码示例:
#include <stdio.h>
int factorial(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
int result = factorial(num);
printf("%d 的阶乘是:%d\n", num, result);
return 0;
}
步骤:
- 定义一个递归函数
factorial
,用于计算一个整数的阶乘。当输入为 0 或 1 时,返回 1;否则,返回n * factorial(n - 1)
。 - 在
main
函数中,定义一个整型变量num
,提示用户输入一个整数。 - 使用
scanf
函数读取用户输入的整数。 - 调用
factorial
函数计算该整数的阶乘,并将结果存储在result
中。 - 使用
printf
函数输出该整数的阶乘。
6.2 交换两个数的值
功能:定义一个函数交换两个整数的值,并在 main
函数中调用该函数。
代码示例:
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int num1, num2;
printf("请输入两个整数:");
scanf("%d %d", &num1, &num2);
printf("交换前:num1 = %d, num2 = %d\n", num1, num2);
swap(&num1, &num2);
printf("交换后:num1 = %d, num2 = %d\n", num1, num2);
return 0;
}
步骤:
- 定义一个函数
swap
,接受两个指向整型的指针作为参数,通过指针交换两个整数的值。 - 在
main
函数中,定义两个整型变量num1
和num2
,提示用户输入两个整数。 - 使用
scanf
函数读取用户输入的两个整数。 - 输出交换前两个数的值。
- 调用
swap
函数,将num1
和num2
的地址传递给swap
函数。 - 输出交换后两个数的值。
7. 字符串类程序
7.1 字符串长度计算
功能:计算一个字符串的长度并输出。
代码示例:
#include <stdio.h>
int stringLength(char str[]) {
int i = 0;
while (str[i] != '\0') {
i++;
}
return i;
}
int main() {
char str[100];
printf("请输入一个字符串:");
scanf("%s", str);
int length = stringLength(str);
printf("字符串的长度为:%d\n", length);
return 0;
}
步骤:
- 定义一个函数
stringLength
,接受一个字符数组作为参数,使用while
循环遍历字符串,直到遇到字符串结束符'\0'
,返回循环次数,即字符串的长度。 - 在
main
函数中,定义一个字符数组str
,提示用户输入一个字符串。 - 使用
scanf
函数读取用户输入的字符串。 - 调用
stringLength
函数计算字符串的长度,并将结果存储在length
中。 - 使用
printf
函数输出字符串的长度。
7.2 字符串拼接
功能:将两个字符串拼接成一个新的字符串并输出。
代码示例:
#include <stdio.h>
void stringConcat(char str1[], char str2[], char result[]) {
int i = 0, j = 0;
while (str1[i] != '\0') {
result[i] = str1[i];
i++;
}
while (str2[j] != '\0') {
result[i] = str2[j];
i++;
j++;
}
result[i] = '\0';
}
int main() {
char str1[100], str2[100], result[200];
printf("请输入第一个字符串:");
scanf("%s", str1);
printf("请输入第二个字符串:");
scanf("%s", str2);
stringConcat(str1, str2, result);
printf("拼接后的字符串为:%s\n", result);
return 0;
}
步骤:
- 定义一个函数
stringConcat
,接受三个字符数组作为参数,将第一个字符串复制到结果数组中,然后将第二个字符串追加到结果数组后面,最后添加字符串结束符'\0'
。 - 在
main
函数中,定义三个字符数组str1
、str2
和result
,提示用户输入两个字符串。 - 使用
scanf
函数分别读取用户输入的两个字符串。 - 调用
stringConcat
函数将两个字符串拼接成一个新的字符串存储在result
中。 - 使用
printf
函数输出拼接后的字符串。
8. 指针类程序
8.1 指针访问数组元素
功能:使用指针访问数组元素并输出。
代码示例:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;
int i;
for (i = 0; i < 5; i++) {
printf("arr[%d] = %d\n", i, *(ptr + i));
}
return 0;
}
步骤:
- 定义一个包含 5 个元素的整型数组
arr
并初始化。 - 定义一个指向整型的指针
ptr
,并将其指向数组arr
的首地址。 - 使用
for
循环遍历数组,通过指针运算*(ptr + i)
访问数组的每个元素并输出。
8.2 动态内存分配与指针
功能:使用 malloc
函数动态分配内存,存储一组整数,并输出这些整数。
代码示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, i;
printf("请输入要存储的整数个数:");
scanf("%d", &n);
int *ptr = (int *)malloc(n * sizeof(int));
if (ptr == NULL) {
printf("内存分配失败!\n");
return 1;
}
for (i = 0; i < n; i++) {
printf("请输入第 %d 个整数:", i + 1);
scanf("%d", &ptr[i]);
}
printf("你输入的整数为:");
for (i = 0; i < n; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
free(ptr);
return 0;
}
步骤:
- 提示用户输入要存储的整数个数
n
。 - 使用
malloc
函数动态分配n
个整型元素的内存空间,并将返回的指针赋值给ptr
。 - 检查内存分配是否成功,如果失败,输出错误信息并终止程序。
- 使用
for
循环提示用户输入每个整数,并将其存储在动态分配的内存中。 - 使用
for
循环输出用户输入的所有整数。 - 使用
free
函数释放动态分配的内存。
9. 文件操作类程序
9.1 文件写入
功能:将用户输入的字符串写入一个文本文件中。
代码示例:
#include <stdio.h>
int main() {
FILE *fp;
char str[100];
fp = fopen("test.txt", "w");
if (fp == NULL) {
printf("文件打开失败!\n");
return 1;
}
printf("请输入要写入文件的字符串:");
scanf("%s", str);
fprintf(fp, "%s", str);
fclose(fp);
printf("字符串已成功写入文件!\n");
return 0;
}
步骤:
- 定义一个文件指针
fp
和一个字符数组str
用于存储用户输入的字符串。 - 使用
fopen
函数以写入模式("w"
)打开一个名为test.txt
的文件。如果文件打开失败,fopen
会返回NULL
,此时输出错误信息并终止程序。 - 提示用户输入要写入文件的字符串,使用
scanf
函数读取该字符串。 - 使用
fprintf
函数将字符串写入文件,fprintf
的第一个参数是文件指针,第二个参数是格式化字符串,这里直接使用"%s"
表示写入一个字符串。 - 使用
fclose
函数关闭文件,释放相关资源。 - 输出写入成功的提示信息。
9.2 文件读取
功能:从一个文本文件中读取内容并输出到控制台。
代码示例:
#include <stdio.h>
int main() {
FILE *fp;
char ch;
fp = fopen("test.txt", "r");
if (fp == NULL) {
printf("文件打开失败!\n");
return 1;
}
while ((ch = fgetc(fp)) != EOF) {
printf("%c", ch);
}
fclose(fp);
return 0;
}
步骤:
- 定义一个文件指针
fp
和一个字符变量ch
用于逐个读取文件中的字符。 - 使用
fopen
函数以读取模式("r"
)打开之前写入的test.txt
文件。若文件打开失败,输出错误信息并终止程序。 - 使用
while
循环和fgetc
函数逐个读取文件中的字符,fgetc
函数会返回文件中的下一个字符,当读取到文件末尾时返回EOF
(文件结束符),循环结束。 - 在循环中,将读取到的字符输出到控制台。
- 使用
fclose
函数关闭文件。
10. 结构体类程序
10.1 学生信息管理(简单示例)
功能:定义一个学生结构体,存储学生的姓名、年龄和成绩,并输出学生信息。
代码示例:
#include <stdio.h>
#include <string.h>
struct Student {
char name[50];
int age;
float score;
};
int main() {
struct Student s1;
strcpy(s1.name, "张三");
s1.age = 20;
s1.score = 85.5;
printf("学生姓名:%s\n", s1.name);
printf("学生年龄:%d\n", s1.age);
printf("学生成绩:%.2f\n", s1.score);
return 0;
}
步骤:
- 使用
struct
关键字定义一个名为Student
的结构体,包含三个成员:一个字符数组name
用于存储姓名,一个整型变量age
用于存储年龄,一个浮点型变量score
用于存储成绩。 - 在
main
函数中,定义一个Student
类型的变量s1
。 - 使用
strcpy
函数将字符串"张三"
复制到s1.name
中,为s1.age
和s1.score
分别赋值。 - 使用
printf
函数输出学生的姓名、年龄和成绩。
10.2 结构体数组存储多个学生信息
功能:使用结构体数组存储多个学生的信息,并输出所有学生的信息。
代码示例:
#include <stdio.h>
#include <string.h>
struct Student {
char name[50];
int age;
float score;
};
int main() {
struct Student students[3] = {
{"张三", 20, 85.5},
{"李四", 21, 90.0},
{"王五", 19, 78.5}
};
int i;
for (i = 0; i < 3; i++) {
printf("学生 %d 信息:\n", i + 1);
printf("姓名:%s\n", students[i].name);
printf("年龄:%d\n", students[i].age);
printf("成绩:%.2f\n", students[i].score);
}
return 0;
}
步骤:
- 定义
Student
结构体,同前一个示例。 - 在
main
函数中,定义一个包含 3 个元素的Student
结构体数组students
,并进行初始化。 - 使用
for
循环遍历结构体数组,依次输出每个学生的姓名、年龄和成绩。
11. 结论
通过学习这 18 个经典的 C 语言程序,你已经对 C 语言的基础语法、控制结构、函数、数组、指针、字符串、文件操作、结构体等重要概念有了较为深入的理解和实践。这些程序涵盖了 C 语言编程中常见的应用场景,是你进一步学习和开发更复杂程序的基石。掌握这些经典程序,能够帮助你更好地运用 C 语言解决实际问题,真正踏入 C 语言编程的大门。