1、什么是程序?什么是程序设计?

程序:就是一组计算机能识别和执行的指令。
程序设计:来自百度百科

程序设计是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。程序设计往往以某种程序设计语言为工具,给出这种语言下的程序。程序设计过程应当包括分析设计编码、测试、排错等不同阶段。

2、为什么要计算机语言?高级语言的特点?

人和人之间的交流需要通过语言。中国人之间用中国话,英国人用英语、俄罗斯人用俄语等等。人和计算机交流信息,也需要解决语言问题。需要创造一种计算机和人都能够识别的语言,这就是计算机语言。
高级语言特点:语言功能很强,且不依赖于具体机器,用它写出的程序对任何型号的计算机都适用(或只须做很少的修改),它与具体机器语言距离较远。

3、正确理解以下名词及其含义:

(1)源程序 目标程序 可执行程序

  • 源程序(source program):用高级语言写程序文件。
  • 目标程序(object program):经过编译所得到的二进制目标文件(后缀为.obj)的文件。

    (2)程序编辑 程序编译 程序连接

  • 程序编辑:根据一定算法,用一种高级语言编写出源程序。

  • 程序编译:用编译系统将源文件转换为二进制形式的目标程序。
  • 程序连接:把所有编译后的目标模块(目标文件)连接装配起来,再与函数库相连接成一个整体的过程。

    (3)程序 程序模块 程序文件

  • 程序:就是一组计算机能识别和执行的指令。

  • 程序模块:当程序规模较大时,所包含的函数的数量较多,如果把所有的函数都放在同一个源程序文件中,则此文件显得太大,不便于编译和调试。为了便于调试和管理,可以使一个程序包含若干个源程序文件,每个源程序文件又包含若干个函数。一个源程序文件就是一个程序模块,即将一个程序分成若干个程序模块。
  • 程序文件:描述程序的文件称为程序文件,程序文件存储的是程序,包括源程序和可执行程序。(个人认为理解为抽象的工程文件)

    (4)函数 主函数 被调用函数 库函数

  • 函数:是从英文 function 翻译过来的,其实 function 在英文中的意思即是“函数”又是“功能”。从本质意义上说,函数就是用来完成一定的功能的(东西)。函数是C程序的主要组成部分。一个C程序是由一个或多个函数组成的,其中必须包含一个main函数(有且仅有一个main函数)。

  • 主函数:main函数,又称主函数,是程序执行的起点。
  • 被调用函数:即由一个函数调用另一个函数,则称第二个函数为被调用函数。
  • 库函数:是由编译系统事先定义好的,库文件中包括了对个函数的定义。

    (5)程序调试 程序测试

  • 程序调试:所谓程序调试是指对程序的差错和排错。(C辅导P269)

  • 程序测试:设计多组测试数据,检查程序对不同数据的运行情况,从中尽量发现程序中存在的漏洞,并修改程序,使之能适用于各种情况。(C程序P13)

4、编写一个C程序,运行时输出 Hello World!

  1. #include <stdio.h>
  2. int main() {
  3. printf("****************\n\n"); // 16
  4. printf(" Hello World!\n\n");
  5. printf("****************\n\n");
  6. return 0;
  7. }

:::success b12@PC:~/chapter1$ gcc -Wall ./src/hello.c -o ./bin/hello
b12@PC:~/chapter1$ ./bin/hello
**
Hello World!
** ::: 进阶1:可以使用循环做到,指定循环多少次打印函数,输出指定 课后习题 - 图1* 是轻而易举的。

  1. #include <stdio.h>
  2. int main() {
  3. for (int i = 0; i < 16; i++) {
  4. printf("*");
  5. }
  6. printf("\n\n"); // newline
  7. printf(" Hello World!\n\n");
  8. for (int i = 0; i < 16; i++) {
  9. printf("*");
  10. }
  11. printf("\n\n"); // newline
  12. return 0;
  13. }

进阶2:上述代码部分存在重复部分,且可指定打印多少个 * 更好,因而实现一个方式根据用户自定义大小打印。

  1. #include <stdio.h>
  2. void print_char(char symbol, int n) {
  3. for (int i = 0; i < n; i++) {
  4. printf("%c", symbol);
  5. }
  6. printf("\n\n"); // newline
  7. }
  8. int main() {
  9. char symbol = '*';
  10. int n = 16;
  11. printf("Please input what character and how many you want to print(*, 5): ");
  12. scanf("%c%d", &symbol, &n); // %c before %d
  13. print_char(symbol, n);
  14. printf(" Hello World!\n\n");
  15. print_char(symbol, n);
  16. return 0;
  17. }

:::success b12@PC:~/chapter1$ ./bin/hello
Please input what character and how many you want to print(, 5): $ 30
::: *

5、编写一个C程序,运行时输出以下图形:

