C 语言基本概念:练习题和编程题

目录汇总:C 语言入门教程:面向萌新小白的零基础入门教程

一、练习题#

编写一个简单的 C 程序

  1. 建立并运行由 Kernighan 和 Ritchie 编写的著名的“hello, world”程序:
#include <stdio.h>

int main (void)
{
  printf("hello, world\n");
}

在编译时是否有警告信息?如果有,需要如何进行修改呢?

解决方案

1.c

1
2
3
4
5
#include <stdio.h>

int main(void) {
    printf("hello, world\n");
}

1b.c

1
2
3
4
5
6
#include <stdio.h>

int main(void) {
    printf("hello, world\n");
    return 0;
}

使用 gcc 版本 7.2.0 编译程序不会产生错误。这是运行命令的完整输出:

$ gcc 1.c -o 1 -Wall -W -pedantic -std=c99
(no output, no warnings or errors)

$ gcc 1.c -o 1 -Wall -W -pedantic -std=c89
1.c: in function 'main':
1.c:5:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

可以通过修改 return 0; 程序来修复此警告(1b.c):

$ gcc 1b.c -o 1b -Wall -W -pedantic -std=c89
(no output, no warnings or errors)

一个简单的 C 程的序的一般形式

  1. 思考下面的程序:
1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main(void)
{
  printf("Parkinson's Law:\nWork expands so as to ");
  printf("fill the time\n");
  printf("available for its completion.\n");
  return 0;
}

(a) 请指出程序中的指令和语句。

(b) 程序的输出是什么?

解决方案

(a)

程序中唯一的指令在第 #include <stdio.h> 1 行。语句是第 5-8 行:printf() 语句和 return 语句。

(b)

该程序产生以下内容:

Parkinson's Law:
Work expands so as to fill the time
available for its completion.

C 语言中的变量和赋值

  1. 通过下列方法缩写程序 dweight.c:(1)用初始化式替换对变量 heightlengthwidth 的赋值;(2)去掉变量 weight,在最后的 printf 语句中计算(volume + 165)/ 166

解决方案

dweight.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/* Computes the dimensional weight of a 12" x 10" x 8" box */

#include <stdio.h>

int main(void) {

    int height = 8,
        length = 12,
        width = 10,
        volume = height * length * width;

    printf("Dimensions: %dx%dx%d\n", length, width, height);
    printf("Volume (cbic inches): %d\n", volume);
    printf("Dimensional weight (pounds): %d\n", (volume + 165) / 166);

    return 0;
}
  1. 编写一个程序来声明几个 int 型和 float 型变量,不对这些变量进行初始化,然后显示它们的值。这些值是否有规律?(通常情况下没有。)

解决方案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <stdio.h>

int main(void) {

    int a, b, c, d, e;
    float f, g, h, i, j;
    
    printf("%d\n%d\n%d\n%d\n%d\n%f\n%f\n%f\n%f\n%f\n", 
           a, b, c, d, e, f, g, h, i, j);

    return 0;
}

产生的前几个整数没有规律,但是,经过反复编译和反复测试,最后两个整数和所有浮点数通常是 0 或 0.000000,偶尔会偏离“随机”垃圾值。

C 语言中的标识符

  1. 判断下列 C 语言标识符哪些是不合法的?

(a) 100_bottles

(b) _100_bottles

(c) one__hundred__bottles

(d) bottles_by_the_hundred_

解决方案

(a) 不是合法标识符,因为标识符必须以字母或下划线开头。

  1. 为什么说在标识符中使用多个相邻的下划线(如 current___balance)不太合适?

解决方案

具有多个连续下划线的标识符难以阅读。很难确定标识符中有多少个下划线字符,并且使用多个下划线没有任何意义。

  1. 判断下列哪些是 C 语言的关键字?

(a) for

(b) If

(c) main

(d) printf

(e) while

解决方案

(a) 和 (e) 是关键字。如果 If 被写成 if,(b) 将是一个关键字。

C 程序的书写规范

  1. 下面的语句中有多少记号?
1
answer=(3*q-p*p)/3;

解决方案

语句中有 13 个记号,其中 6 个是非唯一的。

  1. 在练习题8的记号之间插入空格,使该语句更易于阅读。

解决方案

1
answer = ( 3 * q - p * p) / 3 ;
  1. 在 dweight.c 程序(C 语言中的变量和赋值)中,哪些空格是必不可少的?

解决方案

以下是完整的 dweight.c 程序,如第 C 语言中的变量和赋值 所述:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/* Computes the dimensional weight of a 12" x 10" x 8" box */

#include <stdio.h>

int main(void)
{
    int height, length, width, volume, weight;

    height = 8;
    length = 12;
    width = 10;
    volume = height * length * width;
    weight = (volume + 165) / 166;

    printf("Dimensions: %dx%dx%d\n", length, width, height);
    printf("Volume (cubic inches): %d\n", volume);
    printf("Dimensional weight (pounds): %d\n", weight);

    return 0;
}

#include <stdio.h> 之间的空格;int main(void) 之间的空格;int height... 之间的空格;return 0; 之间的空格。程序其他部分的空格都是为了易于阅读而存在的,即使可去掉程序本身依旧能够正常执行,只是增加了阅读困难。

