
(图片来源网络,侵删)
- 核心目的:本指南的核心目的是帮助你理解C语言的核心概念和编程思想,而不是简单地提供一个让你抄写的答案,直接复制代码而不理解其原理,对你的学习毫无益处。
- 实验差异性:不同高校、不同版本的《C语言程序设计》实验指导书,其具体实验题目和细节要求可能存在差异,请务必将此作为参考和思路启发,而不是标准答案。
- 代码风格:为了便于初学者理解,代码中的变量名可能比较简单,注释也比较详细,在实际项目中,变量名应更具描述性。
C语言程序设计入门
实验目的
- 熟悉C语言程序的开发环境(如Visual Studio Code, Dev-C++, Code::Blocks等)。
- 掌握C语言程序的基本结构,包括
#include,main()函数等。 - 学习编写简单的输入输出程序,掌握
printf()和scanf()函数的基本用法。 - 理解C语言中的基本数据类型(
int,float,double,char)和变量定义。
实验题目1:输出 "Hello, World!"要求**:编写一个程序,在屏幕上输出 "Hello, World!"。
思路分析:
这是所有编程语言的第一个经典程序,目的非常纯粹,就是验证开发环境是否配置正确,并运行第一个程序,它只需要使用 printf() 函数。
参考代码:
#include <stdio.h> // 包含标准输入输出库,因为我们要使用 printf 函数
int main() {
// printf 函数用于在控制台打印字符串
// \n 是一个转义字符,表示换行
printf("Hello, World!\n");
// main 函数的返回值,0 表示程序正常结束
return 0;
}
知识点:
#include <stdio.h>:预处理器指令,告诉编译器在编译前将stdio.h文件的内容包含进来。stdio.h是标准输入输出头文件,提供了printf,scanf等函数的声明。int main():程序的入口函数,操作系统会从这里开始执行你的代码。printf():格式化输出函数,用于向标准输出设备(通常是屏幕)输出数据。\n:换行符。printf遇到它就会将光标移动到下一行的开头。return 0;:表示main函数执行成功并退出。
实验题目2:计算两个整数的和要求**:从键盘输入两个整数,计算它们的和,并将结果输出。
思路分析:

(图片来源网络,侵删)
- 需要定义两个变量来存储从键盘输入的整数,
num1和num2。 - 需要定义一个变量来存储计算结果,
sum。 - 使用
scanf()函数从键盘读取用户输入的整数,并赋值给num1和num2。 - 使用 运算符计算
num1和num2的和,并将结果存入sum。 - 使用
printf()函数输出计算结果。
参考代码:
#include <stdio.h>
int main() {
int num1, num2, sum; // 定义三个整型变量
// 提示用户输入第一个整数
printf("请输入第一个整数: ");
// 从键盘读取一个整数,存入 num1 变量
scanf("%d", &num1);
// 提示用户输入第二个整数
printf("请输入第二个整数: ");
// 从键盘读取一个整数,存入 num2 变量
scanf("%d", &num2);
// 计算两个数的和
sum = num1 + num2;
// 输出结果
// %d 是一个占位符,会被后面的 sum 变量的值替换
printf("两数之和为: %d\n", sum);
return 0;
}
知识点:
- 变量定义:
int num1, num2, sum;定义了三个整型变量。 scanf()函数:格式化输入函数,用于从标准输入设备(通常是键盘)读取数据。%d:表示要读取一个十进制整数。&num1:&是取地址运算符。scanf需要知道变量的内存地址,以便将读取到的值存入其中,这是初学者最容易出错的地方!
- 格式化输出:
printf("两数之和为: %d\n", sum);中的%d会被sum的值替换,实现动态输出。
分支结构程序设计
实验目的
- 掌握关系运算符和逻辑运算符的使用。
- 熟练掌握
if-else语句和switch语句。 - 能够运用分支结构解决简单的实际问题。
实验题目1:判断一个数是奇数还是偶数要求**:从键盘输入一个整数,判断它是奇数还是偶数,并输出结果。
思路分析:
- 一个整数是奇数还是偶数,取决于它能否被2整除。
- 在C语言中,可以使用取模运算符 来获取除法的余数。
number % 2的结果为0,则该数是偶数;否则,就是奇数。- 使用
if-else语句来根据余数的不同执行不同的代码块。
参考代码:

