软考备战-C语言程序举例

1. 兔子的数目

题目:

古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

程序分析:

兔子的规律为数列 1,1,2,3,5,8,13,21...

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>

int main()
{
long f1, f2;
int i;
f1 = f2 = 1;
for (i = 1; i <= 20; i++)
{
printf("%12ld %12ld", f1, f2);
if (i % 2 == 0)
printf("\n"); /*控制输出,每行四个*/
f1 = f1 + f2; /*前两个月加起来赋值给第三个月*/
f2 = f1 + f2; /*前两个月加起来赋值给第三个月*/
}

system("pause");
return 0;
}

还可以使用一维数组进行处理。

2. 输出素数

题目:

判断 101-200 之间有多少个素数,并输出所有素数。

程序分析:

判断素数的方法:用一个数分别去除 2 到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include "math.h"
int main()
{
int num = 0;
for (int i = 101; i <= 200; i++)
{
int j = 2;
for (; j < sqrt(i); j++)
{
if (i % j == 0)
{
break;
}
}

if (j >= sqrt(i))
{
num++;
printf("%d\n", i);
}
}

system("pause");
return 0;
}

3. 水仙花数

题目:

打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153 是一个“水仙花数”,因为 \(153=1^3+5^3+3^3\)

程序分析:

利用 for 循环控制 100-999 个数,每个数分解出个位,十位,百位。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i, j, k, n;
printf("'water flower' number is:");
for (n = 100; n < 1000; n++)
{
i = n / 100; /*分解出百位*/
j = n / 10 % 10; /*分解出十位*/
k = n % 10; /*分解出个位*/
if (i * 100 + j * 10 + k == i * i * i + j * j * j + k * k * k)
printf("%-5d", n);
}
printf("\n");

system("pause");
return 0;
}

4. 分解质因数

题目:

将一个正整数分解质因数。例如:输入 90,打印出 \(90=2*3*3*5\)

程序分析:

对n进行分解质因数,应先找到一个最小的质数 k,然后按下述步骤完成:
(1)如果这个质数恰等于 n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果 n<>k,但 n 能被 k 整除,则应打印出 k 的值,并用 n 除以 k 的商,作为新的正整数 n,重复执行第一步。
(3)如果 n 不能被 k 整除,则用 k+1 作为 k 的值,重复执行第一步。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdlib.h>

int main()
{
int n, i;
printf("please input a number:");
scanf("%d", &n);
printf("%d=", n);
for (i = 2; i <= n; i++)
{
while (n != i)
{
if (n % i == 0)
{
printf("%d*", i);
n = n / i;
}
else
break;
}
}
printf("%d", n);
printf("\n");

system("pause");
return 0;
}

5. 成绩划分

题目:

利用条件运算符的嵌套来完成此题:学习成绩 >= 90 分的同学用 A 表示,60-89 分之间的用 B 表示,60 分以下的用 C 表示。

程序分析:

( a > b) ? a : b 这是条件运算符的基本例子。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdlib.h>
#include <stdio.h>

int main()
{
int score;
char grade;

printf("please input a score:");
scanf("%d", &score);
grade = score >= 90 ? 'A' : score >= 60 ? 'B' : 'C';
printf("%d belongs to %c.\n", score, grade);

system("pause");
return 0;
}

6. 最大公约数与最小公倍数

题目:

输入两个正整数 m 和 n ,求其最大公约数和最小公倍数。

程序分析:

辗转相除法。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdlib.h>
#include <stdio.h>

long long gcd(long long t1, long long t2)
{
return t2 == 0 ? t1 : gcd(t2, t1 % t2);
}

int main()
{
int a, b, c;
printf("please input two numbers:");
scanf("%d,%d", &a, &b);

c = gcd(a, b);

printf("gong yue shu:%d\n", c);
printf("gong bei shu:%d\n", a * b / c);

system("pause");
return 0;
}

7. 统计字符个数

题目:

输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

程序分析:

利用while语句,条件为输入的字符不为'\n'

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <stdlib.h>

int main()
{
char c;
int letters = 0, space = 0, digit = 0, others = 0;
printf("please input some characters\n");
// 循环输入字符 c
while ((c = getchar()) != '\n')
{
if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
{
letters++;
}
else if (c == ' ')
{
space++;
}
else if(c >= '0' && c <= '9')
{
digit++;
}
else
{
others++;
}
}
printf("all in all:char=%d space=%d digit=%d others=%d\n", letters, space, digit, others);

system("pause");
return 0;
}

