在编程的世界里,C语言被誉为“编程语言中的基石”。它以其简洁、高效和强大的功能,成为了学习编程的必修课。对于初学者来说,掌握C语言不仅能够帮助你更好地理解计算机的工作原理,还能为后续学习其他编程语言打下坚实的基础。本文将为你带来50个实用例题,通过这些例题,你将轻松上手C语言编程实战。
1. 数据类型与变量
例题1: 输入一个整数,输出其平方。
#include <stdio.h>
int main() {
int num;
scanf("%d", &num);
printf("%d\n", num * num);
return 0;
}
解析: 这个例子展示了如何使用scanf函数读取用户输入的整数,并使用printf函数输出其平方。
2. 运算符与表达式
例题2: 输入三个整数,输出它们的中位数。
#include <stdio.h>
int main() {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if (a >= b && a >= c) {
printf("%d\n", a);
} else if (b >= a && b >= c) {
printf("%d\n", b);
} else {
printf("%d\n", c);
}
return 0;
}
解析: 这个例子通过比较三个整数的大小,实现了输出中位数的功能。
3. 控制结构
例题3: 输入一个整数,判断它是奇数还是偶数。
#include <stdio.h>
int main() {
int num;
scanf("%d", &num);
if (num % 2 == 0) {
printf("偶数\n");
} else {
printf("奇数\n");
}
return 0;
}
解析: 这个例子使用了if语句来判断一个整数是奇数还是偶数。
4. 循环结构
例题4: 输入一个整数,输出其阶乘。
#include <stdio.h>
int main() {
int num, factorial = 1;
scanf("%d", &num);
for (int i = 1; i <= num; i++) {
factorial *= i;
}
printf("%d\n", factorial);
return 0;
}
解析: 这个例子使用了for循环来计算一个整数的阶乘。
5. 函数
例题5: 编写一个函数,计算两个整数的最大公约数。
#include <stdio.h>
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
int main() {
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", gcd(a, b));
return 0;
}
解析: 这个例子展示了如何使用递归函数来计算两个整数的最大公约数。
6. 数组
例题6: 输入10个整数,输出它们的平均值。
#include <stdio.h>
int main() {
int numbers[10];
int sum = 0;
for (int i = 0; i < 10; i++) {
scanf("%d", &numbers[i]);
sum += numbers[i];
}
printf("%f\n", (float)sum / 10);
return 0;
}
解析: 这个例子展示了如何使用数组来存储多个整数,并计算它们的平均值。
7. 字符串
例题7: 输入一个字符串,输出它的长度。
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
scanf("%s", str);
printf("%d\n", strlen(str));
return 0;
}
解析: 这个例子展示了如何使用strlen函数来计算一个字符串的长度。
8. 文件操作
例题8: 将一个文本文件的内容复制到另一个文件中。
#include <stdio.h>
int main() {
FILE *src, *dst;
char ch;
src = fopen("source.txt", "r");
dst = fopen("destination.txt", "w");
while ((ch = fgetc(src)) != EOF) {
fputc(ch, dst);
}
fclose(src);
fclose(dst);
return 0;
}
解析: 这个例子展示了如何使用文件操作函数来读取和写入文件。
9. 结构体
例题9: 定义一个学生结构体,包含姓名、年龄和成绩,并创建一个学生数组。
#include <stdio.h>
typedef struct {
char name[50];
int age;
float score;
} Student;
int main() {
Student students[3] = {
{"Alice", 20, 90.5},
{"Bob", 22, 85.0},
{"Charlie", 19, 92.0}
};
// 使用students数组
return 0;
}
解析: 这个例子展示了如何定义和使用结构体。
10. 指针
例题10: 输入一个整数数组,输出最大值和最小值。
#include <stdio.h>
int main() {
int numbers[5];
int *ptr, max, min;
ptr = numbers;
max = min = *ptr;
for (int i = 1; i < 5; i++) {
if (*(ptr + i) > max) {
max = *(ptr + i);
}
if (*(ptr + i) < min) {
min = *(ptr + i);
}
}
printf("最大值:%d,最小值:%d\n", max, min);
return 0;
}
解析: 这个例子展示了如何使用指针来访问数组元素。
通过以上10个例题,你将初步掌握C语言的基本语法和编程技巧。接下来,我们将继续深入探讨C语言的更多高级特性,帮助你更好地掌握这门语言。以下是接下来的40个例题,涵盖了C语言的各个方面:
11. 位运算
例题11: 输入两个整数,输出它们的按位与、按位或和按位异或结果。
#include <stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
printf("按位与:%d\n", a & b);
printf("按位或:%d\n", a | b);
printf("按位异或:%d\n", a ^ b);
return 0;
}
解析: 这个例子展示了如何使用位运算符来处理整数。
12. 预处理器
例题12: 使用预处理器宏定义一个计算阶乘的函数。
#include <stdio.h>
#define FACTORIAL(n) ((n) <= 1 ? 1 : (n) * FACTORIAL(n - 1))
int main() {
int num;
scanf("%d", &num);
printf("%d\n", FACTORIAL(num));
return 0;
}
解析: 这个例子展示了如何使用预处理器宏来定义一个函数。
13. 动态内存分配
例题13: 输入一个整数,动态分配内存并存储该整数。
#include <stdio.h>
#include <stdlib.h>
int main() {
int num, *ptr;
scanf("%d", &num);
ptr = (int *)malloc(sizeof(int));
if (ptr != NULL) {
*ptr = num;
printf("%d\n", *ptr);
free(ptr);
} else {
printf("内存分配失败\n");
}
return 0;
}
解析: 这个例子展示了如何使用malloc和free函数来动态分配和释放内存。
14. 链表
例题14: 定义一个单向链表,并实现插入和删除操作。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
void insert(Node **head, int value) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = value;
newNode->next = *head;
*head = newNode;
}
void delete(Node **head, int value) {
Node *temp = *head, *prev = NULL;
while (temp != NULL && temp->data != value) {
prev = temp;
temp = temp->next;
}
if (temp == NULL) {
printf("未找到元素\n");
return;
}
if (prev == NULL) {
*head = temp->next;
} else {
prev->next = temp->next;
}
free(temp);
}
int main() {
Node *head = NULL;
insert(&head, 10);
insert(&head, 20);
insert(&head, 30);
printf("链表:");
for (Node *temp = head; temp != NULL; temp = temp->next) {
printf("%d ", temp->data);
}
printf("\n");
delete(&head, 20);
printf("删除20后的链表:");
for (Node *temp = head; temp != NULL; temp = temp->next) {
printf("%d ", temp->data);
}
printf("\n");
return 0;
}
解析: 这个例子展示了如何定义和使用单向链表。
15. 栈与队列
例题15: 实现一个栈,并实现入栈和出栈操作。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
void push(Stack *s, int value) {
if (s->top < MAX_SIZE - 1) {
s->data[++s->top] = value;
} else {
printf("栈已满\n");
}
}
int pop(Stack *s) {
if (s->top >= 0) {
return s->data[s->top--];
} else {
printf("栈为空\n");
return -1;
}
}
int main() {
Stack s = {0, -1};
push(&s, 10);
push(&s, 20);
push(&s, 30);
printf("栈顶元素:%d\n", pop(&s));
printf("栈顶元素:%d\n", pop(&s));
return 0;
}
解析: 这个例子展示了如何使用数组来实现栈。
16. 字符串处理
例题16: 实现一个字符串反转函数。
#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];
scanf("%s", str);
reverse(str);
printf("反转后的字符串:%s\n", str);
return 0;
}
解析: 这个例子展示了如何使用字符串处理函数来实现字符串反转。
17. 指针与数组
例题17: 输入一个整数数组,输出最大值和最小值。
#include <stdio.h>
int main() {
int numbers[5];
int *ptr, max, min;
ptr = numbers;
max = min = *ptr;
for (int i = 1; i < 5; i++) {
if (*(ptr + i) > max) {
max = *(ptr + i);
}
if (*(ptr + i) < min) {
min = *(ptr + i);
}
}
printf("最大值:%d,最小值:%d\n", max, min);
return 0;
}
解析: 这个例子展示了如何使用指针来访问数组元素。
18. 函数指针
例题18: 定义一个比较函数,并使用函数指针进行排序。
#include <stdio.h>
int compare(int a, int b) {
return a - b;
}
void sort(int *arr, int n, int (*comp)(int, int)) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (comp(arr[j], arr[j + 1]) > 0) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int numbers[5] = {5, 2, 8, 1, 3};
sort(numbers, 5, compare);
printf("排序后的数组:");
for (int i = 0; i < 5; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
return 0;
}
解析: 这个例子展示了如何使用函数指针来实现排序。
19. 链表遍历
例题19: 定义一个单向链表,并实现遍历操作。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
void traverse(Node *head) {
Node *temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main() {
Node *head = NULL;
insert(&head, 10);
insert(&head, 20);
insert(&head, 30);
printf("链表:");
traverse(head);
return 0;
}
解析: 这个例子展示了如何遍历单向链表。
20. 链表反转
例题20: 定义一个单向链表,并实现反转操作。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node *reverse(Node *head) {
Node *prev = NULL;
Node *current = head;
Node *next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
return prev;
}
int main() {
Node *head = NULL;
insert(&head, 10);
insert(&head, 20);
insert(&head, 30);
printf("反转前的链表:");
traverse(head);
head = reverse(head);
printf("反转后的链表:");
traverse(head);
return 0;
}
解析: 这个例子展示了如何反转单向链表。
21. 栈与队列的应用
例题21: 使用栈和队列实现括号匹配。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
void push(Stack *s, int value) {
if (s->top < MAX_SIZE - 1) {
s->data[++s->top] = value;
} else {
printf("栈已满\n");
}
}
int pop(Stack *s) {
if (s->top >= 0) {
return s->data[s->top--];
} else {
printf("栈为空\n");
return -1;
}
}
int isBalanced(char *str) {
Stack s = {0, -1};
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == '(' || str[i] == '[' || str[i] == '{') {
push(&s, str[i]);
} else if (str[i] == ')' || str[i] == ']' || str[i] == '}') {
if (pop(&s) == -1) {
return 0;
}
}
}
return s.top == -1;
}
int main() {
char str[] = "{[()]}";
if (isBalanced(str)) {
printf("括号匹配\n");
} else {
printf("括号不匹配\n");
}
return 0;
}
解析: 这个例子展示了如何使用栈和队列来实现括号匹配。
22. 字符串搜索
例题22: 实现一个字符串搜索算法,例如KMP算法。
”`c
#include
void computeLPSArray(char *pat, int M, int *lps) {
int len = 0;
lps[0] = 0;
int i = 1;
while (i < M) {
if (pat[i] == pat[len]) {
len++;
lps[i] = len;
i++;
} else {
if (len != 0) {
len = lps[len - 1];
} else {
lps[i] = 0;
i++;
}
}
}
}
void KMPSearch(char *txt, char *pat) {
int M = strlen(pat);
int N = strlen(txt);
int lps[M];
computeLPSArray(pat, M, lps);
int i = 0; // index for txt[]
int j = 0; // index for pat[]
while (i < N) {
if (pat[j] == txt[i]) {
j++;
i++;
}
if (j == M) {
printf("在索引 %d 处找到模式\n", i - j);
j = lps[j - 1];
} else if (i < N && pat[j] != txt[i]) {
if (j != 0) {
j = lps[j - 1];
} else {
i = i + 1;
