练习4-1
代码清单3-9是判断所输入的整数值的符号的程序,请将其改写为可以将输入·显示这一过程循环任意次。
#include <stdio.h>
int main(void) {
int no;
do {
printf("请输入一个整数:");
scanf("%d", &no);
if (no == 0)
puts("该整数为0。");
else if (no > 0)
puts("该整数为正数。");
else if (no < 0) // 多余的判断
puts("该整数为负数。");
printf("要重复一次吗?【yes...0 / No...9】:");
scanf("%d", &no);
} while (no == 0);
return 0;
}
练习4-2
编写一段程序,像右面这样读取两个整数的值,然后计算出它们之间所有整数的和。 请输入两个整数。
整数a:37
整数b:28
大于等于28小于等于37的所有整数的和是325。
#include <stdio.h>
int main(void) {
int a, b;
int sum = 0;
int start, end;
puts("请输入两个整数。");
printf("整数a:"); scanf("%d", &a);
printf("整数b:"); scanf("%d", &b);
if (a > b) {
start = b;
end = a;
} else {
start = a;
end = b;
}
do {
sum += start;
start = start + 1;
} while (start <= end);
printf("大于等于%d小于等于%d的所有整数的和是%d。\n",
a, b, sum);
return 0;
}
练习4-3
对代码清单4-5中的程序进行修改,当输入的值为负数的时候不执行换行操作。
#include <stdio.h>
int main(void) {
int n;
printf("请输入一个正整数:");
scanf("%d", &n);
if (n >= 0) { // 负数不参与
do {
printf("%d ", n);
n--;
} while (n >= 0);
printf("\n");
}
return 0;
}
综习4-4
对代码清单4-6的程序进行修改,使其
·递减到1而非递减到0。
·当输入的值小于0时,不进行换行。
#include <stdio.h>
int main(void) {
int n;
printf("请输入一个正整数:");
scanf("%d", &n);
if (n >= 0) { // 负数不参与
do {
printf("%d ", n--);
} while (n > 0); // 0不输出 但是换行
printf("\n");
}
return 0;
}
综习4-5
对代码清单4-7的程序进行如下修改。
·从1开始递增。
·输入的值小于0的时候不换行。
#include <stdio.h>
int main(void) {
int n;
printf("请输入一个正整数:");
scanf("%d", &n);
if (n >= 0) {
int i = 1;
while (i <= n)
printf("%d ", i++);
printf("\n");
}
return 0;
}
练习4-6
编写一段程序,像右面这样按照升序显示出小于输入值的所有正偶数。 请输入一个整数:19
2 4 6 8 10 12 14 16 18
#include <stdio.h>
int main(void) {
int i = 2;
int n;
printf("请输入一个整数:");
scanf("%d", &n);
while (i <= n) {
printf("%d ", i);
i += 2;
}
printf("\n");
return 0;
}
练习4-7
编写一段程序,像右面这样显示出小于输入的整数的所有2的乘方。 请输入一个整数:19
2 4 8 16
#include <stdio.h>
int main(void) {
int i = 2;
int n;
printf("请输入一个整数:");
scanf("%d", &n);
while (i <= n) {
printf("%d ", i);
i *= 2;
}
printf("\n");
return 0;
}
练习4-8
改写代码清单4-8的程序,当输入的值小于1时不输出换行符。
#include <stdio.h>
int main(void) {
int n;
printf("请输入一个整数:");
scanf("%d", &n);
if (n >= 1) {
do {
putchar('*');
n--;
} while (n);
putchar('\n');
}
return 0;
}
练习4-9
编写一段程序,使之像右边这样交替显示+和-,总个数等于所输入的整数值。
另外,当输入0以下的整数时,则什么也不显示。 正整数:13
±±±±±±+
#include <stdio.h>
int main(void) {
int n;
printf("正整数:");
scanf("%d", &n);
if (n >= 0) {
while (n >= 2) {
printf("+-");
n -= 2;
}
if (n == 1)
putchar('+');
putchar('\n');
}
return 0;
}
练习4-10
编写一段程序,使之像右边这样连续显示*,总个数等于所输入的整数值。
另外,当输入0以下的整数时,则什么也不显示。 正整数:3
*
*
*
#include <stdio.h>
int main(void) {
int n;
printf("正整数:");
scanf("%d", &n);
while (n > 0) {
puts("*");
--n;
}
return 0;
}
练习4-11
对代码清单4-10的程序进行修改,使其像右边这样在显示结果的同时显示输入的整数值。 请输入一个正整数:1963
1963逆向显示的结果是3691。
#include <stdio.h>
int main(void) {
int n;
do {
printf("请输入一个正整数:");
scanf("%d", &n);
if (n <= 0)
puts("\a请不要输入非正整数。");
} while (n <= 0);
printf("%d逆向显示的结果是", n);
do {
printf("%d", n % 10);
} while (n /= 10);
puts("。");
return 0;
}
综习4-12
编写一段程序,读取一个正整数,显示其位数。
※注意:代码清单4-10中while语句的循环次数和no的位数一致。 请输入一个正整数:1963
1963的位数是4。
#include <stdio.h>
int main(void) {
int count = 1;
int n;
do {
printf("请输入一个正整数:");
scanf("%d", &n);
if (n <= 0)
puts("\a请不要输入非正整数。");
} while (n <= 0);
printf("%d的位数是", n);
while (n /= 10)
++count;
printf("%d。\n", count);
return 0;
}
练习4-13
编写一段程序,求1到n的和。n的值从键盘输入。 n的值:5
1到5的和为15。
#include <stdio.h>
int main(void) {
int sum = 0;
int i;
int n;
do {
printf("n的值:");
scanf("%d", &n);
if (n <= 1)
puts("\a请不要输入小于等于1的数。");
} while (n <= 1);
for (i = 1; i <= n; ++i)
sum += i;
printf("1到%d的和为%d。", n, sum);
return 0;
}
练习4-14
编写一段程序,像右面这样根据输入的整数,循环显示1234567890,显示的位数和输入的整数值相同。 请输入一个整数:25
1234567890123456789012345
#include <stdio.h>
int main(void) {
int n;
int i;
printf("请输入一个整数:");
scanf("%d", &n);
while (n >= 10) {
printf("1234567890");
n -= 10;
}
for (i = 1; i <= n; ++i)
printf("%d", i);
putchar('\n');
return 0;
}
综习4-15
编写一段程序,像右面这样显示出身高和标准体重的对照表。显示的身高范围和间隔由输入的整数值进行控制,标准体重精确到小数点后2位。 开始数值(cm):155
结束数值(cm):190
间隔数值(cm):5
155cm 49.50kg
160cm 54.00kg
…(以下省略)…
#include <stdio.h>
int main(void) {
int start, end, step;
int height;
printf("开始数值(cm):"); scanf("%d", &start);
printf("结束数值(cm):"); scanf("%d", &end);
printf("间隔数值(cm):"); scanf("%d", &step);
for (height = start; height <= end; height += step)
printf("%3dcm\t%6.2fkg\n", height, (height - 100) * 0.9);
return 0;
}
练习4-16
编写一段程序,输入一个整数值,显示该整数值以下的所有奇数。 整数值:15
1 3 5 7 9 11 13 15
#include <stdio.h>
int main(void) {
int n;
int i;
printf("整数值:");
scanf("%d", &n);
for (i = 1; i <= n; i += 2)
printf("%d ", i);
putchar('\n');
return 0;
}
练习4-17
编写一段程序,像右边这样显示1到n的整数值的二次方。 n的值:3
1的二次方是1
2的二次方是4
3的二次方是9
#include <stdio.h>
int main(void) {
int n;
int i;
printf("n的值:");
scanf("%d", &n);
for (i = 1; i <= n; ++i)
printf("%d的平方是%d\n", i, i * i);
return 0;
}
练习4-18
编写一段程序,输入一个整数值,显示该整数值‘个’*号。每显示5个就进行换行。 显示多少个*:12
*****
*****
**
#include <stdio.h>
int main(void) {
int n;
int i;
printf("显示多少个*:");
scanf("%d", &n);
for (i = 1; i <= n; ++i) {
putchar('*');
if (i % 5 == 0)
putchar('\n');
}
if (n % 5 != 0)
putchar('\n');
return 0;
}
练习4-19
编写一段程序,对代码清单4-15进行修改,在显示所输入的整数值的所有约数之后,显示约数的个数。 整数值:4
1
2
4
约数有3个。
#include <stdio.h>
int main(void) {
int count = 0;
int n;
int i;
printf("整数值:");
scanf("%d", &n);
for (i = 1; i <= n; ++i)
if (n % i == 0) {
printf("%d\n", i);
++count;
}
printf("约数有%d个。\n", count);
return 0;
}
练习4-20
编写一段程序,像右面这样为九九乘法表增加横纵标题。
| | 1 2 3 4 5 6 7 8 9
------------------------------
1 | 1 2 3 4 5 6 7 8 9
2 | 2 4 6 8 10 12 14 16 18
3 | 3 6 9 12 15 18 21 24 27
4 | 4 8 12 16 20 24 28 32 36
…(以下省略)…
#include <stdio.h>
int main(void) {
int i, j;
printf(" |");
for (i = 1; i <= 9; ++i)
printf("%3d", i);
putchar('\n');
for (j = 0; j < 10; ++j)
printf("---");
putchar('\n');
for (i = 1; i <= 9; ++i) {
printf("%d |", i);
for (j = 1; j <= 9; ++j)
printf("%3d", i * j);
putchar('\n');
}
return 0;
}
练习4-21
编写一段程序,像右边这样显示以所输入整数为生成一个正方形边长的正方形。 正方形有几层:3
***
***
***
#include <stdio.h>
int main(void) {
int i, j;
int n;
printf("正方形有几层:");
scanf("%d", &n);
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j)
putchar('*');
putchar('\n');
}
return 0;
}
练习4-22
对代码清单4-17 中的程序进行修改,显示出一个横向较长的长方形。
※读取两个边的边长,以较小的数作为行数,以较大的数作为列数。 让我们来画一个长方形。
一边:7
另一边:3
*******
*******
*******
#include <stdio.h>
int main(void) {
int a, b;
int i, j;
puts("生成一个长方形:");
printf("一边:");
scanf("%d", &a);
printf("另一边:");
scanf("%d", &b);
if (a > b) {
int t = a;
a = b;
b = t;
}
for (i = 0; i < a; ++i) {
for (j = 0; j < b; ++j)
putchar('*');
putchar('\n');
}
return 0;
}
练习4-23
对代码清单4-18和代码清单4-19中的程序进行修改,分别显示出直角在左上方和右上方的等腰直角三角形(生成两个程序)。
#include <stdio.h>
int main(void) {
int i, j;
int n;
puts("生成直角在左上角的等腰直角三角形。");
printf("短边:");
scanf("%d", &n);
for (i = n; i > 0; --i) {
for (j = 0; j < i; ++j)
putchar('*');
putchar('\n');
}
return 0;
}
#include <stdio.h>
int main(void) {
int i, j;
int n;
puts("生成直角右上角的等腰直角三角形。");
printf("短边:");
scanf("%d", &n);
for (i = n; i > 0; --i) {
for (j = n - i; j > 0; --j)
putchar(' ');
for (j = 0; j < i; ++j)
putchar('*');
putchar('\n');
}
return 0;
}
练习4-24
编写一段程序,输入一个整数,像右面这样显示出输入整数层的金字塔形状。
提示:第i行显示(i-1)*2+1个*。 让我们来画一个金字塔。
金字塔有几层:3
*
***
*****
#include <stdio.h>
int main(void) {
int i, j;
int n;
puts("让我们来画一个金字塔。");
printf("金字塔有几层:");
scanf("%d", &n);
for (i = 1; i <= n; ++i) {
for (j = n - i; j > 0; --j)
putchar(' ');
for (j = 2 * i - 1; j > 0; --j)
putchar('*');
putchar('\n');
}
return 0;
}
练习4-25
编写一段程序,像右边这样显示输入整数层的向下的金字塔形状。第i行显示i%10的结果。 让我们来画一个向下的金字塔。
金字塔有几层:3
11111
222
3
#include <stdio.h>
int main(void) {
int i, j;
int n;
puts("让我们来画一个向下的金字塔。");
printf("金字塔有几层:");
scanf("%d", &n);
for (i = 1; i <= n; ++i) {
for (j = 1; j < i; ++j)
putchar(' ');
for (j = 2 * (n - i) + 1; j > 0; --j)
printf("%d", i % 10);
putchar('\n');
}
return 0;
}