C 语言经典练习题:从基础到算法的实战演练

在学习 C 语言的过程中,通过实际的练习题来巩固知识是非常有效的方法。下面我将分享一些 C 语言的经典练习题,涵盖了登录验证、函数递归、数据查找与排序等多个方面,希望能对正在学习 C 语言的小伙伴们有所帮助。

练习题 1:连续登录 3 次,锁定账号

题目描述

实现一个简单的登录验证系统,用户有 3 次尝试登录的机会,如果连续 3 次输入的用户名或密码错误,则锁定账号。

代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

#define MAX_ATTEMPTS 3
#define USERNAME "admin"
#define PASSWORD "password"

int main() {
    char input_username[50];
    char input_password[50];
    int attempts = 0;

    while (attempts < MAX_ATTEMPTS) {
        printf("请输入用户名: ");
        scanf("%s", input_username);
        printf("请输入密码: ");
        scanf("%s", input_password);

        if (strcmp(input_username, USERNAME) == 0 && strcmp(input_password, PASSWORD) == 0) {
            printf("登录成功!\n");
            break;
        }
        else {
            attempts++;
            printf("用户名或密码错误,你还有 %d 次尝试机会。\n", MAX_ATTEMPTS - attempts);
        }
    }

    if (attempts == MAX_ATTEMPTS) {
        printf("账号已锁定,请联系管理员。\n");
    }

    return 0;
}

代码解释

  • 宏定义:使用#define定义了最大尝试次数MAX_ATTEMPTS、正确的用户名USERNAME和密码PASSWORD,方便后续修改和维护。
  • 循环验证:使用while循环,只要尝试次数小于最大尝试次数,就继续提示用户输入用户名和密码。
  • 字符串比较:使用strcmp函数比较用户输入的用户名和密码是否与预设的一致。
  • 锁定账号:当尝试次数达到最大尝试次数时,输出账号锁定的提示信息。

练习题 2:函数:求斐波那契数列前 20 位的值

题目描述

斐波那契数列是指这样一个数列:从第 3 位开始,每一位都是前 2 位的和,即 0, 1, 1, 2, 3, 5, ... 。编写一个函数,求出该数列的前 20 项。

代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 函数用于求斐波那契数列的第n项
int fibonacci(int n) {
    if (n <= 0) return 0;
    if (n == 1) return 1;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

// 主函数
int main() {
    printf("斐波那契数列的前20项为:\n");
    for (int i = 0; i < 20; i++) {
        printf("%d ", fibonacci(i));
        if ((i + 1) % 5 == 0) printf("\n"); // 5个一行
    }
    printf("\n");
    return 0;
}

代码解释

  • 递归函数fibonacci函数使用递归的方式计算斐波那契数列的第n项。当n小于等于 0 时,返回 0;当n等于 1 时,返回 1;否则,返回前两项的和。
  • 主函数:使用for循环调用fibonacci函数,输出前 20 项的值,并每 5 个一行进行格式化输出。

练习题 3:寻找 500 内的回文数

题目描述

回文数是指正读反读都一样的数,编写一个程序,找出 500 以内的所有回文数,并输出它们的个数。

代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int is_palindrom(int num) {
    int temp = num;
    int reversed = 0;
    while (temp > 0) {
        reversed = reversed * 10 + temp % 10;
        temp /= 10;
    }
    return reversed == num;
}

// 主函数
int main() {
    int count = 0;
    printf("500内的回文数有:\n");
    for (int i = 1; i < 500; i++) {
        if (is_palindrom(i)) {
            printf("%d \n", i);
            count++;
        }
    }
    printf("\n");
    printf("500内的回文数的个数为:%d\n", count);

    return 0;
}

代码解释

  • 判断回文数函数is_palindrom函数通过将数字反转,然后比较反转后的数字与原数字是否相等来判断是否为回文数。
  • 主函数:使用for循环遍历 1 到 499 的所有数字,调用is_palindrom函数判断是否为回文数,如果是则输出该数字并计数。

练习题 4:顺序查找算法

题目描述

在数组arrs[] = {11, 23, 32, 22, 14}中查找某一个元素,并输出其在数组中的位置。

代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define SIZE 5

// 顺序查找函数
int sequential_search(int arrs[], int size, int target) {
    for (int i = 0; i < size; i++) {
        if (arrs[i] == target) {
            return i;
        }
    }
    return -1;
}

// 主函数
int main() {
    int arrs[SIZE] = { 11, 23, 32, 22, 14 };
    int target;
    printf("请输入要查找的元素: ");
    scanf("%d", &target);

    int index = sequential_search(arrs, SIZE, target);
    if (index != -1) {
        printf("找到了,元素下标为: %d\n", index);
    }
    else {
        printf("没有找到\n");
    }

    return 0;
}

代码解释

  • 顺序查找函数sequential_search函数通过遍历数组,依次比较每个元素与目标元素是否相等,如果相等则返回该元素的下标,否则返回 -1。
  • 主函数:提示用户输入要查找的元素,调用sequential_search函数进行查找,并输出查找结果。

练习题 5:冒泡排序后顺序查找某一个元素

题目描述

先对数组arrs[] = {11, 23, 32, 22, 14}进行冒泡排序,然后在排序后的数组中查找某一个元素,并输出其在数组中的位置。

代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define SIZE 5

// 冒泡排序函数
void bubble_sort(int arr[], int size) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

// 顺序查找函数
int sequential_search(int arr[], int size, int target) {
    for (int i = 0; i < size; i++) {
        if (arr[i] == target) {
            return i;
        }
    }
    return -1;
}

int main() {
    int arrs[SIZE] = { 11, 23, 32, 22, 14 };
    int target;
    printf("请输入要查找的元素: ");
    scanf("%d", &target);

    bubble_sort(arrs, SIZE);
    printf("冒泡排序后的数组: ");
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", arrs[i]);
    }
    printf("\n");

    int index = sequential_search(arrs, SIZE, target);
    if (index != -1) {
        printf("\n元素 %d 在排序后数组中的下标是 %d\n", target, index);
    }
    else {
        printf("元素 %d 不在数组中\n", target);
    }

    return 0;
}

