《Linux开发基础》项目指导书.docx
- 文档编号:29366062
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:47
- 大小:29.37KB
《Linux开发基础》项目指导书.docx
《《Linux开发基础》项目指导书.docx》由会员分享,可在线阅读,更多相关《《Linux开发基础》项目指导书.docx(47页珍藏版)》请在冰豆网上搜索。
《Linux开发基础》项目指导书
dfd目录
项目一、vi,emacs编辑器的使用
一、实训目的
掌握vi,emacs编辑器的使用方法。
二、实训内容
用vi编辑器编辑文档
用emacs编辑器编辑文档
三、实训过程
(1)vi编辑练习
1.请在/root这个目录下建立一个名为vitest的目录;
2.进入vitest这个目录当中;
3.将/etc/man.config拷贝到本目录底下;
4.使用vi开启本目录下的man.config这个文件;
5.在vi中设定一下行号;
6.移动到第62行,向右移动40个字符,请问您看到的双引号内是什么目录?
7.移动到第一行,并且向下搜寻一下‘teTeX’这个字符串,请问他在第几行?
8.接着下来,我要将50到100行之间的man改为MAN,并且一个一个挑选是否需要修改,如何下达指令?
9.修改完之后,突然反悔了,要全部复原,有哪些方法?
10.我要复制51到60行这十行的内容,并且贴到最后一行之后;
11.删除11到30行之间的20行;
12.将这个文件另存成一个man.test.config的文件;
13.去到第29行,并且删除15个字符;
14.请问目前的文件有多少行与多少字符?
15.储存后离开。
(2)emacs编辑器练习
1./etc/man.config拷贝到本目录底下;
2.使用emacs开启本目录下的man.config这个文件;
3.使用标号和光标选定文本。
4.使用标号和光标位置交换命令调整选择文本范围。
5.将选定文本,分别复制到文本的开始和末尾。
6.搜寻‘teTeX’单词,并删除该单词。
7.取消第6步操作。
8.将当前窗口分为两个
9.在下面窗口新打开个文件test1
10.观察使用ctrl+y命令的结果。
11.关闭上面窗口。
12.退出emacs保留对test1的修改,但不保留对test的修改。
项目二、gcc,gdb练习
一、实训目的
掌握gcc编译器和gdb调试器常用的基本命令和方法
二、实训内容
Gcc编译器的使用
Gdb调试器的使用
三、实训过程
gcc的使用
1.输入下面程序,编译运行
intmain()
{
Printf(“myfirstprogram”);
}
a.将源文件编译生成目标文件。
b.将源程序编译生成默认的可执行文件。
c.将源程序编译成指定的名字的可执行文件。
d.打开警告功能。
e.程序有警告的原因,修改程序消除警告。
2.使用gcc的优化功能。
将下列程序分别使用-O1-O2-O3选项来优化,并使用time命令查看它们各自的运行时间。
#include
intmain()
{
intcounter,ending,temp,five;
for(counter=0;counter<2*1000000000*9/18+5131;counter+=(5-3)/2)
{
temp=counter/15302;
ending=counter;
five=5;
}
printf(“five=%d;ending=%d\n”,five,ending);
return0;
}
gdb的使用
使用gdb调试下面程序:
intget_num(intn){
intsum=0,i;
for(i=0;i { sum+=i; returnsum; } intmain() { inti=100,result; result=get_num(i); printf(“1+2+3+……+%d=%d\n”,i,result); return0; } a.列出源文件。 b.分别在第7行,和main函数处设置断点,观察断点信息。 c.单步运行,观察i,result的值。 (注意: 对比单步运行n和s的区别。 ) d.继续运行程序。 e.观察堆栈信息。 f.完成函数调用。 g.继续运行程序。 h.退出调试。 项目三、Makefile练习 一、实训目的 掌握简单makefile书写。 二、实训内容 编写源文件。 书写相应的makefile。 三、实训过程 一个程序由三个源文件构成,一个头文件构成,分别为main.c,sum.c,mul.c,get.h构成。 Main.c为主函数文件,内容如下: #include #include“get.h” externsum(); externmul(); main() { intn; n=get(); sum(n); mul(n); } sum.c文件存放了一个求累加的函数,并输出结构,内容如下: #include voidsum(intn) { inti,sum=0; for(i=1;i<=n;i++) sum+=i; printf(“sum=%d”,sum); } mul.c存放了一个累阶乘的函数,并输出结构,内容如下: #include voidmul(intn) { inti,mul=1; for(i=1;i<=n;i++) mul*=2; printf(“mul=%ld”,mul); } get.h文件里存放了一个从键盘上获得数的程序,内容如下: get() { inta; printf(“pleaseinputaintnumber: ”); scanf(“%d”,&a); returna; } 1.编写这个程序的最基本的makefile文件,注意保存路径以及名字。 2.使用变量和自动推导规则来简化makefile文件。 3.加上清理临时文件伪目标clean。 项目四、运算符与表达式练习 一、实训目的 理解、掌握c语言运算符与表达式知识。 二、实训内容 基本数据类型 运算符与表达式 标准输入输出函数 三、实训过程 1.分析下列程序的输出结果。 #include main() { inti,j,a,b; i=8; j=12; a=++i; b=j++; printf(“%d,%d,%d,%d\n”,i,j,a,b); } 2.分析下面程序会输出什么结果? Main() { chara,b; a=97; b=98; printf(“%c%c\n”,a,b); printf(“%d%d\n”,a,b); } 3.写出下列程序的运行结果。 intmain() { inta,b,c,d; a=10; b=a++; c=++a; d=10*++a; printf("b,c,d: %d,%d,%d\n",b,c,d); } 4.写出下面赋值表达式运行之后a的值,设a的初值为12,n的值为5。 (1)a+=a; (2)a%=7;(3)a*=2+5; (4)a/=a+a;(5)a%=(n%=2);(6)a-=a+=a*=a; 5.对于1-4题,在linux环境下,编写测试程序验证你的答案。 6.编写一个程序,要求输入两个整数,输出这两个整数的积、余数和平均数。 项目五、控制结构练习 一、实训目的 掌握c语言的控制结构。 二、实训内容 逻辑表达式 控制结构的使用 三、实训过程 1.先分析下面各个逻辑表达式的值,然后编写测试程序验证结果。 a,b,c的值分别为3、4、5。 (1)a+b>c&&b==c (2)a||b&&b-c (3)! (a>b)&&! c||1(4)! (x=a)&&(y=b)&&0(5)! (a+b)+c-1&&b+c/2 2.发了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯中的一个。 以下为4个嫌疑犯的供词: A说: 不是我。 B说: 是C。 C说: 是D。 D说: C在胡说。 已知3个人说了真话,1个人说了假话。 现请根据这些信息,写一个人程序来确定到底谁是凶手。 3.输入一个整数,求从1到这个数之间所有的对称数。 4.用循环语句打印一个菱形,随用户的输入n值变大而变大. 项目六、函数应用 一、实训目的 掌握函数的使用。 二、实训内容 使用函数编程。 三、实训过程 1.分析下列程序运行结果,编写运行程序验证你的答案。 (1)#include voidfunction() {staticinta=0; intb=0; a++; b++; printf("a=%d,b=%d\n",a,b);} main() {function(); function(); function();} (2) #include externlongpower(int); intA=2; main() {intn=10,total;total=power(n); printf("2^10=%d\n",total); return0;} 源文件file2.c externA; longpower(intn) {longtotal=1;inti; for(i=1;i<=n;i++) total=total*A; returntotal;} 2.用函数的递归调用来求n! 3.列出0~10000之间的所有其各位上的数字之和等于10的数。 编写一个判断各位上的数字之和等于10的函数,并在主函数中调用它 项目七、数组应用 一、实训目的 熟练掌握数组的应用,能熟练的使用数组解决问题。 二、实训内容 一维数组 二维数组 字符数组 数组排序 三、实训过程 1.输入10个学生成绩,成绩取值范围为0到100分,编程实现: 去掉最高成绩和最低成绩,计算并显示平均成绩。 3.将一个3×3二维数组的行和列元素互换,存到另一个二维数组中。 2.用数组和循环实现: 统计输入的一个字符串中的数字、大写字母、小写字母、空格及其它字符的个数。 4.输入10个数,分别采用选择法和冒泡法进行排序。 项目八、指针 一、实训目的 掌握指针的使用。 二、实训内容 指针和字符串的关系 指针和数组的关系 三、实训过程 1.分析下列程序运行结果,上机测试。 (1) #include intmain() { inta[5]={1,3,5,7,9}; int*p[5],i; int**pp=p; for(i=0;i<5;i++) p[i]=&a[i]; for(i=0;i<5;i++) printf("%d",*p[i]); printf("\n"); for(i=0;i<5;i++,pp++) printf("%d",**pp); return0; } (2) #include intmain() { inta[2][5]={1,3,5,7,9,2,4,6,8,10}; int(*p)[5],i; p=a; for(i=0;i<5;i++) printf("%d",(*p)[i]); printf("\n"); p++; for(i=0;i<5;i++) printf("%d",(*p)[i]); printf("\n"); return0; } (3) 2.使用指针,将字符串“ABCD1234efgh”前后对调并显示。 项目九、结构体与共用体 一、实训目的 掌握结构体与数组共同作用的使用,并能用与实际问题的解决。 二、实训内容 数组元素的扩展 结构体元素的扩展 三、实训过程 项目一十、指针、字符串、数组 一、实训目的 掌握指针、字符串、数组的共同点和不同点,能正确区分三者的使用场合。 二、实训内容 指针和字符串的关系 指针和数组的关系 三、实训过程 函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数StrOL(),其函数的功能是: 以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。 最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT6.DAT中。 例如: 原文: YouHeMe Iamastudent. 结果: MeHeYou studentaamI 原始数据文件存放的格式是: 每行的宽度均小于80个字符,含标点符号和空格。 charxx[50][80]; intmaxline=0;/*文章的总行数*/ intReadDat(void); voidWriteDat(void); voidStrOL(void) { } voidmain() { clrscr(); if(ReadDat()) { printf(\数据文件ENG.IN不能打开! \n\\007\); return; } StrOL(); WriteDat(); } intReadDat(void) { FILE*fp; inti=0; char*p; if((fp=fopen(\IN.DAT\,\r\))==NULL) { return1; } while(fgets(xx[i],80,fp)! =NULL) { p=strchr(xx[i],'\\n'); if(p) { *p=0; } i++; } maxline=i; fclose(fp); return0; } voidWriteDat(void) { FILE*fp; inti; clrscr(); fp=fopen(\OUT6.DAT\,\w\); for(i=0;i { printf(\%s\\n\,xx[i]); fprintf(fp,\%s\\n\,xx[i]); } fclose(fp); } 注: 该题的主要算法是先让两字符指针都指向串尾,然后使一指针(p1)往前移动,当出现不是字母时则表示在p1+1与p2之间是一个单词,并将该单词存入一变量(t1),最后将t1连接到新串中(t);接着再往前找第二个单词,依次类推直到字符串头。 由此可知新串就是原串中各单词的倒排。 voidStr0L(void) { inti,k; char*p1,*p2; chart[80],t1[80]; for(i=0;i { p2=p1=strchr(xx[i],'\0')-'\0'; } t[0]=t1[0]='\0'; k=1; while(k) { while(isalpha(*p1)==0&&p1! =xx[i]) {p1--;p2=p1;} } while(isalpha(*p1)&&p1>=xx[i]) { p1--; } memcpy(t1,p1+1,p2-p1); t1[p2-p1]=0; strcat(t,t1); strcat(t,”“); if(p1) { strcpy(xx[i],t); } } } 项目一十一、指针与结构体 一、实训目的 掌握指针与结构体的关系,能够将二者结合起来进行有效的运用。 二、实训内容 结构体元素的扩展 指针类型的扩展 三、实训过程 【项目1】 已知学生信息由姓名、学号、出生日期、性别几部分构成,其中出生日期又由年、月、日几部分构成。 构造一个结构体表示学生信息(要求结构体内部的所有元素类型都是指针! )。 并由该结构体定义出几个不同的学生结构体变量,要求实现结构体变量的初始化和访问过程。 提示1: 请注意指针元素初始化的内存分配。 提示2: 请分别计算出结构体变量的大小和结构体所有元素的大小。 【项目2】 已知一个电脑由主机、显示器、鼠标、键盘构成,其中主机又由主版、内存、CPU构成。 构造一个结构体表示电脑信息(提示: 可以以各个部件的价格作为描述对象。 要求结构体中涉及到的所有元素均定义为指针类型! ),并由该结构体定义出不同的电脑结构体变量,要求实现结构体变量的初始化和访问过程。 提示1: 请注意指针元素初始化的内存分配。 提示2: 请分别计算出结构体变量的大小和结构体所有元素的大小。 项目一十二、指针与二维数组、字符串数组 一、实训目的 掌握二级指针的基本使用方法,知道指针与二维数组、字符串数组的联系。 二、实训内容 二级指针在内存中的形式 二维数组中出现的各种指针 字符串数组中出现的各种形式的指针 三、实训过程 【项目1】 现有一个10个人100行的选票数据文件IN.DAT,其数据存放的格式是每条记录的长度均为10位,第一位表示第一个人的选中情况,第二位表示第二个人的选中情况,依此类推: 内容均为字符0和1,1表示此人被选中,0表示此人未被选中,若一张选票人数小于等于5个人时被认为无效的选票。 给定函数ReadDat()的功能是把选票数据读入到字符串数组xx中。 请编制函数CountRs()来统计每个人的选票数并把得票数依次存入yy[0]到yy[9]中。 把结果yy输出到文件OUT.DAT中。 charxx[100][11]; intyy[10] intReadDat(void); voidWriteDat(void); voidCountRs(void) { } voidmain() { inti; for(i=0;i<10;i++) { yy[i]=0; } if(ReadDat()) { printf(\选票数据文件IN.DAT不能打开! \\n\\007\); return; } CountRs(); WriteDat(); } intReadDat(void) { FILE*fp; inti; if((fp=fopen(\IN.DAT\,\r\))==NULL) { return1; } for(i=0;i<10;i++) { if(fgets(xx[i],11,fp)! =NULL) { return1; } xx[i][10]='\\0'; } fclose(fp); return0; } voidWriteDat(void) { FILE*fp; inti; fp=fopen(\OUT.DAT\,\w\); for(i=0;i<10;i++) { fprintf(fp,\%d\\n\,yy[i]); printf(\第%d个人的选票数=%d\\n\,i+1,yy[i]); } fclose(fp); } /*注: 题目要求将那些选了不超过5人的选票视为无效票,即一张选票中如果‘1’不超过5个则为无效选票。 该题先用for()循环对100行选票进行循环,在循环内先进行用for()循环数出这张选票中选中的人数(count)再用if()判断,如果选中人数小于等于5则continue即判断下一张选票,否则用内嵌的for()对行内的数据进行判断,注意如果数据为‘1’时才对对应的人增加1。 */ voidcountrs(void) { inti,j,count; for(i=0;i<300;i++) { count=0; for(j=0;j<10;j++) { if(xx[i][j]=='1') { count++; } } if(count<=5) { continue; } for(j=0;xx[i][j];j++) { if(xx[i][j]=='1') { yy[j]++; } } } } 【项目2】 已知数据文件IN.DAT中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是: 求出千位数上的数加百位数等于十位数上的数加个位数上的数的个数cnt,再求出所有满足此条件的四位数平均值pjz1,以及不满足此条件的四位数平均值pjz2,最后调用写函数writeDat()把结果输出到OUT.DAT文件。 例如: 7153,7+1=5+3,则该数满足条件计算平均值pjz1,且个数cnt=cnt+1。 8129,8+1<>2+9,则该数不满足条件计算平均值pjz2. 程序中已定义数组: a[300],已定义变量: cnt,pjz1,pjz2 inta[300],cnt=0; doublepjz1=0.0,pjz2=0.0; jsValue() { } main() { inti; readDat(); jsValue(); writeDat(); printf(\cnt=%d\\n满足条件的平均值pzj1=%7.21f\\n不满足条件的平均值pjz2=%7.21f\\n\,cnt,pjz1,pjz2); } readDat() { FILE*fp; inti; fp=fopen(\in.dat\,\r\); for(i=0,i<300;i++) { fscanf(fp,\%d\,&a[i]); } fclose(fp); } writeDat() { FILE*fp; inti; fp=fopen(\out.dat\,\w\); fprintf(fp,\%d\\n%7.21f\\n%7.21f\\n\,cnt,pjz1,pjz2); fclose(fp); } /*注: 参考。 */ jsvalue() { inti,g,s,b,q,k=0; for(i=0;i<300;i++) { g=a[i]%10; s=a[i]%100/10; b=a[i]/100%10; q=a[i]/1000; if((q+b)==(s+g)) { cnt++; pjz1+=a[i]; } else { k++; pjz2+=a[i]; } } pjz1/=cnt; pjz2/=k; } 项目一十三、动态内存分配 一、实训目的 掌握计算机内存管理的基本原理和方法,能进行简单的动态内存分配 二、实训内容 程序内存管理方法 动态内存申请 动态内存回收 三、实训过程 【项目1】 定义一个整形数据指针,使用该指针动态分配一个长度不确定的数组(数组长度由用户在运行程序时随机输入),对该数组进行初始化、运算等,并求该数组的长度和占用空间的大小,最后对数组进行动态的内存释放。 注意: 掌握动态内存的分配和释放方法。 【项目2】 定义一个整形数据指针,使用该指针动态分配一个行长度和列长度都不确定的数组(数组的行长度和列长度都由用户在运行程序时随机输入),对该数组进行初始化、运算等,并求该数组的长度和占用空间的大小,最后对数组进行动态的内存释放。 注意: 掌握态内存的分配和释放方
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux开发基础 Linux 开发 基础 项目 指导书