• 抬起头,继续前进吧,去把这个不完美的故事,变成你成所期望的样子
  • 登山路上我们会放弃很多东西,但这些被我们丢掉在我们登上山顶之际,都会一一回来
  • 不论开发还是逆向,数学水平的高低直接决定了”你的饭碗里有没有肉”
  • 万丈高楼平地起,勿在浮沙筑高台

《C语言程序设计:现代方法》第六章练习

C 菜鸟 1年前 (2018-01-30) 9700次浏览 已收录 0个评论
[隐藏]

        本篇为菜鸟在学习《C 语言程序设计:现代方法》中第六章循环时做的练习题,如果有错误或疑问的话,欢迎大家指正~

1、最大数

编写一个程序,要求找到用户输入的一串数中的最大数。程序提示用户一个一个输入数。当用户输入 0 或负数时,程序必须显示输入的最大非负数
注意输入的数不一定为整数
Enter a number: 60
Enter a number: 38.3
Enter a number: 4.89
Enter a number: 100.62
Enter a number: 75.2295
Enter a number: 0
The largest number entered was 100.62

#include <stdio.h>

main()
{
    float bigNumber, number;
    bigNumber = 0;
    for (;;) {
        printf("Enter a number: ");
        scanf("%f", &number);
        if (number <= 0) {
            printf("The largest number entered was %.2f\n", bigNumber);
            break;
        }
        if (number > bigNumber) {
            bigNumber = number;
        }
    }

    return 0;
}

2、最大公约数

编写程序,要求用户输入两个整数,然后使用欧几里得算法计算显示这两个整数的最大公约数(GCD)
提示:Euclid 算法 gcd(a,b) = gcd(b,a mod b),分别让变量和 n 存储两个数的值;用 m 除以 n,把除数保存在 m 中,而把余数保存在 n 中,如果 n 为 0,停止操作,m 中的值为最大公约数。否则继续 m 除以 n 的过程
Enter two integers: 12 28
Greatest common divisor: 4

#include <stdio.h>

main()
{
    int m, n, divisor;
    printf("Enter two integers: ");
    scanf("%d %d", &m, &n);
    
    for (;;) {
        if (n == 0) {
			printf("Greatest common divisor: %d\n", m);
            break;
        }
        divisor = n;
        n = m % n;
        m = divisor;
    }
    
    return 0;
}

3、最简分式

编写程序,要求用户输入一个分数,然后将其约分为最简分式
提示:首先计算分子和分母的最大公约数,然后分子分母分别除以最大公约数
Enter a fraction: 6/12
In lowest terms: 1/2

#include <stdio.h>

main()
{
    int molecular, denominator, m, n, divisor, gcd;
    printf("Enter a fraction: ");
    scanf("%d/%d", &molecular, &denominator);
    m = molecular;
    n = denominator;

    for (;;) {
        if (n == 0) {
            gcd = m;
            break;
        }
        divisor = n;
        n = m % n;
        m = divisor;
    }

    molecular /= gcd;
    denominator /= gcd;
    printf("In lowest terms: %d/%d\n", molecular, denominator);

    return 0;
}

4、股票佣金

在 brock.c 中添加循环以便用户可以输入多笔交易,并且程序可以计算每次的佣金。程序在用户输入交易额为 0 时终止
Enter value of trade: 30000
Commission: $166.00
Enter value of trade: 20000
Commission: $144.00
Enter value of trade: 0

#include <stdio.h>

main()
{
    float commission, value;
    for (;;) {
        printf("Enter value of trade: ");
        scanf("%f", &value);

        if (value == 0) {
            break;
        } else if (value < 2500.00) {
            commission = 30.00 + .017 * value;
        } else if (value < 6250.00) {
            commission = 56.00 + .0066 * value;
        } else if (value < 20000.00) {
            commission = 76.00 + .0034 * value;
        } else if (value < 50000.00) {
            commission = 100.00 + .0022 * value;
        } else if (value < 500000.00) {
            commission = 150.00 + .0011 * value;
        } else {
            commission = 255.00 + .0009 * value;
        }

        if (commission < 39.00) {
            commission = 39.00;
        }
        printf("Commission: $%.2f\n", commission);
    }

    return 0;
}

5、数字反向

设计一个程序可以实现一位、两位、三位或多位数反向
提示:使用 do 循环重复除以 10,直到值为 0

#include <stdio.h>

main()
{
	int number, n, digit = 0, n1, n2, n3, n4, n5;
	printf("Enter a number(max digit is 5): ");
	scanf("%d", &number);
	n = number;
	
	do {
		n /= 10;
		++digit;
	} while (n != 0);

	if (digit > 5) {
		printf("The digit of your input number is over limt!\n");
	} else {
		n = digit;
	}

	for ( ; n >= 0 ; n--) {
		switch (n) {
			case 1:
				n1 = number % 10;
				break;
			case 2:
				n2 = number % 100 / 10;
				break;
			case 3:
				n3 = number % 1000 / 100;
				break;
			case 4:
				n4 = number % 10000 / 1000;
				break;
			case 5:
				n5 = number % 100000 / 100000;
				break;
		}
	}
	switch (digit) {
		case 1:
			printf("The reversal is: %1d\n", n1);
			break;
		case 2:
			printf("The reversal is: %1d%1d\n", n1, n2);
			break;
		case 3:
			printf("The reversal is: %1d%1d%1d\n", n1, n2, n3);
			break;
		case 4:
			printf("The reversal is: %1d%1d%1d%1d\n", n1, n2, n3, n4);
			break;
		case 5:
			printf("The reversal is: %1d%1d%1d%1d%1d\n", n1, n2, n3, n4, n5);
			break;
	}

	return 0;
}

