1 . 项目课题引入

33

description

1 . 项目课题引入. 2 . Vi 编辑器的使用方法. 3 . Linux 中 C 语言程序的编辑. 4 . Linux 中 C 语言程序的运行. 5 . 现场演示案例. 课题引入 —— 项目背景. 在 Linux 操作系统中设计一个 C 语言程序,当程序运行时显示如下的运行效果 :. 课题引入 —— 项目分析. 完成本项目需要解决的问题: 1 、在 Linux 下我们使用什么工具进行程序和文字的编辑。 2 、在 Linux 操作系统中我们如何编译和运行 C 程序 3 、我们编写的程序如何在 Linux 操作系统中进行调试。. 课题引入 —— 教学目标. - PowerPoint PPT Presentation

Transcript of 1 . 项目课题引入

Page 1: 1 . 项目课题引入
Page 2: 1 . 项目课题引入

1. 项目课题引入

2. Vi 编辑器的使用方法

3. Linux 中 C 语言程序的编辑

4. Linux 中 C 语言程序的运行

5. 现场演示案例

Page 3: 1 . 项目课题引入

课题引入——项目背景 在 Linux 操作系统中设计一个 C 语言程序,当程序运

行时显示如下的运行效果 :

Page 4: 1 . 项目课题引入

课题引入——项目分析完成本项目需要解决的问题:

1 、在 Linux 下我们使用什么工具进行程序和文字的编辑。

2 、在 Linux 操作系统中我们如何编译和运行 C 程序

3 、我们编写的程序如何在 Linux 操作系统中进行调试。

Page 5: 1 . 项目课题引入

课题引入——教学目标学习本课需要实现的教学目标:掌握 Vi 编辑器的启动和退出掌握 Vi 编辑器的工作模式熟悉 Vi 编辑器的基本命令掌握 C/C++ 编译器 gcc 的使用掌握 Linux 下程序设计的一般方法

Page 6: 1 . 项目课题引入

课题引入——应达到的职业能力

学生学习本课后应该具有的职业能力:熟练掌握 Vi 编辑器的使用方法能够利用 Vi 编辑器进行文字编辑工作能够使用 gcc 进行 C/C++ 程序的编译和调试能够独立完成基本的 Linux 程序

Page 7: 1 . 项目课题引入

项目问题一— Vi 编辑器的使用

Vi 编辑器包含的主要内容有:

Vi 编辑器的启动与退出 Vi 编辑器的工作模式 Vi 编辑器的常用命令

Page 8: 1 . 项目课题引入

Vi 编辑器的简介Vi 是 Visual interface 的简称,它可以执行输出、删

除、查找、替换、块操作等众多文本操作用户可以根据自己的需要对 Vi 进行定制,这是其他

编辑程序所没有的。Vi 不是一个排版程序,它不像 WORD 或 WPS 那样

可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。

Vi 是全屏幕文本编辑器,它没有菜单,只有命令。

Page 9: 1 . 项目课题引入

Vi 的启动在系统提示符后输入 Vi 和想要编辑(或建立)的文

件名,便可进入 Vi 如果只输入 Vi ,而不带文件名,也可以进入 Vi

Page 10: 1 . 项目课题引入

Vi 编辑器的退出要退出 Vi ,在命令模式下键入如图所示命令。其中 :wq 和 :x 是存盘退出,而 :q 是直接退出。可以

用 :w 命令保存文件后再用 :q 退出,或用 :wq 或 :x命令退出。

如果你不想保存改变后的文件,你就需要用 :q! 命令,这个命令将不保存文件而直接退出 Vi

Page 11: 1 . 项目课题引入

Vi 的工作模式 Vi 有 3 种基本工作模式:编辑模式、插入模式和命令模式。 进入 Vi 之后,首先进入的就是编辑模式,进入编辑模式后 Vi 等待编辑命

令输入而不是文本输入,也就是说这时输入的字母都将作为编辑命令来解释。

在编辑模式下输入插入命令 i 、附加命令 a 、打开命令 o 、修改命令 c 、替换命令 s 都可以进入插入模式。在插入模式下,用户输入的任何字符都被 Vi 当作文件内容保存起来,并将其显示在屏幕上。在文本输入过程中(插入模式下),若想回到命令模式下,按 ESC 键即可。

在编辑模式下,用户按“ :” 键即可进入命令模式,此时 Vi 会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“ :” 作为命令模式的提示符,等待用户输入命令。

Page 12: 1 . 项目课题引入

Vi 编辑器中的常用命令 在编辑模式下,输入如表所示的命令均可进入插入模

Page 13: 1 . 项目课题引入

文件相关命令

使用下表中的命令可以在 Vi 中进行文件相关的操作

Page 14: 1 . 项目课题引入

