引言
C语言作为一种历史悠久且应用广泛的编程语言,以其高效、灵活和强大的功能深受程序员喜爱。然而,C语言编程过程中也常常会遇到各种设计难题。本文将为您提供50个实战例题,通过这些例题,您可以深入理解C语言编程的奥秘,提升编程技能。
例题1:计算两个整数的和
#include <stdio.h>
int main() {
int a, b, sum;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
sum = a + b;
printf("两个整数的和为:%d\n", sum);
return 0;
}
例题2:判断一个数是否为素数
#include <stdio.h>
#include <stdbool.h>
bool is_prime(int num) {
if (num <= 1) return false;
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) return false;
}
return true;
}
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
if (is_prime(num)) {
printf("%d 是素数\n", num);
} else {
printf("%d 不是素数\n", num);
}
return 0;
}
例题3:冒泡排序
#include <stdio.h>
void bubble_sort(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;
}
}
}
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, n);
printf("排序后的数组:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
例题4:递归计算阶乘
#include <stdio.h>
int factorial(int n) {
if (n == 0) return 1;
return n * factorial(n - 1);
}
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
printf("%d 的阶乘为:%d\n", num, factorial(num));
return 0;
}
例题5:链表插入节点
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* create_node(int data) {
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->data = data;
new_node->next = NULL;
return new_node;
}
void insert_node(Node** head, int data) {
Node* new_node = create_node(data);
new_node->next = *head;
*head = new_node;
}
void print_list(Node* head) {
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
int main() {
Node* head = NULL;
insert_node(&head, 1);
insert_node(&head, 2);
insert_node(&head, 3);
print_list(head);
return 0;
}
例题6:二分查找
#include <stdio.h>
int binary_search(int arr[], int l, int r, int x) {
while (l <= r) {
int m = l + (r - l) / 2;
if (arr[m] == x) return m;
if (arr[m] < x) l = m + 1;
else r = m - 1;
}
return -1;
}
int main() {
int arr[] = {2, 3, 4, 10, 40};
int n = sizeof(arr) / sizeof(arr[0]);
int x = 10;
int result = binary_search(arr, 0, n - 1, x);
if (result == -1) {
printf("元素不存在\n");
} else {
printf("元素在索引:%d\n", result);
}
return 0;
}
例题7:快速排序
#include <stdio.h>
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
void quick_sort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quick_sort(arr, low, pi - 1);
quick_sort(arr, pi + 1, high);
}
}
int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
quick_sort(arr, 0, n - 1);
printf("排序后的数组:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
例题8:动态内存分配
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr = (int*)malloc(10 * sizeof(int));
if (ptr == NULL) {
printf("内存分配失败\n");
return 1;
}
for (int i = 0; i < 10; i++) {
ptr[i] = i;
}
printf("动态分配的数组:\n");
for (int i = 0; i < 10; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
free(ptr);
return 0;
}
例题9:结构体与联合体
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
typedef union {
int i;
float f;
char c;
} Data;
int main() {
Point p = {1, 2};
printf("Point x:%d, y:%d\n", p.x, p.y);
Data d;
d.i = 10;
printf("Data i:%d\n", d.i);
d.f = 3.14;
printf("Data f:%f\n", d.f);
d.c = 'A';
printf("Data c:%c\n", d.c);
return 0;
}
例题10:文件操作
#include <stdio.h>
int main() {
FILE* file = fopen("example.txt", "w");
if (file == NULL) {
printf("文件打开失败\n");
return 1;
}
fprintf(file, "Hello, World!\n");
fclose(file);
file = fopen("example.txt", "r");
if (file == NULL) {
printf("文件打开失败\n");
return 1;
}
char ch;
while ((ch = fgetc(file)) != EOF) {
printf("%c", ch);
}
fclose(file);
return 0;
}
例题11:指针与数组
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
int* ptr = arr;
printf("数组的第一个元素:%d\n", *ptr);
printf("数组的最后一个元素:%d\n", *(ptr + 4));
return 0;
}
例题12:函数指针
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int (*func_ptr)(int, int) = add;
int result = func_ptr(3, 4);
printf("结果:%d\n", result);
return 0;
}
例题13:指针数组
#include <stdio.h>
int main() {
int a = 10, b = 20;
int* ptr[2] = {&a, &b};
printf("a:%d, b:%d\n", *ptr[0], *ptr[1]);
return 0;
}
例题14:二维数组
#include <stdio.h>
int main() {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
例题15:字符串处理
#include <stdio.h>
#include <string.h>
int main() {
char str1[100] = "Hello, World!";
char str2[100];
strcpy(str2, str1);
printf("str1:%s\n", str1);
printf("str2:%s\n", str2);
strcat(str2, " C programming");
printf("str2:%s\n", str2);
return 0;
}
例题16:结构体数组
#include <stdio.h>
typedef struct {
int id;
char name[50];
} Student;
int main() {
Student students[] = {
{1, "Alice"},
{2, "Bob"},
{3, "Charlie"}
};
for (int i = 0; i < sizeof(students) / sizeof(students[0]); i++) {
printf("ID:%d, Name:%s\n", students[i].id, students[i].name);
}
return 0;
}
例题17:指针与函数
#include <stdio.h>
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int a = 10, b = 20;
printf("交换前:a:%d, b:%d\n", a, b);
swap(&a, &b);
printf("交换后:a:%d, b:%d\n", a, b);
return 0;
}
例题18:递归函数
#include <stdio.h>
int factorial(int n) {
if (n == 0) return 1;
return n * factorial(n - 1);
}
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
printf("%d 的阶乘为:%d\n", num, factorial(num));
return 0;
}
例题19:指针数组与函数
#include <stdio.h>
void print_array(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int* ptr = arr;
print_array(ptr, 5);
return 0;
}
例题20:指针与结构体
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
void print_point(const Point* p) {
printf("Point x:%d, y:%d\n", p->x, p->y);
}
int main() {
Point p = {1, 2};
print_point(&p);
return 0;
}
例题21:指针与函数参数
#include <stdio.h>
void increment(int* a) {
(*a)++;
}
int main() {
int num = 10;
printf("原始值:%d\n", num);
increment(&num);
printf("增加后的值:%d\n", num);
return 0;
}
例题22:指针与字符串
#include <stdio.h>
#include <string.h>
void reverse_string(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] = "Hello, World!";
printf("原始字符串:%s\n", str);
reverse_string(str);
printf("反转后的字符串:%s\n", str);
return 0;
}
例题23:指针与动态内存分配
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr = (int*)malloc(10 * sizeof(int));
if (ptr == NULL) {
printf("内存分配失败\n");
return 1;
}
for (int i = 0; i < 10; i++) {
ptr[i] = i;
}
printf("动态分配的数组:\n");
for (int i = 0; i < 10; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
free(ptr);
return 0;
}
例题24:指针与结构体数组
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
void print_points(Point* points[], int n) {
for (int i = 0; i < n; i++) {
printf("Point %d x:%d, y:%d\n", i + 1, points[i]->x, points[i]->y);
}
}
int main() {
Point p1 = {1, 2};
Point p2 = {3, 4};
Point* points[2] = {&p1, &p2};
print_points(points, 2);
return 0;
}
例题25:指针与函数指针
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int main() {
int (*func_ptr)(int, int);
func_ptr = add;
printf("结果:%d\n", func_ptr(3, 4));
func_ptr = subtract;
printf("结果:%d\n", func_ptr(7, 2));
return 0;
}
例题26:指针与指针数组
#include <stdio.h>
int main() {
int a = 10, b = 20;
int* ptr[2] = {&a, &b};
printf("a:%d, b:%d\n", *ptr[0], *ptr[1]);
return 0;
}
例题27:指针与二维数组
#include <stdio.h>
int main() {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", *(arr + i) + j);
}
printf("\n");
}
return 0;
}
例题28:指针与字符串处理
#include <stdio.h>
#include <string.h>
void copy_string(char* dest, const char* src) {
while (*src) {
*dest++ = *src++;
}
*dest = '\0';
}
int main() {
char str1[100] = "Hello, World!";
char str2[100];
copy_string(str2, str1);
printf("str1:%s\n", str1);
printf("str2:%s\n", str2);
return 0;
}
例题29:指针与结构体数组
#include <stdio.h>
typedef struct {
int id;
char name[50];
} Student;
void print_students(Student* students[], int n) {
for (int i = 0; i < n; i++) {
printf("ID:%d, Name:%s\n", students[i]->id, students[i]->name);
}
}
int main() {
Student students[] = {
{1, "Alice"},
{2, "Bob"},
{3, "Charlie"}
};
Student* ptr[3] = {students};
print_students(ptr, 3);
return 0;
}
例题30:指针与函数指针
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int main() {
int (*func_ptr)(int, int);
func_ptr = add;
printf("结果:%d\n", func_ptr(3, 4));
func_ptr = subtract;
printf("结果:%d\n", func_ptr(7, 2));
return 0;
}
例题31:指针与指针数组
#include <stdio.h>
int main() {
int a = 10, b = 20;
int* ptr[2] = {&a, &b};
printf("a:%d, b:%d\n", *ptr[0], *ptr[1]);
return 0;
}
例题32:指针与二维数组
”`c
