题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔
子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数
为多少?
程序分析:兔子的规律为数列1, 1, 2, 3, 5, 8, 13, 21…
程序源代码:
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;/*前两个月加起来赋值给第三个月*/ } }
题目:判断101 - 200之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整
除,则表明此数不是素数,反之是素数。
程序源代码:
#include "math.h" main() { int m, i, k, h = 0, leap = 1; printf("\n"); for (m = 101; m <= 200; m++) { k = sqrt(m + 1); for (i = 2; i <= k; i++) if (m % i == 0) { leap = 0; break; } if (leap) { printf("%-4d", m); h++; if (h % 10 == 0) printf("\n"); } leap = 1; } printf("\nThe total is %d", h); }
题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位
数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153 = 1的三次方
+5的三次方+3的三次方。
程序分析:利用for循环控制100 - 999个数,每个数分解出个位,十位,百位。
程序源代码:
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"); }
题目:将一个正整数分解质因数。例如:输入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的值, 重复执行第一步。
程序源代码:
main() { int n, i; printf("\nplease input a number:\n"); 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); }
题目:利用条件运算符的嵌套来完成此题:学习成绩 >= 90分的同学用A表示,60
- 89分之间的用B表示,60分以下的用C表示。
程序分析:(a > b) ? a : b这是条件运算符的基本例子。
程序源代码:
main() { int score; char grade; printf("please input a score\n"); scanf("%d", &score); grade = score >= 90 ? 'A'score >= 60 ? 'B' : 'C'); printf("%d belongs to %c", score, grade); }
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
程序分析:利用辗除法。
程序源代码:
main() { int a, b, num1, num2, temp; printf("please input two numbers:\n"); scanf("%d,%d", &num1, &num2); if (num1{ temp = num1; num1 = num2; num2 = temp; } a = num1; b = num2; while (b != 0)/*利用辗除法,直到b为0为止*/ { temp = a % b; a = b; b = temp; } printf("gongyueshu:%d\n", a); printf("gongbeishu:%d\n", num1 * num2 / a); }
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
。
程序分析:利用while语句, 条件为输入的字符不为’\n’.
程序源代码:
#include "stdio.h" 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); }
题目:求s = a + aa + aaa + aaaa + aa…a的值,其中a是一个数字。例如
2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加有键盘控制。
程序分析:关键是计算出每一项的值。
程序源代码:
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+...=%ld\n", sn); }
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6 = 1+2
+3.编程找出1000以内的所有完数。
程序源代码:
main() { static int k[10]; int i, j, n, s; for (j = 2; j < 1000; j++) { n = -1; s = j; for (i = 1; i{ if ((j % i) == 0) { n++; s = s - i; k[n] = i; } } if (s == 0) { printf("%d is a wanshu", j); for (i = 0; i printf("%d,", k); printf("%d\n", k[n]); } } }
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,
求它在第10次落地时,共经过多少米?第10次反弹多高?
程序源代码:
main() { float sn = 100.0, hn = sn / 2; int n; for (n = 2; n <= 10; n++) { sn = sn + 2 * hn;/*第n次落地时共经过的米数*/ hn = hn / 2; /*第n次反跳高度*/ } printf("the total of road is %f\n", sn); printf("the tenth is %f meter\n", hn); }
题目:一只猴子摘了N个桃子第一天吃了一半又多吃了一个, 第二天又吃了余下的
一半又多吃了一个, 到第十天的时候发现还有一个.
程序源代码:
main() { int i, s, n = 1; for (i = 1; i < 10; i++) { s = (n + 1) * 2 n = s; } printf("第一天共摘了%d个桃\n", s); }
迭代法求方程根
/* 迭代法求一个数的平方根 */ #define Epsilon 1.0E-6 /*控制解的精度*/ #include<math.h> main() { float a, x0, x1; printf("请输入要求的数:"); scanf("%f", &a); x0 = a / 2; x1 = (x0 + a / x0) / 2; while (fabs(x1 - x0) >= Epsilon) { x0 = x1; x1 = (x0 + a / x0) / 2; } printf("%f的平方根:%f.5\n", x1); }
/* 上题的另一种算法 */ #define Epsilon 1.0E-6 /*控制解的精度*/ #include <stdio.h> #include <math.h> main() { float num, pre, this; do { scanf("%f", &num);/*输入要求平方根的数*/ } while (num < 0); if (num == 0) printf("the root is 0"); else { this = 1; do { pre = this; this = (pre + num / pre) / 2; } while (fabs(pre - this) > Epsilon);/*用解的精度,控制循环次数*/ } printf("the root is %f", this); }
用牛顿迭代法 求方程 2 * x * x * x - 4 * x * x + 3 * x - 6 的根
/* 牛顿迭代法 */ #define Epsilon 1.0E-6 /*控制解的精度*/ #include<math.h> main() { float x1, x0 = 1.5; x1 = x0 - (2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6) / (6 * x0 * x0 - 8 * x0 + 3); while (fabs(x1 - x0 >= Epsilon) { x0 = x1; x1 = x0 - (2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6) / (6 * x0 * x0 - 8 * x0 + 3); } printf("方程的根为%f\n", x1); }
用二分法求上题
/* 二分法 */ #define Epsilon 1.0E-5 /*控制解的精度*/ #include<math.h> main() { folat x1, x2, x0, f1, f2, f0; x0 = (x1 + x2) / 2; f0 = 2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6; /* 求中点的函数值 */ while (fabs(f0) >= Epsilon) { if (f0 * f1 < 0) { x2 = x0; f2 = 2 * x2 * x2 * x2 - 4 * x2 * x2 + 3 * x2 - 6; } if (f0 * f2 < 0) { x1 = x0; f1 = 2 * x1 * x1 * x1 - 4 * x1 * x1 + 3 * x1 - 6; } x0 = (x1 + x2) / 2; f0 = 2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6; } printf("用二分法求得方程的根:%f\n", x0); }
题目:打印出如下图案(菱形)
*
程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利
用双重for循环,第一层控制行,第二层控制列。
程序源代码:
main() { int i, j, k; for (i = 0; i <= 3; i++) { for (j = 0; j <= 2 - i; j++) printf(" "); for (k = 0; k <= 2 * i; k++) printf("*"); printf("\n"); } for (i = 0; i <= 2; i++) { for (j = 0; j <= i; j++) printf(" "); for (k = 0; k <= 4 - 2 * i; k++) printf("*"); printf("\n"); } }
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,
十位与千位相同。
程序分析:同29例
程序源代码:
main() { long ge, shi, qian, wan, x; scanf("%ld", &x); wan = x / 10000; qian = x % 10000 / 1000; shi = x % 100 / 10; ge = x % 10; if (ge == wan && shi == qian)/*个位等于万位并且十位等于千位*/ printf("this number is a huiwen\n"); else printf("this number is not a huiwen\n"); }
题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,
则继续判断第二个字母。
程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语
句判断第二个字母。
程序源代码:
#include <stdio.h> void main() { char letter; printf("please input the first letter of someday\n"); while ((letter = getch()) != 'Y') /*当所按字母为Y时才结束*/ { switch (letter) { case 'S':printf("please input second letter\n"); if ((letter = getch()) == 'a') printf("saturday\n"); else if ((letter = getch()) == 'u') printf("sunday\n"); else printf("data error\n"); break; case 'F':printf("friday\n"); break; case 'M':printf("monday\n"); break; case 'T':printf("please input second letter\n"); if ((letter = getch()) == 'u') printf("tuesday\n"); else if ((letter = getch()) == 'h') printf("thursday\n"); else printf("data error\n"); break; case 'W':printf("wednesday\n"); break; default: printf("data error\n"); } } }
题目:Press any key to change color, do you want to try it.Please hurry up!
程序源代码:
#include <conio.h> void main(void) { int color; for (color = 0; color < 8; color++) { textbackground(color); /*设置文本的背景颜色*/ cprintf("This is color %d\r\n", color); cprintf("ress any key to continue\r\n"); getch(); /*输入字符看不见*/ } }
题目:学习gotoxy()与clrscr()函数
程序源代码:
#include <conio.h> void main(void) { clrscr(); /*清屏函数*/ textbackground(2); gotoxy(1, 5); /*定位函数*/ cprintf("Output at row 5 column 1\n"); textbackground(3); gotoxy(20, 10); cprintf("Output at row 10 column 20\n"); }
题目:练习函数调用
程序源代码:
#include <stdio.h> void hello_world(void) { printf("Hello, world!\n"); } void three_hellos(void) { int counter; for (counter = 1; counter <= 3; counter++) hello_world();/*调用此函数*/ } void main(void) { three_hellos();/*调用此函数*/ }
题目:文本颜色设置
程序源代码:
#include <conio.h> void main(void) { int color; for (color = 1; color < 16; color++) { textcolor(color);/*设置文本颜色*/ cprintf("This is color %d\r\n", color); } textcolor(128 + 15); cprintf("This is blinking\r\n"); }
题目:求100之内的素数
程序源代码:
#include <stdio.h> #include "math.h" #define N 101 main() { int i, j, line, a[N]; for (i = 2; i < N; i++) a = i; for (i = 2; i < sqrt(N); i++) for (j = i + 1; j < N; j++) { if (a != 0 && a[j] != 0) if (a[j] % a == 0) a[j] = 0; } printf("\n"); for (i = 2, line = 0; i < N; i++) { if (a != 0) { printf("%5d", a); line++; } if (line == 10) { printf("\n"); line = 0; } } }
题目:对10个数进行排序
程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个
元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。
程序源代码:
#define N 10 main() { int i, j, min, tem, a[N]; /*input data*/ printf("please input ten num:\n"); for (i = 0; i < N; i++) { printf("a[%d]=", i); scanf("%d", &a); } printf("\n"); for (i = 0; i < N; i++) printf("%5d", a); printf("\n"); /*sort ten num*/ for (i = 0; i < N - 1; i++) { min = i; for (j = i + 1; j < N; j++) if (a[min] > a[j]) min = j; tem = a; a = a[min]; a[min] = tem; } /*output data*/ printf("After sorted \n"); for (i = 0; i < N; i++) printf("%5d", a); }
题目:求一个3 * 3矩阵对角线元素之和
程序分析:利用双重for循环控制输入二维数组,再将a累加后输出。
程序源代码:
main() { float a[3][3], sum = 0; int i, j; printf("please input rectangle element:\n"); for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) scanf("%f", &a[j]); for (i = 0; i < 3; i++) sum = sum + a; printf("duijiaoxian he is %6.2f", sum); }
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数
组中。
程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况
,插入后此元素之后的数,依次后移一个位置。
程序源代码:
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); 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 > number) { temp1 = a; a = 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); }
题目:将一个数组逆序输出。
程序分析:用第一个与最后一个交换。
程序源代码:
#define N 5 main() { int a[N] = { 9,6,5,4,1 }, i, temp; printf("\n original array:\n"); for (i = 0; i < N; i++) printf("%4d", a); for (i = 0; i < N / 2; i++) { temp = a; a = a[N - i - 1]; a[N - i - 1] = temp; } printf("\n sorted array:\n"); for (i = 0; i < N; i++) printf("%4d", a); }
题目:学习static定义静态变量的用法
程序源代码:
#include "stdio.h" 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++; } void main() { int i; for (i = 0; i < 3; i++) varfunc(); }
题目:学习使用auto定义变量的用法
程序源代码:
#include "stdio.h" main() { int i, num; num = 2; for (i = 0; i < 3; i++) { printf("\40: The num equal %d \n", num); num++; { auto int num = 1; printf("\40: The internal block num equal %d \n", num); num++; } } }
程序源代码:
#include "stdio.h" main() { int i, num; num = 2; for (i = 0; i < 3; i++) { printf("\40: The num equal %d \n", num); num++; { static int num = 1; printf("\40:The internal block num equal %d\n", num); num++; } } }
题目:学习使用external的用法。
程序源代码:
#include "stdio.h" int a, b, c; void add() { int a; a = 3; c = a + b; } void main() { a = b = 4; add(); printf("The value of c is equal to %d\n", c); }
题目:学习使用register定义变量的方法。
程序源代码:
void main() { register int i; int tmp = 0; for (i = 1; i <= 100; i++) tmp += i; printf("The sum is %d\n", tmp); }
题目:宏#define命令练习(1)
程序源代码:
#include "stdio.h" #define TRUE 1 #define FALSE 0 #define SQ(x) (x)*(x) void 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; } }
题目:宏#define命令练习(2)
程序源代码:
#include "stdio.h" #define exchange(a,b) { \ /*宏定义中允许包含两道衣裳命令的情形,此时必须在最右边加上"\"*/ int t; \ t = a; \ a = b; \ b = t; \ } void main(void) { 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); }
题目:宏#define命令练习(3)
程序源代码:
#define LAG > #define SMA < #define EQ == #include "stdio.h" void 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"); }
题目:#if #ifdef和#ifndef的综合应用。
程序源代码:
#include "stdio.h" #define MAX #define MAXIMUM(x,y) (x>y)?x:y #define MINIMUM(x,y) (x>y)?y:x void 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 }
题目:#include 的应用练习
程序源代码:
test.h 文件如下: #define LAG > #define SMA < #define EQ == #include "test.h" /*一个新文件50.c,包含test.h*/ #include "stdio.h" void 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"); }
题目:学习使用按位与& 。
程序分析:0 & 0 = 0; 0 & 1 = 0; 1 & 0 = 0; 1 & 1 = 1
程序源代码:
#include "stdio.h" main() { int a, b; a = 077; 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); }
题目:学习使用按位或 | 。
程序分析:0 | 0 = 0; 0 | 1 = 1; 1 | 0 = 1; 1 | 1 = 1
程序源代码:
#include "stdio.h" main() { int a, b; a = 077; 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); }
题目:学习使用按位异或^ 。
程序分析:0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 = 0
程序源代码:
#include "stdio.h" main() { int a, b; a = 077; 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); }
题目:取一个整数a从右端开始的4~7位。
程序分析:可以这样考虑:
(1)先使a右移4位。
(2)设置一个低4位全为1, 其余全为0的数。可用(0 << 4)
(3)将上面二者进行& 运算。
程序源代码:
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); }
题目:学习使用按位取反~。
程序分析:~0 = 1; ~1 = 0;
程序源代码:
#include "stdio.h" 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); }
题目:画图,学用circle画圆形。
程序源代码:
/*circle*/ #include "graphics.h" main() { int driver, mode, i; float j = 1, k = 1; driver = VGA; mode = VGAHI; initgraph(&driver, &mode, ""); setbkcolor(YELLOW); for (i = 0; i <= 25; i++) { setcolor(8); circle(310, 250, k); k = k + j; j = j + 0.3; } }
题目:画图,学用line画直线。
程序源代码:
#include "graphics.h" main() { int driver, mode, i; float x0, y0, y1, x1; float j = 12, k; driver = VGA; mode = VGAHI; initgraph(&driver, &mode, ""); setbkcolor(GREEN); x0 = 263; y0 = 263; y1 = 275; x1 = 275; for (i = 0; i <= 18; i++) { setcolor(5); line(x0, y0, x0, y1); x0 = x0 - 5; y0 = y0 - 5; x1 = x1 + 5; y1 = y1 + 5; j = j + 10; } x0 = 263; y1 = 275; y0 = 263; for (i = 0; i <= 20; i++) { setcolor(5); line(x0, y0, x0, y1); x0 = x0 + 5; y0 = y0 + 5; y1 = y1 - 5; } }
题目:画图,学用rectangle画方形。
程序分析:利用for循环控制100 - 999个数,每个数分解出个位,十位,百位。
程序源代码:
#include "graphics.h" main() { int x0, y0, y1, x1, driver, mode, i; driver = VGA; mode = VGAHI; initgraph(&driver, &mode, ""); setbkcolor(YELLOW); x0 = 263; y0 = 263; y1 = 275; x1 = 275; for (i = 0; i <= 18; i++) { setcolor(1); rectangle(x0, y0, x1, y1); x0 = x0 - 5; y0 = y0 - 5; x1 = x1 + 5; y1 = y1 + 5; } settextstyle(DEFAULT_FONT, HORIZ_DIR, 2); outtextxy(150, 40, "How beautiful it is!"); line(130, 60, 480, 60); setcolor(2); circle(269, 269, 137); }