字符串搜索、替换和删除 使用下表中的命令可以进行字符串的相关操作

Page 15: 1 . 项目课题引入

文本的复制、删除和移动使用下表中的命令,可以进行文本的相关操作

Page 16: 1 . 项目课题引入

在 Vi 编辑器中执行 shell 命令

使用下表中的命令,可以进行 shell 中的命令

Page 17: 1 . 项目课题引入

项目问题二— C 程序的编译Linux 应用程序表现为 2 种特殊类型的文件:可执行

文件和脚本文件。可执行文件是计算机可以直接运行的程序,相当于Windows 的 .exe 文件。脚本文件是一组指令的集合,相当于Windows 的 .bat 文件。

在 POSIX兼容的系统中, C 语言编译器被称为 c89.Linux尽量实现相关标准, c89 , cc 和 gcc 这些命令全都指向系统的 C 语言编译器,通常是 GNU C 编译器,或者称为 gcc 。

Page 18: 1 . 项目课题引入

gcc 编译器在为 Linux 开发应用程序时,绝大多数情况下使用的都是 C

语言,因此几乎每一位 Linux 程序员面临的首要问题都是如何灵活运用 C 编译器。

GCC 不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如 Java、 Fortran 、 Pascal 、Modula-3和 Ada等。

开放、自由和灵活是 Linux 的魅力所在,而这一点在 GCC 上的体现就是程序员通过它能够更好地控制整个编译过程。在使用 GCC 编译程序时,编译过程可以被细分为四个阶段:

◆ 预处理( Pre-Processing )◆ 编译( Compiling )◆ 汇编( Assembling )◆ 链接( Linking )

Page 19: 1 . 项目课题引入

gcc 起步— HelloWorld在用户当前目录,使用 Vi 编辑器输入如下代码,并保存

成文件 hello.c: #include <stdio.h>

int main(void) {    printf ("Hello world, Linux programming!\n");    return 0; }

然后执行下面的命令编译和运行这段程序: 编译: gcc hello.c -o hello 运行: ./hello Hello world结果: Linux programming!

Page 20: 1 . 项目课题引入

gcc 编译过程从 程序员的角度看,只需简单地执行一条 GCC 命令

就可以了,但从编译器的角度来看,却需要完成一系列非常繁杂的工作。

首先, GCC 需要调用预处理程序 cpp ,由它负责展开在源文件中定义的宏,并向其中插入“ #include”语句所包含的内容。

接着, GCC 会调用 ccl 和 as 将处理后的源代码编译成目 标代码。

最后, GCC 会调用链接程序 ld ,把生成的目标代码链接成一个可执行程序。

Page 21: 1 . 项目课题引入

gcc 编译过程第一步是进行预编译,使用 -E参数可以让 GCC 在预处理结束后停止编译过程:gcc -E hello.c -o hello.i 此时若查看 hello.i 文件中的内容,会发现 stdio.h 的内容确实都插到文

件里去了,而其它应当被预处理的宏定义也都做了相应的处理。 第二步是将 hello.i 编译为目标代码,这可以通过使用 -c参数

来完成:gcc -c hello.i -o hello.o GCC默认将 .i 文件看成是预处理后的 C 语言源代码,因此上述命令

将自动跳过预处理步骤而开始执行编译过程,也可以使用 -x参数让 GCC从指定的步骤开始编译。

最后一步是将生成的目标文件链接成可执行文件: gcc hello.o -o hello

Page 22: 1 . 项目课题引入

gcc警告提示功能 看看如下 illcode.c 程序,这段代码写得很糟糕,仔细检查一下不难挑出很多毛病:

#include <stdio.h> void main(void) {    long long int var = 1;   printf("It is not standard C code!\n"); }

main函数的返回值被声明为 void ,但实际上应该是 int使用了 GNU 语法扩展,即使用 long long 来声明 64位整数,不符合 ANSI/ISO C 语言标准

main函数在终止前没有调用 return 语句。

Page 23: 1 . 项目课题引入

gcc警告提示功能 当 GCC 在编译不符合 ANSI/ISO C 语言标准的源代码时,如果加上了 -p

edantic选项,那么使用了扩展语法的地方将产生相应的警告信息: # gcc -pedantic illcode.c -o illcode illcode.c: In function `main': illcode.c:9: IS

O C89 does not support `long long' illcode.c:8: return type of `main' is not `int'

需要注意的是, -pedantic 编译选项并不能保证被编译程序与 ANSI/ISO C标准的完全兼容,它仅仅只能用来帮助 Linux 程序员离这个目标越来越近。或者换句话说, -pedantic选项能够帮助程序员发现一些不符合 ANSI/ISO C 标准的代码,但不是全部,事实上只有 ANSI/ISO C 语言标准中要求进行编译器诊断的那些情况,才有可能被 GCC发现并提出警告。

