题目:古典问题:有一对兔子,从出生后第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);
}