掌握C语言编程挑战:实战解析50道经典难题

2026-10-19 0 阅读

C语言作为一门历史悠久且广泛应用于系统软件、嵌入式系统、游戏开发等领域的编程语言,其语法简洁、效率高,深受开发者喜爱。为了帮助广大编程爱好者深入理解和掌握C语言,本文将针对50道经典编程难题进行实战解析,旨在帮助读者在实战中提升编程技能。

第一部分:基础篇

难题1:输出“Hello, World!”

解析:这是C语言编程中最基础的程序,主要用于入门练习。

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

难题2:输入输出整型

解析:学习如何从键盘读取整数并输出到屏幕。

#include <stdio.h>

int main() {
    int num;
    scanf("%d", &num);
    printf("You entered: %d", num);
    return 0;
}

第二部分:进阶篇

难题3:计算阶乘

解析:考察递归和循环的概念。

#include <stdio.h>

long long factorial(int n) {
    if (n == 0)
        return 1;
    else
        return n * factorial(n - 1);
}

int main() {
    int num;
    printf("Enter a number: ");
    scanf("%d", &num);
    printf("Factorial of %d is %lld", num, factorial(num));
    return 0;
}

难题4:字符串反转

解析:利用指针和数组操作实现字符串反转。

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

void reverse(char *str) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = temp;
    }
}

int main() {
    char str[100];
    printf("Enter a string: ");
    scanf("%s", str);
    reverse(str);
    printf("Reversed string: %s", str);
    return 0;
}

第三部分:高级篇

难题5:链表操作

解析:实现链表的基本操作,如插入、删除和遍历。

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

typedef struct Node {
    int data;
    struct Node* next;
} Node;

Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

void insertNode(Node** head, int data) {
    Node* newNode = createNode(data);
    newNode->next = *head;
    *head = newNode;
}

void deleteNode(Node** head, int key) {
    Node* temp = *head, *prev = NULL;
    if (temp != NULL && temp->data == key) {
        *head = temp->next;
        free(temp);
        return;
    }
    while (temp != NULL && temp->data != key) {
        prev = temp;
        temp = temp->next;
    }
    if (temp == NULL) return;
    prev->next = temp->next;
    free(temp);
}

void displayList(Node* head) {
    while (head != NULL) {
        printf("%d ", head->data);
        head = head->next;
    }
    printf("\n");
}

int main() {
    Node* head = NULL;
    insertNode(&head, 1);
    insertNode(&head, 2);
    insertNode(&head, 3);
    displayList(head);
    deleteNode(&head, 2);
    displayList(head);
    return 0;
}

难题6:排序算法

解析:实现冒泡排序、选择排序和插入排序等常见排序算法。

#include <stdio.h>

void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

void selectionSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        int min_idx = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[min_idx]) {
                min_idx = j;
            }
        }
        int temp = arr[min_idx];
        arr[min_idx] = arr[i];
        arr[i] = temp;
    }
}

void insertionSort(int arr[], int n) {
    int i, j, key;
    for (i = 1; i < n; i++) {
        key = arr[i];
        j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
    }
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);
    bubbleSort(arr, n);
    printf("Bubble sorted array: \n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");

    int arr1[] = {64, 34, 25, 12, 22, 11, 90};
    selectionSort(arr1, n);
    printf("Selection sorted array: \n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr1[i]);
    printf("\n");

    int arr2[] = {64, 34, 25, 12, 22, 11, 90};
    insertionSort(arr2, n);
    printf("Insertion sorted array: \n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr2[i]);
    printf("\n");

    return 0;
}

第四部分:综合应用篇

难题7:模拟银行系统

解析:设计一个简单的银行系统,实现开户、存取款和查询余额等功能。

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

typedef struct {
    char accountNumber[50];
    char name[50];
    float balance;
} Account;

void createAccount(Account accounts[], int index) {
    printf("Enter account number: ");
    scanf("%s", accounts[index].accountNumber);
    printf("Enter name: ");
    scanf("%s", accounts[index].name);
    accounts[index].balance = 0.0;
}

void deposit(Account accounts[], int index) {
    float amount;
    printf("Enter amount to deposit: ");
    scanf("%f", &amount);
    accounts[index].balance += amount;
}

void withdraw(Account accounts[], int index) {
    float amount;
    printf("Enter amount to withdraw: ");
    scanf("%f", &amount);
    if (accounts[index].balance >= amount) {
        accounts[index].balance -= amount;
    } else {
        printf("Insufficient balance\n");
    }
}

void checkBalance(Account accounts[], int index) {
    printf("Account balance: %.2f\n", accounts[index].balance);
}

int main() {
    Account accounts[100];
    int numberOfAccounts = 0;

    int choice, index;
    while (1) {
        printf("1. Create account\n");
        printf("2. Deposit\n");
        printf("3. Withdraw\n");
        printf("4. Check balance\n");
        printf("5. Exit\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                if (numberOfAccounts < 100) {
                    createAccount(accounts, numberOfAccounts);
                    numberOfAccounts++;
                } else {
                    printf("Maximum number of accounts reached\n");
                }
                break;
            case 2:
                printf("Enter account number: ");
                scanf("%s", index);
                deposit(accounts, index);
                break;
            case 3:
                printf("Enter account number: ");
                scanf("%s", index);
                withdraw(accounts, index);
                break;
            case 4:
                printf("Enter account number: ");
                scanf("%s", index);
                checkBalance(accounts, index);
                break;
            case 5:
                return 0;
            default:
                printf("Invalid choice\n");
        }
    }
    return 0;
}

通过以上50道经典编程难题的实战解析,相信读者在C语言编程方面会有很大的提升。希望本文对您的编程之路有所帮助!

分享到: