当前位置:文档之家› Linux环境下C语言编程课程设计

Linux环境下C语言编程课程设计

Linux操作系统教程

课程设计

题目:算术测试系统

学号: 22041240120 姓名:严涛

专业:信息工程

目录

一、课程设计目的 (3)

二、课程设计所需知识与开发工具 (3)

2.1、课程设计所需知识 (3)

2.2、开发工具简介 (6)

三、课程设计主要内容 (6)

3.1、系统结构简介 (6)

3.2、系统功能模块的划分 (6)

3.3、makefile介绍.............................................................................................. .. (7)

3.4、makefile规则.............................................................................................. .. (7)

四、设计步骤 (8)

4.1、题量输入模块的实现与相关代码 (8)

4.2、出题模块的实现与相关代码 (8)

4.3、答题模块的实现与相关代码 (9)

4.4、检查计分模块的实现与相关代码 (10)

4.5、评分模块的实现与相关代码 (10)

五、测试与调试 (11)

六、总结 (13)

6.1、成员分工 (13)

6.2、心得于体会 (13)

七、参考文献 (14)

一、课程设计目的

1.熟悉linux基本操作命令;

2.掌握linux环境下c语言编程;

3.提高学生搜集资料的能力,以此解决遇到的各种问题。

二、课程设计所需知识与开发工具

2.1、课程设计所需知识

1.linux基本操作命令:

