第一篇:实验五常用软件开发工具
实验
五、常用软件开发工具
一、实验目的
1、熟悉字符模式下的C程序编译和调试环境,基本掌握Linux字符模式下的编译工具和调试工具的使用;
2、本实验需要综合使用Linux基本文件命令、编辑器的使用,练习在Linux的字符模式下,编辑、编译及调试一个C程序的基本方法。
二、实验内容和步骤 1 gcc和 g++ 语言编译器
GCC是GNU Compiler Collection的缩写,它是世界上最为重要的开放源代码软件[18]。因为所有其他的开放源代码项目都依赖于GCC进行编译。比如,没有GCC,Linux的产生就不会成为可能。
GCC能工作在很多平台上,这里所说的平台是指计算机硬件芯片和运行在其上的操作系统的组合。下表是GCC运行的平台。表 GCC运行的平台 硬件
操作系统
Alpha
Red Hat Linux 7.1
HPPA
HPUX 11.0
Intel x86
Debian Linux 2.2, Red Hat Linux 6.2, FreeBSD 4.5
MIPS
IRIX 6.5
PowerPC
AIX4.3.3
Sparc
Solaris 2.7
GCC可以编译多种语言:C,C++,对象C(标准C的派生),Fortran,Java,Ada。正如GCC缩写所代表的对象一样,GCC实际上是多种编译器的统称,gcc是所有编译器的统一的程序接口,在本书中,并没有区分GCC和gcc。同时,GCC 也能够进行代码优化,提高执行程序的运行速度。g++是构建于 gcc 基础上的 C++语言编译器。gcc 编译过程分为 4个阶段: l
预处理 l
编译 l
汇编 l
连接
最简单的C 语言编译的例子: 用 vi建立一个 hello.c文件 $vi hello.c
输入字符 i,插入文本以下文本 /*
* hello.c
*/
#include
printf(“ Hello World!n”);
return 0;}
最后输入字符
gcc 带有多达数页的编译选项,我们仅列出最常用的几项:
-o 可执行文件名指定输出的可执行文件名,而不是默认的 a.out-c
只编译生成.o 的目标文件,不连接生成可执行文件-s
只编译生成.s的汇编文件,不连接生成可执行文件-g
在可执行文件中加入标准调试信息-Wall
允许GCC发出警告型错误信息 选项使用的例子:
对以上 hello.c使用-o,-g 常用选项重新编译、执行: $gcc-g hello.c-o hello $./hello Hello World!$
GCC默认的扩展文件名:.c
C 语言源代码
.C
.cc
C++语言源代码.i
预处理后的 C语言源代码.ii
预处理后的 C++语言源代码.S.s
汇编语言源代码.o
编译后的目标代码.a
.so 编译后的库代码
下面的例子由两个文件组成:main.c, calc.c,其中,main.c文件内容为: #include
printf(“Please input a positive integer!n”);
scanf(“%i”,&iInput);} iOutput = calc(iInput);
printf(“Result is:%in”, iOutput);return 0;} calc.c的文件内容为: #include
iOut += iOut * iIn;} return iOut;}
1、编译过程
有三种方式编译这两个源程序,一是直接使用如下命令行完成编译、链接过程: $gcc main.c calc.c-o main 命令行中,main.c calc.c的后缀名指明了调用c编译器,前面讲到了gcc是GCC的众多编译器的统一入口,gcc靠后缀名决定调用什么编译器,-o 参数指定了可执行文件的文件名为main。
第二种方法是编译calc.c为静态库,编译main.c时指定静态库的位置。需要将calc.c编译成中间文件calc.o,使用如下命令行: $gcc-c calc.c 生成静态库文件,添加calc.o到静态库中,使用如下命令行: $ar-r libcalc.a calc.o 命令行中,-r libcalc.a参数表示建立静态库,名字为libcalc.a。接下来,使用如下命令行: $gcc main.c libcalc.a-o main 上面这条命令也可以用下面的命令完成: $gcc main.c-lcalc –o main-l参数可以指定库名称,这里calc表示使用库libcalc.a,库名字前面的lib和后面的.a被省略掉了,遵从了命名法。
第三种方法是建立共享库,编译时指定共享库。首先,编译calc.c为calc.o,使用命令行: $gcc-c-fpic calc.c 命令行中,-fpic指定calc.o为可重分配地址属性,pic是position independence code的缩写。接下来使用calc.o生成共享库calc.so: $gcc-shared calc.o –o calc.so 这两条命令也可以缩减为一行: $gcc-shared-fpic calc.c-o calc.so 最后编译main.c,链接生成的共享库: $gcc main.c calc.so-o main 2 make项目管理器
make 项目管理器(GNU 中的名称为 gmake)可以根据项目开发者说明的项目开 发文件 Makefile 自动的进行编译配置和重复编译,能实现复杂项目的编译自动化。项目开发文件 Makefile 的编写使用以下规则: 目标体 1:依赖体 1 [依赖体2 [...]] 命令行 1 命令行 2
[...]
目标体 2:依赖体 1 [依赖体2 [...]] 命令行 1 命令行 2
[...]
[...]
其中目标体是命令行要生成的输出文件,依赖体是命令行要输入的文件或选项,命 令行序列是要创建目标体文件所需要的步骤,例如编译命令。无特别指定,make 总是使用当前目录中的 Makefile 进行自动编译。
例如我们在当前目录中有两个项目开发文件hello.c和hello.h,则Makefile文件可以 编写为: hello: hello.o
gcc hello.o-o hello
hello.o: hello.c hello.h
gcc-c hello.c clean:
rm hello *.o
make 命令的使用: $g make
输入make或make hello将生成Makefile中所有的目标文件,即hello,hello.o,hello.s。$g make hello.o 将仅生成目标文件 hello.o $g make clean
是一条伪目标生成命令,该目标没有依赖体,它只执行对已生成目标文件的删除。当我们对以上依赖体中的任意一个进行了修改,重新 make 时仅会引发对应目标体的重新生成,从而提高了编译的效率并保证了项目开发的正确性。3 gdb程序调试器
GDB是GNU Project Debugger的缩写,用于调试Ada, C, C++, Objective-C, Pascal 和其他语言编写的程序[20],这些程序可以运行在本地计算机上,也可以运行在远程计算机上。GDB可以运行在几乎所有的UNIX和微软Windows平台上。
GDB主要能做下面4种事(以及由它们所支持的其他事情): 1)启动程序,指定可能影响程序运行的任何条件; 2)指定程序在一定条件下停止; 3)检查当程序停止时发生的事情;
4)通过改变程序中的某些条件,测试可能造成的软件错误,还可以由此学习其他的软件错误。
GDB可以做源代码级别的程序调试(需要在编译时指定相应条件),也可以做二进制级别的程序调试。
如果您在 gcc 编译选项中用到了-g 调试选项,则编译出的可执行文件就会带有符号表。这样的程序就可以使用 gdb 跟踪调试,观察到它的高级语言源代码的执行过程和变量的中间结果,从而能快速的排除程序运行时发生的错误。以下是一个带有运行时错误的C程序,注意程序想通过传地址方式在一个函数中为字符变量 C赋一个字符,但它引用了一个空指针,这将引发运行时的段非法错误使得程序异常终止。但我们可以通过 gdb 跟踪到它产生错误的位置,从而分析出产生错误的原因。/*
* debugmy.c */
#include
*cptr = 'a';
printf(“myputc=%cn”,*cptr);
}
int main(void){
char c;
char * cptr;
c = 'A';
myputc(cptr);
return 0;}
使用带-g 选项的 gcc编译、执行: $gcc-g debugmy.c-o debugmy $./debugmy 段错误 $
使用 gdb 跟踪查错 $ gdb./debugmy
GNU gdb Red Hat Linux(6.3.0.0-1.122rh)
Copyright 2004 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions.Type “show copying” to see the conditions.There is absolutely no warranty for GDB.Type “show warranty” for details.This GDB was configured as “i386-redhat-linux-gnu”...Using host libthread_db library “/lib/libthread_db.so.1”.(gdb)
现在进入了 gdb 调试状态,可以使用 gdb 的调试子命令跟踪程序的执行。Gdb 常 用命令:
list [行号] 列出指定行号的上下行(缺省为 10行)break [源程序文件名:] 行号建立一个断点 run
启动被调试的程序 next
从断点处向下执行一行
step
从断点处向下执行一行,当前行为函数则跟踪进入函数 continue
继续从断点处连续执行 print 变量名打印变量当前值 quit
退出 gdb
让我们现使用 list命令查看一下要调试的程序是否已经装入,输入:(gdb)list 10
void myputc(char * cptr)6
{
*cptr = 'a';
printf(“myputc=%cn”,*cptr);9
}
int main(void)11
{
char c;13
char * cptr;14
c = 'A';
我们将断点设在第 15 行上,输入:(gdb)break 15
Breakpoint 1 at 0x80483c0: file debugmy.c, line 15.开始跟踪执行,输入:
(gdb)run
Starting program: /root/ipc/debugmy
Reading symbols from shared object read from target memory...done.Loaded system supplied DSO at 0xffffe000
Breakpoint 1, main()at debugmy.c:15 15
myputc(cptr);
程序执行到第 15 行上停止,我们采用单步执行跟踪错误的发生,输入:(gdb)step
myputc(cptr=0x9bbe40 “U211? WVS203? L? 215s”)at debugmy.c:7 7
*cptr = 'a';
程序执行一行,进入函数myputc,再单步执行一行,再次输入:(gdb)step
Program received signal SIGSEGV, Segmentation fault.0x0804838d in myputc(cptr=0x9bbe40 “U211? WVS203? L? 215s”)at debugmy.c:7 7
*cptr = 'a';
第二篇:软件开发工具总结
1.软件开发工具:在高级程序设计语言(第三代语言)的基础上,为提高软件开发的质量和效率,从规划、分析、设计、测试、成文和管理各方面,对软件开发者提供各种不同程度的帮助的一类广泛的软件。
2.软件开发工具的功能要求:(1)认识与描述客观系统
(2)存储及管理开发过程中的信息
(3)代码的编写或生成(4)文档的编制或生成(5)软件项目的管理
3.软件开发工具的性能:(1)表达能力或描述能力
(2)保持信息一致性的能力
(3)使用的方便程度
(4)工具的可靠程度
(5)对硬件和软件环境的要求
4软件开发工具的类别(1)按工作阶段划分:分为设计工具、分析工具、计划工具
(2)按集成程度划分:分为集成化的和专用的(3)按与硬件、软件的关系划分:分为依赖于特定的计算机或特定的软件、独立于硬件与其他软件的。
5.软件开发过程:需求分析、总体设计、实现阶段、测试或调试阶段
6.通用软件的弱点:
(1)有许多工作是通用软件所无法完成的。
(2)用通用软件完成某些工作,只能表现其表面的形式,而不能反映其逻辑内涵。
(3)用通用软件来帮助人们完成软件开发工作时,常会遇到难于保持一致性的困难。
7.软件开发工具的发展表现在:
(1)自动化程度的提高
(2)把需求分析包括进了软件工作范围之内,从而使软件开发过程进一步向用户方面延伸,离用户更近了。
(3)把软件开发工作延伸到项目及版本管理。
(4)吸收了许多管理科学的内容与方法。
8大型软件开发中的困难:(1)一致性的保持成为十分困难的问题。
(2)测试的困难大大增加
(3)工作进度难以控制。
(4)文档与代码的协调十分困难。
(5)版本更新带来的困难。
9大型软件开发中困难产生的原因
(1)这些困难来自大系统的复杂性
(2)许多具有主动性的个人之间的组织与协调本身也会带来大量的困难。
(3)各个应用领域之间的差别也导致这些困难的加重。
(4)时间的因素、变化的因素也给软件开发工作带来许多困难。
10.结构化程序设计分解的三个基本模块:处理单元、循环机制、二分决策机制。
11.结构化程序设计划分模块的基本要求:
(1)模块的功能在逻辑上尽可能地单一化、明确化。
(2)模块之间的联系及相互影响尽可能少,明确说明必需的联系,避免传递控制信号,避免逻辑耦合,仅限于数据耦合。
(3)模块的规模应足够小,以便使它本身的调试易于进行。
1.IBM提出的应用软件的开发过程:需求分析、分析与设计阶段、编程阶段、测试阶段、使用及维护阶段。
2.面向对象的程序设计的基本思想:
(1)课观世界的任何事物都是对象,它们都有一些静态属性,也都有一些有关的操作,作为一个整体,这些对象对外不必公开这些属性与操作,这就是所谓“封装性”
(2)对象之间有抽象与具体、群体与个体、整体与部分等几种关系
(3)抽象的、较大的对象所具有的性质包括静态属性和动态操作,自然地成为它的子类的性质,不必加以重复说明或规定,这是“遗传性”
(4)对象之间可以互送消息,这一消息可以是传送一个参数,也可使这个对象开始某个操作
3.对软件质量进行测评的标准:
(1)正确地实现所要求的功能,准确地给出预定的输出结果
(2)用户界面友好,符合实际用户的使用习惯与知识水平
(3)具有足够的速度,能在符合用户要求的时间限度内,给出所要求的处理结果
(4)具有足够的可靠性,能够在各种干扰下保持正常的工作
(5)程序易读,结构良好,文档齐全,从而保证系统易于修改
4.单个程序员需要具备的知识与技能:
(1)具有程序设计所需要的基本知识与技能
(2)对本项目所在的领域有较深入的了解
(3)对软件开发的技术环境比较熟悉
5.项目组的一员,除了实现自己分担的功能外,还需要
(1)保证严格地在本模块范围内操作,绝不要使用可能干扰其他模块的命令或函数
(2)严格按总体设计的要求和理解去传递参数值,决不要随意修改其内容或函数
(3)在对公用的文件或数据库进行存取时,必须完全地、准确地按统一规定的格式去操作,决不能擅自改变
(4)在使用标识符时,应按照统一的原则,尽量使用易于看出逻辑含义的名称,特别是涉及公用数据及参数的时候
(5)严格按照统一的要求编写文档,在内容、格式、表达方式、符号使用上遵循项目组的统一规定
(6)尽量保持程序风格的一致
6.好的项目组应具备的条件:
(1)有严格的、成文的工作规范和文档标准
(2)人员之间有严格的分工
(3)每个项目都要事先制定详细的时间表,且得到严格执行,每一项目完成之后都有完整的资料,并得到妥善保存
7.可视化程序设计的技术手段:
(1)指点与卡嗒,简称“点”
(2)删剪与粘贴,简称“剪贴”
(3)拖拉与扔下,简称“拖扔”
8.软件开发中涉及的信息有
(1)有关系统环境、现状及需求的信息
(2)有关软件的功能设计与物理设计的各种信息
(3)软件成果本身,包括程序与文档
(4)用户对系统的各种变更要求,以及系统的各种变更的记录
9.对各类信息的管理工作有:
(1)许多信息需要长期保存,包括一致性的检查与维护、方便迅速的查询与调用
(2)在许多环节上都要进行数据的转换与加工
(3)大量的人与人之间的信息交流
10.软件开发工具用到的理论和方法:
(1)认知科学中关于概念模式的概念与方法
(2)数据库技术的理论与方法
(3)编译技术的有关方法
(4)关于人机界面的理论与方法
(5)管理科学中关于项目管理与版本管理的理论与方法
(6)系统科学与系统工程中的有关理论与方法
1.在选择与购置软件开发工具时,最重要的是设置有限的、现实的目标,以及充分考虑各方面的环境因素,这两点对于软件开发工具是否切实发挥作用起着根本性的制约作用。
2.自行开发软件开发工具时应注意:
(1)从实际出发,设定现实的、有限的目标
(2)坚持短小实用、逐步积累、避免期望过高,贪大求全
(3)注意文档的齐全与资料的积累
(4)谨慎对待商品化
3.对于自行研制软件开发工具来说,除了技术上的各种考虑之外,主要是区分自己用还是作为商品出售
4.软件开发工具购置与开发权衡,考虑以下因素:
(1)准备从事软件开发工作的性质与要求
(2)开发人员对支持工作与支持程度的实际需要
(3)工作环境
(4)人员的情况
5.购置软件开发工具应考虑的问题:开发工具的功能如何,性能/价格比如何,开发工具所使用或依据的开发方法或开发理论是什么,开发工具运行环境是什么,文档资料是否齐全,服务、培训的条件如何以及实用性如何。
6.购置软件开发工具时,首先要明确目的与要求。
7.确定购置软件开发工具后,要明确目的与要求即明确
(1)为哪个软件开发项目而使用工具
(2)在哪个工作阶段使用工具
(3)工具将供那些人使用
(4)工具将在怎样的软、硬件环境下运行
8.在引入软件开发工具后,使用者必须从一开始就对它的使用过程进行认真地组织与管理,包括
(1)制定严格的使用制度
(2)记录实用的详细过程
(3)培训使用人员
(4)经常进行审计与评价工作
9.记录的内容包括:系统运行的次数、时间;信息库的输入与更新时间;各种输出的质量与
数据量;使用者的反映与满意程度,各种故障及处理的情况。
10.在软件开发工具的选择与购置中,应按照一下步骤进行
(1)明确购买软件开发工具的目的与要求
(2)明确购买软件开发工具的环境与制约条件
(3)市场调查
(4)对可供选择的各种工具进行综合比较
(5)进行测试和检验
(6)正式签约购置
(7)安装与试用
11.工作环境包括硬件配置、系统软件、网络通信等各种条件
12.决定购置还是自行开发工具的最根本因素是准备从事软件开发工作的性质与要求。
13.如果已决定配置软件开发工具,进行市场调查时,首先应该调查软件开发工具的功能。
14.引入软件开发工具后,还需要经常进行审计工作,即对软件工具使用的环境、人员、工作效果、存在问题及改进方向等方面进行评价。
第三篇:Linux实验 常用开发工具
一、实验目的
1、掌握Linux 下的C语言编译的基本方法
2、理解make工具的功能,学会编制makefile的方法
二、实验内容
1、利用gcc编译C语言程序,使用不同的选项,观察并分析显示结果
2、编写一个由多文件构成的C语言程序,编制makefile,运行make工具进
行维护。
三、主要实验步骤
1、设计一个程序,打印输出输入数字的正弦值。要求定义属于自己的头文件,并且放在另外的目录中。使用下列选项进行编译:-I,-E,-c , –o ,-l。参考教材的P155-158节的内容。
2、针对下面4个C语言程序,main.c, one.c, two.c, public.h.。写一个makefile 文件,运行make工具进行维护。public.h 在另外的目录中。
Main.c: include “public.h” int main(){
printf(“main...n”);show1();show2();return 0;} One.c #include “public.h” void show1(){ printf(“hello, this show1 n”);} Two.c #include “public.h” void show2(){ printf(“hello, this show2 n”);}
public.h
#ifndef __MANYCO_MAKEFILE_PUBLIC_1 #define __MANYCO_MAKEFILE_PUBLIC_1 #include
五、心得体会
通过对数字的正玄值程序的编写,我们掌握了Linux 下的C语言编译的基本方法,理解了make工具的功能,学会了编制makefile的方法。我们更加深刻的了解了GCC的各参数的含义,知道了GCC的编译流程大致为:先用Vim编辑源程序,生成源程序文件,然后使用GCC的“-E”参数预处理,生成经过预处理的源程序文件,接着用GCC的“-S”参数编译,生成汇编语言程序文件,然后用GCC的“:”参数汇编,生成二进制文件。最后再一次使用GCC,把二进制文件和一些用到的链接库文件链接成可执行文件,并使用“-o”参数将文件输出到目录文件,最终的目录文件就是完全编译好的可执行文件。
第四篇:自考软件开发工具复习资料总结
一、软件开发工具的功能要求:
1、认识描述客观系统
2、存储管理开发过程中的信息
3、代码生成和编写
4、文档生成和编写
5、软件项目管理
二、软件开发工具性能:
1、表达能力或描述能力(首先考虑)
2、保持信息一致性能力(十分关键)
3、使用方便程度
4、工具可靠程度
5、对硬件和软件的要求(不应当超出所支持的软件环境要求)
三、软件开发工具基本功能:
1、提供描述软件状况及开发过程的概念模式
2、提供存储和管理有关信息的机制与手段
3、帮助使用者编制、生成及修改各种文档
4、帮助使用者编写程序代码
5、对于历史信息进行跨生命周期的管理
四、大型软件开发困难:1、2、3、一致性保持
测试困难加大 进度难以控制4、5、文檔和代码协调困难
版本更新困难
原因:1、2、3、4、大系统的复杂性
主动性的个人之间组织和协调困难
领域间的差别使困难加重 时间因素、变化因素
五、AD/Cylce(软件开发过程的抽象理解):
1、需求分析阶段(任务:建立逻辑模型)
2、分析设计阶段(任务:完成系统的总体设计 包括:详细设计 子系统或模块化分)
3、编码阶段
4、测试阶段
5、维护阶段(任务:管理软件的日常运行)
六、软件开发工具:
1、设计工具(最具体实现阶段 第四代语言 直接帮助编写和调试
最早)
2、分析工具(需求分析FLOW 数据字典 数据字典管理系统CDD Dictionary/3000)
3、计划工具(宏观 组织项目管理实施)
七、模块划分的要求:
1、功能在逻辑上单一,明确模块和任务一一对应,一个模块完成 一个任务(凝聚性)
2、模块间联系尽可能少,对必要的联系加以说明(数据耦合)
3、规模应足够小,调试易于进行
八、好软件:
1、实现功能
2、界面友好
3、足够的运行速度(不是越快越好)
4、可靠性
5、易读、结构良好、文文件齐全、易于修改
九、好程序员:
1、基本知识技能
2、项目领域理解深入
3、熟悉开发环境
十、CMM好项目组:
1、有严格、成文工作规范标准,并为全体成员熟知,切实遵守
2、人员严格分工,除程序员外还要专门秘书(负责文檔收集、审核及保管),专门测试人员,专职的不限于编程的项目负责人
3、详细时间表并严格执行
十一、用户界面基本原则:
1、主要功能通信
2、用户界面始终保持一致
3、使用户随时掌握任务的进展状况
4、必须能够提供帮助
5、宁可让程序多干,不可让用户多干
十二、项目管理基本目标:
1、使产品质量得以有效的控制
2、保证整个系统按预定的进度完成3、有效的利用各种资源
4、控制和降低成本
十三、生成代码的依据:
1、信息库已有的资料
2、利用各种模块的框架和构件
3、使用者临时通过屏幕前操作送入的信息
十四、信息库需要四大类信息:
1、软件应用的领域与环境状况(系统状况)
2、设计成果(物理设计和逻辑设计)
3、运行状况与测试记录
4、项目管理和本管理信息
十五、AD/Cycle项目考虑范围:
1、研究确定工作方法方针
2、开发任务划分和分工
3、资源状况
4、人员情况
5、变更情况
6、质量情况
十六、权衡购买软件的因素:
1、准备开发软件的性质与要求
2、开发人员支持工作与支持程度的实际需要
3、工作环境
4、人员因素
十七、人机界面总控技术上基本原则:
1、面向使用者
2、保证信息的准确传递
3、保证系统的开放性(灵活性)
十八、软开工具的开发:
1、从实际出发设定现实有限的目标
2、坚持短小实用,逐步积累,避免期望过高,贪大求全
3、文档的齐全与资料的积累
十九、信息库技术涉及问题:
1、内容
2、组织方式
3、管理功能
4、历史信息处理方法
二十、版本管理的核心问题:保持两个一致性
1、新旧工作保持一致
2、局部与整体保持一致
二
十一、软件开发工具发展主要表现:
1、自动化程度提高
2、需求分析包含在软件工作中,向用户延伸
3、把项目及版本管理包进来,超出一次编程的局限
4、吸收了很多管理科学的方法 二
十二、软件开发基本问题:
1、用户理解到程序员理解
2、程序员理解到程序实现
二十三、软件开发工具的购置方法与步骤:
1、明确购买软件的目的与要求
2、明确购买软件的环境条件与制约条件
3、对于可选工具进行综合比较
4、进行测试和检验
5、正式签约购置
6、安装与试用
审计:对一个系统运行状况及效率进行检查和评价,以便进一步用好或改进这个系统
软件开发定义:在高级程序设计语言(第三代语言)基础上,为提高软件开发效率和质量,从规划、分析设计测试成文管理各方面,为软件开发者提供帮助的软件。
非过程化语言(4GL):只要给机器下达需要做什么的命令,由机器自己去安排执行的顺序。即插即用:一部分人专门生产组件,一部分人专门设计整个软件结构,并把软件组件插入这个结构以便迅速完成大型软件开发工作。数据库:重点合理组织数据,体现数据逻辑关系,并尽可能的帮助用户检索,减少冗余。
概念模式:对某一事物或某一系统形成的抽象的一般化的概念。框图(FC):用来描述程序执行逻辑过程
最早
Flow chart
结构图(SC):用以表示大型软件层次结构
好处:体现层次观点:由粗到细 自顶向下Structure Chart 数据流程图(DFD):适用于客观描述,重于软件间的控制
基本元素:外部实体、数据处理、数据存储 实体关系图(E-R):描述静态数据结构的概念模式
以实体 关系 属性为基本结构
数据字典(DD):描述数据内容的概念模式用表格形式表示基本属性以及数据关系
时序网络(PN):描述系统状态及其转换方式
基本概念:状态和转换
数学与逻辑模型:描述客观世界状态和规律
运动学公式、计量经济学模型、决策表和决策树
计算机模型:强有力概念模式。以便人们观察客观系统的状况不需要事先作更多的假设
第一个重要文档:软件功能说明书 程序分解三种基本模块:处理单元 循环机制 二分决策机制 软件开发核心:质量问题
软件开发工具对开发工作支持是在:信息管理和信息处理方面 信息库研究核心问题:一致性
项目版本管理核心:跨生命周期管理
历史信息是项目版本管理的关键问题
项目管理基本问题:质量、进度、资源配置及费用 中心位置:总控和人机界面 历史信息处理:
问题:信息数量大,占用存储设备多;历史信息格式不一致,很难有效利用
方法:脱机备份、加强标准、稳定数据结构 组织和管理工作好坏影响软开工具作用发挥程度 :
1、制定严格使用制度
2、记录使用详细过程
3、培训使用人员
4、进行审计和评价工作
第五篇:软件实验
《软件技术基础》实验报告
实验一:
顺序表的操作
班 级
0801210 学 号
2012212982 姓 名
蒲米
栈,然后编写进栈和出栈的操作,读取栈顶元素。这里栈有顺序栈和链式栈两种,顺序栈是利用一种动态存储的数组定义,而链式栈是一个无头节点,只是在头部插入和删除元素的单链表。使用顺序栈要先为存储元素的数组申请一个空间,然后编写进栈和出栈取栈顶元素的操作。#include
printf(“此栈表已满”);pst->top++;pst->st[pst->top]=x;} void pop(struct stack *pt,int *p){ if(pt->top==-1)
printf(“此栈表为空”);*p=pt->st[pt->top];pt->top--;} void main(){ struct stack T;struct stack *t=&T;int a[n];int i;printf(“请输入数组的值:”);for(i=0;i<5;i++){
scanf(“%d”,&a[i]);} T.top=-1;for(i=0;i<5;i++)
push(t,a[i]);for(i=0;i<5;i++){
pop(t,&a[i]);
printf(“%dn”,a[i]);
}
}
四、算法。
顺序栈的算法:
1、顺序栈的初始化。
2、进栈操作
3、出栈操作
4、取栈顶元素。链式栈的算法:
1、进栈操作
若栈不满,则在栈顶插入元素x作为新的栈顶。
2、出栈操作
若栈不空,则删除栈顶的元素,用e返回其值。
五、实验心得体会:
通过本次实验我学习了栈这种特殊形式的线性表,就是只能从一端进行操作,逻辑和一般的线性表相同,只是元素的操作方式不同。
实验五:
队列的操作
一、实验目的:
掌握队列的定义及其运算,了解队列的应用。
二、实验内容:
1、掌握队列的特点及常见算法。
2、队列测试和应用。要求:
设计一个主函数对循环队列代码进行测试。测试方法为:依次把数据元 素2,4,6,8,10入队,然后出队中的数据元素并在屏幕上显示。
三、实验思路:
使用队列的时候要创建一个空队列,这里队列可以分为两种存储方式,顺序存储和链式存储,顺序存储顾名思义它的存储数据方式是连续存储的,而链式存储则是不连续的,队头和队尾定义两个指针,通过指针来操作队列。先创建一个含有头结点的空的链队列,建立头结点,在队尾插入结点后建立好队尾指针,判断队列是否为空,然后编写出队列的功能函数。
#include
{ if(rst->len==n)
printf(“此队列已满”);else {
rst->rear=(rst->rear+1)%n;
rst->data[rst->rear]=x;} } int out(struct nobe *rst){ int x;if(rst->len==0)
printf(“此队列为空”);else {
rst->front=(rst->front+1)%n;
x=rst->data[rst->front];} return x;}
首先建立一个结构体包含数据域与指针域,然后编写队列的入队与出队操作,最后编写主函数,在主函数调用入队与出队操作,实现程序的编程。
四、算法。队列的算法:
1、入队操作。
若队列不满,则在队尾插入元素x作为新的队尾。
2、出队操作。
3、若队列不空,则删除队头元素的值。链队列的算法
1、链队列初始化
建立一个含有头结点的空的链队列。
2、求队列的长度
返回队列的元素个数,即队列的长度。
3、入队列操作
插入元素x作为队列新的队尾元素。
4、出队列操作
若队列不空,则删除队头元素,用e返回其值。
五、实验心得体会:
队列和栈一样是一种特殊形式的线性表,队列不同与栈的是它可以在一端插入,另一端删除。
实验六: 二叉树的生成与遍历
一、实验目的:
1、熟悉二叉树节点的定义和生成方式;
2、熟悉二叉树链式结构的生成方式;
3、掌握二叉树遍历算法的实现。
二、实验内容:
1.设计实现二叉树的建立及遍历算法,要求:
(1)编写创建二叉链式存储结构的二叉树程序并输出。
(2)编写递归实现二叉树的先序、中序、后序遍历算法。(3)编写主函数测试以上二叉树的创建和遍历函数。
2.假设二叉树采用链式存储结构进行存储,编写程序实现二叉树的所有叶子
结点的统计并输出统计个数。
三、实验思路:
首先建立一个结构体包含数据域,左右子树的指针三个数据元素,这里左子树和右子树分别为某一结点指向其左子树和右子树的指针。对于叶子结点或者新生成的结点,它的左子树和右子树的指针都是空值。定义二叉树结构体变量,然后编写二叉树的输入和先序、中序、后序遍历算法,最后编写主函数,在主函数中初始化二叉树长度为零,输入二叉树的各个元素,再调用二叉树的先序、中序、后序遍历操作,输出二叉树,实现程序的编程。
四、算法。
1.二叉树的建立:
二叉树的遍历算法需要先建立二叉树,二叉树的建立需要建立栈和数组
栈和数组的建立:
typedef struct node
/*结点定义*/ {
char
data;
struct node * lchild, * rchild;} BinTreeNode;
typedef struct{ //栈的定义
BinTreeNode * ptr;int tag;}StackNode;
二叉树的建立:
BinTreeNode * CreateBinTree(BinTreeNode * Tree)/*,按先序序列建立二叉树,输入并建立一棵二叉树Tree*/ {
char c;scanf(“%c”,&c);if(c=='&')Tree = NULL;else {
Tree=(BinTreeNode *)malloc(sizeof(BinTreeNode));
Tree->data=c;
Tree->lchild= CreateBinTree(Tree->lchild);
Tree->rchild= CreateBinTree(Tree->rchild);
}
return(Tree);}
2.先序遍历
先序遍历的递归算法:
/*二叉树的先序遍历*/ void PreOrder(BinTreeNode *T){ if(T!= NULL)
{
printf(“%c”,T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
} } 先序遍历的非递归算法:
/*二叉树的先序遍历的非递归算法*/ void PreOrderTwo(BinTreeNode *T){
BinTreeNode *p,*S[Max];
int top=-1;
p=T;
/*初始化*/
do
{
while(p!= NULL)
{
printf(“%c”,p->data);
top++;S[top]=p;
p=p->lchild;
}
if(top >-1)/*栈非空*/
{
p=S[top];top--;/*取栈顶元素,出栈*/
p = p->rchild;
}
}while((p!= NULL)||(top>-1));
}
3、中序遍历:
void InOrder(BinTreeNode*t){
if(t){
InOrder(t—>leftchild);
Visit(t);
InOrder(t—>rightchild);
} }
4、后序遍历:
void PostOrder(BinTreeNode*t){
if(t){
PostOrder(t—>leftchild);
PostOrder(t—>rightchild);
visit(t);
} }
五、实验心得体会:
二叉树是一种非线性的数据存储结构,描述的是结点一对多的关系,这种结构最常用,最适合的描述方法是用链表的形式。每个结点都包含一个数据域和两个指针域。
实验七: 查找算法的实现
一、实验目的:
掌握各种查找算法的特点,测试并验证查找常见算法。
二、实验内容:
1.建立有序表,采用折半查找实现某一已知的关键字的查找。
2.利用折半查找算法在一个有序表中插入一个元素,并保持表的有序性。
三、实验思路:
#include
int search(int x,int data[],int n){ int low,high,mid;low=0;high=n-1;while(low<=high){
mid=(low+high)/2;
if(data[mid]=x)
return(mid+1);
else
if(data[mid]>x)
high=mid-1;
else
low=mid+1;} return 0;}折半查找法首先定义一个一维数组表示有序表,查找的思路是将给定的数据与有序表中间位置的元素做比较,若两者相等则查找成功,若前者小于后者,则在中间位置左边的元素中继续查找;若前者大于后者,则在中间位置右边的元素中继续查找。重复这个步骤直到查找成功。然后编写折半查找法的算法和利用折半查找法插入元素的算法,最后编写主函数,在主函数中输入有序表的元素,再调用折半查找法的查找和插入操作,保持有序表的有序性并输出,实现程序的编程。
四、算法。
1、设置查找区间初值,设下界low=0,设上界high=length—1。
2、若low<=high,则计算中间位置mid=(low+high)/2.3、若key 若key>data[mid],则设low=mid+1并继续执行步骤2; 若key=data[mid]则查找成功,返回目标元素位置mid+1(位置从1计数)。 4、若当low=high时,key!=data[mid]则查找失败,返回0.四、实验心得体会: 折半查找法是对一个有序表进行折中查找,首先对表进行排序,则查找起来就会事半功倍。这种查找的算法直观,形象,便于使用。 实验八: 排序综合实验 一、实验目的: 参照各种排序算法程序样例,验证给出的排序常见算法。 二、实验内容: 输入一组关键字序列分别实现下列排序,并将上述几种排序的算法编写成菜 单,根据输入的数字不同执行对应的排序算法(任选两种排序方法实现)。 1、直接插入排序。 2、冒泡排序。 3、直接选择排序。 4、快速排序。 三、实验思路: 首先编写直接插入排序法和冒泡排序法,然后编写主函数,在主函数中定义一个一维数组用来记录数据,再编写一个菜单用来选择排序方法,最后调用直接插入排序法和冒泡排序法等操作,使用循环结构实现程序的反复执行直到退出为止。 四、算法。 直接插入排序算法void insort(int p[],int n){ int i,j,temp;for(i=1;i temp=p[i]; j=i; while(j>0&&temp { p[j]=p[j-1]; j--; } p[j]=temp;} } 冒泡排序算法void bublesort(int v[],int n){ int i,j,temp;for(i=1;i for(j=0;j { if(v[j]>v[j+1]) { temp=v[j]; v[j]=v[j+1]; v[j+1]=temp; } } } } 简单选择排序法void Select_Sort(datatype R[ ],intn){ /*对排序表R[1].....R[n]进行冒泡排法,n是记录个数*/ for(i=1;i