除了 -pedantic 之外, GCC还有一些其它编译选项也能够产生有用的警告信息。这些选项大多以 -W 开头,其中最有价值的当数 -Wall了,使用它能够使 GCC产生尽可能多的警告信息: # gcc -Wall illcode.c -o illcode illcode.c:8: warning: return type of `main' is not

`int' illcode.c: In function `main': illcode.c:9: warning: unused variable `var' GCC给出的警告信息虽然从严格意义上说不能算作是错误,但却很可能

成为错误的栖身之所。一个优秀的 Linux程序员应该尽量避免产生警告信息,使自己的代码始终保持简洁、优美和健壮的特性。

Page 24: 1 . 项目课题引入

gcc警告提示功能在处理警告方面,另一个常用的编译选项是 -Werror ,它要求 GCC 将所有的警告当成错误进行处理,这在使用自动编译工具(如 Make 等)时非常 有用。如果编译时带上 -Werror选项,那么 GCC 会在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改。只有当相应的警告信息消除时,才 可能将编译过程继续朝前推进。执行情况如下:gcc -Wall -Werror illcode.c -o illcode cc1: warnings being treated as

errors illcode.c:8: warning: return type of `main' is not `int' illcode.c: In function `main': illcode.c:9: warning: unused variable `var'

对 Linux 程序员来讲, GCC给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更加健壮的程序,而且还是跟踪和调试程序的有力工具。建议在用 GCC 编译源代码时始终带上 -Wall选项,并把它逐渐培养成为一种习惯,这对找出常见的隐式编程错误很有帮助。

Page 25: 1 . 项目课题引入

项目问题三— C 程序的调试运行我们编写的程序经过编译之后可以使用如下方法进行

运行:./ 生成的程序名 (其中“ ./” 表示当前的工作目录)将生成的程序目录加入到系统搜索路径的 PATH 变量(我

们将在 Shell 编程课程中进行介绍)如果编译过程出现错误,需要进行程序的调试,这时

我们需要使用的工具是 gdb

Page 26: 1 . 项目课题引入

程序调试工具— gdb

对于 Linux 程序员来讲, GDB ( GNU Debugger )通过与 GCC 的配合使用,为基于 Linux 的软件开发提供了一个完善的调试环境。

默认情况下, GCC 在编译时不会将调试符号插入到生成的二进制代码中,因为这样会增加可执行文件的大小。如果需要在编译时生成调试符号信息,可以使 用 GCC 的 -g 或者 -ggdb选项。

使用任何一个调试选项都会使最终生成的二进制文件的大小急剧增加,同时增加程序在执行时的开销,因此调试选项通常仅在软件的开发和调试阶段使用。

Page 27: 1 . 项目课题引入

程序调试工具— gdb

我们使用如下代码说明 gdb 的使用: #include <stdio.h>

int main(void) {    int input =0;      printf("Input an integer:");    scanf("%d", input);    printf("The integer you input is %d\n", input);    return 0; }

编译并运行上述代码,会产生一个严重的段错误( Segmentation fault )如下: gcc -g crash.c -o crash ./crash Input an integer:10 Segmentation fault

Page 28: 1 . 项目课题引入

程序调试工具— gdb

为了更快速地发现错误所在,可以使用 gdb 进行跟踪调试,方法如下: 首先,在对源代码进行编译时加入“ -g”选项

Page 29: 1 . 项目课题引入

程序调试工具— gdb

使用 gdb 进行程序的调试我们可以通过使用命令“ gdb crash” 打开要调试的程序

也可以先使用“ gdb” 命令打开 gdb环境,然后通过输入 “file 文件名”的方式打开需要调试的程序

Page 30: 1 . 项目课题引入

程序调试工具— gdb

使用“ run” 命令运行程序查看程序中的错误

使用“ backtrace” 命令查看具体的错误信息

Page 31: 1 . 项目课题引入

程序调试工具— gdb

使用“ frame 编号”命令查看可能的程序错误(编号是在 backtrace 命令的执行结果中)

可以看到我们程序的出错在于第 8 行的 scanf 语句。使用 quit 语句退出 gdb 调试环境,对源程序进行修改,然后编译运行就可以了。

Page 32: 1 . 项目课题引入

本课项目总结通过前面的学习,我们已经可以完成本课程的项目了。具体实施方法如下:使用 vi 编辑器编写程序源代码使用 gcc 编译器进行源代码的编译如果程序出现错误,使用 gdb 进行调试运行程序

Page 33: 1 . 项目课题引入

作业

在 Linux 操作系统中编写程序,实现“鸡兔同笼”问题,要求头数和脚数从键盘输入整形数据

在 Linux 操作系统中,实现万年历,并提供友好的用户界面。