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语言编程方面会有很大的提升。希望本文对您的编程之路有所帮助!