(图片来源网络,侵删)
#include <stdio.h>
int main() {
int number;
printf("请输入一个整数: ");
scanf("%d", &number);
// 使用 if-else 语句进行判断
// 注意:判断相等使用 ==,而不是 =
if (number % 2 == 0) {
printf("%d 是一个偶数,\n", number);
} else {
printf("%d 是一个奇数,\n", number);
}
return 0;
}
知识点:
- 取模运算符 :用于计算两个数相除的余数。
10 % 3的结果是1。 - 关系运算符 :用于判断两个值是否相等。极易与赋值运算符 混淆!
if-else语句:最基本的分支结构。if后面的条件为真(非0),则执行if代码块;否则,执行else代码块。
实验题目2:计算分段函数要求**:计算以下分段函数的值,从键盘输入 x 的值,输出 y 的值。
y = x + 2 (x > 0) y = 0 (x = 0) y = x - 1 (x < 0)
思路分析:
- 这是一个典型的多分支问题,需要根据
x的不同取值范围来计算y。 - 可以使用
if-else if-else结构来解决。if检查x > 0的条件,如果为假,则用else if检查x == 0,如果还为假,则执行最后的else(即x < 0的情况)。 - 也可以使用
if-else嵌套,但if-else if-else更清晰。
参考代码:
#include <stdio.h>
int main() {
double x, y;
printf("请输入 x 的值: ");
scanf("%lf", &x); // 注意:读取 double 类型使用 %lf
// 使用 if-else if-else 结构
if (x > 0) {
y = x + 2;
} else if (x == 0) {
y = 0;
} else { // x < 0
y = x - 1;
}
printf("计算结果 y = %f\n", y); // 输出 double 类型使用 %f
return 0;
}
知识点:
if-else if-else结构:当有多个互斥的条件需要判断时使用,它从上到下依次判断,一旦某个条件为真,就执行对应的代码块,并跳过后续所有else if和else。double类型:用于存储双精度浮点数(即带小数的数)。scanf和printf中使用%lf和%f。
循环结构程序设计
实验目的
- 掌握
for循环、while循环和do-while循环的语法和使用场景。 - 理解循环控制语句
break和continue的作用。 - 能够运用循环结构解决累加、累乘、遍历等问题。
实验题目1:计算 1 到 100 的累加和要求**:使用循环结构计算 1 + 2 + 3 + ... + 100 的和。
思路分析:
- 这是一个典型的累加问题,需要一个变量(如
sum)来存放最终的和,初始值为0。 - 需要一个变量(如
i)作为循环的计数器,从1开始,到100结束。 - 在循环的每次迭代中,将
i的值加到sum上。 - 循环结束后,
sum中就是最终结果。for循环非常适合这种已知循环次数的场景。
参考代码:
#include <stdio.h>
int main() {
int i, sum = 0; // sum 初始化为 0
// for 循环:初始化 i=1; 循环条件 i <= 100; 每次循环后 i++
for (i = 1; i <= 100; i++) {
sum = sum + i; // 或者使用 sum += i;
}
printf("1 到 100 的累加和为: %d\n", sum);
return 0;
}
知识点:
for循环:语法为for (初始化表达式; 循环条件; 循环后操作表达式),非常适合用于循环次数已知的情况。- 累加算法:
sum = sum + i是累加的核心思想。sum必须在循环开始前被初始化。
实验题目2:判断一个数是否为素数(质数)要求**:从键盘输入一个正整数,判断它是否为素数,素数是指只能被1和它本身整除的大于1的自然数。
思路分析:
- 定义一个标志变量,如
is_prime,初始设为1(代表是素数)。 - 素数最小的判断是2,如果输入的数小于2,它一定不是素数。
- 对于一个数
n,我们只需要检查从2到n-1(或者更优化的到sqrt(n))之间是否存在能整除n的数。 - 使用一个
for循环,让变量i从2遍历到n-1。 - 在循环中,
n % i == 0,说明n能被i整除,那么它就不是素数,将is_prime设为0(代表不是素数),并使用break提前退出循环。 - 循环结束后,根据
is_prime的值输出判断结果。
参考代码:
#include <stdio.h>
#include <math.h> // 为了使用 sqrt 函数
int main() {
int n, i;
int is_prime = 1; // 假设是素数
printf("请输入一个正整数: ");
scanf("%d", &n);
if (n < 2) {
is_prime = 0; // 小于2的数不是素数
} else {
// 优化:只需检查到 sqrt(n)
for (i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
is_prime = 0; // 发现一个能整除的数,就不是素数
break; // 找到一个即可,提前结束循环
}
}
}
if (is_prime) {
printf("%d 是一个素数,\n", n);
} else {
printf("%d 不是一个素数,\n", n);
}
return 0;
}
知识点:
- 素数判断算法:核心是“试除法”,只要找到一个除数,就可以判定它不是素数。
break语句:立即终止并退出它所在的循环。- 算法优化:一个数
n的因子不会超过sqrt(n),所以循环只需到sqrt(n)即可,大大提高了效率。 #include <math.h>:使用数学函数(如sqrt)需要包含这个头文件。
数组
实验目的
- 掌握一维数组和二维数组的定义、初始化和引用。
- 学习使用数组进行批量数据的存储和处理。
- 掌握与数组相关的常用算法,如查找、排序(冒泡排序)、最大值/最小值等。
实验题目1:找出数组中的最大值和最小值要求**:定义一个包含10个整数的数组,从键盘为数组赋值,然后找出数组中的最大值和最小值。
思路分析:
- 定义一个整型数组,如
int arr[10];。 - 使用
for循环和scanf从键盘为数组的10个元素赋值。 - 假设数组的第一个元素
arr[0]既是最大值也是最小值。 - 使用另一个
for循环遍历数组(从第二个元素开始)。 - 在循环中,将当前元素与当前的最大值比较,如果当前元素更大,则更新最大值。
- 同样,将当前元素与当前的最小值比较,如果当前元素更小,则更新最小值。
- 循环结束后,最大值和最小值就都找到了。
参考代码:
#include <stdio.h>
int main() {
int arr[10];
int i;
int max, min;
printf("请输入10个整数,用空格隔开:\n");
for (i = 0; i < 10; i++) {
scanf("%d", &arr[i]);
}
// 假设第一个元素是最大值和最小值
max = arr[0];
min = arr[0];
// 从第二个元素开始遍历
for (i = 1; i < 10; i++) {
if (arr[i] > max) {
max = arr[i];
}
if (arr[i] < min) {
min = arr[i];
}
}
printf("数组中的最大值是: %d\n", max);
printf("数组中的最小值是: %d\n", min);
return 0;
}
知识点:
- 数组定义与初始化:
int arr[10];定义了一个可以存放10个整数的数组。 - 数组元素访问:通过下标(索引)访问,如
arr[0],arr[1], ...,arr[9]。注意:C语言数组下标从0开始! - 查找算法(极值查找):通过遍历和比较来找到最大/最小值是一种非常基础且重要的算法。
实验题目2:数组元素逆序存放要求**:将一个数组中的元素逆序存放,原数组为 1, 2, 3, 4, 5,逆序后为 5, 4, 3, 2, 1。
思路分析:
- 逆序操作可以通过交换对称位置的元素来实现。
- 对于一个长度为
n的数组,需要交换arr[0]和arr[n-1],arr[1]和arr[n-2],以此类推。 - 循环的次数只需要是数组长度的一半即可,使用一个
for循环,循环变量i从0遍历到n/2 - 1。 - 在循环中,定义一个临时变量
temp,用于交换arr[i]和arr[n-1-i]的值。
参考代码:
#include <stdio.h>
#define N 5 // 使用宏定义数组长度,方便修改
int main() {
int arr[N] = {1, 2, 3, 4, 5};
int i, temp;
printf("原始数组: ");
for (i = 0; i < N; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 逆序操作
for (i = 0; i < N / 2; i++) {
// 交换 arr[i] 和 arr[N-1-i]
temp = arr[i];
arr[i] = arr[N - 1 - i];
arr[N - 1 - i] = temp;
}
printf("逆序后数组: ");
for (i = 0; i < N; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
知识点:
- 交换算法:
temp = a; a = b; b = temp;是交换两个变量值的标准方法。 - 对称交换:通过
i和n-1-i的组合,可以方便地访问到对称的元素。 #define宏定义:用于定义一个常量,提高代码的可读性和可维护性。
函数
实验目的
- 掌握C语言中函数的定义、声明和调用方法。
- 理解函数参数的传递方式(值传递)。
- 学习使用函数来解决模块化编程问题。
实验题目:使用函数判断素数要求**:将实验三中判断素数的代码封装成一个函数,然后在 main 函数中调用该函数来判断用户输入的数是否为素数。
思路分析:
- 函数定义:创建一个函数,
int is_prime(int num),它接收一个整数num作为参数,返回一个整数(1代表是素数,0代表不是)。 - 函数体:将实验三中判断素数的核心逻辑代码放入
is_prime函数的函数体中。 - 函数声明:在
main函数之前,对is_prime函数进行声明,以便编译器知道这个函数的存在,格式为int is_prime(int num);。 - 函数调用:在
main函数中,从键盘获取用户输入,然后调用is_prime函数,并将返回值赋给一个变量。 - 根据返回值输出结果。
参考代码:
#include <stdio.h>
#include <math.h>
// 函数声明
int is_prime(int num);
int main() {
int n;
printf("请输入一个正整数: ");
scanf("%d", &n);
// 函数调用
if (is_prime(n)) {
printf("%d 是一个素数,\n", n);
} else {
printf("%d 不是一个素数,\n", n);
}
return 0;
}
// 函数定义
int is_prime(int num) {
if (num < 2) {
return 0; // 不是素数
}
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return 0; // 不是素数,提前返回
}
}
return 1; // 是素数
}
知识点:
- 函数三要素:函数名、参数列表、返回值类型。
- 函数声明 vs 函数定义:
- 声明:告诉编译器“有这么一个函数,长这样”,不包含具体代码,通常放在文件开头。
- 定义:提供了函数的具体实现,包含函数体。
return语句:不仅可以从函数中返回一个值,还可以立即终止函数的执行。- 模块化:将复杂的功能分解成一个个独立的函数,使代码结构更清晰、更易于复用和维护。
总结与建议
这份指南涵盖了C语言初学者最核心的实验内容,请务必:
- 亲手敲代码:不要只看不练,在编译器中自己输入、编译、运行、调试代码。
- 修改和扩展:尝试修改实验题目中的条件,比如计算1到100的累加积,或者判断一个数是否是“完数”等。
- 调试:学会使用编译器的调试功能(如设置断点、单步执行、查看变量值),这是解决问题的关键技能。
- 理解原理:每一步代码都要明白它为什么这么写,背后的逻辑是什么。
祝你学习顺利,在C语言的世界里探索愉快!