6、偶数平方

编写程序,要求提示用户输入一个数 n,然后显示出 1-n 的所有偶数平方。例如用户输入 100,则应该显示
4
16
36
64
100

#include <stdio.h>

main()
{
    int number, n;
    for (;;) {
        printf("Enter a number (greater than 1): ");
        scanf("%d", &number);
        if (number <= 1) {
            printf("The number is outside the law! Please enter again!");
        } else {
            break;
        }
    }
    for (n = 2; n * n <= number; n += 2) {
        printf("%d\n", (n * n));
    }

    return 0;
}

7、平方列表

重新安排程序 sqauar3.c 以便 for 循环对变量 i 进行初始化,对变量 i 进行判定,并且对变量 i 进行自增操作。

/* Prints a table of square using an odd method */
#include <stdio.h>

main()
{
    int i, n, odd, square;

    printf("This program prints a table of squares.\n");
    printf("Enter number of entries in table: ");
    scanf("%d", &n);

    odd = 3;
	square = 1;
    for (i = 1; i <= n; ++i) {
        printf("%10d%10d\n", i, square);
        square += odd;
		odd += 2
    }

    return 0;
}

8、日历

编写程序,要求显示出单月的日历。用户说明这个月的天数和本月起始日是星期几。
Enter of days of the month: 31
Enter starting day of the week (1=Sun, 7=Sat): 3
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>

main()
{
    int days, startOfTheWeek, i, dayOfTheWeek = 1;
    printf("Enter of days of the month: ");
    scanf("%d", &days);
    printf("Enter starting day of the week (1=Sun, 7=Sat): ");
    scanf("%d", &startOfTheWeek);

    for (i = 1; i <= days; i++) {
        if (dayOfTheWeek < startOfTheWeek) {
            printf("   ");
            ++dayOfTheWeek;
            --i;
            continue;
        } else {
            startOfTheWeek = -1;
        }

        if (dayOfTheWeek > 7) {
            printf("\n%2d ", i);
            dayOfTheWeek = 1;
        } else {
            printf("%2d ", i);
        }

        if (i == days) {
            printf("\n");
        }
        ++dayOfTheWeek;
    }

    return 0;
}

9、for 循环 1

下面这条 for 语句输出是什么?

for (i = 5, j = i - 1; i > 0, j > 0; --i, j = i - 1)
    printf("%d ", i);

答:5 4 3 2

知识点:
        逗号表达式中的第一个表达式的值会被丢弃,将第二个表达式的值作为整个逗号表达式的最终值

10、for 循环 2

下列哪条语句和其他两条语句不等价(假设循环体一致)
a、for (i = 0; i < 10; i++) ...
b、for (i = 0; i < 10; ++i) ...
c、for (i = 0; i++ < 10; ) ...
答:c (i 的值在判定表达式结束后执行循环体前完成了自增)

11、循环

下列哪条语句和其他两条语句不等价(假设循环体一致)
a、while (i < 10) {...}
b、for (; i < 10;) {...}
c、do {…} while (i < 10);
答:c (如果判定表达式为假,do 循环还会执行一次循环体)

12、goto 与 continue

显示如果用等价的 goto 语句替换 continue 语句
continue 语句

sum = 0;
for (i = 0; i < 10; i++) {
    if (i % 2) continue;
	sum += i;
}

goto 语句

sum = 0;
for (i = 0; i < 10; i++) {
    if (i % 2) goto go_to_end;
    sum += i;
    go_to_end: ;
}

13、输出判定

下面的程序产生的输出是什么?

sum = 0;
for (i = 0; i < 10; i++) {
    if (i % 2) continue;
	sum += i;
}
printf("%d\n", sum);

答:20

14、素数判定

for (d = 2; d < n; d++)
    if (n % d == 0) break;

修改循环,使用平方根的来检查素数
答:

for (d = 2; d * d < n; d++)
    if (n % d == 0) break;

15、空语句

重写下面的循环,使其循环体为空

for (n = 0; m > 0; n++)
    m /= 2;

答:

for (n = 0; m > 0; m /= 2, n++){
    ;
}

16、修改错误

找出下面程序段的错误并修改

if (n % 2 == 0);
    printf("n is even\n");

答:if 的判断表达式后不可带分号。printf 语句中 n 不可直接使用,应该做转换说明
改:

if (n % 2 == 0)
    printf("%d is even\n", n);

学习心得 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明《C 语言程序设计:现代方法》第六章练习
喜欢 (3)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址