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!
#include <stdio.h>
int main() {
printf("****************\n\n"); // 16
printf(" Hello World!\n\n");
printf("****************\n\n");
return 0;
}
:::success
b12@PC:~/chapter1$ gcc -Wall ./src/hello.c -o ./bin/hello
b12@PC:~/chapter1$ ./bin/hello
**
Hello World!
**
:::
进阶1:可以使用循环做到,指定循环多少次打印函数,输出指定 个
*
是轻而易举的。
#include <stdio.h>
int main() {
for (int i = 0; i < 16; i++) {
printf("*");
}
printf("\n\n"); // newline
printf(" Hello World!\n\n");
for (int i = 0; i < 16; i++) {
printf("*");
}
printf("\n\n"); // newline
return 0;
}
进阶2:上述代码部分存在重复部分,且可指定打印多少个 *
更好,因而实现一个方式根据用户自定义大小打印。
#include <stdio.h>
void print_char(char symbol, int n) {
for (int i = 0; i < n; i++) {
printf("%c", symbol);
}
printf("\n\n"); // newline
}
int main() {
char symbol = '*';
int n = 16;
printf("Please input what character and how many you want to print(*, 5): ");
scanf("%c%d", &symbol, &n); // %c before %d
print_char(symbol, n);
printf(" Hello World!\n\n");
print_char(symbol, n);
return 0;
}
:::success
b12@PC:~/chapter1$ ./bin/hello
Please input what character and how many you want to print(, 5): $ 30
:::
*
5、编写一个C程序,运行时输出以下图形:
:::info
*
*
*
*
:::
书本答案:最简单地,复制输出即可搞定。这里介绍一下 C 语言的字符串拼接知识。
#include <stdio.h>
int main() {
printf("*****\n");
printf(" *****\n");
printf(" *****\n");
printf(" *****\n");
printf("\n");
printf(
"*****\n"
" *****\n"
" *****\n"
" *****\n"
);
return 0;
}
后者实现上是非常简单的,不需要写多个 printf
函数,字符串这样处理在预编译阶段会进行连接操作,因此输出是整个字符串,相当于它就是一个多字符串的一行表示方式。
:::success
b12@PC:~/chapter1$ gcc -Wall ./src/asterisk.c -o ./bin/astrisk
b12@PC:~/chapter1$ ./bin/astrisk
*
*
*
*
*
*
*
*
:::
此外,补充一种跨行字符串的写法,就是使用 \
进行续行,比如如下程序:
#include <stdio.h>
int main() {
printf("abc\
def\
kjl\n");
printf("123\
456\
789\n");
return 0;
}
它们输出很怪并不是预期所示,格式发生较大变化,建议少使用!
:::success
b12@PC:~/chapter1$ gcc -Wall ./src/asterisk.c -o ./bin/astrisk
b12@PC:~/chapter1$ ./bin/astrisk
abc def
kjl
123 456
789
:::
解题思路:这是一类找规律的问题,类似题目在循环中经常出现,肯定存在内在规律。
本题最简单的规律就是每行输出 5 个 *
,下一行相比上一行左侧多出两个空格,因此空格规律就是
#include <stdio.h>
#define N 5 // asterisk's size
#define ROW 3
int main() {
for (int i = 0; i < ROW; i++) {
// 1.print i*2 space
for (int j = 0; j < 2 * i; j++) {
printf(" ");
}
// 2.print asterisk
for (int k = 0; k < N; k++) {
printf("*");
}
printf("\n"); // newline
}
return 0;
}
:::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
次比较即可获得最大值。
#include <stdio.h>
int main() {
int a, b, c, max;
printf("Please input a, b, c:");
scanf("%d,%d,%d", &a, &b, &c); // format string
printf("a=%d,b=%d,c=%d\n", a, b, c);
max = a;
if (max < b) {
max = b;
}
if (max < c) {
max = c;
}
printf("The largest number is %d\n", max);
return 0;
}
:::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)程序的执行