二、编程题#

  1. 编写一个程序,使用 printf 在屏幕上显示下面的图形:

使用 printf 在屏幕上显示下面的图形

解决方案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>

int main(void) {
    
    printf("       *\n");
    printf("      * \n");
    printf("     *  \n");
    printf("*   *   \n");
    printf(" * *    \n");
    printf("  *     \n");

    return 0;
}
  1. 编写一个计算球体体积的程序,其中球体半径为 10m,参考公式 $ v= 4/3{\pi}r^3 $。注意,分数 4/3 应写为 4.0f/3.0f。(如果分数写成 4/3 会产生什么结果?)提示:C 语言没有指数运算符,所以需要对 $r$ 自乘两次来计算 $ r^3 $。

解决方案

1
2
3
4
5
6
7
#include <stdio.h>

int main(void) {

    printf("Sphere volume: %.2f cubic meters\n", 4.0f/3.0f * 3.14f * 1000);
    return 0;
}

如果分数写成 4/3 会产生什么结果?以整数形式写入分数将导致整数舍入错误,返回 1。

  1. 修改上题中的程序,使用户可以自行录入球体的半径。

解决方案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>

int main(void) {

    int r = 0;

    printf("Enter radius: ");
    scanf("%d", &r);

    printf("\nSphere volume: %.2f cubic meters\n",
           4.0f/3.0f * 3.14f * r * r * r);
    return 0;
}
  1. 编写一个程序,要求用户输入一个美元数量,然后显示出增加 5% 税率后的相应金额。格式如下所示:
Enter an amount: 100.00
With tax added: $105.00

解决方案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <stdio.h>

int main(void) {

    float money = 0.0f;
    printf("Enter an amount: ");
    scanf("%f", &money);
    printf("With tax added: $%.2f\n", money * 1.05f);

    return 0;
}
  1. 编程要求用户输入的值,然后显示如下多项式的值:

编程要求用户输入的值,然后显示如下多项式的值

提示: C 语言没有指数运算符,所以需要对进行自乘来计算其幂。(例如,x*x*x 就是 x 的三次方。)

解决方案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>

int main(void) {

    int x = 0;

    printf("Enter value for x: ");
    scanf("%d", &x);
    printf("Result: %d\n",
           (3 * x * x * x * x * x) + (2 * x * x * x * x) - (5 * x * x * x)
           - (x * x) + (7 * x) - 6);

    return 0;
}
  1. 修改上题,用如下公式对多项式求值:

修改上题,用如下公式对多项式求值

注意,修改后的程序所需的乘法次数减少了。这种多项式求值方法即 Horner 法则(Horner’s Rule)。

解决方案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>

int main(void) {

    int x = 0;

    printf("Enter value for x: ");
    scanf("%d", &x);
    printf("Result: %d\n",
           ((((3 * x + 2) * x - 5) * x - 1) * x + 7) * x - 6);

    return 0;
}
  1. 编写一个程序,要求用户输入一个美金数量,然后显示出如何用最少的 20 美元、10 美元、5 美元和 1 美元来付款:
Enter a dollar amount: 93

$20 bills: 4
$10 bills: 1
 $5 bills: 0
 $1 bills: 3

提示: 将付款金额除以 20,确定 20 美元的数量,然后从付款金额中减去 20 美元的总金额。对其他面值的钞票重复这一操作。确保在程序中始终使用整数值,不要用浮点数。

解决方案

 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>

int main(void) {

    int money = 0;

    printf("Enter a dollar amount: ");
    scanf("%d", &money);

    printf("$20 bills: %d\n", money/20);
    money -= 20 * (money/20);

    printf("$10 bills: %d\n", money/10);
    money -= 10 * (money/10);

    printf(" $5 bills: %d\n", money/5);
    money -= 5 * (money/5);

    printf(" $1 bills: %d\n", money);

    return 0;
}
  1. 编程计算第一、第二、第三个月还贷后剩余的贷款金额:
Enter amount of loan: 20000.00
Enter interest rate: 6.0
Enter monthly payment: 386.66

Balance remaining after first payment: $19713.34
Balance remaining after second payment: $19425.25
Balance remaining after third payment: $19135.71

在显示每次还款后的余额时保留两位小数。

提示: 每个月的贷款余额减去还款金额后,还需要加上贷款余额与月利率的乘积。月利率的计算方法是把用户输入的利率转换成百分数再除以 12。

解决方案

 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>

int main(void) {

    float loan = 0.0f,
          rate = 0.0f,
          payment = 0.0f;

    printf("Enter amount of loan: ");
    scanf("%f", &loan);

    printf("Enter interest rate: ");
    scanf("%f", &rate);

    printf("Enter monthly payment: ");
    scanf("%f", &payment);


    loan = loan - payment + (loan * rate / 100.0 / 12.0);
    printf("Balance remaining after first payment: $%.2f\n", loan);

    
    loan = loan - payment + (loan * rate / 100.0 / 12.0);
    printf("Balance remaining after second payment: $%.2f\n", loan); 

    loan = loan - payment + (loan * rate / 100.0 / 12.0);
    printf("Balance remaining after third payment: $%.2f\n", loan);

    return 0;
}

(完)

comments powered by Disqus