天天看點

實驗一

一、        實驗目的

(1)掌握指令解釋程式的原理;

(2)掌握簡單的DOS調用方法;

(3)掌握C語言程式設計初步。

二、        實驗内容和要求

實驗内容

根據教師指定的實驗課題,完成設計、編碼、測試工作。

實驗要求

編寫類似于DOS,UNIX的指令行解釋程式

(1)自行定義系統提示符

(2)自定義指令集(8-10個)

(3)使用者輸入HELP以查找指令的幫助

(4)列出指令的功能,區分内部還是外部指令

(5)使用者輸入QUIT退出

(6)内部指令有dir, cd, md, rd, cls, date, time, ren, copy等。

三、        實驗方法、步驟及結果測試

 1.      源程式名:MiniOS.c

可執行程式名:MiniOS.exe

2.      原理分析及流程圖

1. 指令解釋程式的原理:

指令解釋程式的主要功能是:

接受和執行一條使用者從鍵盤輸入的指令,它通常儲存一張指令名字(動詞)表,其中記錄着所有操作指令及其處理程式的入口位址或有關資訊。

2. 指令解釋程式實作的兩種方式 :

1) 一種是它自身包含了指令的執行代碼;

2) 另一種是由專門的“系統程式” 實作,自身不含指令處理代碼,也不進行處理,僅僅把這條指令對應的指令檔案裝入記憶體執行。例如:在DOS作業系統中,dir、cd、cls等指令的執行代碼包含在系統自身核心中,稱為内部指令;format、help等指令的執行代碼在外部檔案中,稱為外部指令。

3. 程式設計實作流程

顯示程式提示資訊;

While(1)

{ 顯示提示符;

接收鍵盤的字元串;

判斷是否quit程式退出指令,是則退出;

判斷是否内部指令,并給出相應的資訊,否則給出錯誤資訊;

顯示退出程式資訊;

首先查了cmd有哪些指令訓示符,分别有什麼作用,在自己電腦的cmd輸入一些字元看對應的結果。通過在自己電腦輸入指令訓示符複制到程式的顯示輸出中,使得用起來像真的一樣。

#include<stdio.h> 
#include<string.h> //在使用到字元數組時需要使用
#include<stdlib.h>
void main() 
{ 
int system(const char *string);
//定義數組中的值
char cmd[20][20]={"dir","cd","md","rd","cls","date","time","ren","copy","help","quit"}; 
char str[20];
//Init(str);
printf("Microsoft Windows [版本 10.0.10240]\n");//設定标題
printf("(C) 2015 Microsoft Corporation. All rights reserved.\n");
while(1)//進入函數循環
{
printf("\nC:\\Users\\Carson>");
gets(str);
int i,date;
for(i=0; '\0' != str[i]; i++)//for循環周遊s串
{ 
if(str[i] >= 'A' && str[i] <= 'Z') //判斷是不是大寫字母
str[i] += 32; //轉換成小寫
}
if(strcmp(str,cmd[0])==0)//判斷輸入單詞是否與cmd數組中的對應
{ 
//system(str);
printf("dir 内部指令:顯示一個目錄中的檔案和子目錄\n");
printf("\n驅動器 C 中的卷是 系統\n卷的序列号是 0E33-63F0\n\nC:\Users\Carson 的目錄\n\n2016/03/15 09:00 <DIR> .\n2016/03/18 10:00 <DIR> Music\n2016/03/14 11:00 <DIR> Photo\n2016/03/13 12:00 <DIR> Video\n2016/03/19 13:00 <DIR> Games\n2016/03/12 14:00 <DIR> Searches\n2016/03/11 15:00 <DIR> homework\n 4 個檔案 2,159 位元組\n 19 個目錄 66,666,666,666 可用位元組\n");
}
else if(strcmp(str,cmd[1])==0)
{
printf("C:\\Users\\yj\n");
printf("cd 内部指令:顯示目前目錄的名稱或将其更改\n");
}
else if(strcmp(str,cmd[2])==0)
{
system("md");
printf("md 内部指令:建立一個目錄或檔案夾.dos下面叫目錄,win下面叫檔案夾\n");
}
else if(strcmp(str,cmd[3])==0)
{
system("rd");
printf("rd 内部指令:删除目錄\n");
}
else if(strcmp(str,cmd[4])==0)
{
system("cls");
printf("cls 内部指令:清除螢幕\n");
}
else if(strcmp(str,cmd[5])==0)
{
printf("date 内部指令:顯示或設定日期\n");
printf("目前日期: 2016/03/24 周四\n輸入新日期: (年月日):\n"); 
}
else if(strcmp(str,cmd[6])==0) 
{
printf("目前時間: 14:48:07.86\n");
printf("time 内部指令:顯示或設定系統時間\n");
}
else if(strcmp(str,cmd[7])==0)
{ 
printf("ren 内部指令:重新命名檔案,ren指令的格式是:ren 源檔案名目的檔案名\n");
}
else if(strcmp(str,cmd[8])==0)
{
printf("copy 内部指令:将至少一個檔案複制到另一個位置\n");
}
else if(strcmp(str,cmd[9])==0)
{
printf("dir 顯示一個目錄中的檔案和子目錄\n");
printf("cd 顯示目前目錄的名稱或将其更改\n");
printf("md 建立一個目錄或檔案夾.dos下面習慣叫目錄,win下面習慣叫檔案夾\n");
printf("rd 删除目錄\n");
printf("cls 清除螢幕\n");
printf("date 顯示或設定日期\n");
printf("time 顯示或設定系統時間\n");
printf("ren 重新命名檔案,ren指令的格式是:ren 源檔案名目的檔案名\n");
printf("copy 将至少一個檔案複制到另一個位置\n");
printf("help 提供Windows指令的幫助資訊\n");
printf("quit 退出指令解釋程式\n");
printf("\n有關工具的詳細資訊,請參閱聯機幫助中的指令行參考。\n");
}
else if(strcmp(str,cmd[10])==0)
return;
else
{
printf("'%s' 不是内部或外部指令,也不是可運作的程式\n或批處理檔案。\n",str);
}
}
}      
實驗一
實驗一