8. 求 s=a+aa+aaa+aaaa+aa...a

题目:

求 s=a+aa+aaa+aaaa+aa...a 的值,其中a是一个数字。例如 2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

程序分析:

关键是计算出每一项的值。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>

int main()
{
int a, n, count = 1;
long int sn = 0, tn = 0;
printf("please input a and n:\n");
scanf("%d %d", &a, &n);
printf("a=%d, n=%d\n", a, n);
while (count <= n)
{
tn = tn + a;
sn = sn + tn;
a = a * 10;
++count;
}
printf("a + aa + .. = %1d\n", sn);

system("pause");
return 0;
}

9. 完数

题目:

一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3。编程找出1000以内的所有完数。

程序分析:

根据要求计算即可。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("wan shu:\n");
for (int i = 0; i < 1001; i++)
{
int temp = 0;
for (int j = 1; j < i; j++)
{
if (i % j == 0)
{
temp += (j != 1 ? j + i % j : j);
}
}
if (temp == i)
{
printf("%d\n", i);
}
}

system("pause");
return 0;
}

10. 球的反弹

题目:

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

程序分析:

第一次只有一次下降距离,之后都有两次。还需要注意数据类型应为floatdouble,因为除不尽。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>

int main()
{
float n = 100, dis =0, time = 0;
while (time != 10)
{
dis += (n == 100 ? n : 2 * n);
n = n / 2;
time++;
}
printf("总距离:%f米, 第十次反弹:%f米。\n", dis, n);

system("pause");
return 0;
}

11. 猴子吃桃

题目:

一只猴子摘了N个桃子第一天吃了一半又多吃了一个,第二天又吃了余下的一半又多吃了一个,到第十天的时候发现还有一个。

程序分析:

第一天:\(\frac{N}{2}+1=\frac{N+2}{2^1}\)

第二天:\(\frac{\frac{N}{2}+1}{2}=\frac{N-(2+2^2)}{2^2}\)

......

第十天没吃,因此第十天剩下的就是第九天吃完的数:\(N=9,\ \frac{N-\sum_{i=1}^{N}{2^N}}{2^N}=\frac{N-\sum_{i=1}^{9}{2^9}}{2^9}\)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
int sum = 0;
for (int i = 1; i < 10; i++)
{
sum += pow(2, i);
}

int res = pow(2, 9) + sum;
printf("%d\n", res);

system("pause");
return 0;
}

12. 牛顿迭代法求平方根

题目:

牛顿迭代法求一个数的平方根。

程序分析:

牛顿迭代法:求 a 的平方根,先令 c 为任意值,一般为 \(\frac{a}{2}\) ,然后不断令\(c=\frac{c+\frac{a}{c}}{2}\),直到满足精度要求。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
float a, x0, x1;
printf("请输入要求的数:");
scanf("%f", &a);

x0 = a / 2;
x1 = (x0 + a / x0) / 2;
while (fabs(x1 - x0) >= 1.0E-6)
{
x0 = x1;
x1 = (x0 + a / x0) / 2;
}
printf("%f的平方根为:%f\n", a, x1);

system("pause");
return 0;
}

13. 牛顿迭代法求方程 \(2x^3-4x^2+3x-6=0\) 的根

题目:

牛顿迭代法求方程 \(2x^3-4x^2+3x-6=0\) 的根。

程序分析:

\(r\)\(f(x)=0\) 的根,选 \(x_0\)\(r\) 的初始近似值,过点 \((x_0, f(x_0))\) 做曲线的切线 \(L\),切线 \(L\)\(x\) 轴交点的横坐标 \(x_1=x_0-\frac{f(x_0)}{f'(x_0)}\) ,那么 \(x_1\)\(r\) 的一次近似值。

过点 \((x_1, f(x_1))\) 做曲线的切线 \(L\),切线 \(L\)\(x\) 轴交点的横坐标 \(x_2=x_1-\frac{f(x_1)}{f'(x_1)}\) ,那么 \(x_2\)\(r\) 的二次近似值。

重复以上过程,得到 \(r\) 的近似值序列,其中,\(x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}\) 称为 \(r\)\(n+1\) 的近似值。上式称为牛顿迭代公式。迭代关系式为:\(x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}\)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
// 需要预先估计一下其中的一个值,带到方程中要一正一负,确保根在范围中。
float x1, x0 = 1.5;
x1 = x0 - (2.0 * x0 * x0 * x0 - 4.0 * x0 * x0 + 3 * x0 - 6) / (6.0 * x0 * x0 - 8 * x0 + 3);
while (fabs(x1 - x0) >= 1.0E-6)
{
x0 = x1;
x1 = x0 - (2.0 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6) / (6.0 * x0 * x0 - 8 * x0 + 3);
}
printf("方程的根为:%f\n", x1);

system("pause");
return 0;
}

二分法求解:

首先看一下函数曲线,确定一下解的范围,这样便有助于给 \(x_1\)\(x_2\) 赋初值;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

float f(float x)
{
return 2 * x * x * x - 4 * x * x + 3 * x - 6;
}

int main()
{
float left = 0, right = 3, mid;
while (right - left > 1.0E-6)
{
mid = (left + right) / 2;
if (f(mid) > 1.0E-6)
{
right = mid;
}
else
{
left = mid;
}
}

printf("用二分法求得方程的根:%f\n", mid);

system("pause");
return 0;
}

14. 打印图案

题目:

打印如下图案(菱形):

1
2
3
4
5
6
7
   *
***
*****
*******
*****
***
*

程序分析:

分成两个部分,上四行一个规律,下三行一个规律。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>

int main()
{
// 打印上半部分
for (int i = 1; i < 8; i = i + 2)
{
for (int j = 0; j < (7 - i) / 2; j++)
{
printf(" ");
}
for (int j = 0; j < i; j++)
{
printf("*");
}
printf("\n");
}
// 打印下半部分
int k = 3;
for (int i = 1; i < 4; i++)
{
int j = 0;
while (j < i)
{
printf(" ");
j++;
}
for (int j = (k - i + 1) * 2 - 1; j > 0; j--)
{
printf("*");
}
printf("\n");
}

system("pause");
return 0;
}

15. 回文数

题目:

一个 5 位数,判断它是不是回文数。即 12321 是回文数,个位与万位相同,十位与千位相同。

程序分析:

依次取出每一位的数比较即可。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>

int main()
{
long x, ge, shi, qian, wan;
scanf("%ld", &x);
wan = x / 10000;
qian = x / 1000 % 10;
shi = x / 10 % 10;
ge = x % 10;
if (ge == wan && shi == qian)
{
printf("是回文数。\n");
}
else
{
printf("不是回文数。\n");
}

system("pause");
return 0;
}

16. 判断星期几

题目:

请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

程序分析:

依次取出每一位的数比较即可。

1
2
3
4
5
6
7
Monday      Mon    周一
Tuesday Tue 周二
Wednesday Wed 周三
Thursday Thu 周四
Friday Fri 周五
Saturday Sat 周六
Sunday Sun 周日

最多只需要判断第二位。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
#include <stdlib.h>

int main()
{
char week, week1;
printf("please input the first letter\n");
week = getchar();
getchar(); //为了接受 回车键
switch (week)
{
case 'M':
printf("Monday");
break;
case 'T':
printf("please input the second letter\n");
week1 = getchar();
if (week1 == 'u')
printf("Tuesday");
else if (week1 == 'h')
printf("Thursday");
else
printf("data error");
break;
case 'W':
printf("Wednesday");
break;
case 'F':
printf("Friday");
break;
case 'S':
printf("please input the second letter\n");
week1 = getchar();
if (week1 == 'a')
printf("Saturday");
else if (week1 == 'u')
printf("Sunday");
else
printf("data error");
break;
default:
printf("data error");
break;
}

system("pause");
return 0;
}

17. 求100之内的素数

题目:

求100之内的素数。

程序分析:

素数,除了 1 和它本身没有别的书是它的因数。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
for (int i = 1; i < 100; i++)
{
int j = 2;
for (; j <= sqrt(i); j++)
{
if (i % j == 0)
{
break;
}
}
if (j > sqrt(i))
{
printf("%d\n", i);
}
}

system("pause");
return 0;
}

18. 对10个数进行排序

题目:

对10个数进行排序。

程序分析:

素数,除了 1 和它本身没有别的书是它的因数。

代码:

冒泡排序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <stdlib.h>

// 冒泡排序
void bubble_sort(int arr[], int len)
{
int i, j, temp;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len - 1 - i; j++)
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}

int main()
{
int arr[10];
for (int i = 0; i < 10; i++)
{
arr[i] = rand() % 100;
printf("%d ", arr[i]);
}
printf("\n");
bubble_sort(arr, 10);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");

system("pause");
return 0;
}

19. 求矩阵对角线之和

题目:

求一个3 * 3矩阵对角线元素之和。

程序分析:

利用双重for循环控制输入二维数组,再将a累加后输出。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>

int main()
{
float a[3][3], sum = 0;

printf("请输入矩阵的值(3*3):\n");
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%f", &a[i][j]);
}
}

for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (i == j || j == 2 - i)
{
sum += a[i][j];
}
}
}
printf("%f", sum);
printf("\n");

system("pause");
return 0;
}

20. 数组插入值

题目:

有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

程序分析:

先考虑特殊位置:开头跟末尾。再考虑一般位置:中间。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <stdlib.h>

int main()
{
int a[11] = {1, 4, 6, 9, 13, 16, 19, 28, 40, 100};
int temp1, temp2, number, end, i, j;
printf("original array is:\n");
for (i = 0; i < 10; i++)
printf("%5d", a[i]);
printf("\n");
printf("insert a new number:");
scanf("%d", &number);
end = a[9];
if (number > end)
a[10] = number;
else
{
for (i = 0; i < 10; i++)
{
if (a[i] > number)
{
temp1 = a[i];
a[i] = number;
for (j = i + 1; j < 11; j++)
{
temp2 = a[j];
a[j] = temp1;
temp1 = temp2;
}
break;
}
}
}
for (i = 0; i < 11; i++)
printf("%6d", a[i]);
printf("\n");

system("pause");
return 0;
}

21. 数组逆序

题目:

将一个数组逆序输出。

程序分析:

未交换的第一个与最后一个交换。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>

int main()
{
int a[5] = {1, 2, 3, 4, 5};

printf("逆序之前:\n");
for (int i = 0; i < 5; i++)
{
printf("%4d", a[i]);
}
printf("\n");

for (int i = 0; i < 5 / 2; i++)
{
int temp = a[i];
a[i] = a[5 - i - 1];
a[5 - i - 1] = temp;
}

printf("逆序之后:\n");
for (int i = 0; i < 5; i++)
{
printf("%4d", a[i]);
}
printf("\n");

system("pause");
return 0;
}

22. static定义静态变量

题目:

学习static定义静态变量的用法。

程序分析:

在 C 语言中,static 关键字不仅可以用来修饰变量,还可以用来修饰函数。在使用 static 关键字修饰变量时,我们称此变量为静态变量。

静态变量的存储方式与全局变量一样,都是静态存储方式。但这里需要特别说明的是,静态变量属于静态存储方式,属于静态存储方式的变量却不一定就是静态变量。例如,全局变量虽然属于静态存储方式,但并不是静态变量,它必须由 static 加以定义后才能成为静态全局变量。

考虑到可能会有不少读者对静态变量作用不太清楚,本节就来详细讨论一下它的主要作用。

隐藏与隔离的作用

上面已经阐述过,全局变量虽然属于静态存储方式,但并不是静态变量。全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,全局变量在各个源文件中都是有效的。

如果我们希望全局变量仅限于在本源文件中使用,在其他源文件中不能引用,也就是说限制其作用域只在定义该变量的源文件内有效,而在同一源程序的其他源文件中不能使用。这时,就可以通过在全局变量之前加上关键字 static 来实现,使全局变量被定义成为一个静态全局变量。这样就可以避免在其他源文件中引起的错误。也就起到了对其他源文件进行隐藏与隔离错误的作用,有利于模块化程序设计。

保持变量内容的持久性

有时候,我们希望函数中局部变量的值在函数调用结束之后不会消失,而仍然保留其原值。即它所占用的存储单元不释放,在下一次调用该函数时,其局部变量的值仍然存在,也就是上一次函数调用结束时的值。这时候,我们就应该将该局部变量用关键字 static 声明为“静态局部变量”。

当将局部变量声明为静态局部变量的时候,也就改变了局部变量的存储位置,即从原来的栈中存放改为静态存储区存放。这让它看起来很像全局变量,其实静态局部变量与全局变量的主要区别就在于可见性,静态局部变量只在其被声明的代码块中是可见的。

通过上面的示例,我们可以得出静态局部变量一般的使用场景:

  • 需要保留函数上一次调用结束时的值。
  • 如果初始化后,变量只会被引用而不会改变其值,则这时用静态局部变量比较方便,以免每次调用时重新赋值。

默认初始化为 0

在静态数据区,内存中所有的字节默认值都是 0x00。静态变量与全局变量也一样,它们都存储在静态数据区中,因此其变量的值默认也为 0。

参考:

static变量及其作用,C语言static变量详解 (biancheng.net)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>

void varfunc()
{
int var = 0;
static int static_var = 0;
printf("\40:var equal %d \n", var);
printf("\40:static var equal %d \n", static_var);
printf("\n");
var++;
static_var++;
}

int main()
{
for (int i = 0; i < 3; i++)
{
varfunc();
}

system("pause");
return 0;
}

23. auto定义变量

题目:

学习使用auto定义变量的用法。

程序分析:

auto自动存储类型,一般我们很少在程序中显示申明变量为 auto 类型。因为代码块中的变量缺省情况下就是这种类型,这种类型的变量存放于堆栈中,也就是说只有程序执行这些代码块时这种自动变量才会被创建,代码块执行结束后自动变量便被释放。

参考:

C语言 | auto定义变量 - 知乎 (zhihu.com)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i, num;
num = 2;
for (i = 0; i < 3; i++)
{
printf("\40: The num equal %d \n", num);
num++;
{
auto num = 1;
printf("\40: The internal block num equal %d \n", num);
num++;
}
}

system("pause");
return 0;
}

24. register定义变量

题目:

学习使用register定义变量的方法。

程序分析:

这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个 CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多 register 变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。

参考:

C语言register关键字—最快的关键字_C语言中文网 (biancheng.net)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>

int main()
{
register int i;
int tmp = 0;
for (i = 1; i <= 100; i++)
tmp += i;
printf("The sum is %d\n", tmp);

system("pause");
return 0;
}

25. 宏定义(1)

题目:

#define命令练习。

程序分析:

参考:

宏定义(无参宏定义和带参宏定义),C语言宏定义详解 (biancheng.net)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "stdio.h"
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
// 带参宏定义
#define SQ(x) (x) * (x)

int main()
{
int num;
int again = 1;
printf("\40: Program will stop if input value less than 50.\n");
while (again)
{
printf("\40lease input number==>");
scanf("%d", &num);
printf("\40:The square for this number is %d \n", SQ(num));
if (num >= 50)
again = TRUE;
else
again = FALSE;
}

system("pause");
return 0;
}

26. 宏定义(2)

题目:

#define命令练习。

程序分析:

参考:

宏定义(无参宏定义和带参宏定义),C语言宏定义详解 (biancheng.net)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>

#define exchange(a, b) \
{ \
int t; \
t = a; \
a = b; \
b = t; \
}

int main()
{
int x = 10;
int y = 20;
printf("x=%d; y=%d\n", x, y);
exchange(x, y);
printf("x=%d; y=%d\n", x, y);

system("pause");
return 0;
}

27. 宏定义(3)

题目:

#define命令练习。

程序分析:

参考:

宏定义(无参宏定义和带参宏定义),C语言宏定义详解 (biancheng.net)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>

#define LAG >
#define SMA <
#define EQ ==

int main()
{
int i = 10;
int j = 20;
if (i LAG j)
printf("\40: %d larger than %d \n", i, j);
else if (i EQ j)
printf("\40: %d equal to %d \n", i, j);
else if (i SMA j)
printf("\40:%d smaller than %d \n", i, j);
else
printf("\40: No such value.\n");

system("pause");
return 0;
}

28. #if#ifdef#ifndef的综合应用

题目:

#if#ifdef#ifndef的综合应用。

程序分析:

参考:

C语言#if、##ifdef、#ifndef的用法详解,C语言条件编译详解 (biancheng.net)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <stdlib.h>

#define MAX
#define MAXIMUM(x, y) (x > y) ? x : y
#define MINIMUM(x, y) (x > y) ? y : x

int main()
{
int a = 10, b = 20;
#ifdef MAX
printf("\40: The larger one is %d\n", MAXIMUM(a, b));
#else
printf("\40: The lower one is %d\n", MINIMUM(a, b));
#endif
#ifndef MIN
printf("\40: The lower one is %d\n", MINIMUM(a, b));
#else
printf("\40: The larger one is %d\n", MAXIMUM(a, b));
#endif
#undef MAX
#ifdef MAX
printf("\40: The larger one is %d\n", MAXIMUM(a, b));
#else
printf("\40: The lower one is %d\n", MINIMUM(a, b));
#endif
#define MIN
#ifndef MIN
printf("\40: The lower one is %d\n", MINIMUM(a, b));
#else
printf("\40: The larger one is %d\n", MAXIMUM(a, b));
#endif

system("pause");
return 0;
}

29. #include的应用练习

题目:

#include的应用练习。

程序分析:

暂无。

代码:

test.h

1
2
3
#define LAG >
#define SMA <
#define EQ ==

.c文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
#include "test.h"

int main()
{
int i = 10;
int j = 20;
if (i LAG j)
printf("\40: %d larger than %d \n", i, j);
else if (i EQ j)
printf("\40: %d equal to %d \n", i, j);
else if (i SMA j)
printf("\40:%d smaller than %d \n", i, j);
else
printf("\40: No such value.\n");

system("pause");
return 0;
}

30. 按位与(&)

题目:

学习使用按位与&

程序分析:

5 的二进制为: 101,3 的二进制为:011。按位与操作:按照每位对应的二进制位,不同为 0,相同为 1。因此5 & 3 = 001 = 1

运算规则:

1
0 & 0 = 0;  0 & 1 = 0;  1 & 0 = 0;  1 & 1 = 1

参考:

&按位与运算符 - C语言教程 - C语言网 (dotcpp.com)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>

int main()
{
int a, b;

a = 5;
b = a & 3;
printf("\40: The a & b(decimal) is %d \n", b);
b &= 7;
printf("\40: The a & b(decimal) is %d \n", b);

system("pause");
return 0;
}

31. 按位或(|)

题目:

学习使用按位或|

程序分析:

5 的二进制为: 101,3 的二进制为:011。按位或操作:按照每位对应的二进制位,相同为 0,不同为 1。因此5 | 3 = 111 = 7

运算规则:

1
0 | 0 = 0;  0 | 1 = 1;  1 | 0 = 1;  1 | 1 = 1 

参考:

|按位或运算符 - C语言教程 - C语言网 (dotcpp.com)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>

int main()
{
int a, b;
a = 5;
b = a | 3;
printf("\40: The a | b(decimal) is %d \n", b);

system("pause");
return 0;
}

32. 按位异或(^)

题目:

学习使用按位异或^

程序分析:

5 的二进制为: 101,3 的二进制为:011。^表示按位异或运算符,顾名思义,相异,即不同则为1,反之为0。因此5 ^ 3 = 110 = 6

运算规则:

1
0 ^ 0 = 0;  0 ^ 1 = 1;  1 ^ 0 = 1;  1 | 1 = 0 

参考:

^按位异或运算符 - C语言教程 - C语言网 (dotcpp.com)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>

int main()
{
int a, b;
a = 5;
b = a ^ 3;
printf("\40: The a ^ b(decimal) is %d \n", b);

system("pause");
return 0;
}

33. 整数取位

题目:

取一个整数 a 从右端开始的 4~7 位。

程序分析:

<< 和 >> 运算符,通过箭头方向可以很好的辨别,分别是 C 语言位运算符中的左移运算符和右移运算符,如表达式13 << 2,它的运算过程为: 13 的用二进制(四个字节,不考虑符号)表示为,0000 0000 0000 0000 0000 0000 0000 1101,那么向左移两位,右侧补 0,则变为0000 0000 0000 0000 0000 0000 0011 0100换成十进制即变为 52。

本题需要注意的是:

  • 对二进制进行操作;
  • 从右到左从 0 开始;
  • 先使 a 右移 4 位;
  • 设置一个低 4 位全为 1,其余全为 0 的数。可用~( ~0 << 4 )
  • 将上面二者进行 & 运算。

参考:

移位运算符 - C语言教程 - C语言网 (dotcpp.com)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>

int main()
{
unsigned a, b, c, d;
scanf("%o", &a);
b = a >> 4;
c = ~(~0 << 4);
d = b & c;
printf("%o\n%o\n", a, d);

system("pause");
return 0;
}

34. 按位取反(~)

题目:

学习使用按位取反~

程序分析:

运算规则:

1
~0 = 1; ~1 = 0;

参考:

~取反运算符 - C语言教程 - C语言网 (dotcpp.com)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>

int main()
{
int a, b;
a = 234;
b = ~a;
printf("\40: The a's 1 complement(decimal) is %d \n", b);
a = ~a;
printf("\40: The a's 1 complement(hexidecimal) is %x \n", a);

system("pause");
return 0;
}

软考备战-C语言程序举例
https://excelius.xyz/软考备战-c语言程序举例/
作者
Excelius
发布于
2021年9月7日
许可协议