date 显示系统日期;cal 2007 显示2007年的日历表;date 0412********.00 设置日期和时间- 月日时分年.秒;clock -w 将时间修改保存到BIOS;shutdown -h now 关闭系统(1);init 0 关闭系统(2);telinit 0 关闭系统(3);shutdown -h hours:minutes & 按预定时间关闭系统;shutdown -c 取消按预定时间关闭系统;shutdown -r now 重启(1);reboot 重启(2);logout 注销;cd /home 进入'/ home' 目录';cd .. 返回上一级目录;cd ../.. 返回上两级目录;cd 进入个人的主目录;cd ~user1 进入个人的主目录;cd - 返回上次所在的目录;pwd 显示工作路径;ls 查看目录中的文件;ls -F 查看目录中的文件;ls -l 显示文件和目录的详细资料;ls -a 显示隐藏文件;ls *[0-9]* 显示包含数字的文件名和目录名;tree 显示文件和目录由根目录开始的树形结构(1);lstree 显示文件和目录由根目录开始的树形结构(2);mkdir dir1 创建一个叫做'dir1' 的目录';mkdir dir1 dir2 同时创建两个目录;mkdir -p /tmp/dir1/dir2 创建一个目录树;rm -f file1 删除一个叫做'file1' 的文件';rmdir dir1 删除一个叫做'dir1' 的目录';rm -rf dir1 删除一个叫做'dir1' 的目录并同时删除其内容;rm -rf dir1 dir2 同时删除两个目录及它们的内容;mv dir1 new_dir 重命名/移动一个目录;cp file1 file2 复制一个文件;cp dir/* . 复制一个目录下的所有文件到当前工作目录;cp -a /tmp/dir1 . 复制一个目录到当前工作目录;cp -a dir1 dir2 复制一个目录;bunzip2 file1.bz2 解压一个叫做'file1.bz2'的文件;bzip2 file1 压缩一个叫做'file1' 的文件;gunzip file1.gz 解压一个叫做'file1.gz'的文件;gzip file1 压缩一个叫做'file1'的文件;gzip -9 file1 最大程度压缩;rar a file1.rar test_file 创建一个叫做'file1.rar' 的包;rar a file1.rar file1 file2 dir1 同时压缩'file1', 'file2' 以及目录'dir1';rar x file1.rar 解压rar包;unrar x file1.rar 解压rar包;tar -cvf archive.tar file1 创建一个非压缩的tarball;tar -cvf archive.tar file1 file2 dir1 创建一个包含了'file1', 'file2' 以及'dir1'的档案文件;tar -tf archive.tar 显示一个包中的内容;tar -xvf archive.tar 释放一个包;tar -xvf archive.tar -C /tmp 将压缩包释放到/tmp目录下;tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包;tar -xvfj archive.tar.bz2 解压一个bzip2格式的压缩包;tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包;tar -xvfz archive.tar.gz 解压一个gzip格式的压缩包;zip file1.zip file1 创建一个zip格式的压缩包;zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包;unzip file1.zip 解压一个zip格式压缩包;

2.c语言程序开发相关知识;

3.linux vi编辑器的使用:

进入vi的命令:

vi filename :打开或新建文件,并将光标置于第一行首;vi +n filename :打开文件,并将光标置于第n行首;vi + filename :打开文件,并将光标置于最后一行首;vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处;vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename;vi filename....filename :打开多个文件,依次进行编辑;

移动光标类命令:

h :光标左移一个字符;l :光标右移一个字符;space:光标右移一个字符;Backspace:光标左移一个字符;k或Ctrl+p:光标上移一行;j或Ctrl+n :光标下移一行;Enter :光标下移一行;w或W :光标右移一个字至字首;b或B :光标左移一个字至字首;e或E :光标右移一个字至字尾;) :光标移至句尾;( :光标移至句首;}:光标移至段落最后一个字母;{:光标移至段落第一个字母;nG:光标移至第n行首;n+:光标下移n行;n-:光标上移n行;n$:光标移至第n行尾;H :光标移至屏幕顶行;M :光标移至屏幕中间行;L :光标移至屏幕最后行;0:(注意是数字零)光标移至当前行首;$:光标移至当前行尾;

屏幕翻滚类命令:

Ctrl+u:向文件首翻半屏;Ctrl+d:向文件尾翻半屏;Ctrl+f:向文件尾翻一屏;Ctrl+b;向文件首翻一屏;nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部;

插入文本类命令:i :在光标前;I :在当前行首;a:光标后;A:在当前行尾;o:在当前行之下新开一行;O:在当前行之上新开一行;r:替换当前字符;R:替换当前字符及其后的字符,直至按ESC键;s:从当前光标位置处开始,以输入的文本替代指定数目的字符;S:删除指定数目的行,并以所输入文本代替之;ncw或nCW:修改指定数目的字;nCC:修改指定数目的行;

删除命令:

ndw或ndW:删除光标处开始及其后的n-1个字;d0:删至行首;d$:删至行尾;ndd:删除当前行及其后n-1行;x或X:删除一个字符,x删除光标后的,而X删除光标前的;Ctrl+u:删除输入方式下所输入的文本;

搜索及替换命令:

/pattern:从光标开始处向文件尾搜索pattern;

?pattern:从光标开始处向文件首搜索pattern;

n:在同一方向重复上一次搜索命令;

N:在反方向上重复上一次搜索命令;

:s/p1/p2/g:将当前行中所有p1均用p2替代;

:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代;

:g/p1/s//p2/g:将文件中所有p1均用p2替换;

选项设置:

all:列出所有选项设置情况;

term:设置终端类型;

ignorance:在搜索中忽略大小写;

list:显示制表位(Ctrl+I)和行尾标志($);

number:显示行号;report:显示由面向行的命令修改过的数目;

terse:显示简短的警告信息;

warn:在转到别的文件时若没保存当前文件则显示NO write信息;

nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符;

nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始;

mesg:允许vi显示其他用户用write写到自己终端上的信息;

最后行方式命令:

:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下;

:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下;

:n1,n2 d :将n1行到n2行之间的内容删除;

:w :保存当前文件;

:e filename:打开文件filename进行编辑;

:x:保存当前文件并退出;

:q:退出vi;

:q!:不保存文件并退出vi;

:!command:执行shell命令command;

:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入;

:r!command:将命令command的输出结果放到当前行;

4.gcc的基本规则:

gcc所遵循的部分约定规则:

.c为后缀的文件,C语言源代码文件;

.a为后缀的文件,是由目标文件构成的档案库文件;

.C,.cc或.cxx 为后缀的文件,是C++源代码文件且必须要经过预处理;

.h为后缀的文件,是程序所包含的头文件;

.i 为后缀的文件,是C源代码文件且不应该对其执行预处理;

.ii为后缀的文件,是C++源代码文件且不应该对其执行预处理;

.m为后缀的文件,是Objective-C源代码文件;

.mm为后缀的文件是Objective-C++源代码文件;

.o为后缀的文件,是编译后的目标文件;

.s为后缀的文件,是汇编语言源代码文件;

.S为后缀的文件,是经过预编译的汇编语言源代码文件。

5.gcc的基本用法

GCC最基本的用法是∶gcc [options] [filenames]

其中options就是编译器所需要的参数,filenames给出相关的文件名称。

-c,只编译,不链接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。

-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。

-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。

-O,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、链接的速度就相应地要慢一些。

-O2,比-O更好的优化编译、链接,当然整个编译、链接过程会更慢。

-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶

A)#include

B)#include “myinc.h”

其中,A类使用尖括号(< >),B类使用双引号(“ ”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而B类,预处理程序在目标文件的文件夹内搜索相应文件。

2.2、开发工具简介

1:linux ubantu操作系统

Ubuntu(乌班图)是一个以桌面应用为主的Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu基于Debian发行版和GNOME桌面环境,而从11.04版起,Ubuntu发行版放弃了Gnome桌面环境,改为Unity,与Debian的不同在于它每6个月会发布一个新版本。Ubuntu的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。2013年1月3日,Ubuntu正式发布面向智能手机的移动操作系统。

ubuntu基于linux的免费开源桌面PC操作系统,十分契合英特尔的超极本定位,支持x86、64位和ppc架构。

2:gcc-4.5.1

GNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)。GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由。

三、课程设计主要内容

3.1、系统结构简介

本系统包含了顺序结构,选择结构,循环结构三种在c程序中的主要结构,其中穿插了数组,指针,函数调用等知识

3.2、系统功能模块的划分

本系统一共有五个模块,分别是:输入题量模块,出题模块,答题模块,检查计分模块,评分模块

1.输入题量模块:本系统能由使用者指定出题数量,用scanf语句来输入题量,然后用return将题量值返回到出题模块;

2.出题模块:一个考试系统首先就是要有题目且能够根据条件出题,用一个for循环结构来约束题量;

3.答题模块:出完题后就是从键盘上输入答案,在本模块中,提示输入答案后,用scanf 函数来实现使从键盘上输入一个数赋给一个用来记录答案的字符变量,用return语句将这个变量返回到出题模块;

4.检查计分模块:输入答案后,就要判断答案的正确性和计分了,在本模块中,用for 循环结构嵌套if语句来控制输入的答案是否正确,若正确就返回i++函数使正确数加1,否则continue终止此次循环,循环完成后,用return语句将正确数返回到出题系统中;

5.评分模块:用检查计分模块返回的值除以出题模块返回的题数乘以100%以百分比保留两位小数显示正确率。

3.3、makefile介绍

1.makefile文件介绍

makefile一个工程中的源文件不计数,其按类型,功能,模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个shell脚本一样,其中也可以执行操作系统的命令。

2.makefile主要功能

make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile文件是许多编译器——包括windowsNT下的编译器——维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改makefile文件而已。

3.自动化编译

makefile带来的好处就是——自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile 中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,VC++的nmake,Linux下GUN的make。可见,makefile都成为了一种在工程方面的编译方法。

3.4、makefile规则

makefile中的规则是这样的:

TAGET···:DPENDENCIES···

COMMAND

···

目标(TARGET)程序产生的文件,如可执行文件和目标文件:目标也可以是要执行的动作,如“clean”。

依赖(DEPENDENCIES)是用来产生目标的输入文件,一个目标通常依赖于多个文件。

命令(COMMAND)是make执行的动作,一个可以有多个命令,每个占一行。注意:每个命令行的起始字符必须为TAB字符!

有依赖关系规则中的命令通常在依赖文件变化时负责产生target“clean”的规。

规则解释如何和何时执行动作。有的规则看起来很复杂,但都符合上述模式。

makefile中的规则描述如何生成特定的文件,即规则的目标。规则列出了目标依赖文件,指定生成或更新目标的命令。规则的次序是不重要的,除非是确定缺省目标:缺省目标是第一

个makefile中的第一个规则:如果第一个规则有多个目标,第一个目标是缺省的。有两个例外:以….?开头的目标不是缺省目标:模式规则对缺省目标没有影响。通常我们所写的第一个规则是编译整个或makefile中指定的所有程序。

四、设计步骤

4.1、输入题量模块的实现与代码

#include

#include

int input(void)

{

int j;

while(1){

printf("请输入您需要的测试题题量: ");

if(!scanf("%d",&j)){

printf("请输入正确的数字,然后重启该程序。\n");

exit(0);

}else{break;}

}

return j;

}

4.2、出题模块的实现与代码

#include

#include

int question(int questionNum)

{

int i;

int k;

int q1;

int q2;

int THE_TRUE_ANSWER_NUMBER=0;

srand((unsigned)time(NULL));

for(i=0;i

q1=rand()%100;

q2=rand()%100;

printf("%d+%d=",q1,q2);

scanf("%d",&k);

if(k==q1+q2){

THE_TRUE_ANSWER_NUMBER+=1;}}

return THE_TRUE_ANSWER_NUMBER;

}

4.3、答题模块和检查计分模块的实现与代码

#include

#include

static int THE_TRUE_ANSWER_NUMBER=0;

int main(int argc,char *argv[])

{

int i;

int j;

int k;

int q1;

int q2;

srand((unsigned)time(NULL));

printf("请输入测试题题量: ");

scanf("%d",&j);

for(i=0,i

q1=rand()%100;

q2=rand()%100;

printf("%d+%d=",q1,q2);

scanf("%d",&k);

if(k==q1+q2){

THE_TRUE_ANSWER_NUMBER+=1;}}

float f=THE_TRUE_ANSWER_NUMBER/(j*1.0);

printf("您的正确率为%0.2f,继续加油!\n",f*100);

exit(0);

}

4.4、自定义头文件myhead.h代码

#ifndef MYHEAD_H

#define MYHEAD_H

extern int question(int);

extern int input(void);

#endif

4.5、评分模块的实现与代码

#include

#include

#include

#include"myhead.h"

int main(int argc,char *argv[])

{

int i;

int k;

int j=input();

int correctNum=question(j);

float f=correctNum/(j*1.0);

printf("您的正确率为百分之%0.2f,仍需继续努力!\n",f*100); exit(0);

}

五、测试与调试

1.输入测试题题量:

2.得到测试题目:(输入一个答案,再显示下一道测试题)

3.答案输入完毕:

4.运行结果:

六、总结

6.1、成员分工

严涛:设计系统,写程序代码,测试/调试系统

叶鑫楠:总结报告,打包程序

徐康:查找资料,心得体会

6.2、心得与体会

本学期对于Linux系统的学习,让我对Linux有了一定的了解。我知道了Linux只是个内核。现在的Linux操作系统,都是用这么一个内核,加上其它的应用程序构成的。Linux 最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一,使其在金融、安全等部门有很重要的应用。

学习Linux,首先我们应该从基础开始学起。对Linux操作系统的功能、版本、特点,以及Linux系统安装和图形环境有较全面的了解。

Linux命令是必须学习的。虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力。Linux是一个命令行组成的操作系统,精髓在命令行,学习如何在安全的环境中执行系统命令,包括有关文件、目录、文件系统、进程等概念,如何使用相应的命令对文件、目录、进程等进行管理,了解遇到问题时,如何找到帮助信息等。Linux常用命令,有echo 命令、date命令、passwd命令、file命令、ls命令、touch命令等。

要明白学好Linux不是一件一蹴而就的事,一定要能坚持使用它,特别是在学习初期。要增加自己的Linux技能,只有通过实践来实现。只要多动手,就一定会有收获。遇到问题时要自己去寻找答案,在寻找答案的过程中,会学到更多知识。

应该说目前我们对于Linux的学习只是入门而已,学习Linux是一个长期的过程,很耗时间。作为电子信息工程专业的学生,对我们来说,Linux将来主要应用于嵌入式Linux系统的开发,这非一日之功,我们还需要不断深入地学习它。

七、参考文献

1.《linux操作系统教程》

2.《C语言编程基础》

3。百度文库/百度知道

相关主题
文本预览
相关文档 最新文档