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" ); 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次反弹多高?
程序分析:
第一次只有一次下降距离,之后都有两次。还需要注意数据类型应为float
或double
,因为除不尽。
代码:
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 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. 按位取反(~)
题目:
学习使用按位取反~
。
程序分析:
运算规则:
参考:
~取反运算符 - 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 ; }