“软件工程(C编码实践篇)”实验报告(三)
“软件工程(C编码实践篇)”实验报告(三)
逍遥蓝云 发表于2年前
“软件工程(C编码实践篇)”实验报告(三)
  • 发表于 2年前
  • 阅读 10
  • 收藏 0
  • 点赞 1
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 实验三:内部模块化的命令行菜单小程序V2.0

实验过程

看了课件,看视频,了解了模块化的思想 然后自己实现

实验代码

menu.c

引入头文件

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"link_list.h"
#include<sys/types.h>
#include<unistd.h>
#include<dirent.h>

声明函数

void Help();
void Quit();
void Mkdir();
void Mkfile();
void Ls();

命令的链表

static tDataNode Head[]={
    {"help","this command can list all menu command",Help,&Head[1]},
    {"quit","this command can quit from menu",Quit,&Head[2]},
    {"mkdir","this command can creat a new dir in current dir",Mkdir,&Head[3] },
    {"mkfile","this command can creat a new file in current dir",Mkfile,&Head[4]},
    {"ls","this command can list all file in current dir",Ls,NULL}
};

define

#define CMD_LEN 10
#define NAME_LEN 1028
#define BUF_LEN 1028

main函数

int main()
    {  
        char cmd[CMD_LEN];
        printf("Ctrl c to exit\n"); 
        //循环输入cmd 按Ctrl c退出
        while(printf("command:"),scanf("%s",cmd))
        {
            tDataNode *p=Find_cmd(cmd,Head);  
            if(p==NULL)
            { 
                printf("this command is error\n");
                continue;
            } 
            if(p->handler!=NULL)
            {
                p->handler();
            }
        }
    }

各种命令的函数定义部分

void Help()
    {
        ShowAllcmd(Head);//调用ShowAllcmd函数此函数在link_list.c中
    } 
void Quit()
    {
        exit(0);
    }    
void Mkdir()
    {
        char name[NAME_LEN]; 
        printf("please write down the name of new dir\n");
        scanf("%s",name);
        if(access(name,0)==-1)//判断制定文件夹是否存在
        {
            if(mkdir(name,0777))
            { 
                printf("creat dir failed");
            }
        }
    }
 void Mkfile()
    { 
        char name[NAME_LEN]; 
        printf("please write down the name of new file\n"); 
        scanf("%s",name);
        FILE *file; 
        if(file=fopen(name,"w"))//判断指定文件是是否存在不存在就新建 存在就重写文件
        { 
            printf("create success\n");
        } 
        fclose(file);
    }
 void Ls()
    { 
        char buf[BUF_LEN];    int i=1;
        DIR *dir;    struct dirent *ptr;
        getcwd(buf,sizeof(buf));//获取当前地址
        dir=opendir(buf); 
        while(ptr=readdir(dir))
        { 
            printf("%s\t",ptr->d_name);
            if(i%4==0)
            { 
                printf("\n");
            }    
            i++;
        } 
        printf("\n");
        closedir(dir);
    }

link_list.h

#define CMD_MAX 10 
#define DESC_LEN 1028 
typedef struct DataNode
{ 
    char cmd[CMD_MAX]; 
    char Desc[DESC_LEN]; 
    void  (*handler)(); 
    struct DataNode *next;
}tDataNode; 
tDataNode *Find_cmd(char *cmd,tDataNode *head);
int ShowAllcmd(tDataNode *p);

link_list.c

#include <stdio.h> 
#include <stdlib.h>
#include <string.h> 
#include "link_list.h" 
tDataNode *Find_cmd(char * cmd,tDataNode *head)
    {
        tDataNode *p=head;
        while(p!=NULL)
        { 
            if(!strcmp(p->cmd,cmd))
            {    
                return p;
            }
        p=p->next;
        }  
        return NULL;
    } 
 int ShowAllcmd(tDataNode *head)
    {
        tDataNode *p=head; 
        printf("menu list:\n"); 
        while(p!=NULL)
            {
                printf("%s--%s\n",p->cmd,p->Desc);
                p=p->next;
            }
    }

  

实验代码

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 2
博文 23
码字总数 17574
×
逍遥蓝云
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: