1. Hello World
作为编程语言的入门程序,Hello World 经典而简单。作用是在控制台输出常见的问候语“Hello, world!”。
代码
#include <stdio.h>
int main()
{
printf("Hello, world!\n");
return 0;
}
代码解析:这个程序中用到了 C 语言中的一个“函数”——printf(),它的作用是在 终端 上输出一段文本信息。这个程序也是大家学 C 语言时的第一步。
2. 交换两个变量的值
交换两个变量的值在程序设计中特别常见,这里将介绍三种不同的方法实现。
方法1:使用第三方变量
使用第三方变量方法的思路是先利用一个变量存储其中一个变量的值,再将其中一个变量值改为另一个变量的值,最后再将辅助变量中存储的值赋值给另一个变量。
代码
#include <stdio.h>
int main()
{
int a, b, temp;
printf("请输入想要交换的两个整数:\n");
scanf("%d %d", &a, &b);
temp = a;
a = b;
b = temp;
printf("交换后的值:\n");
printf("a = %d, b = %d\n", a, b);
return 0;
}
代码解析:使用变量 temp 暂存其中一个变量的值,然后修改两个变量的值,即 a = b,b = temp。
方法2:使用位运算符
使用“异或运算符”实现。
代码
#include <stdio.h>
int main()
{
int a, b;
printf("请输入想要交换的两个整数:\n");
scanf("%d %d", &a, &b);
a = a ^ b;
b = b ^ a;
a = a ^ b;
printf("交换后的值:\n");
printf("a = %d, b = %d\n", a, b);
return 0;
}
代码解析:使用“异或”运算符能简便地完成两个数的交换,原理是利用两数的二进制相异或的结果。假设 a = 3(二进制:11),b = 6(二进制:110),则按位异或操作符 ^ 的操作如下:
a^b 计算方法 结果
——————————— ———————— —————————
3 二进制:0011 0011
^ 6 二进制:0110 0110
——————————— ———————— —————————
(3^6) = 5 二进制:0101 0101
即将 3、6 两个数相异或得到另一个数 5(二进制:101),接下来执行 a = 5,b = 6 ^ 5。由于 b=6,而 6 = (6 ^ 5) ^ 5。把这个公式代入 b,可以得到 b = z ^ z ^ 5,其中 z = 6 ^ 5,即 z = 3。因此 b = 3 ^ 5,执行 b = 6。
方法3:运用加减法
运用加减法实现交换。
代码
#include <stdio.h>
int main()
{
int a, b;
printf("请输入想要交换的两个整数:\n");
scanf("%d %d", &a, &b);
a = a + b;
b = a - b;
a = a - b;
printf("交换后的值:\n");
printf("a = %d, b = %d\n", a, b);
return 0;
}
代码解析:这种方法的核心思想与“方法1”相同,沿类似的思路推出其算法,a = a + b,b = a - b,a = a - b。
3. 输入输出字符串
输入输出字符串是 C 语言程序开发中常用的功能。字符串很常见,你经常需要处理包含字母和数字的字符串,例如读入用户的名字、地址等信息,或者输出日志信息等。在 C 语言中,字符串用字符数组表示。
代码
#include <stdio.h>
int main()
{
char name[20], city[20];
printf("请输入您的名字:");
scanf("%s", name);
printf("请输入您所在的城市:");
scanf("%s", city);
printf("您的名字是:%s,您所在的城市是:%s\n", name, city);
return 0;
}
代码解析:这段代码中用到了两个函数 scanf() 和 printf()。scanf() 用输入格式串从标准输入设备 stdin 读取输入,并根据格式串将读入的数据格式化。printf() 用输出格式串将输出格式化,输出到标准输出设备 stdout(如屏幕)。
4. 判断回文数
回文数是指任何一位数或超过一位的数,它按照同样顺序排列数值的正反两个方向都完全相同。例如11、121、1221、12321等。
代码
#include <stdio.h>
?
int main()
{
int n, origin, reversed = 0, digit;
printf("输入一个整数:");
scanf("%d", &n);
origin = n;
while (n != 0) {
digit = n % 10;
reversed = reversed * 10 + digit;
n /= 10;
}
if (origin == reversed) {
printf("%d 是回文数\n", origin);
} else {
printf("%d 不是回文数\n", origin);
}
return 0;
}
代码解析:核心思路是使用一个 while 循环,每次取出一个数字位数的数字,使用 reversed 变量存储它的反转后的值,并将它除以 10。
5. 计算斐波那契数列
斐波那契数列始于 0 和 1,后面的每一项由前面两项相加得到。
代码
#include <stdio.h>
int main()
{
int i, n, fib, x, y;
x = 0;
y = 1;
printf("请输入整数 n:");
scanf("%d", &n);
printf("斐波那契数列前 %d 项如下:\n", n);
for (i = 0; i < n; ++i) {
printf("%d\n", x);
fib = x + y;
x = y;
y = fib;
}
return 0;
}
代码解析:这个程序用到了一个 for 循环,依次输出斐波那契数列中的每一项,每次计算结果都使用变量进行存储。这里需要注意的是,斐波那契数列在本例中总共输出了 n 项,而每一项都是由前两项相加得到的,其中第一项是 0,第二项是 1。
6. 判断素数
一个只能被 1 和它本身整除的数被称作素数。判断一个整数是否为素数在程序设计中非常常见。
代码
#include <stdio.h>
#include <math.h>
int main()
{
int n, i, is_prime = 1;
printf("请输入一个正整数:");
scanf("%d", &n);
if (n <= 1) {
is_prime = 0;
}
for (i = 2; i <= sqrt(n); ++i) {
if (n % i == 0) {
is_prime = 0;
break;
}
}
if (is_prime == 0) {
printf("%d 不是素数。\n", n);
} else {
printf("%d 是素数。\n", n);
}
return 0;
}
代码解析:这个程序中使用一个循环,从 2 一直到小于 n 的根号,依次判断它们是否是 n 的因数。如果 n 能被 i 整除,则发现 n 不是素数,这时程序将退出循环并输出“不是素数”;否则输出“是素数”。
7. 奇数偶数判断
判断一个数字是奇数还是偶数是一项简单而常见的程序设计任务。
代码
#include <stdio.h>
int main()
{
int x;
printf("请输入一个整数:");
scanf("%d", &x);
if (x % 2 == 0) {
printf("%d 是偶数\n", x);
} else {
printf("%d 是奇数\n", x);
}
return 0;
}
代码解析:一个数如果能够被 2 整除,那么它就是偶数;否则它就是奇数。
8. 通过二分查找查找数据
二分查找是一种用于在有序列表中查找特定元素的算法。
代码
#include <stdio.h>
?
int binary_search(int arr[], int len, int key)
{
int low = 0, high = len - 1, mid;
while (low <= high) {
mid = low + (high - low) / 2;
if (arr[mid] == key) {
return mid;
} else if (arr[mid] > key) {
high = mid - 1;
} else if (arr[mid] < key) {
low = mid + 1;
}
}
return -1;
}
?
int main()
{
int arr[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512};
int len = sizeof(arr) / sizeof(arr[0]);
int key = 32;
int index = binary_search(arr, len, key);
if (index == -1) {
printf("%d 不存在于数组中\n", key);
} else {
printf("%d 在数组 arr[%d] 中\n", key, index);
}
return 0;
}
代码解析:这个程序实现了一个函数,用于在一个有序的变量数组中通过 二分查找 找到包含一个特定元素的下标。这个程序也有一个主函数,用于测试该二分查找函数的工作方式。数组中包含 10 个元素,这些元素都按照升序排列。在主函数中输入要查找的关键字,然后查找数组中是否包含这个关键字。如果找不到,有一个说明会输出;如果找到了,将会在数组中找到它的下标,并输出。
9. 阶乘计算
阶乘是数字的一种重要属性,它是指一个正整数 n 的阶乘是所有小于和等于 n 的正整数相乘的积。
代码
#include <stdio.h>
int main()
{
int i, n;
long long fact = 1;
printf("请输入一个正整数:");
scanf("%d", &n);
for (i = 1; i <= n; ++i) {
fact *= i;
}
printf("%d 的阶乘是 %lld\n", n, fact);
return 0;
}
代码解析:这个程序将输入一个正整数 n,然后计算它的阶乘,最后输出计算结果。计算过程利用了一个 for 循环,并使用一个变量表示按顺序乘倍的乘积。在循环结束后,这个乘积将等于我们要求的阶乘的数值
10. 判断闰年
闰年是指一个能够被4整除,但不能被100整除的正整数,或是能够被400整除的正整数。
代码
#include <stdio.h>
int main()
{
int year;
printf("输入一个年份:");
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
printf("%d 是闰年。\n", year);
} else {
printf("%d 不是闰年。\n", year);
}
return 0;
}
代码解析:一个年份如果能够被 4 整除,但不能被 100 整除,这个年份就是闰年。或者,一个年份能被 400 整除,这个年份也是闰年。否则它就是平年。
11. 求最大公因数
最大公因数是指两个或多个整数的公共因子中的最大值。
代码
#include <stdio.h>
int main()
{
int i, x, y, min, gcd = 1;
printf("请输入两个数:\n");
scanf("%d %d", &x, &y);
min = x > y ? y : x;
for (i = 2; i <= min; ++i) {
if (x % i == 0 && y % i == 0) {
gcd = i;
}
}
printf("%d 和 %d 的最大公约数是 %d\n", x, y, gcd);
return 0;
}
代码解析:找到这两个数的最大公约数,需要从 2 开始迭代,直到小于或等于两个