【C语言】习题练手 带你入门,突破编程瓶颈

前言:

刚接触 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[]);   // 打印成绩表

其他的函数简单,就自己定义吧 

总结:

方式:
  1. 先思考再编码:在纸上画流程、思考过程,避免边写边改;
  2. 调试是必备技能:用printf打印中间变量,或用 IDE 的断点调试功能;
  3. 举一反三:比如排序题,试试对浮点数数组、字符串数组排序;
  4. 挑战 “边界条件”:输入 0 个元素、负数、超大数,测试程序鲁棒性。(大部分的网址习题都会考察边界问题)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值