资源描述
计算机系综合性实验
实 验 报 告
课程名称 操作系统实验报告
实验学期 至 年 第 一 学期
学生所在系部 计算机与信息管理系
年级 专业班级 计算机102
学生姓名 王强 黄新潮 张蒙
学号 11030082 11030070 11030077
任课教师 陆丽娜
实验成绩
计算机系制
一种简朴文献系统详细设计
一、实验目
(1)阅读并调试一种简朴文献系统,模仿文献管理工作过程。从而对各种文献操作命令实质内容和执行过程有比较进一步理解。
(2)理解设计一种n个顾客文献系统,每个顾客可以保存M个文献。顾客在一次运营中只能打开一种文献,对文献必要设立保护办法,且至少有create、delete、open、close、read、write等命令。
二、实验规定
1、依照流程图阅读所给文献系统源程序,并对源程序加以注释(注释量达70%以上)。
2、修改、完善该系统,指出程序bug。
三、文献系统功能设计
1. 功能设计
该文献系统是一种多顾客、多任务文献系统。对顾客和顾客文献数目并没有上限。也就是说该系统容许任何顾客申请空间,并且在其目录下文献数目并不做任何限制。
该系统可以支持操作命令如下:
① bye——顾客注销命令。当使用该命令时,顾客退出系统,注销该顾客功能设计并回到登陆界面。
命令格式: bye
② close——删除顾客注册信息命令。执行该命令后,顾客在系统中所有信息,涉及该顾客目录下所有文献都被删除。命令执行完毕后返回登陆界面。
命令格式:close
③ create——在当前目录下创立一种文献,且该文献不能跟当前已有文献重名。该文献管理信息登记在顾客文献信息管理模块中。执行完该命令后回到执行命令行。
命令格式:create>file1
其中:“>”符为提示符,file1为要创立文献名。
④ delete——删除当前顾客目录下一种文献,命令执行完毕返回至命令行。
命令格式:delete>file1
其中:file1为要删除文献名。
⑤ list——显示当前注册目录下所有文献信息,涉及文献名、文献长度、文献操作权限。
命令格式:list
⑥ chmod——变化某个文献执行权限,但前提是该文献是该顾客目录下文献。
命令格式:chmod>file1。
其中:file1为要授权文献名。
⑦ open——在window界面下打开某个文献。执行该命令后,文献file1将用在windows界面下文献形式打开。顾客可以在这个方式中对文献进行修改,并将修改后内容保存。
命令格式:open>file1
其中:file1为要打开文献名。
⑧ read——读文献信息。将文献信息读入并显示在终端上。
命令格式:read>file1
其中:file1为要读文献名。
⑨ write——向某个文献写入新信息。顾客可以选取用覆盖本来内容方式或和在文献末尾追加新信息方式写入信息。 当要退出时输入“#”即可。
(2)系统采用二级文献目录。设立主目录(MFD)和顾客文献目录(UFD),分别以文献方式保存在磁盘中。在主目录中有注册顾客顾客名和另一标志该顾客目录下与否有文献指针标记。顾客文献目录采用顾客名作为文献名保存于磁盘,以便检索时以便相应。在顾客文献目录中保存着该目录下所有文献文献名称、保护码、文献长度。
(3)该系统大量使用高档语言中文献操作函数,因此能实际看到文献创立、写入、读出、删除等效果。
2. 功能设计实现总体流程
3. 重要数据构造
struct UFD
{//顾客文献模块
char filename[32]; //文献名
int safecode; //文献保护码
long length; //文献长度
}*curfile = NULL;
这个是顾客文献模块数据构造,构造体名字是:UFD,在构造体里面定义了三个成员,filename,safecode,length,分别用于存储顾客文献名字,文献保护码,文献长度,*curfile = NULL;,这是一种构造体类型指针,开始初始化为NULL.
struct MFD
{//主文献模块
char username[32];//存储顾客名
bool filepoint;
//顾客目录下文献指针,false表达目录为空,true为该顾客目录中有文献
}*curuser = NULL,*elseuser=NULL;
这个是主文献模块数据构造,有两个成员,username,filepoint,分别用于存储顾客名,顾客目录下面文献指针. *curuser = NULL,*elseuser=NULL;这两个是主文献构造体变量,用于访问构造体里面数据成员
4. 重要功能模块
1. int LoginDisplay() //登陆选项操作函数
2. bool Login(int SELETE)//顾客登陆,注册函数
3. void DisplayUFD() //打印顾客信息,涉及顾客各个文献
4. void ByeFile(bool BOOL)//注销函数,调用次函数顾客可以退出系统
5. bool ClearUserFile()//顾客要将自己注册目录从系统彻底删除
6. void ClearUserMes()//删除顾客所有信息
7. void DeleteUser()//删除顾客注册目录操作
8. void CreatFile()//在当前顾客目录下创立文献
9. void DeleteFile() //删除当前目录下一种文献操作
10. bool QueryModElse(bool BOOL,bool &flag)
//查询其他顾客目录下文献文献
11. bool QueryMod(bool BOOL)//查询权限
12. bool WriteRight(int len,bool BOOL)
//查看与否已经对的地写入到该文献信息中,是则返回真值
13. void WriteLengthToFile(int Len,bool BOOL)
//将文献长度写入文献管理模块中
14. void WriteFile()//向文献写入信息操作
15. void ReadFile()//读文献函数
16. void ChangeMod()//修改某文献执行权限
17. void Execute(int i,int len,int cmdset)//执行命令函数
18. void Command()
//读取顾客输入命令,并将其转换成系统能辨认命令
5.小构成员及分工
负责人:
姓名
模 块
黄新潮
组长分派任务,总结实验心得,分析流程图,给成员解说
王强
对源程序加以注释、修改
张蒙
对源程序读取,运营,截图,完善
四、文献系统功能模块详细设计流程图
1. int LoginDisplay() //登陆选项操作函数
Y
N
Scanf SELETE_1
Return SELETE_1
0<=SELETE_1<=2?
Begin
End
图1 LoginDisplay
2. bool Login(int SELETE)//顾客登陆,注册函数
Other
N
Y
N
Y
N
Y
2
1
SELETE
Search MFD(图2.1)
Ture?
Return Ture
Return False
Scanf name
Begin
LOGIN.exe?
Search MFD(图2.1)
Ture?
Fwrite name
Creat name.exe
End
图2 Login
Scanf name
N
Y
N
Y
此模块重复调用,因而单独列出,到文献尾时仍未找到同名文献/顾客名返回False,反之返回True
搜索xFD
图2.1 Search xFD
Temp=Malloc(xFD)
EOF?
Return Ture
Return False
Begin
Fread(temp,xFD,1,file/login.exe)
Temp=Name
Buffer
End
3. void DisplayUFD() //打印顾客信息,涉及顾客各个文献
Y
N
N
N
Y
Y
Begin
Filepoint
Username.exe
EOF
Temp=Malloc(UFD)
Fread(temp,UFD,1,username.exe)
Cout Temp
Cout No File
End
图3 DisplayUFD
4. void ByeFile(bool BOOL)//注销函数,调用次函数顾客可以退出系统
Y
Y
N
N
Update(True) MFD(图4.1)
Begin
LOGIN.exe
outfilelocate.exe
Remove LOGIN.exe
outfilelocate.exe->LOGIN.exe
End
Cout error
图4 ByeFile
N
Y
Y
N
Y
N
Begin
此模块重复调用,因而单独列出,更新xFD
Update为True只更新,反之会进行删除操作
Temp=Malloc(xFD)
EOF
Fread(Temp,xFD,1,file/login.exe)
Temp=username
Buffer
Update
Fwrite(Temp,xFD,1,outfilelocate.exe)
End
图4.1 Update xFD
5. bool ClearUserFile()//顾客要将自己注册目录从系统彻底删除
N
Y
Y
N
Begin
File=username.exe
File
EOF
Temp=Malloc(UFD)
Fread(Temp,UFD,1,file)
Remove Temp->file
Return True
End
图5 ClearUserFile
6. void ClearUserMes()//删除顾客所有信息
Name=username.exe
Remove Name
Update(False) MFD(图4.1)
End
图6 ClearUserMes
Begin
7. int DeleteUser()//删除顾客注册目录操作
Other
Y
‘Y’||‘y’
End
图7 DeleteUser
Begin
ch
Scanf ch
R
R=ClearUserFile(图5)
ClearUserMes(图6)
Return 1
8. void CreatFile()//在当前顾客目录下创立文献
N
Other
N
‘Y’||‘y’
Y
Y
Begin
Buffer
Scanf Ch
Fread(NewFile,UFD,1,username.exe)
Server&Set Buffer
Cout error
End
图8 CreatFile
Can Write
Ch
Scanf Buffer
Cout Ture
NewFile=Malloc(UFD)
9. void DeleteFile() //删除当前目录下一种文献操作
Other
N
‘Y’||‘y’
N
Y
Y
Begin
Ture?
Ch
Scanf Ch
Remove Buffer
End
图9 DeleteFile
Search UFD(图2.1)
Name.exe
Update(False) UFD(图4.1)
10. bool QueryModElse(bool BOOL,bool &flag)//查询其他顾客目录下文献文献
N
N
N
N
Y
Y
Y
31||33
Y
Y
N
N
Y
Begin
Temp.File=Buffer
Cout error
Fread(Temp,UFD,1,user.exe)
Return True
End
图10 QueryModElse
EOF?
Temp?
Return False
Temp=Malloc(UFD)
BOOL
32||33
11. bool QueryMod(bool BOOL)//查询权限
N
N
Y
Y
N
Y
N
N
N
Y
Y
Begin
Username.exe
EOF
Fread(temp,UFD,1,username.exe)
Return True
Else=Malloc(MFD)
End
图11 QueryMod
buffer
temp=Malloc(UFD)
EOF
Fread(Else,MFD,1,Login.exe)
Username=Else
Ture
QueryModElse(图10)
Return False
12. bool WriteRight(int len,bool BOOL) //查看与否已经对的地写入到该文献信息中,是则返回真值
N
Y
N
N
Y
Y
N
Y
N
N
Y
Y
Begin
Username.exe
EOF
Fread(temp,UFD,1,username.exe)
Length=len
Return False
End
图12 WriteRight
temp=Malloc(UFD)
Buffer
Fwrite(temp,UFD,1,outfilelocate.exe)
outfilelocate.exe
Length+len
EOF
Buffer
Fread(temp,UFD,1,username.exe)
BOOL
Remove username.exe
outfilelocate.exe ->username.exe
Return Ture
13. void WriteLengthToFile(int Len,bool BOOL)//将文献长度写入文献管理模块中
N
Y
Y
Y
N
N
Begin
LOGIN.exe
Fread(Else,MFD,1,LOGIN.exe)
End
Cout error
图13 WriteLengthToFile
Else=Malloc(MFD)
EOF
WriteRight(图12)
True?
14. void WriteFile()//向文献写入信息操作
N
N
2
Other
Y
Y
2
1
Y
Y
N
N
Begin
Buffer
End
Get char
图14 WriteFile
Scanf Chmod
Chmod
QueryMod(true)(图11)
True?
Char!=#
Fput(char,buffer)
Get char
Char!=#
Fput(char,buffer)
WriteLength
ToFile (图11)
Cout error
15. void ReadFile()//读文献函数
N
Y
Y
Y
N
N
Begin
True?
Putchar(ch)
End
Cout error
图15 ReadFile
Fgetchar(buffer)
Buffer
QueryMod(False)(图12)
EOF?
16. void ChangeMod()//修改某文献执行权限
Other
Y
N
‘Y’||‘y’
Begin
True?
Scanf Mod
End
Cout error
图16 ChangeMod
Printf Mod Test
Ch
Search UFD(图2.1)
Scanf ch
Update UFD(图4.1)
Remove username.exe
outfilelocate.exe->username.exe
17. int Execute(int i,int len,int cmdset)//执行命令函数
9
8
7
6
5
4
2
3
1
N
Y
N
Y
Begin
Cmd[i]!=0
Buffer[i]=Cmd[i]
End
Cout error
图17 Execute
ListAllFile
Buffer?
ChangeMod(图16)
ByeFile(图4)
OpenFile
Return Temp
cmdset
DeleteUser(图7)
CreatFile (图8)
DeleteFile (图9)
ReadFile (图15)
WriteFile (图14)
18. void Command()//读取顾客输入命令,并将其转换成系统能辨认命令
Y
N
Y
N
Y
N
Y
Begin
1
Scanf cmd
End
图18 Command
Buffer[i]=cmd[i]
‘>’||‘ ’||len-1
Cmdset=0||mid
二分查找命令编号
Cmdset
EndIt?
Execute(图17)
五、实验运营成果
/*****************************************************************
* 文献名:Simple_file_system.c
* 功 能:简朴文献管理系统模仿程序
*******************************************************************/
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "conio.h"
#include<dos.h>
#define NULL 0
#define keynum 10
#define getspace(type) (type*)malloc(sizeof(type)) //宏定义 申请内存
char cmd[64]; //存储顾客输入命令
char buffer[36];//
char user[32];//存储当前登陆顾客名
typedef char ALFA[12];
ALFA KWORD[keynum];
//------------------------------------------------------------------------------------------------
struct UFD{//顾客文献管理模块
char filename[32]; //文献名
int safecode; //文献保护码
long length; //文献长度
}*curfile = NULL;
//------------------------------------------------------------------------------------------------
struct MFD{//顾客登陆信息管理模块
char username[32];//顾客名
bool filepoint; //顾客目录下文献指针,false表达目录为空,true为该顾客目录中有文献
}*curuser = NULL,*elseuser=NULL;
typedef UFD UFD; //重命名
typedef MFD MFD;
void main();
//------------------------------------------------------------------------------------------------
void KeyWord()//初始化命令核心字
{
strcpy(KWORD[ 1],"bye"); //顾客注销命令
strcpy(KWORD[ 2],"chmod"); //变化文献执行权限
strcpy(KWORD[ 3],"close"); //删除顾客注册信息
strcpy(KWORD[ 4],"create"); // 在当前目录下创立一种文献
strcpy(KWORD[ 5],"delete"); //删除当前顾客目录下一种文献
strcpy(KWORD[ 6],"list"); //显示当前注册目录下所有文献信息
strcpy(KWORD[ 7],"open"); //打开文献
strcpy(KWORD[ 8],"read"); //读文献信息
strcpy(KWORD[ 9],"write"); //向文献写入新信息
}
//------------------------------------------------------------------------------------------------
int LoginDisplay() //登陆选项操作函数
{
int SELETE_1 = 0; //定义整型数存储选项
do //循环控制
{
cout<<" *****请选取操作*****\n1、顾客登陆 2、顾客注册 0、退出"<<endl; //显示登陆选项界面
cin>>SELETE_1; //输入要选取命令
}while(SELETE_1<0 || SELETE_1>2); //选项判断
system("cls"); //清屏
return SELETE_1; //返回选项数
}
//------------------------------------------------------------------------------------------------
bool Login(int SELETE)//顾客登陆,注册函数
{
FILE *fp,*fp1,*fp2; //定义文献
char name[12]; //定义数组存储登录名
switch(SELETE) //switch选取
{
case 1://顾客登陆
if((fp = fopen("LOGIN.exe","rb")) == NULL)//打开顾客注册目录管理文献
{
cout<<"\n错误:不能打开登陆文献。"<<endl; //显示错误
getch(); //读取结束符
system("cls"); //清屏
return false; //返回
}
curuser = getspace(MFD); //顾客名申请空间
cout<<"\n*****登陆*****\n顾客名:"; //显示
cin>>name; //输入顾客登陆名
while(!feof(fp)) //检查该顾客与否合法
{
fread(curuser,sizeof(MFD),1,fp); //文献读取
if(strcmp(curuser->username,name)==0) //比较输入顾客名与否与存在顾客名相似
break;
}
if(feof(fp)) //如果没有找到跟当前登陆顾客名相似管理信息,执行下列代码
{
cout<<"\n错误:该顾客不存在。"<<endl; //显示“错误:该顾客不存在”
fclose(fp); //关闭文献
return false; //返回
}
else
{
fclose(fp); //关闭文献
return true; //返回
}
break; //跳出
case 2: //新顾客注册
if((fp=fopen("LOGIN.exe","ab"))==NULL)//如果登陆信息管理文献不存在
fp=fopen("LOGIN.exe","wb+"); //创立该信息管理文献
char name[12];
curuser = getspace(MFD); //顾客申请空间
while(1)
{
cout<<"\n *****新顾客注册*****"<<endl;
cout<<"顾客名:";
cin>>name; //输入顾客注册名
fp1 = fopen("LOGIN.exe","rb"); //打开登陆文献,只容许读数据
while(!feof(fp1))//查看该顾客名与否被别顾客占用
{
fread(curuser,sizeof(MFD),1,fp1); //文献读取
if(strcmp(curuser->username,name) == 0)
{
cout<<"\n该顾客已经存在,请重新输入!"<<endl;//该名称已经被使用
getch(); //读取结束符
break; //跳出
}
}
if(feof(fp1))//该名称没有被别顾客占用
{
strcpy(curuser->username,name); //拷贝输入顾客名到顾客名构造体
curuser->filepoint = NULL; //文献指针置空
fwrite(curuser,sizeof(MFD),1,fp); //顾客信息写入文献
strcpy(user,curuser->username); //生成顾客文献管理模块
strcat(user,".exe"); //用于管理顾客目录下各个文献
fp2=fopen(user,"wb+"); //打开文献,容许读和写
fclose(fp2); //关闭fp2
cout<<"\n注册成功!"<<endl; //提示注册成功
LoginDisplay();
fclose(fp1); //关闭fp1
fclose(fp); //关闭fp
break;
}
}
fp = fopen("LOGIN.exe","rb"); //显示当前注册顾客名称
while(1)
{
fread(curuser,sizeof(MFD),1,fp); //文献读取
if(feof(fp)) //检查与否最后顾客
break;
cout<<curuser->username<<endl; // 显示顾客名
getch(); //读取结束符
}
fclose(fp); //关闭文献
return true; //返回
break;
default:
return false; //返回
break; //返回到上一层
}
}
//------------------------------------------------------------------------------------------------
void DisplayUFD()//打印顾客信息,涉及顾客各个文献
//名称、长度和操作权限设立信息
{
if(curuser->filepoint == false) //当前顾客目录下没有任何文献存在
cout<<"\n顾客 "<<curuser->username<<" 文献夹是空"<<endl;
else
{//存在文献,将所有文献信息打印在终端
FILE *fp; //定义文献
char filename[12]; //定义文献名
strcpy(filename,curuser->username); //拷贝顾客名到定义
strcat(filename,".exe"); //扩展名.exe
if((fp=fopen(filename,"rb"))==NULL) //打开顾客文献信息管理模块
{
cout<<"\n无法打开顾客:"<<curuser->username<<" 文献!"<<endl; //显示
getch(); //读取结束符
return;
}
else
{ //读入并将顾客所有文献信息打印在终端
cout<<"顾客:"<<curuser->username<<"目录下文献:"<<endl;
UFD *ufd; //申请文献模块
int i=0;
ufd = getspace(UFD); //申请存储顾客文献模块空间
while(1)
{
fread(ufd,sizeof(UFD),1,fp); //文献读取,把文献信息读到顾客中
if(feof(fp)) //所有输出
break;
else //打印信息
cout<<ufd->filename<<"\t"<<ufd->length<<"\t"<<ufd->safecode<<endl; //输出文献信息
}
}
fclose(fp); //关闭文献
}
}
//------------------------------------------------------------------------------------------------
void ByeFile(bool BOOL)//注销函数,调用次函数顾客可以退出系统
{
FILE *infile,*outfile; //定义文献
char out[50]; //定义数组out[50]
strcpy(out,"outfilelocate.exe"); //拷贝信息到数组
if((infile=fopen("LOGIN.exe","rb"))==NULL)//检查与否保存
{
cout<<"\n保存错误。"; //fclose(infile);
return;
}
else
{
if((outfil
展开阅读全文