西北工业大学-操作系统实验报告-实验三.doc
- 格式:doc
- 大小:146.52 KB
- 文档页数:5
操作系统实验指导书实验一进程控制与描述一、实验目的通过对 Windows XP编程,进一步熟悉操作系统的基本概念,较好地理解Windows XP的结构。
通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解 Windows XP进程的“一生”。
二、实验环境硬件环境:计算机一台,局域网环境;软件环境: Windows XP, Visual C++ 6.0 专业版或企业版。
三、实验内容和步骤第一部分Windows 编程Windows XP可以识别的程序包括控制台应用程序、GUI 应用程序和服务应用程序。
本实验中主要用到的是控制台应用程序和GUI 应用程序。
1、简单的控制台应用程序创建一个名为“Hello ”的应用程序, 在“开始”菜单中单击“程序”-“附件” -“记事本”命令,将程序键入记事本中,并把代码保存为1-1.cpp 。
程序 1-1 Windows XP的GUI应用程序#include <iostream>void main(){Std::cout<<”Hello, Windows XP”<<std::endl;}在“命令提示符”窗口运行CL.EXE ,产生 1-1.EXE 文件:C:\> CL 1-1.cpp运行 1-1.EXE 程序,运行结果是:(如果运行不成功,则可能的原因是什么?)_2、 GUI应用程序Windows XP Professional 下的 GUI 应用程序,使用Visual C++ 编译器创建一个GUI 应用程序,代码中包括了WinMain() 方法,该方法GUI 类型的应用程序的标准入口点。
在“开始”菜单中单击“程序”-“附件” -“记事本”命令,将程序键入记事本中,并把代码保存为1-2.cpp。
程序1-2 Windows XP的 GUI 应用程序// msgbox 项目# include <windows.h>// 标准的 include// 告诉连接器与包括MessageBox API 函数的 user32 库进行连接# pragma comment(lib,“ user32.lib” )//这是一个可以弹出信息框然后退出的筒单的应用程序int APIENTRY WinMain(HINSTANCE/* hInstance */ ,HINSTANCE/* hPrevInstance */ ,LPSTR/* lpCmdLine */,int/* nCmdShow */ ){:: MessageBox(NULL,“ Hello, Windows 2000“ Greetings” ,MB_OK) ;”,// 没有父窗口// 消息框中的文本// 消息框标题// 其中只有一个OK按钮//返回 0 以便通知系统不进入消息循环return(0) ;}也可以利用任何其他文本编辑器键入程序代码,如果这样,例如使用程序,则应该注意什么问题?保存时将文件保存为“.cpp”的 c++文件在“命令提示符”窗口运行CL.EXE ,产生 1-2.EXE 文件:WORD来键入和编辑C:\> CL 1-2.cpp在程序1-2的GUI应用程序中,首先需要Windows.h头文件,以便获得传送给WinMain()和MessageBox() API 函数的数据类型定义。
操作系统实验报告学生学院计算机学院专业班级12级网络1班学号**********学生姓名沙宇丰指导教师李敏2015 年01月07日目录1 实验一进程调度………………………………………………………………2 实验二作业调度………………………………………………………………3 实验三存储管理………………………………………………………………实验一进程调度(实现了最高优先级优先,时间片轮转,多级反馈队列三种算法)1、实验目的编写并调试一个模拟的进程调度程序,采用最高优先数优先算法,时间片轮转算法,多级反馈队列算法对进程进行调度。
以加深对进程的概念及进程调度算法的理解.2:实验原理每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:进程名、到达时间、需要运行时间、已运行时间、进程状态等等。
每个进程的状态可以是就绪W(Wait)、运行R(Run)两种状态之一。
就绪进程获得CPU后都只能运行一个时间片。
用运行时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程需要继续运行,此时应分配时间片给就绪队列中排在该进程之后的进程,并将它插入就绪队列队尾。
3:实验内容,方法首先对于:最高优先数算法:最高优先数算法的基本思想是把cpu分配给就绪队列中优先数最高的进程。
而我采用优先数动态变化的方式,进程在没获得一次cpu时间后其优先数就减一,然后对各个进程的优先数进行重新排序。
继续把cpu分配给优先数最高的进程。
进程的剩余时间为0时就退出队列。
首先用create()函数创建链表并对其初始化,然后对链表按照优先级大小进行排序,然后把排序后的链表放进processing()函数中进行处理,让其占有一个时间片执行,若进程任然未完成,则把该进程放进insert()函数中插入就绪队列中。
用disp()函数进行进程的显示。
西北工业大学《SOC设计实践》实验报告学院:软件与微电子学院学号:姓名:专业:时间:实验地点:实验一、编写一个自动售货机Verilog HDL模型#2 five_cents=0;#10 ten_cents=1;#2 ten_cents=0;#10$stop;endAUTOSEL AUTOSEL(five_cents,ten_cents,clk,rst_n,soda_out);Endmodule测试波形图如下所示:Autosel-vcs仿真波形最下边一行代表的是投5分,倒数第二行代表的是复位信号,第三行是时钟信号,第二行是投10分,由图可知,在投3个5分,1个5分、1个10分,两个10分,1个10分、1个5分,2个5分、1个10分都可使输出信号为1,满足题意要求。
4)使用Synopsys DC进行综合。
答:autosel.con约束文件如下:##################Constrain#######################reset_design总的面积为25.75um2。
最终的综合电路图:Autosel dc 综合电路三、实验报告要求1)设计思路,状态定义,转台转换图。
2)使用Verilog HDL完成设计。
3)编写testbench。
4)V CS完成仿真,对仿真结果进行分析。
5)编写Synopsys DC综合脚本文件dc.tcl以及约束文件autosel.con。
6)使用Synopsys DC进行综合,给出综合后的报告,包括rc.rpt,rt.rpt,ra.rpt,并做必要说明。
7)综合后的电路图。
四、分析与讨论在做本次试验时,由于刚开始使用的投币信号的脉冲较宽,使得输出信号在时输出信号有效的最后一个信号为高时,状态发生了连续的跳转,最后的输出信实验二、设计PCM30基群帧同步电路一、题目描述设计PCM30基群帧同步电路,该PCM30机群系统结构如下:输入输出信号说明:DATA :输入串行码流,速率为2.04Mb/S;CLK :输入时钟,频率为2.04MHz;/FLOSS :输出失步信号,低电平有效。
西北工业大学《SOC设计实践》实验报告学院:软件与微电子学院学号:姓名:专业:时间:实验地点:实验一、编写一个自动售货机Verilog HDL模型#10$stop;endAUTOSEL AUTOSEL(five_cents,ten_cents,clk,rst_n,soda_out);Endmodule测试波形图如下所示:Autosel-vcs仿真波形最下边一行代表的是投5分,倒数第二行代表的是复位信号,第三行是时钟信号,第二行是投10分,由图可知,在投3个5分,1个5分、1个10分,两个10分,1个10分、1个5分,2个5分、1个10分都可使输出信号为1,满足题意要求。
4)使用Synopsys DC进行综合。
答:autosel.con约束文件如下:##################Constrain#######################reset_designcreate_clock -period 490.2 [get_ports clk]#创建频率为2.04MHz的时钟信号set_clock_latency -source -max 10 [get_clocks clk]set_clock_latency -max 10 [get_clocks clk]set_clock_uncertainty -setup 20 [get_clocks clk]set_clock_transition 10 [get_clocks clk]set_input_delay -max 60 -clock clk [get_ports ten]set_input_delay -max 60 -clock clk [get_ports five]set_driving_cell -lib_cell bufbd7 [all_inputs]set_output_delay -max 80 -clock clk [get_ports out]set_load [load_of cb13fs120_tsmc_max/bufbd7/I] [get_ports out]set_max_area 10000Autosel dc 综合电路三、实验报告要求1)设计思路,状态定义,转台转换图。
实验一TTL集成逻辑门参数测试学号:姓名:班级:日期:一.实验目的(1)加深了解TTL逻辑门的参数意义。
(2)掌握TTL逻辑门电路的主要参数及测量方法。
(3)认识各种电路及掌握空闲端处理方法。
二.实验设备数字电路实验箱,数字双踪示波器,函数信号发生器,数字万用表,74LS00,电位器。
三.实验内容1、函数信号发生器A路产生1kHz,0~5V 的方波信号,用数字示波器观察波形并测量频率/周期、峰峰值:①方波、②频率、③峰峰值、④偏移2、测试与非门的功能将每一个与非门分别接入电路,即检查与非门。
F=AB当输入均为“1”时,实验箱的指示灯不亮,当其中一个为“0”时,指示灯亮。
依次检测每一个与非门电路。
3、用与非门实现与门、或门和异或门○1F=AB=1•AB用原有的一个与非门直接接输入A和B,其输出的接入下一个与非门的输入端,另一个输入端悬空。
在输出即达到与非门实现与门的目的。
○2F=A+B=B1用三个与非门即可实现,一个门输入A信号另一•1•A•个输入悬空,一个门输入B另一个输入悬空;两个输出分别接入下一个门的输入端,接出输出即达到与非门实现或门的目的。
○3F=A ○+B=AB••用一个A和B输入构成与非门(用两次)A•ABB将其输出非别再次将A和B输入接下来的两个与非门。
再将这两个输出接到下一个与非门的输入端,输出即可到达与非门实现异或门的目的。
四.实验结果1、F=AB=AB•1A B F0 0 00 1 01 0 01 1 1A••B•12、F=A+B=13、F=A○+B=A AB••B•AB五.故障排除在做非用与非门实现与门中,不管如何改变输入变量灯一直亮,在74LS00 集成电路无故障情况下,最终检测出一根接输入信号的导线断路,替换有问题导线即可。
六.心得体会这种集成与非门的逻辑器件体积较小,且可以实现多种逻辑电路的连接,很大程度上简化了电路。
实验三二叉排序树的建立和查找一、实验目的1.掌握二叉排序树的建立算法2.掌握二叉排序树查找算法。
二、实验环境操作系统和C语言系统三、预习要求复习二叉排序树的生成及查找算法,编写完整的程序。
四、实验内容实现二叉排序树上的查找算法。
具体实现要求:用二叉链表做存储结构,输入键值序列,建立一棵二叉排序树并在二叉排序树上实现查找算法。
五、参考算法#include <stdio.h>#include <stdlib.h>typedef int InfoType;typedef int KeyType; /*假定关键字类型为整数*/typedef struct node /*结点类型*/{KeyType key; /*关键字项*/InfoType otherinfo; /*其它数据域,InfoType视应用情况而定,下面不处理它*/struct node *lchild,*rchild; /*左右孩子指针*/}BSTNode;typedef BSTNode *BSTree; /*BSTree是二叉排序树的类型*/BSTNode *SearchBST(BSTree T,KeyType key){ /*在二叉排序树T上查找关键字为key的结点,成功时返回该结点位置,否则返回NULL*/if(T==NULL||key==T->key) /*递归的终结条件*/return T; /*若T为空,查找失败;否则成功,返回找到的结点位置*/if(key<T->key)return SearchBST(T->lchild,key);elsereturn SearchBST(T->rchild,key); /*继续在右子树中查找*/}void InsertBST(BSTree *T,int key){ /*插入一个值为key的节点到二叉排序树中*/BSTNode *p,*q;if((*T)==NULL){ /*树为空树*/(*T)=(BSTree)malloc(sizeof(BSTNode));(*T)->key=key;(*T)->lchild=(*T)->rchild=NULL;}else{p=(*T);while(p){q=p;if(p->key>key)p=q->lchild;else if(p->key<key)p=q->rchild;else{printf("\n 该二叉排序树中含有关键字为%d的节点!\n",key);return;}}p=(BSTree)malloc(sizeof(BSTNode));p->key=key;p->lchild=p->rchild=NULL;if(q->key>key)q->lchild=p;elseq->rchild=p;}}BSTree CreateBST(void){ /*输入一个结点序列,建立一棵二叉排序树,将根结点指针返回*/BSTree T=NULL; /*初始时T为空树*/KeyType key;scanf("%d",&key); /*读入一个关键字*/while(key){ /*假设key=0是输入结束标志*/ InsertBST(&T,key); /*将key插入二叉排序树T*/scanf("%d",&key); /*读入下一关键字*/}return T; /*返回建立的二叉排序树的根指针*/ }void ListBinTree(BSTree T) /*用广义表示二叉树*/{if(T!=NULL){printf("%d",T->key);if(T->lchild!=NULL||T->rchild!=NULL){printf("(");ListBinTree(T->lchild);if(T->rchild!=NULL)printf(",");ListBinTree(T->rchild);printf(")");}}}void main(){BSTNode *SearchBST(BSTree T,KeyType key);void InsertBST(BSTree *Tptr,KeyType key);BSTree CreateBST();void ListBinTree(BSTree T);BSTree T;BSTNode *p;int key;printf("请输入关键字(输入0为结束标志):\n");T=CreateBST();ListBinTree(T);printf("\n");printf("请输入欲查找关键字:");scanf("%d",&key);p=SearchBST(T,key);if(p==NULL)printf("没有找到%d!\n",key);elseprintf("找到%d!\n",key);ListBinTree(p);printf("\n");}实验中出现的问题及对问题的解决方案输入数据时,总是不能得到结果,原因是在建立二叉树函数定义中,是对指针的值进行了修改。
操作系统实验报告班级物联网1302班学号姓名实验3 进程同步和通信-生产者和消费者问题模拟1. 目的:调试、修改、运行模拟程序,通过形象化的状态显示,使学生理解进程的概念,了解同步和通信的过程,掌握进程通信和同步的机制,特别是利用缓冲区进行同步和通信的过程。
通过补充新功能,使学生能灵活运用相关知识,培养创新能力。
2. 内容及要求:1) 调试、运行模拟程序。
2) 发现并修改程序中不完善的地方。
3) 修改程序,使用随机数控制创建生产者和消费者的过程。
4) 在原来程序的基础上,加入缓冲区的写互斥控制功能,模拟多个进程存取一个公共缓冲区,当有进程正在写缓冲区时,其他要访问该缓冲区的进程必须等待,当有进程正在读取缓冲区时,其他要求读取的进程可以访问,而要求写的进程应该等待。
5) 完成1)、2)、3)功能的,得基本分,完成4)功能的加2分,有其它功能改进的再加2分3. 程序说明:本程序是模拟两个进程,生产者(producer)和消费者(Consumer)工作。
生产者每次产生一个数据,送入缓冲区中。
消费者每次从缓冲区中取走一个数据。
缓冲区可以容纳8个数据。
因为缓冲区是有限的,因此当其满了时生产者进程应该等待,而空时,消费者进程应该等待;当生产者向缓冲区放入了一个数据,应唤醒正在等待的消费者进程,同样,当消费者取走一个数据后,应唤醒正在等待的生产者进程。
就是生产者和消费者之间的同步。
每次写入和读出数据时,都将读和写指针加一。
当读写指针同样时,又一起退回起点。
当写指针指向最后时,生产者就等待。
当读指针为零时,再次要读取的消费者也应该等待。
为简单起见,每次产生的数据为0-99的整数,从0开始,顺序递增。
两个进程的调度是通过运行者使用键盘来实现的。
4. 程序使用的数据结构进程控制块:包括进程名,进程状态和执行次数。
缓冲区:一个整数数组。
缓冲区说明块:包括类型,读指针,写指针,读等待指针和写等待指针。
5. 程序使用说明启动程序后,如果使用'p'键则运行一次生产者进程,使用'c'键则运行一次消费者进程。
操作系统实验指导书实验一进程控制与描述一、实验目的通过对Windows XP编程,进一步熟悉操作系统的基本概念,较好地理解Windows XP的结构。
通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows XP进程的“一生”。
二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Windows XP,Visual C++ 6.0专业版或企业版。
三、实验内容和步骤第一部分Windows 编程Windows XP可以识别的程序包括控制台应用程序、GUI应用程序和服务应用程序。
本实验中主要用到的是控制台应用程序和GUI应用程序。
1、简单的控制台应用程序创建一个名为“Hello”的应用程序, 在“开始”菜单中单击“程序”-“附件”-“记事本”命令,将程序键入记事本中,并把代码保存为1-1.cpp。
程序1-1 Windows XP的GUI应用程序#include <iostream>void main(){Std::cout<<”Hello, Windows XP”<<std::endl;}在“命令提示符”窗口运行CL.EXE,产生1-1.EXE文件:C:\> CL 1-1.cpp运行1-1.EXE程序,运行结果是:(如果运行不成功,则可能的原因是什么?)_2、GUI应用程序Windows XP Professional下的GUI应用程序,使用Visual C++编译器创建一个GUI应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。
在“开始”菜单中单击“程序”-“附件”-“记事本”命令,将程序键入记事本中,并把代码保存为1-2.cpp。
程序1-2 Windows XP的GUI应用程序// msgbox项目# include <windows.h> // 标准的include// 告诉连接器与包括MessageBox API函数的user32库进行连接# pragma comment(lib, “user32.lib” )// 这是一个可以弹出信息框然后退出的筒单的应用程序int APIENTRY WinMain(HINSTANCE /* hInstance */ ,HINSTANCE /* hPrevInstance */ ,LPSTR /* lpCmdLine */ ,int /* nCmdShow */ ){:: MessageBox(NULL, // 没有父窗口“Hello, Windows 2000” , // 消息框中的文本“Greetings”, // 消息框标题MB_OK) ; // 其中只有一个OK按钮// 返回0以便通知系统不进入消息循环return(0) ;}也可以利用任何其他文本编辑器键入程序代码,如果这样,例如使用WORD来键入和编辑程序,则应该注意什么问题?保存时将文件保存为“.cpp”的c++文件在“命令提示符”窗口运行CL.EXE,产生1-2.EXE文件:C:\> CL 1-2.cpp在程序1-2的GUI应用程序中,首先需要Windows.h头文件,以便获得传送给WinMain() 和MessageBox() API函数的数据类型定义。
实验一汇编运行环境及方法、简单程序设计一、程序说明本程序用来比较两个字符串string1和string2所含的字符是否相同。
若相同则显示‘Match’,否则显示‘Nomatch’。
在程序的数据段先定义两个字符串string1和string2,再定义两个字符串mess1和mess2,分别代表‘Match’和‘Nomatch’。
再代码段比较字符串string1和string2,通过比较判断是否相同。
若相同则显示‘Match’,否则显示‘Nomatch’。
二、调试说明再EDIT中建立ASM文件,再用汇编程序对源程序汇编产生目标文件Obj,再用连接程序产生执行文件EXE。
再用Debug进行调试。
其中常用到的指令有:用-g命令来用运行程序,用-u命令来显示程序,用-d 命令来查看数据段的情况,用-e或-f命令来修改需要改正的部分,用-t指令来逐步执行程序,用-r指令来查看寄存器和修改寄存器的值,-q命令用来退出debug程序。
在这些命令的后面加上地址,可以将命令执行到相应的地方。
如用-g指令运行程序后,再用-u指令显示程序的执行借给如下:三:源程序和执行结果:DATA SEGMENTSTRING1 DB 'Move the cursor backward.' STRING2 DB 'Move the cursor backward.' mess1 db 'match.',10,13,'$'mess2 db 'no match.',10,13,'$'DATA ENDScode segmentmain proc farassume cs:code,ds:DATA,es:DATAstart:mov ax,DATAmov ds,axmov es,axlea si,STRING1lea di,STRING2cldmov cx,25repz cmpsbjz matchlea dx,mess2jmp short dispmatch:lea dx,mess1disp:mov ah,9int 21hmov ah,4chint 21hretmain endpcode endsend start执行结果:实验二用DEBUG编程:使用堆栈段将AX和BX的内容进行交换等一:程序说明:1、设堆栈指针SP=2000H,AX=3000H,BX=5000H;编一程序段将AX和BX的内容进行交换。
实验三 LINUX
的 C 语言编程
一、 实验目的
学习在 FreeBSD 下使用 vi 编辑 c 语言代码,使用
gcc 编译,并运行。
二、 实验内容与要求
1、查阅资料,掌握 vi 编辑器的基本使用,包括两种不同模式的区别,如何在两种模
式之间切换,以及常用的编辑命令等;
2、使用 vi 编写一个 c 程序,要求该程序通过命令行接收用户的输入,其输入参数为
FreeBSD系统中的任意文本文件,接收输入后, c 程序读取该文件内容,并打印在屏幕
上。编辑好后,存为 .c 文件(如 a.c ),使用 gcc 编译该文件,运行结果文件。
3、详细记录学习的内容和实验的整个过程,包括用到的 vi 命令, c 程序源代码, gcc
命令,以及执行结果文件的命令等;
4、对整个实验过程进行分析总结,给出详细步骤;
三、 实验过程
1、vi 编辑器的基本使用
( 1) vi 工作模式及其切换
vi 存在两种模式:指令模式和输入模式。在指令模式下输入的按键将做为指令来处
理:如输入 a, vi 即认为是在当前位置插入字符。而在输入模式下, vi 则把输入的按键当
作插入的字符来处理。指令模式切换到输入模式只需键入相应的输入命令即可(如 a,A ),
而要从输入模式切换到指令模式,则需在输入模式下键入 ESC键,如果不晓得现在是处于
什么模式,可以多按几次 [ESC] 。
(2).
常用命令
1.vi# 在命令行中输入 vi, 进入 vi 编辑器
2.i# 按一下 i 键, 下端显示 --INSERT--
# 插入命令 , 在 vi 中可能任意字符都有作用
3.Esc#
退出
i(
插入 ) 命令进行其它命令使用
4.:r #
读入一个文件内容
, 并写入到当前编辑器中
5.:w new#
将该编辑器中的内容写入到一个新文件中
6.:w# 在编辑的过程中保存文件 , 相当于 word
中的
ctrl+s
7.:! command#
暂时离开 vi 到指令列模式下执行 command 的显示结果!例如
:!ls# 在编辑过程中执行 shell 命令 ls
8.:sh# 进入 shell
命令行 , 执行完命令后 ctrl+d 退出重新进入 vim 编辑继续编辑
在 shell 命令下,执行 ctral+l 完成清屏
9.:wq# 保存文件并退出
10.ZZ# 保存文件并退出 , 同上一个命令 , 注意大写
11.:q!#
强制退出 , 不保存
12.:set number
或者:
set nu#
使编辑中的文件显示行号
13.:set nonumber
或者: set nonu 14.:help i# 查看插入命令帮助 #与上一条命令相反 , 不显示行号
15.u
#撤消上一步操作
16./Fedora#
查找 Fedora
字符
17.:s /Fedora/Redhat# 将 Fedora 字符替换为 Redhat( 只替换在光标所在的行 )
18.dw# 删除单词, dd#删除行
19.o# 打开空白一行
20.vim + #
进行文件最后一行进行编辑
21.vim +n # 进入文件第 n 行进行编辑
22.:1,.s/redhat/fedora#. 号表示当前行
, 即光标所在行
#将第 1 行到当前行 (.) 第一次出现的 redhat 字符代替为 fedora
23.:1,.s/redhat/fedora/g# 将第 1 行到当前行 (.) 所有出现的 redhat
字符代替为
fedora,g 全局标志
24.:1,$s/redhat/fedora/g#$
表示最后一行
# 将第 1 行到最后一行所有出现的 redhat 字符代替为 fedora
25.:%s/redhat/fedora/g#
同上一个命令
26.:%s/redhat\/fedora/g
# 将第 1 行到最后一行所有出现的 redhat 字代替为 fedora
# 字 , 而不是字符
27.:f# 显示文件内容
, 状态等等
# 同 ctrl+g 命令
28.:e!#
当前文件 , 返回到上次保存
:e file#
切换编辑文件
29.:n# 当编辑时有多个文件 ( 比如 vim file1 file2) 时切换到下一个文件
, 与 :e file
结合使用
基本使用如下图所示:
2
、使用 vi 编写一个 c 程序,读取文件内容,并打印在屏幕上。
假设读取文件 a.txt 中的内容, a.txt
中的内容如下图所示:
源程序为
a.c,源程序内容如下所示:
#include
#include
#include
int main(void)
{
int ch = 0;
FILE *fp = NULL;
char s[100];
printf(" 请输入文件名: \n");
scanf("%s", s);
fp = fopen(s, "r");
if (fp == NULL)
{
printf("\nCann't open the file!");
exit(1);
}
else
{
while ( ( ch = fgetc(fp) ) != EOF)
{
putchar(ch);// 或者 printf("%c", ch);
}
printf("\n");
fclose(fp);
}
return 0;
}
运行结果如下图所示:
四、 实验分析与总结
在实验过程中,遇到了不少问题,在使用 vi 时,由于对命令不熟悉,导致试验进
度很慢,还经常出错。经过查阅相关资料,不断的练习,慢慢熟悉了命令的使用。
经过本次实验,我掌握了如何在 FreeBSD 下使用 vi 编辑器和 vi 的常用命令, 并
知道了如何使用 vi 编辑 c 语言代码,使用
gcc 编译,并运行。