1. C语言基础入门
C语言作为一种历史悠久的编程语言,以其高效、灵活和强大的功能而闻名。要想掌握C语言,首先需要了解其基础语法和常用数据类型。
1.1 基础语法
- 变量定义:
int a; - 常量定义:
const int PI = 3.14159; - 运算符:
+,-,*,/,%,==,!=,>,<,>=,<= - 控制语句:
if,else,switch,for,while,do...while - 函数:
int sum(int a, int b) { return a + b; }
1.2 常用数据类型
- 整型:
int,short,long,char - 浮点型:
float,double - 字符串:
char[]或char*
2. 实战案例解析
以下列举了50个实战案例,帮助读者深入理解C语言编程。
2.1 计算阶乘
#include <stdio.h>
int factorial(int n) {
if (n == 0) {
return 1;
}
return n * factorial(n - 1);
}
int main() {
int n;
printf("Enter a number: ");
scanf("%d", &n);
printf("Factorial of %d is %d\n", n, factorial(n));
return 0;
}
2.2 求最大公约数
#include <stdio.h>
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
int main() {
int x, y;
printf("Enter two numbers: ");
scanf("%d %d", &x, &y);
printf("GCD of %d and %d is %d\n", x, y, gcd(x, y));
return 0;
}
2.3 检查素数
#include <stdio.h>
#include <stdbool.h>
bool is_prime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int main() {
int n;
printf("Enter a number: ");
scanf("%d", &n);
if (is_prime(n)) {
printf("%d is a prime number\n", n);
} else {
printf("%d is not a prime number\n", n);
}
return 0;
}
2.4 水仙花数
#include <stdio.h>
int is_narcissistic(int n) {
int sum = 0, temp = n;
while (temp) {
int digit = temp % 10;
sum += digit * digit * digit;
temp /= 10;
}
return sum == n;
}
int main() {
int n;
printf("Enter a number: ");
scanf("%d", &n);
if (is_narcissistic(n)) {
printf("%d is a narcissistic number\n", n);
} else {
printf("%d is not a narcissistic number\n", n);
}
return 0;
}
2.5 字符串逆序
#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];
printf("Enter a string: ");
scanf("%s", str);
reverse_string(str);
printf("Reversed string: %s\n", str);
return 0;
}
2.6 冒泡排序
#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("Sorted array: \n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
2.7 查找数组中的最大值
#include <stdio.h>
int find_max(int arr[], int n) {
int max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Maximum element in the array is %d\n", find_max(arr, n));
return 0;
}
2.8 判断闰年
#include <stdio.h>
int is_leap_year(int year) {
if (year % 4 == 0) {
if (year % 100 != 0) {
return 1;
} else {
if (year % 400 == 0) {
return 1;
}
}
}
return 0;
}
int main() {
int year;
printf("Enter a year: ");
scanf("%d", &year);
if (is_leap_year(year)) {
printf("%d is a leap year\n", year);
} else {
printf("%d is not a leap year\n", year);
}
return 0;
}
2.9 计算斐波那契数列
#include <stdio.h>
int fibonacci(int n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
int main() {
int n;
printf("Enter a number: ");
scanf("%d", &n);
printf("Fibonacci of %d is %d\n", n, fibonacci(n));
return 0;
}
2.10 寻找数组中的最小值
#include <stdio.h>
int find_min(int arr[], int n) {
int min = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Minimum element in the array is %d\n", find_min(arr, n));
return 0;
}
2.11 判断回文数
#include <stdio.h>
#include <stdbool.h>
bool is_palindrome(int n) {
int reversed = 0, original = n, remainder;
while (n != 0) {
remainder = n % 10;
reversed = reversed * 10 + remainder;
n /= 10;
}
return original == reversed;
}
int main() {
int n;
printf("Enter a number: ");
scanf("%d", &n);
if (is_palindrome(n)) {
printf("%d is a palindrome\n", n);
} else {
printf("%d is not a palindrome\n", n);
}
return 0;
}
2.12 判断素数(另一种方法)
#include <stdio.h>
#include <stdbool.h>
bool is_prime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int main() {
int n;
printf("Enter a number: ");
scanf("%d", &n);
if (is_prime(n)) {
printf("%d is a prime number\n", n);
} else {
printf("%d is not a prime number\n", n);
}
return 0;
}
2.13 字符串查找
#include <stdio.h>
#include <string.h>
int find_substring(char *str, char *substr) {
int index = 0;
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == substr[0]) {
for (int j = 0; j < strlen(substr); j++) {
if (str[i + j] != substr[j]) {
break;
}
if (j == strlen(substr) - 1) {
index = i;
return index;
}
}
}
}
return -1;
}
int main() {
char str[100], substr[100];
printf("Enter a string: ");
scanf("%s", str);
printf("Enter a substring: ");
scanf("%s", substr);
int index = find_substring(str, substr);
if (index != -1) {
printf("Substring found at index %d\n", index);
} else {
printf("Substring not found\n");
}
return 0;
}
2.14 字符串反转
#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];
printf("Enter a string: ");
scanf("%s", str);
reverse_string(str);
printf("Reversed string: %s\n", str);
return 0;
}
2.15 合并两个有序数组
#include <stdio.h>
void merge_arrays(int arr1[], int n1, int arr2[], int n2, int merged[]) {
int i = 0, j = 0, k = 0;
while (i < n1 && j < n2) {
if (arr1[i] < arr2[j]) {
merged[k++] = arr1[i++];
} else {
merged[k++] = arr2[j++];
}
}
while (i < n1) {
merged[k++] = arr1[i++];
}
while (j < n2) {
merged[k++] = arr2[j++];
}
}
int main() {
int arr1[] = {1, 3, 5, 7};
int arr2[] = {2, 4, 6, 8};
int n1 = sizeof(arr1) / sizeof(arr1[0]);
int n2 = sizeof(arr2) / sizeof(arr2[0]);
int merged[n1 + n2];
merge_arrays(arr1, n1, arr2, n2, merged);
printf("Merged array: ");
for (int i = 0; i < n1 + n2; i++) {
printf("%d ", merged[i]);
}
printf("\n");
return 0;
}
2.16 字符串排序
#include <stdio.h>
#include <string.h>
void sort_string(char *str) {
int len = strlen(str);
for (int i = 0; i < len - 1; i++) {
for (int j = i + 1; j < len; j++) {
if (str[i] > str[j]) {
char temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
}
}
int main() {
char str[100];
printf("Enter a string: ");
scanf("%s", str);
sort_string(str);
printf("Sorted string: %s\n", str);
return 0;
}
2.17 计算字符串长度
#include <stdio.h>
#include <string.h>
int string_length(char *str) {
int len = 0;
while (str[len] != '\0') {
len++;
}
return len;
}
int main() {
char str[100];
printf("Enter a string: ");
scanf("%s", str);
printf("Length of string: %d\n", string_length(str));
return 0;
}
2.18 字符串查找(另一种方法)
#include <stdio.h>
#include <string.h>
int find_substring(char *str, char *substr) {
int index = 0;
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == substr[0]) {
int j = 0;
while (substr[j] != '\0') {
if (str[i + j] != substr[j]) {
break;
}
j++;
}
if (substr[j] == '\0') {
index = i;
return index;
}
}
}
return -1;
}
int main() {
char str[100], substr[100];
printf("Enter a string: ");
scanf("%s", str);
printf("Enter a substring: ");
scanf("%s", substr);
int index = find_substring(str, substr);
if (index != -1) {
printf("Substring found at index %d\n", index);
} else {
printf("Substring not found\n");
}
return 0;
}
2.19 字符串替换
#include <stdio.h>
#include <string.h>
void replace_string(char *str, char *old, char *new) {
char buffer[1000];
char *temp = str;
while ((temp = strstr(temp, old)) != NULL) {
strncpy(buffer, str, temp - str);
buffer[temp - str] = '\0';
strcat(buffer, new);
strcat(buffer, temp + strlen(old));
strcpy(str, buffer);
temp = buffer;
}
}
int main() {
char str[100], old[100], new[100];
printf("Enter a string: ");
scanf("%s", str);
printf("Enter the substring to be replaced: ");
scanf("%s", old);
printf("Enter the new substring: ");
scanf("%s", new);
replace_string(str, old, new);
printf("Replaced string: %s\n", str);
return 0;
}
2.20 判断是否为回文字符串
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
bool is_palindrome(char *str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
if (str[i] != str[len - i - 1]) {
return false;
}
}
return true;
}
int main() {
char str[100];
printf("Enter a string: ");
scanf("%s", str);
if (is_palindrome(str)) {
printf("The string is a palindrome\n");
} else {
printf("The string is not a palindrome\n");
}
return 0;
}
2.21 查找字符串中字符的出现次数
#include <stdio.h>
#include <string.h>
int count_chars(char *str, char ch) {
int count = 0;
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == ch) {
count++;
}
}
return count;
}
int main() {
char str[100], ch;
printf("Enter a string: ");
scanf("%s", str);
printf("Enter a character to count: ");
scanf(" %c", &ch);
printf("The character '%c' appears %d times in the string\n", ch, count_chars(str, ch));
return 0;
}
2.22 查找字符串中子字符串的出现次数
#include <stdio.h>
#include <string.h>
int count_substring(char *str, char *substr) {
int count = 0;
int index = 0;
while ((index = strstr(str, substr)) != NULL) {
count++;
str = index + strlen(substr);
}
return count;
}
int main() {
char str[100], substr[100];
printf("Enter a string: ");
scanf("%s", str);
printf("Enter a substring to count: ");
scanf("%s", substr);
printf("The substring '%s' appears %d times in the string\n", substr, count_substring(str, substr));
return 0;
}
2.23 删除字符串中的重复字符
”`c
#include
void remove_duplicate_chars(char *str) {
int len = strlen(str);
for (int i = 0; i < len - 1; i++) {
for (int j = i + 1; j < len; j++) {
if (str[i] == str[j]) {
str[j] = str[j + 1];
len--;
j--;
}
}
}
str
