C语言程序设计题库 (大一版)
第一部分:基础语法与数据类型
这个部分是C语言的基石,主要考察对基本数据类型、变量、常量、运算符和表达式的理解。

知识点:
- 变量定义与初始化
- 基本数据类型 (
int,float,double,char) - 常量与符号常量 (
#define,const) - 算术运算符 (, , , , )
- 赋值运算符与复合赋值运算符
- 自增自减运算符 (, )
- 类型转换
1:温度转换描述: 编写一个程序,将摄氏温度转换为华氏温度,转换公式为:F = C * 9 / 5 + 32,用户输入一个摄氏温度,程序输出对应的华氏温度。
代码示例:
#include <stdio.h>
int main() {
float celsius, fahrenheit;
printf("请输入摄氏温度: ");
scanf("%f", &celsius);
fahrenheit = celsius * 9.0f / 5.0f + 32.0f;
printf("华氏温度为: %.2f\n", fahrenheit);
return 0;
}
解析:
- 使用
float类型存储温度,因为温度可能是小数。 scanf用于从键盘读取用户输入的浮点数。%.2f是格式化输出,表示保留两位小数,使结果更美观。- 在计算时,使用
0f和0f可以确保进行浮点数除法,而不是整数除法。
2:计算圆的周长和面积描述: 从键盘输入一个圆的半径,计算并输出其周长和面积,使用 #define 定义圆周率 PI 为 14159。
代码示例:
#include <stdio.h>
#define PI 3.14159
int main() {
float radius, circumference, area;
printf("请输入圆的半径: ");
scanf("%f", &radius);
circumference = 2 * PI * radius;
area = PI * radius * radius;
printf("周长为: %.2f\n", circumference);
printf("面积为: %.2f\n", area);
return 0;
}
解析:
- 使用
#define定义常量PI,这是一个良好的编程习惯,方便统一修改和管理。 - 分别计算周长和面积,并输出结果。
第二部分:流程控制语句
这个部分是程序逻辑的核心,考察分支和循环结构的使用。
知识点:
if-else条件语句switch多分支语句for循环while循环do-while循环break和continue语句- 循环嵌套
3:判断奇偶数描述: 输入一个整数,判断它是奇数还是偶数。
代码示例:
#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;
}
解析:
- 使用 (取模) 运算符来判断一个数是否能被2整除。
if-else结构用于根据条件执行不同的代码块。
4:打印九九乘法表描述: 使用循环嵌套打印标准的九九乘法表。
代码示例:
#include <stdio.h>
int main() {
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= i; j++) {
printf("%d*%d=%-2d ", j, i, i * j); // %-2d 表示左对齐,占2位
}
printf("\n"); // 每行结束后换行
}
return 0;
}
解析:
- 外层循环
for (i = 1; i <= 9; i++)控制行数。 - 内层循环
for (j = 1; j <= i; j++)控制每行的列数,列数等于当前的行数i。 printf("\n");用于在每一行打印完毕后换行。%-2d是一个格式化技巧, 表示左对齐,2表示该整数占2个字符宽度,可以使输出更整齐。
5:猜数字游戏描述: 程序随机生成一个1到100之间的整数,用户输入猜测的数字,程序提示“猜大了”、“猜小了”或“猜对了”,直到用户猜中为止。
代码示例:
#include <stdio.h>
#include <stdlib.h> // 用于 rand() 和 srand()
#include <time.h> // 用于 time()
int main() {
int secret, guess;
// 使用当前时间作为随机数种子,确保每次运行结果不同
srand((unsigned)time(NULL));
secret = rand() % 100 + 1; // 生成1-100的随机数
printf("我已经想好了一个1到100之间的整数,请你来猜,\n");
do {
printf("请输入你的猜测: ");
scanf("%d", &guess);
if (guess > secret) {
printf("猜大了!\n");
} else if (guess < secret) {
printf("猜小了!\n");
} else {
printf("恭喜你,猜对了!\n");
}
} while (guess != secret); // 当猜错时,循环继续
return 0;
}
解析:
srand((unsigned)time(NULL))是初始化随机数种子的标准做法,否则每次程序运行生成的随机数序列都是一样的。rand() % 100 + 1是生成1到100随机数的常用方法。do-while循环非常适合这种“至少执行一次,直到满足条件才退出”的场景。
第三部分:数组
数组是相同类型数据的集合,是处理批量数据的基础。
知识点:
- 一维数组的定义、初始化和引用
- 数组的遍历
- 求数组最大值、最小值、平均值
- 数组元素的排序 (冒泡排序)
- 二维数组的定义和遍历
6:数组元素求和与平均值描述: 定义一个包含10个整数的数组,计算并输出所有元素的和以及平均值。
代码示例:
#include <stdio.h>
int main() {
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sum = 0;
float average;
int i;
// 计算总和
for (i = 0; i < 10; i++) {
sum += arr[i];
}
average = (float)sum / 10; // 注意类型转换,确保得到浮点数结果
printf("数组元素的和为: %d\n", sum);
printf("数组元素的平均值为: %.2f\n", average);
return 0;
}
解析:
int arr[10]定义了一个可以存放10个整数的数组。sum += arr[i]是累加的简洁写法。(float)sum是强制类型转换,将sum从int转换为float,以保证除法运算得到的是浮点数。
7:数组排序 (冒泡排序)描述: 对一个包含5个整数的数组进行升序排序,并输出排序后的结果。
代码示例:
#include <stdio.h>
int main() {
int arr[5] = {64, 34, 25, 12, 22};
int i, j, temp;
int n = 5;
// 冒泡排序
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// 交换元素
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
printf("排序后的数组: ");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
解析:
- 冒泡排序的核心思想是:每次比较相邻的两个元素,如果它们的顺序错误,就交换它们。
- 外层循环控制排序的轮数,共需要
n-1轮。 - 内层循环负责每轮中的具体比较和交换,每轮后最大的元素会“冒泡”到最后,所以内层循环的范围可以减少。
第四部分:函数
函数是模块化编程的基础,用于封装代码,提高代码的复用性和可读性。
知识点:
- 函数的定义、声明和调用
- 函数参数 (值传递)
- 函数返回值
- 递归函数
8:使用函数判断素数描述: 编写一个函数 isPrime(int num),用于判断一个整数是否为素数,在 main 函数中调用该函数,并输出结果。
代码示例:
#include <stdio.h>
#include <stdbool.h> // 使用 bool 类型
// 函数声明
bool isPrime(int num);
int main() {
int number;
printf("请输入一个正整数: ");
scanf("%d", &number);
if (isPrime(number)) {
printf("%d 是一个素数,\n", number);
} else {
printf("%d 不是一个素数,\n", number);
}
return 0;
}
// 函数定义:判断素数
bool isPrime(int num) {
if (num <= 1) {
return false;
}
for (int i = 2; i * i <= num; i++) { // 优化:只需判断到 sqrt(num)
if (num % i == 0) {
return false;
}
}
return true;
}
解析:
bool是C99标准引入的类型,需要包含<stdbool.h>头文件。- 函数声明放在
main函数之前,告诉编译器这个函数的存在。 - 函数定义实现了具体的逻辑,判断素数时,只需从2遍历到
sqrt(num)即可,这里用i * i <= num来避免调用开方函数,效率更高。 return false或return true一旦执行,函数立即结束。
第五部分:指针
指针是C语言的灵魂和难点,它存储的是变量的内存地址。
知识点:
- 指针变量的定义和初始化 (,
&) - 指针与数组的关系
- 使用指针作为函数参数 (实现值传递的模拟,即地址传递)
const与指针
9:使用指针交换两个变量的值描述: 编写一个函数 swap,通过指针参数交换两个整数的值。
代码示例:
#include <stdio.h>
// 函数声明
void swap(int *ptr1, int *ptr2);
int main() {
int a = 10, b = 20;
printf("交换前: a = %d, b = %d\n", a, b);
swap(&a, &b); // 传递变量的地址
printf("交换后: a = %d, b = %d\n", a, b);
return 0;
}
// 函数定义:通过指针交换值
void swap(int *ptr1, int *ptr2) {
int temp;
temp = *ptr1; // 解引用ptr1,获取a的值
*ptr1 = *ptr2; // 将b的值赋给a
*ptr2 = temp; // 将temp的值(原来的a的值)赋给b
}
解析:
int *ptr1定义了一个指向整型的指针变量ptr1。&a是取地址运算符,获取变量a的内存地址。- 在
swap函数内部,*ptr1是解引用(或称间接寻址)操作,它获取指针ptr1所指向地址的值(即a的值)。 - 通过传递地址,函数可以直接修改
main函数中变量的值,这是C语言中实现“引用传递”效果的标准方式。
第六部分:结构体
结构体允许将不同类型的数据组合成一个有机的整体。
知识点:
- 结构体类型的定义
- 结构体变量的声明和初始化
- 结构体成员的访问 ( 和
->)
10:学生信息管理描述: 定义一个结构体 Student,包含学号 (id)、姓名 (name) 和成绩 (score),创建一个 Student 类型的变量,并为其赋值,然后打印出来。
代码示例:
#include <stdio.h>
#include <string.h>
// 定义结构体类型
struct Student {
int id;
char name[50];
float score;
};
int main() {
// 声明并初始化结构体变量
struct Student stu1 = {101, "张三", 95.5};
// 打印结构体信息
printf("学号: %d\n", stu1.id);
printf("姓名: %s\n", stu1.name);
printf("成绩: %.1f\n", stu1.score);
// 修改成员值
stu1.score = 98.0;
printf("修改后的成绩: %.1f\n", stu1.score);
return 0;
}
解析:
struct Student是一个自定义的数据类型。struct Student stu1;声明了一个Student类型的变量stu1。stu1.id使用点号 来访问结构体变量的成员。
备考与学习建议
- 先理解,后敲代码: 看懂题目逻辑和解析,理解每一步代码为什么这么写,不要直接复制粘贴。
- 多动手实践: C语言是实践性极强的学科,只看不练等于白学,把上面的题目亲手敲一遍,并尝试修改,观察结果变化。
- 调试能力: 学会使用编译器的错误提示信息,当程序出错时,仔细阅读错误信息,定位问题所在,这是程序员的核心技能之一。
- 善用资源:
- 书籍: 《C Primer Plus》、《C程序设计语言》 经典必读。
- 在线教程: 菜鸟教程、W3School、Runoob 等都有很好的入门教程。
- IDE: 推荐使用 Visual Studio Code (配合C/C++插件) 或 Dev-C++。
- 从模仿到创造: 在掌握基础后,尝试自己出题,或者找一些更复杂的项目(如简单的计算器、学生管理系统、贪吃蛇游戏等)来挑战自己。
希望这份题库能对你的C语言学习有所帮助!祝你学业有成!
