前言:
刚接触 C 语言时,你是否曾对着书本上的语法规则发呆?
看着题目要求傻傻的不知所措?
看着复杂的代码示例却不知如何下手?其
实,编程的核心能力从来不是死记硬背,而是在实战中培养逻辑思维。
本章为大家带来经典练手题。
这里提出一个要求,在看完题目后,先在脑海中进行思考后,再看答案代码
习题一
计算圆的面积与周长
#include <stdio.h>
#define PI 3.14159 // 定义常量π
int main()
{
float r, area, circumference;
printf("请输入圆的半径:");
scanf("%f", &r);
area = PI * r * r;
circumference = 2 * PI * r;
printf("面积:%.2f,周长:%.2f\n", area, circumference);
return 0;
}
关键点:#define
宏定义的使用、浮点数精度控制在%.2f
习题二
不借第三方变量交换两数
a = a + b; // 两数之和存到a
b = a - b; // a-b即为原a的值,存入b
a = a - b; // 现在a是原b的值
借助第三方的方法应该不用多讲吧!!(提示:定义temp)
习题三
打印 9×9 乘法口诀表
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
printf("%d×%d=%d\t", j, i, i*j);
}
printf("\n"); // 每行列数打印完后换行
}
扩展练习:
试试打印倒三角口诀表,或用#
符号拼出乘法表的形状!
习题四
判断素数的高效算法
优化思路:不必从 2 循环到 n-1,只需检查到√n
int isPrime(int n)
{
if (n <= 1) return 0;
if (n == 2) return 1;
if (n % 2 == 0) return 0; // 偶数直接排除
int max = sqrt(n);
for (int i = 3; i <= max; i += 2)
{ // 只检查奇数
if (n % i == 0) return 0;
}
return 1;
}
思考:为什么 n=2 要单独处理
扩展练习:
判断闰年
习题五
冒泡排序
相邻元素比较,大的往后 “冒泡”
void bubbleSort(int arr[], int n)
{
for (int i = 0; i < n-1; i++)
{ // n个元素需n-1轮
for (int j = 0; j < n-1-i; j++)
{ // 每轮减少已排好的元素
if (arr[j] > arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
习题六
数组最值查找的指针技巧
技巧:传址
void findMaxMin(int arr[], int n, int *max, int *min)
{
*max = *min = arr[0];
for (int i = 1; i < n; i++)
{
if (arr[i] > *max) *max = arr[i];
if (arr[i] < *min) *min = arr[i];
}
}
// 主函数调用:findMaxMin(arr, n, &max, &min);
习题七
函数与递归 计算阶乘
long long factorial(int n)
{
if (n == 0 || n == 1)
{
return 1; // 终止条件:0! = 1! = 1
} else
{
return n * factorial(n-1); // 递推公式
}
}
技巧:
递归三要素: 终止条件、递推公式、数据规模递减
习题 八
指针交换字符串的 地址
void swapStrings(char *a, char *b)
{
char temp[100];
strcpy(temp, a); // 先复制a到临时数组
strcpy(a, b); // 再把b复制到a
strcpy(b, temp); // 最后把临时数组复制到b
}
易错点:字符串常量不能直接修改,需用字符数组存储。
思考:如果直接修改会发生什么?(char *temp = a; a = b; b = temp)
习题九
学生成绩管理系统
这里考察结构体的运用
typedef struct
{
char name[20];
float scores[3];
float total, average;
} Student;
void inputScores(Student s[]); // 输入成绩
void calculate(Student s[]); // 计算总分平均分
void printTable(Student s[]); // 打印成绩表
其他的函数简单,就自己定义吧
总结:
方式:
- 先思考再编码:在纸上画流程、思考过程,避免边写边改;
- 调试是必备技能:用
printf
打印中间变量,或用 IDE 的断点调试功能; - 举一反三:比如排序题,试试对浮点数数组、字符串数组排序;
- 挑战 “边界条件”:输入 0 个元素、负数、超大数,测试程序鲁棒性。(大部分的网址习题都会考察边界问题)