代码解释

  • 冒泡排序函数bubble_sort函数通过多次比较和交换相邻元素的位置,将数组按升序排序。
  • 顺序查找函数:与练习题 4 中的顺序查找函数相同。
  • 主函数:先对数组进行冒泡排序,输出排序后的数组,然后调用顺序查找函数进行查找,并输出查找结果。

练习题 6:选择排序后顺序查找某一个元素

题目描述

先对数组arrs[] = {11, 23, 32, 22, 14}进行选择排序,然后在排序后的数组中查找某一个元素,并输出其在数组中的位置。

代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define SIZE 5

// 选择排序函数
void selection_sort(int arr[], int size) {
    for (int i = 0; i < size - 1; i++) {
        int min_index = i;
        for (int j = i + 1; j < size; j++) {
            if (arr[j] < arr[min_index]) {
                min_index = j;
            }
        }
        if (min_index != i) {
            int temp = arr[i];
            arr[i] = arr[min_index];
            arr[min_index] = temp;
        }
    }
}

// 顺序查找函数
int sequential_search(int arr[], int size, int target) {
    for (int i = 0; i < size; i++) {
        if (arr[i] == target) {
            return i;
        }
    }
    return -1;
}

int main() {
    int arrs[SIZE] = { 11, 23, 32, 22, 14 };
    int target;
    printf("请输入要查找的元素: ");
    scanf("%d", &target);

    selection_sort(arrs, SIZE);
    printf("选择排序后的数组: ");
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", arrs[i]);
    }
    printf("\n");

    int index = sequential_search(arrs, SIZE, target);
    if (index != -1) {
        printf("\n元素 %d 在排序后数组中的下标是 %d\n", target, index);
    }
    else {
        printf("元素 %d 不在数组中\n", target);
    }

    return 0;
}

代码解释

  • 选择排序函数selection_sort函数通过每次从未排序部分中选择最小的元素,将其与未排序部分的第一个元素交换位置,逐步将数组按升序排序。
  • 顺序查找函数:与练习题 4 中的顺序查找函数相同。
  • 主函数:先对数组进行选择排序,输出排序后的数组,然后调用顺序查找函数进行查找,并输出查找结果。

练习题 7:二分查找某一个元素

题目描述

在数组arrs[] = {11, 23, 32, 22, 14}中查找某一个元素,并输出其在数组中的位置。使用二分查找算法,要求先对数组进行排序。

代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

#define SIZE 5

// 比较函数,用于 qsort
int compare(const void* a, const void* b) {
    return (*(int*)a - *(int*)b);
}

// 二分查找函数
int binary_search(int arr[], int size, int target) {
    int left = 0, right = size - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) {
            return mid;
        }
        else if (arr[mid] < target) {
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }
    return -1;
}

int main() {
    int arrs[SIZE] = { 11, 23, 32, 22, 14 };
    int target;
    printf("请输入要查找的元素: ");
    scanf("%d", &target);

    // 对数组进行排序
    qsort(arrs, SIZE, sizeof(int), compare);

    printf("排序后的数组: ");
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", arrs[i]);
    }
    printf("\n");

    int index = binary_search(arrs, SIZE, target);
    if (index != -1) {
        printf("元素 %d 在排序后数组中的下标是 %d\n", target, index);
    }
    else {
        printf("元素 %d 不在数组中\n", target);
    }

    return 0;
}

代码解释

  • 比较函数compare函数用于qsort函数,用于比较两个元素的大小,返回值为负数表示第一个元素小于第二个元素,返回值为正数表示第一个元素大于第二个元素,返回值为 0 表示两个元素相等。
  • 二分查找函数binary_search函数通过不断将查找范围缩小一半,直到找到目标元素或查找范围为空。
  • 主函数:先使用qsort函数对数组进行排序,输出排序后的数组,然后调用二分查找函数进行查找,并输出查找结果。

通过这些练习题,我们可以加深对 C 语言的基本语法、函数、数组、排序和查找算法等知识点的理解和掌握。希望大家在学习过程中能够多动手实践,不断提高自己的编程能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值