基于linux的进栈出栈的gcc编程Word文件下载.docx
- 文档编号:19832600
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:19
- 大小:231.01KB
基于linux的进栈出栈的gcc编程Word文件下载.docx
《基于linux的进栈出栈的gcc编程Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于linux的进栈出栈的gcc编程Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
检查是否安装了gcc10
2.2Gcc编译过程各模块并运行11
2.2.1用vi建立.c文件11
2.2.2gcc编译过程12
2.2.3Makefile编译过程13
3总结14
参考文献15
致谢15
附录:
程序15
0引言
Linux内核是最初由LinusTorvalds于1991年的10月5日独立发表,目的是希望通过纯粹的开源协作来实现UNIX内核。
随着开源协作开发方式的发展以及成熟,众多厂商相继加入到Linux内核开发中,当前Linux内核已经完全取代了UNIX内核,并将达到闭源专利的UNIX所无法达到的高度。
Linux不是UNIX,严格来讲也不是类UNIX,但是如今却是UNIX家族的代表者,也是开源软件的成功案例。
Linux源码许可协议接近GPL,允许任何人自由获取并免费使用。
Linux一般指Linux内核,而GNU/Linux指以Linux为内核并使用GNUuserland的成套操作系统。
已知的较早时间(1992年上半年至1994年下半年)发布的GNU/Linux依次为MCCInterim、TAMU、SLS、Yggdrasil、DLD、Slackware、DebianLinuxRelease、LST、Bogus、S.u.S.E和RedHatLinux,最初的Slackware基于SLS,最初的S.u.S.E基于Slackware。
Linux系统下的Gcc(GNUCCompiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。
gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。
Gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。
Gcc的不断发展完善是许多商业编译器都相形见绌,由于UNIX平台的高度可移植性,Gcc提供各种常见的UNIX平台上的版本,而且还提供了WIN32和DOS上的GCC。
在linux环境中,假如有很多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简直就是一场灾难。
make是一个非常重要的编译命令。
利用make工具,将大型的开发项目分解为多个更易管理的模块,分而治之。
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。
因此,有效的利用make和makefile工具可以大大提高项目开发的效率。
1内容
基于课程知识的学习,本次作业的将要完成的内容如下:
●安装Gcc的过程;
●对数据进栈出栈问题的研究和C编程;
●Gcc编译各模块并运行;
●Makefile编译各模块并运行;
1.1安装Gcc的过程
1.1.1下载
在GCC官方网站上(http:
//gcc.gnu.org/)或者通过网上搜索可以查找到下载资源。
目前GCC的最新版本为4.3.3。
可供下载的文件一般有两种形式:
gcc-4.3.3.tar.gz和gcc-4.3.3.tar.bz2,只是压缩格式不一样,内容完全一致,下载其中一种即可。
1.1.2解压缩
根据压缩格式,选择下面相应的一种方式解包(以下的“%”表示命令行提示符):
%tarxzvfgcc-4.3.3.tar.gz
或者
%bzcatgcc-4.3.3.tar.bz2|tarxvf-
新生成的gcc-4.3.3这个目录被称为源目录,用${srcdir}表示它。
以后在出现${srcdir}的地方,应该用真实的路径来替换它。
用pwd命令可以查看当前路径。
在${srcdir}/INSTALL目录下有详细的GCC安装说明,可用浏览器打开index.html阅读。
1.1.3建立目标目录
目标目录(用${objdir}表示)是用来存放编译结果的地方。
GCC建议编译后的文件不要放在源目录${srcdir]中(虽然这样做也可以),最好单独存放在另外一个目录中,而且不能是${srcdir}的子目录。
例如,可以这样建立一个叫gcc-build的目标目录(与源目录${srcdir}是同级目录):
%mkdirgcc-build
%cdgcc-build
以下的操作主要是在目标目录${objdir}下进行。
1.1.4.配置
配置的目的是决定将GCC编译器安装到什么地方(${destdir}),支持什么语言以及指定其它一些选项等。
其中,${destdir}不能与${objdir}或${srcdir}目录相同。
配置是通过执行${srcdir}下的configure来完成的。
其命令格式为(记得用你的真实路径替换${destdir}):
%${srcdir}/configure--prefix=${destdir}[其它选项]
例如,如果想将GCC4.3.3安装到/usr/local/gcc-4.3.3目录下,则${destdir}就表示这个路径。
在我的机器上,我是这样配置的:
%../gcc-4.3.3/configure--prefix=/usr/local/gcc-4.3.3--enable-threads=posix--disable-checking--enable--long-long--host=i386-RedHat-linux--with-system-zlib--enable-languages=c,c++,java
将GCC安装在/usr/local/gcc-4.3.3目录下,支持C/C++和JAVA语言,其它选项参见GCC提供的帮助说明。
1.2对数据进栈出栈问题的研究和C编程
1.2.1栈的定义和用法
●栈和队列是两种特殊的线性表,它们的逻辑结构和线性表相同,只是其运算规则较线性表有更多的限制,故又称它们为运算受限的线性表。
栈和队列被广泛应用于各种程序设计中。
栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。
(1)通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。
(2)当表中没有元素时称为空栈。
(3)栈为后进先出(LastInFirstOut)的线性表,简称为LIFO表。
栈的修改是按后进先出的原则进行。
每次删除(退栈)的总是当前栈中"
最新"
的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除。
如下图为栈的示意图:
栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表
●顺序栈的基本操作
前提条件:
设S是SeqStack类型的指针变量。
若栈底位置在向量的低端,即S->data[0]是栈底元素。
(1)进栈操作
进栈时,需要将S->top加1
注意:
①S->top==StackSize-1表示栈满
②"
上溢"
现象--当栈满时,再做进栈运算产生空间溢出的现象。
上溢是一种出错状态,应设法避免。
(2)退栈操作
退栈时,需将S->top减1
①S->top<
0表示空栈
②"
下溢"
现象——当栈空时,做退栈运算产生的溢出现象。
下溢是正常现象,常用作程序控制转移的条件。
●顺序栈的基本运算
(1)置栈空
voidInitStack(SeqStack*S)
{//将顺序栈置空
S->
top=-1;
}
(2)判栈空
intStackEmpty(SeqStack*S)
{
returnS->
top==-1;
}
(3)判栈满
intStackFull(SeqStack*SS)
top==StackSize-1;
(4)进栈
voidPush(S,x)
if(StackFull(S))
Error("
Stackoverflow"
);
//上溢,退出运行
data[++S->
top]=x;
//栈顶指针加1后将x入栈
(5)退栈
DataTypePop(S)
if(StackEmpty(S))
Stackunderflow"
//下溢,退出运行
data[S->
top--];
//栈顶元素返回后将栈顶指针减1
(6)取栈顶元素
DataTypeStackTop(S)
Stackisempty"
top];
1.2.2程序设计流程图(主函数模块)如图2.0
图2.0
1.3Gcc编译过程各模块并运行
viHelloWrold.c这条命令的作用是创建一个HelloWrold.c的文件。
按回车
进vi编辑界面,按后a,i,o等进入编辑状态。
示例程序如下:
#include<
stdio.h>
main()
printf("
HelloWrold!
\n"
);
}
编写完程序后检查按Esc并保存退出(:
w“保存”:
q“退出”)
进入然后用gcc编译:
gcc-cHelloWrold.c回车
用ls查看就会看到一个HelloWrold.out文件;
用chmod777HelloWrold.c修改权限;
用.
/HelloLinux.out来运行程序;
将会显示
1.3.2linux下对C代码的编译
在linux下对C代码的编译时极其简单的,但是,不能忘记步骤。
要进入自己所要的目录:
cd文件名
如果要是返回上级目录:
cd……
要查看下面的子目录:
ls或者ll
建立新目录:
mkdir文件名
删除空目录:
rmdir文件名非空的rm
编译:
gcc-otesttest.c
输出:
./test
1.3.3Linux平台下关于GCC编译及使用的方法
第一步、是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程:
gcc-Ehello.c-ohello.i
预处理的宏定义插入到hello.i中
第二步、是将hello.i编译为目标代码,这可以通过使用-c参数来完成:
gcc-chello.i-ohello.o
也可以通过源文件直接生成
gcc-chello.c
第三步、是将生成的目标文件链接成可执行文件:
gcchello.o-ohello
gcc-ohellohello.c
1.4Makefile编译各模块并运行
在linux系统中,习惯使用Makefile作为makefile文件。
如果要使用其他文件作为makefile,则可利用类似下面的make命令选项指定makefile文件:
#make-fMakefile.debug
例如,一个名为prog的程序由3个C源文件main.ckbd.c和command.c以及库文件LS编译生成,这三个源文件还包含自己的头文件a.h,b.h和c.h。
通常情况下,C编译器将会输出三个目标文件main.okbd.o和command.o。
假设main.ckbd.c都将声明用到一个名为defs的文件,但command.c不用。
即在main.ckbd.c有这样的声明:
#include“defs”
那么下面的文件就描述了这些文件之间的相互关系:
prog:
main.okbd.ocommand.o
gcc-main.okbd.ocommand.o
main.o:
main.ca.hdefs
gcc-cmain.c
kbd.o:
kbd.cb.hdefs
gcc-ckbd.c
command.o:
command.cc.hdefs
gcc-ccommand.c
clean:
rmeditmain.okbd.ocommand.odisplay.o\
insert.osearch.ofiles.outils.o
这个描述文件就是一个简单的makefile文件。
2过程
2.1安装Gcc的过程
检查是否安装了gcc
命令:
#rpm–qa|grepgcc回车键后显示图形如图2.1:
图2.1
有上图可知在本虚拟机中已装载了gcc编译器。
2.2Gcc编译过程各模块并运行
2.2.1用vi建立.c文件
用vi建立四个.c文件分别为duizhan.c,get.c,get1.c,get2.c。
在duizhan.c里编译主函数,get.c返回输入的栈位的内容;
get1.c编写判断是否满栈;
get2.c编写堆栈是否为空的程序。
命令窗口如下图2.2显示。
图2.2
在各.c文件下编的程序截图如下(部分vi编辑器下程序):
图2.3
图2.4
2.2.2gcc编译过程
(1)每个.c程序编译过程如下:
#gcc-cduizhan.c
#gcc-cget.c
#gcc-cget1.c
#gcc-cget2.c
这几条命令的意思是只编译生成目标文件。
生成目标文件如图2.5.
图2.5
(2)用gcc-o将四个文件连编生成可执行文件chuzhan,在终端命令窗口输入程序如下:
gcc-ochuzhanduizhan.cget.cget1.cget2.c
当次命令执行过去后说明已经生成了可执行文件chuzhan,现在我们在终端命令窗口输入程序如下可修改权限:
Chmod777chuzahn
修改好权限之后用如下程序运行chuzhan程序:
./chuzhan
上述过程和运行程序过程截图为图2.6和2.7.
图2.6
图2.7
2.2.3Makefile编译过程
我在前面以简单介绍过makefile的基本用法,仿照前面的例子,我在makefile文件中输入以下程序:
chuzhan:
duizhan.oget.oget1.oget2.o
gcc-ochuzhanduizhan.oget.oget1.oget2.o
duizhan.o:
duizhan.c
gcc-cduizhan.c
get.o:
get.c
gcc-cget.c
get1.o:
get1.c
gcc-cget1.c
get2.o:
get2.c
gcc-cget2.c
clean:
rmchuzhanduizhan.oget.oget1.oget2.o
在makefile中如图2.8
图2.8
在终端命令窗口输入命令make,将运行程序如图2.9
如图2.9
3总结
这次课程设计达到了我基本的要求,实现了我C语言程序所要实现的效果。
Linux同windows一样是常用的操作系统,与windows的保守不同Linux是一种自由和开放源码的类Unix操作系统,为我们学习者提供丰富的学习资源,所以说学习linux是非常有必要的。
之前我们学的都是在linux下的一些简单命令,相比于linux这个大的资源是相形见绌的。
这一次通过这一次大作业,首先通过编程简单的进栈出栈程序让我对C语言知识的学习更加深刻;
其次通过gcc和makefile的连编多个程序也让我体会到了linux的魅力。
也明白了实践是检验真理的唯一准则这句话的深刻内涵。
虽然这次做的比较简单,但亲自动手增加了我的学习兴趣。
同时更是感觉仅仅依靠上课老师讲的知识是远远不够的,我们要腾出更多的时间来钻研有意义的事情。
在接下来的学习中,虽然linux课程已接近尾声,但我们寻求知识的脚步不应该停下来。
Linux是我们学习的一个好的平台。
我们要借着这个平台多做点,多学点。
参考文献
【1】魏红.曾忠平.RedHatLinux实用宝典【M】.中国铁道出版社,2008.
【2】王春森.程序员教程【M】.清华大学出版社,2001.
【3】严蔚敏.数据结构(C语言版)
【M】.清华大学出版社,2007.
【4】张辉.(译)GNU/Linux编译指南【M】.清华大学出版社,2002.
致谢
通过这次的设计让我对开发工具有了更深刻的认识,linux操作系统这门课程让我懂得了一些linux的基本知识和用法,让我在理论和实践两方面都学到了很多。
首先我要感谢杨老师对我传授的知识,并在理论与实践方面给予了我很多的启发,让我知道了在设计过程中的许多规范性问题,使我的课题能够顺利的、大工作量的完成。
在此向他们致以最衷心的感谢。
再次感谢在此次设计中帮助了我的所有同学,他们也给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助。
谢谢你们!
希望在以后的学习中我们能互帮互助,共创美好!
程序
主函数模块:
stdlib.h>
conio.h>
#definem10
typedefstruct
{
inta[m];
inttop;
}stack;
voidmain()
{intisempty(stack*s);
intisfull(stack*s);
intgettop(stack*s,intx);
intget(stack*s,intb);
voidpush(stack*s,intx);
voidpop(stack*s);
inti,x,b,c,j=0;
stack*s;
s=(stack*)malloc(sizeof(stack));
s->
top=0;
pleaseenter10numbers\n"
for(i=0;
i<
=m-1;
i++)
{
scanf("
%d"
&
x);
push(s,x);
if(isempty(s))printf("
空栈\n"
elseprintf("
非空\n"
if(isfull(s))printf("
满栈\n"
elseprintf("
非满\n"
gettop(s,x);
最后一个进栈元素为%d\n"
x);
请输入要找第几号元素?
scanf("
b);
c=get(s,b);
第%d元素为%d\n"
b,c);
是否出栈?
出栈请输入1\n"
j);
原栈中元素为:
if(j)pop(s);
出栈失败!
intgettop(stack*s,intx)
{inti;
i=isempty(s);
if(i)printf("
empty"
else
x=s->
a[s->
top-1];
returnx;
voidpush(stack*s,intx)
i=isfull(s);
overflow"
else{
s->
top++;
voidpop(stack*s)
{inti,j,t;
t=s->
top;
t-1;
{printf("
%d\n"
s->
top-1]);
top--;
j=isempty(s);
if(j)printf("
出栈成功!
模块二:
返回输入的栈位的内容:
intget(stack*s,intb)
intc;
c=s->
a[b-1];
returnc;
模块三:
判断是否满栈
intisfull(stack*s)
if(s->
top==m)
return1;
elsereturn0;
模块四:
判断栈是否空
#defi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 linux 进栈出栈 gcc 编程