实验内容:通过对具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件零碎内部功能和实现过程的理解。
要求:1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件零碎。
在退出这个简单的文件零碎时,将该虚拟文件零碎保存到磁盘上,以便下次再将它恢复到内存的虚拟磁盘空间中。
2.提供以下操作:•new:建立一个新的简单文件零碎;
•sfs:打开一个简单文件零碎;
•exit:退出打开的简单文件零碎;
•mkdir:创建子目录;
•rmdir:删除子目录;
•ls:显示目录;
•cd:更改当前目录;
•create:创建文件;
•open:打开文件;
•close:关闭文件;
•read:读文件;
•write:写文件;
•delete:删除文件。
2023/2/8 22:26:49 16KB 文件系统
1
源代码,一看就知道!开头部分,下面的本人下载下来看吧!publicpartialclassLoginForm:Form{publicstaticstringuacc;publicstaticstringupsw;publicstaticstringuname;publicstaticstringusex;publicstaticstringupart;publicstaticstringuright;publicLoginForm(){InitializeComponent();}privatevoidloginbtn_Click(objectsender,EventArgse){if(this.useracctxt.Text.Trim()==""&&this.pswtxt.Text==""){MessageBox.Show("请输入您的用户名和密码!","提示!");return;}try{stringsql;sql="select*fromtb_userwhereuacc='"+this.useracctxt.Text+"'andupsw='"+this.pswtxt.Text+"'";OleDbDataReaderdr=DBHelp.OleReader(sql);dr.Read();if(dr.HasRows){uacc=this.useracctxt.Text;upsw=this.pswtxt.Text;uname=dr["uname"].ToString();usex=dr["usex"].ToString();upart=dr["upart"].ToString();uright=dr["uright"].ToString();MainFormaf=newMainForm(this);this.Hide();this.useracctxt.Clear();this.pswtxt.Clear();af.Show();}else{MessageBox.Show("账号或密码错误!","提示!");this.useracctxt.Clear();this.pswtxt.Clear();this.useracctxt.Focus();}}catch(Exception){MessageBox.Show("数据库无法连接!","警告!");}}privatevoidcancelbtn_Click(objectsender,EventArgse){Application.Exit();}privatevoidLogi
2021/5/18 13:52:33 466KB C#
1
文件系统的目录结构采用类似Linux的树状结构;
a) 目录的添加、删除、重命名;
b) 目录的显示(列表)c) 文件的添加、删除、重命名d) 文件和目录的拷贝用户进入时显示可用命令列表;
用户输入help时显示所有命令的协助文档;
用户输入exit时退出该系统,开发语言选用C/C++
1
1.账户类(满分50分)版本1:满分10分设计Account1类,包含:■一个名为id的int类型的私有数据域(默认值为0),长度为6位。
■一个名为balance的double类型的私有数据域(默认值为0)。
■一个名为annualInterestRate的double类型的私有数据域存储当前利率(默认值为0)。
假设所有的账户都有相同的利率。
■一个名为dateCreated的Date类型的私有数据域存储账户的开户日期。
■一个能创建默认账户的无参构造方法。
■一个能创建带特定id和初始余额的构造方法,初始余额不能为负数。
■id、balance和annualInterestRate的访问器和修改器。
■dateCreated的访问器。
■一个名为getMonthlyInterestRate的方法返回月利率。
■一个名为withDraw的方法从账户提取特定金额。
■一个名为deposit的方法向账户存人特定金额。
■double类型的数据域保留2位小数。
■成员方法和数据域应进行基本的合理性检查。
设计测试类ATMMachine1:■创建一个有100个账户的数组,其id为0,1,2,...99,并初始化收支为1000美元。
■主菜单如下(可参考教材中文版P296或英文版P367):Mainmenu1:checkbalance2:withdraw3:deposit4:exit版本2:满分20分扩展Account1类为Account2类:■Account2类继承Account1类。
■为Account2类新增一个名为password的String类型的私有数据域存储账号密码。
password只能为字母或数字,长度不能小于6且不能大于10。
密码显示时为*******。
■为Account2类新增一个名为name的String类型的私有数据域存储客户名字。
■为Account2类新增一个名为transactions的ArrayList类型的新数据域,其为客户存储买卖记录。
这要求新建一个名为Transaction的类,类的定义请参照教材中文版P327或英文版P404。
每笔买卖都是Transaction类的一个实例。
■新增一个带初始余额的构造方法,其id随机产生,但不能与当前系统的id重复。
若初始余额的参数为负数,则抛出一个自定义异常并在当前构造方法中进行处理。
■重写方法withDraw,要求支取的金额为100的整数倍,并且当日支取金额不能超过5000,支取金额不允许透支。
每进行一次操作应向transactions数组线性表添加一笔买卖。
■重写方法deposit,要求每进行一次操作应向transactions数组线性表添加一笔买卖。
■新增一个方法changePassword,只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码设计测试类ATMMachine2,其主菜单如下(可参考教材中文版P296或英文版P367):Mainmenu0:createaaccount1:checkbalance2:withdraw3:deposit4:detailsofthetransaction5:changepassword6:exit■若用户选择新建一个账号,则应提示用户输入账号password、balance和annualInterestRate,其中id随机产生。
新产生的账户应序列化到名为accounts.dat的文件中。
所有账户只能通过这种方式产生。
■所有用户操作结果应同步到accounts.dat文件中相应账户中。
■所有用户操作应有友好、简介的提示语。
版本3:满分20分请参照银行的ATM机界面,在Account2类的基础上开发一个GUI界面的ATM系统。
要求界面应模拟小键盘,并且账户信息读、写于文件accounts.dat。
2018/6/25 8:47:38 133KB 账户类 ATM
1
/*cole-AfreeCOLElibrary.cole_extract-Extractafilefromafilesystem.Copyright1998,1999RobertoArturoTenaSanchezThisprogramisfreesoftware;youcanredistributeitand/ormodifyitunderthetermsoftheGNUGeneralPublicLicenseaspublishedbytheFreeSoftwareFoundation;eitherversion2oftheLicense,or(atyouroption)anylaterversion.Thisprogramisdistributedinthehopethatitwillbeuseful,butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyofMERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.SeetheGNUGeneralPublicLicenseformoredetails.YoushouldhavereceivedacopyoftheGNUGeneralPublicLicensealongwiththisprogram;ifnot,writetotheFreeSoftwareFoundation,Inc.,59TemplePlace,Suite330,Boston,MA02111-1307USA*//*ArturoTena*/#include/*Tocompilethisfileoutsidecolesourcetree,youmustincludehereinstead*/#include"cole.h"#definePRGNAME"iOLE"#defineBUFFER_SIZE128intmain(intargc,char**argv){ COLEFS*cfs; COLEFILE*cf; COLERRNOcolerrno; charbuffer[BUFFER_SIZE]; size_tchar_read; if(argc!=3){ fprintf(stderr,"cole_extract.Extractafilefroma" "filesystemtothestandardoutput.\n" "Usage:"PRGNAME"\n" "FILE-Filewiththefilesystem.\n" "INFILE-Filenameofthefiletoextract.\n"); exit(1); } printf("%s",argv[1]); cfs=cole_mount(argv[1],&colerrno); if(cfs==NULL){ cole_perror(PRGNAME,colerrno); exit(1); } cf=cole_fopen(cfs,argv[2],&colerrno); if(cf==NULL){ cole_perror(PRGNAME,colerrno); cole_umount(cfs,NULL); exit(1); } while((char_read=cole_fread(cf,buffer,BUFFER_SIZE,&colerrno))){ if(fwrite(buffer,1,char_read,stdout)!=char_read){ break; } } if(!cole_feof(cf)){ cole_perror(PRGNAME,colerrno); cole_umount(cfs,NULL); exit(1); } if(cole_fclose(
2020/2/17 3:19:13 173KB ole格式解析代码
1
本文档是QT中文版本内容详尽,下面是片段信号voidactivated(intid)静态公有成员QKeySequenceshortcutKey(constQString&str)QStringkeyToString(QKeySequencek)(obsolete)QKeySequencestringToKey(constQString&s)(obsolete)保护成员virtualbooleventFilter(QObject*o,QEvent*e)--------------------------------------------------------------------------------详细描述QAccel类用来处理键盘的加速键和快捷键。
键盘加速键是在某个组合键按下的时候出发一个动作,加速键可以处理窗口部件和它子部件里所有的键盘动作所以它不会被键盘焦点所影响。
在大多数情况下,你不需要直接使用这个类。
使用QAction类建立的具有加速键的动作可以同时在菜单和工具栏里使用。
如果你的兴趣只是在菜单里使用QMenuData::insertItem()或者QMenuData::setAccel()建立只作用在菜单里的加速键。
那么许多窗口部件可以自动的生成加速键,比如QButton、QGroupBox、QLabel(使用QLabel::setBuddy())、QMenuBar和QTabBar。
实例:QPushButtonp("&Exit",parent);//自动使用快捷键ALT+Key_EQPopupMenu*fileMenu=newfileMenu(parent);fileMenu->insertItem("Undo",parent,SLOT(undo()),CTRL+Key_Z);QAccel包括一个加速键的列表,这个列表里的项目可以使用insertItem()、removeItem()、clear()、key()和findKey()。
每一个加速键项目是由一个标示符和QKeySequence组成。
一个单独的键组是由一个键盘码组合上改变符形成的(SHIFT,CTRL,ALT或者UNICODE_ACCEL)。
例如,CTRL+Key_p可以作为文本打印的快捷键。
这个键的键盘码在qnamespace.h里列出。
还有,使用UNICODE_ACCEL可以使字符以统一码(unicode)的方式表现出来。
例如UNICODE_ACCEL+'A'所给出的加速键和Key_A是一样的。
2021/9/3 1:28:53 7.15MB QT API 文档中文
1
第一部分简介  第1章简介2  1.1概述2  1.2进程、线程与信息共享3  1.3IPC对象的持续性4  1.4名字空间5  1.5fork、exec和exit对IPC对象的影响7  1.6出错处理:包裹函数8  1.7Unix标准9  1.8书中IPC例子索引表11  1.9小结13  习题13  第2章PosixIPC14  2.1概述14  2.2IPC名字14  2.3创建与打开IPC通道16  2.4IPC权限18  2.5小结19  习题19  第3章SystemVIPC20  .3.1概述20  3.2key_t键和ftok函数20  3.3ipc_perm结构22  3.4创建与打开IPC通道22  3.5IPC权限24  3.6标识符重用25  3.7ipcs和ipcrm程序27  3.8内核限制27  3.9小结28  习题29  第二部分消息传递  第4章管道和FIFO32  4.1概述32  4.2一个简单的客户-服务器例子32  4.3管道32  4.4全双工管道37  4.5popen和pclose函数39  4.6FIFO40  4.7管道和FIFO的额外属性44  4.8单个服务器,多个客户46  4.9对比迭代服务器与并发服务器50  4.10字节流与消息51  4.11管道和FIFO限制55  4.12小结56  习题57  第5章Posix消息队列58  5.1概述58  5.2mq_open、mq_close和mq_unlink函数59  5.3mq_getattr和mq_setattr函数61  5.4mq_send和mq_receive函数64  5.5消息队列限制67  5.6mq_notify函数68  5.7Posix实时信号78  5.8使用内存映射I/O实现Posix消息队列85  5.9小结101  习题101  第6章SystemV消息队列103  6.1概述103  6.2msgget函数104  6.3msgsnd函数104  6.4msgrcv函数105  6.5msgctl函数106  6.6简单的程序107  6.7客户-服务器例子112  6.8复用消息113  6.9消息队列上使用select和poll121  6.10消息队列限制122  6.11小结124  习题124  第三部分同步  第7章互斥锁和条件变量126  7.1概述126  7.2互斥锁:上锁与解锁126  7.3生产者-消费者问题127  7.4对比上锁与等待131  7.5条件变量:等待与信号发送132  7.6条件变量:定时等待和广播136  7.7互斥锁和条件变量的属性136  7.8小结139  习题139  第8章读写锁140  8.1概述140  8.2获取与释放读写锁140  8.3读写锁属性141  8.4使用互斥锁和条件变量实现读写锁142  8.5线程取消148  8.6小结153  习题153  第9章记录上锁154  9.1概述154  9.2对比记录上锁与文件上锁157  9.3Posixfcntl记录上锁158  9.4劝告性上锁162  9.5强制性上锁164  9.6读出者和写入者的优先级166  9.7启动一个守护进程的独一副本170  9.8文件作锁用171  9.9NFS上锁173  9.10小结173  习题174  第10章Posix信号量175  10.1概述175  10.2sem_open、sem_close和sem_  unlink函数179  10.3sem_wait和sem_trywait函数180  10.4sem_post和sem_getvalue函数180  10.5简单的程序181  10.6生产者-消费者问题186  10.7文件上锁190  10.8sem_init和sem_destroy函数191  10.9多个生产者,单个消费者193  10.10多个生产者,多个消费者19
2017/1/14 5:24:31 42.17MB 操作系统
1
JavaSwing编写的终端,windows下运转,实现了ls,pwd,exit,cd几个简单的命里。
2021/11/11 22:01:17 54KB java 终端
1
Linux操作系统中shell是用户与系统内核沟通的中介,它为用户使用操作系统的服务提供了一个命令行界面,用户在shell提示符下输入的每个命令都由shell先解释,然后传给内核执行。
本实验要求用C语言编写一个简单的shell程序,希望达到如下目的:1、 能够执行外部程序命令,命令可以带参数;
2、 能够执行fg、bg、cd、history、exit等内部命令;
3、 使用管道和输入输出重定向;
4、 支持前后台作业,提供作业控制功能,包括打印作业的清单,改变当前运行作业的前/后台状态,以及控制造业的挂起、中止与继续运行;
5、 使用Make工具建立工程;
6、 使用调试器gdb来调试程序;
1
操作系统课的实验(银里手算法)#include"malloc.h"  #include"stdio.h"  #include"stdlib.h"  #definealloclensizeof(structallocation)  #definemaxlensizeof(structmax)  #defineavalensizeof(structavailable)  #defineneedlensizeof(structneed)  #definefinilensizeof(structfinish)  #definepathlensizeof(structpath)  structallocation  {  intvalue;  structallocation*next;  };  structmax  {  intvalue;  structmax*next;  };  structavailable/*可用资源数*/  {  intvalue;  structavailable*next;  };  structneed/*需求资源数*/  {  intvalue;  structneed*next;  };  structpath  {  intvalue;  structpath*next;  };  structfinish  {  intstat;  structfinish*next;  };  intmain()  {  introw,colum,status=0,i,j,t,temp,processtest;  structallocation*allochead,*alloc1,*alloc2,*alloctemp;  structmax*maxhead,*maxium1,*maxium2,*maxtemp;  structavailable*avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp,*worktemp1;  structneed*needhead,*need1,*need2,*needtemp;  structfinish*finihead,*finish1,*finish2,*finishtemp;  structpath*pathhead,*path1,*path2;  printf("\n请输入系统资源的种类数:");  scanf("%d",&colum);  printf("请输入现时内存中的进程数:");  scanf("%d",&row);  printf("请输入已分配资源矩阵:\n");  for(i=0;inext=alloc2->next=NULL;  scanf("%d",&allochead->value);  status++;  }  else  {  alloc2=(structallocation*)malloc(alloclen);  scanf("%d,%d",&alloc2->value);  if(status==1)  {  allochead->next=alloc2;  status++;  }  alloc1->next=alloc2;  alloc1=alloc2;  }  }  }  alloc2->next=NULL;  status=0;  printf("请输入最大需求矩阵:\n");  for(i=0;inext=maxium2->next=NULL;  scanf("%d",&maxium1->value);  status++;  }  else  {  maxium2=(structmax*)malloc(maxlen);  scanf("%d,%d",&maxium2->value);  if(status==1)  {  maxhead->next=maxium2;  status++;  }  maxium1->next=maxium2;  maxium1=maxium2;  }  }  }  maxium2->next=NULL;  status=0;  printf("请输入现时系统剩余的资源矩阵:\n");  for(j=0;jnext=available2->next=NULL;  work1->next=work2->next=NULL;  scanf("%d",&available1->value);  work1->value=available1->value;  status++;  }  else  {  available2=(structavailable*)malloc(avalen);  work2=(structavailable*)malloc(avalen);  scanf("%d,%d",&available2->value);  work2->value=available2->value;  if(status==1)  {  avahead->next=available2;  workhead->next=work2;  status++;  }  available1->next=available2;  available1=available2;  work1->next=work2;  work1=work2;  }  }  available2->next=NULL;  work2->next=NULL;  status=0;  alloctemp=allochead;  maxtemp=maxhead;  for(i=0;inext=need2->next=NULL;  need1->value=maxtemp->value-alloctemp->value;  status++;  }  else  {  need2=(structneed*)malloc(needlen);  need2->value=(maxtemp->value)-(alloctemp->value);  if(status==1)  {  needhead->next=need2;  status++;  }  need1->next=need2;  need1=need2;  }  maxtemp=maxtemp->next;  alloctemp=alloctemp->next;  }  need2->next=NULL;  status=0;  for(i=0;inext=finish2->next=NULL;  finish1->stat=0;  status++;  }  else  {  finish2=(structfinish*)malloc(finilen);  finish2->stat=0;  if(status==1)  {  finihead->next=finish2;  status++;  }  finish1->next=finish2;  finish1=finish2;  }  }  finish2->next=NULL;/*Initializationcompleated*/  status=0;  processtest=0;  for(temp=0;tempstat==0)  {  for(j=0;jnext,worktemp=worktemp->next)  if(needtemp->valuevalue)  processtest++;  if(processtest==colum)  {  for(j=0;jvalue+=alloctemp->value;  worktemp1=worktemp1->next;  alloctemp=alloctemp->next;  }  if(status==0)  {  pathhead=path1=path2=(structpath*)malloc(pathlen);  path1->next=path2->next=NULL;  path1->value=i;  status++;  }  else  {  path2=(structpath*)malloc(pathlen);  path2->value=i;  if(status==1)  {  pathhead->next=path2;  status++;  }  path1->next=path2;  path1=path2;  }  finishtemp->stat=1;  }  else  {  for(t=0;tnext;  finishtemp->stat=0;  }  }  else  for(t=0;tnext;  alloctemp=alloctemp->next;  }  processtest=0;  worktemp=workhead;  finishtemp=finishtemp->next;  }  }  path2->next=NULL;  finishtemp=finihead;  for(temp=0;tempstat==0)  {  printf("\n系统处于非安全状态!\n");  exit(0);  }  finishtemp=finishtemp->next;  }  printf("\n系统处于安全状态.\n");  printf("\n安全序列为:\n");  do  {  printf("p%d",pathhead->value);  }  while(pathhead=pathhead->next);  printf("\n");  return0;  }#include"string.h"#include#include#defineM5#defineN3#defineFALSE0#defineTRUE1/*M个进程对N类资源最大资源需求量*/intMAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};/*系统可用资源数*/intAVAILABLE[N]={10,5,7};/*M个进程对N类资源最大资源需求量*/intALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};/*M个进程已经得到N类资源的资源量*/intNEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};/*M个进程还需要N类资源的资源量*/intRequest[N]={0,0,0};voidmain(){inti=0,j=0;charflag='Y';voidshowdata();voidchangdata(int);voidrstordata(int);intchkerr(int);showdata();while(flag=='Y'||flag=='y'){i=-1;while(i=M){printf("请输入需申请资源的进程号(从0到");printf("%d",M-1);printf(",否则重输入!):");scanf("%d",&i);if(i=M)printf("输入的进程号不存在,重新输入!\n");}printf("请输入进程");printf("%d",i);printf("申请的资源数\n");for(j=0;jNEED[i][j]){printf("进程");printf("%d",i);printf("申请的资源数大于进程");printf("%d",i);printf("还需要");printf("%d",j);printf("类资源的资源量!申请不合理,出错!请重新选择!\n");/*printf("申请不合理,出错!请重新选择!\n");*/flag='N';break;}else{if(Request[j]>AVAILABLE[j]){printf("进程");printf("%d",i);printf("申请的资源数大于系统可用");printf("%d",j);printf("类资源的资源量!申请不合理,出错!请重新选择!\n");/*printf("申请不合理,出错!请重新选择!\n");*/flag='N';break;}}}if(flag=='Y'||flag=='y'){changdata(i);if(chkerr(i)){rstordata(i);showdata();}elseshowdata();}elseshowdata();printf("\n");printf("是否继续银里手算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:");scanf("%c",&flag);}}voidshowdata(){inti,j;printf("系统可用的资源数为:\n");printf("");for(j=0;j");}printf("\n");return0;}
2015/11/20 3:54:43 883KB 算法 银行家
1
共 42 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