:::info *
*
*
* ::: 书本答案:最简单地,复制输出即可搞定。这里介绍一下 C 语言的字符串拼接知识。

  1. #include <stdio.h>
  2. int main() {
  3. printf("*****\n");
  4. printf(" *****\n");
  5. printf(" *****\n");
  6. printf(" *****\n");
  7. printf("\n");
  8. printf(
  9. "*****\n"
  10. " *****\n"
  11. " *****\n"
  12. " *****\n"
  13. );
  14. return 0;
  15. }

后者实现上是非常简单的,不需要写多个 printf 函数,字符串这样处理在预编译阶段会进行连接操作,因此输出是整个字符串,相当于它就是一个多字符串的一行表示方式。 :::success b12@PC:~/chapter1$ gcc -Wall ./src/asterisk.c -o ./bin/astrisk
b12@PC:~/chapter1$ ./bin/astrisk
*
*
*
*
*
*
*
*

::: 此外,补充一种跨行字符串的写法,就是使用 \ 进行续行,比如如下程序:

  1. #include <stdio.h>
  2. int main() {
  3. printf("abc\
  4. def\
  5. kjl\n");
  6. printf("123\
  7. 456\
  8. 789\n");
  9. return 0;
  10. }

它们输出很怪并不是预期所示,格式发生较大变化,建议少使用! :::success b12@PC:~/chapter1$ gcc -Wall ./src/asterisk.c -o ./bin/astrisk
b12@PC:~/chapter1$ ./bin/astrisk
abc def
kjl
123 456
789

::: 解题思路:这是一类找规律的问题,类似题目在循环中经常出现,肯定存在内在规律。
本题最简单的规律就是每行输出 5 个 * ,下一行相比上一行左侧多出两个空格,因此空格规律就是 课后习题 - 图2

  1. #include <stdio.h>
  2. #define N 5 // asterisk's size
  3. #define ROW 3
  4. int main() {
  5. for (int i = 0; i < ROW; i++) {
  6. // 1.print i*2 space
  7. for (int j = 0; j < 2 * i; j++) {
  8. printf(" ");
  9. }
  10. // 2.print asterisk
  11. for (int k = 0; k < N; k++) {
  12. printf("*");
  13. }
  14. printf("\n"); // newline
  15. }
  16. return 0;
  17. }

:::success b12@PC:~/chapter1$ gcc -Wall ./src/asterisk.c -o ./bin/astrisk
b12@PC:~/chapter1$ ./bin/
b12@PC:~/chapter1$ ./bin/astrisk
*
*
*
*
* :::

6、编写一个 C 程序,运行时输入 a, b, c 三个值,输出其中值最大者。

解题思路:两两比较即可,打擂台,最多进行 n-1 次比较即可获得最大值。

  1. #include <stdio.h>
  2. int main() {
  3. int a, b, c, max;
  4. printf("Please input a, b, c:");
  5. scanf("%d,%d,%d", &a, &b, &c); // format string
  6. printf("a=%d,b=%d,c=%d\n", a, b, c);
  7. max = a;
  8. if (max < b) {
  9. max = b;
  10. }
  11. if (max < c) {
  12. max = c;
  13. }
  14. printf("The largest number is %d\n", max);
  15. return 0;
  16. }

:::success b12@PC:~/chapter1$ gcc -Wall ./src/threeBigger.c -o ./bin/threeBigger
b12@PC:~/chapter1$ ./bin/threeBigger
Please input a, b, c:18, 99, -8
a=18,b=99,c=-8
The largest number is 99

::: 请注意:上面输入数据格式,只要数字+ **,** 即可,不管你在其后空多少个「空白符」都可以!!格式化字符串非常重要,也非常坑!如果你以空格输入,将会导致程序异常。 :::warning b12@PC:~/chapter1$ ./bin/threeBigger
Please input a, b, c:18 -35 78
a=18,b=32547,c=-883313888
The largest number is 32547

b12@PC:~/chapter1$ ./bin/threeBigger
Please input a, b, c:18 , -35 , 78
a=18,b=-35,c=-1011053376
The largest number is 18

b12@PC:~/chapter1$ ./bin/threeBigger
Please input a, b, c:18, 87 65
a=18,b=87,c=-425149696
The largest number is 87

::: 因为空格再进行 scanf 函数的 , 比对过程中,它被认为是不匹配,而程序结束,最后只让 a 进行赋值,而其它都是随机值。因此格式控制字符要求必须精准对位(不容许半点偏差),而格式字符 %d 可以自动跳过不满足条件的字符,因此在上题中可使用 %c%d 然后输入是 $ 9 任然满足条件。

7、附录A:在Visual C++ 6.0环境下运行C程序的方法

(1)安装Visual C++ 6.0和进入Visual C++ 6.0集成环境
(2)输入和编辑源程序
(3)程序的编译
(4)程序的连接
(5)程序的执行