文件结构“图”

40 篇文章 0 订阅

题目

用了递归的思想 参考了一下其他人写的代码写的。。尴尬

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string tem;
int lev = 0;

void myTab()
{
    for(int i = 0;i < lev;++i)
    cout<<"|     ";
}

void myPrint()
{
//cout<<"myPrint"<<endl;
    vector<string> inputData;
    while(cin.peek() != '*')
    {
        if(cin.peek() == 'd')
        {
            //cout<<"mydir"<<endl;
            lev++;
            //cin>>tem;
            getline(cin,tem);
            myTab();
            cout<<tem<<endl;
            myPrint();
        }
        while(cin.peek() == 'f')
        {
//            char ch_tem[100] = {};
//            gets(ch_tem);
//            tem = ch_tem;
        getline(cin,tem);
        //cin>>tem;
        inputData.push_back(tem);
        //getchar();//吃掉回车符号。。。。也可以改成用getline来读取文件名 cin.getline 的参数是字符数组 。。。getline的参数才是string的
        }
        //if(cin.peek()== 10)cout<<"daasd"<<endl;//换行符的asc是 10(LF line feed - new line) 回车的asc是 13(CR carriage return)
        if(cin.peek() == ']')
        {
            //cout<<"my ]"<<endl;
            //cin>>tem;
            getline(cin,tem);
            sort(inputData.begin(),inputData.end());
            for(unsigned k = 0; k < inputData.size(); ++k)
            {
                myTab();
                cout<<inputData[k]<<endl;
            }
            lev--;
            return;
        }
    }
    if(cin.peek() == '*')
    {
        //cout<<"my*"<<endl;
        sort(inputData.begin(),inputData.end());
        for(unsigned k = 0; k < inputData.size(); ++k)
        {
            cout<<inputData[k]<<endl;
        }
        return;
        getline(cin,tem);
    }
}

int main()
{
    freopen("in.txt","r",stdin);
    freopen("outMy.txt","w",stdout);
    int num = 1;
    while(cin.peek() != '#')
    {
        while(cin.peek() != '*')
        {
            lev = 0;
            cout<<"DATA SET "<<num<<":"<<endl;
            cout<<"ROOT"<<endl;
            num++;
            myPrint();
            cout<<endl;
        }
        //cin>>tem;//把 * 吃掉
        getline(cin,tem);
    }
    return 0;
}

参考一

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
char input[200][20];  //输入保存
char str[20];  //每项的输入
char files[200][20];  //保存要输出的文件(只保存最近目录下的,用来排序用)
int blank;//空格的次数
int dirs[200];  //用来表示嵌套的第几次文件,每项纪录的是当前目录在input中的排序
int dnum;  //当前在哪个目录下,和dirs搭配使用
/**
	输出空格
*/
void printBlank(){  
	for(int i=0;i<blank;i++){
		printf("|     ");
	}
}
/**
	排序的函数,搭配qsort
*/
int compare(const void *elem1,const void *elem2)
{
	return (strcmp((char*)elem1,(char*)elem2));
}
//对输入的项进行处理
void process(int pos){
	switch(input[pos][0]){
		case '*':{   //遇到结尾的处理,从当前位置向上数到头,遇到file就保存,准备输出
			int i=pos;
			int j=0;
			while(i>=0){
				if(input[i][0]=='f'){
					strcpy(files[j++],input[i]);
				}
				i--;
			}		
			qsort(files,j,20,compare);
			for(i=0;i<j;i++){
				printBlank();
				puts(files[i]);
			}
			break;
		}
		case 'd':  //遇到目录就输出
			blank++;
			printBlank();
			printf("%s/n",input[pos]);
			dirs[dnum++]=pos;
			process(pos+1);
			break;
		case 'f':  //遇到文件就跳过
			process(pos+1);
			break;
		case ']':{  //愈大]准备打印当前目录下的文件
			
            int i=pos;
			int j=0;
			while(i>dirs[dnum-1]){
				if(input[i][0]=='f'){
					strcpy(files[j++],input[i]);
					input[i][0]='s';
				}
				i--;
			}
			qsort(files,j,20,compare);
			for(i=0;i<j;i++){
				printBlank();
				puts(files[i]);
			}
			if(dnum>1) dnum--;
			blank--;
			process(pos+1);
			break;
		}
	}
	return;
}
int main(){
	
	int i=0;
	int flag=0;
	int n=1;
	while(scanf("%s",str)!=EOF){    //读入字符串
		if(str[0]=='#') break;      //结束
		if(str[0]!='*'){            //一直输入
			strcpy(input[i++],str);
		}else{
		   strcpy(input[i],"*");    //遇到一组结束,准备处理
		   printf("DATA SET %d:/n",n++);
		   printf("ROOT/n");
		   blank=0;
		   process(0);
		   i=0;		
		   puts("");	   		 
		}
       
	}
	system("pause");
    return 0;
}

参考二

#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

struct Dir
{
    string name;
    vector<string> files;
    vector<Dir> dirs;
};

Dir input(string name)
{
    Dir dir;

    string str;
    cin >> str;

    if(str == "#") return dir;

    dir.name = name;

    while(str != "*" && str != "]")
    {
        if(str[0] == 'f') dir.files.push_back(str);
        else dir.dirs.push_back(input(str));

        cin >> str;
    }
    
    return dir;
}

void iprintf(int level,string str)
{
    int i;
    for(i = 0; i < level; ++i)
    {
        cout << "|     ";
    }
    cout << str << endl;
    return;
}

void output(Dir dir,int level)
{
    iprintf(level,dir.name);

    int v_i;
    for(v_i = 0; v_i != dir.dirs.size(); ++v_i) output(dir.dirs[v_i],level + 1);

    sort(dir.files.begin(),dir.files.end());
    for(v_i = 0; v_i != dir.files.size(); ++v_i) iprintf(level,dir.files[v_i]);

    return;
}

int main()
{
    //freopen("C://input.txt","r",stdin);

    int count = 1;

    Dir dir = input("ROOT");
    while(dir.name == "ROOT")
    {

        cout << "DATA SET " << count++ << ":" << endl;
        output(dir,0);
        cout << endl;

        dir = input("ROOT");
    }

    return 0;
}

参考三

这道题刚开始的想法就是把属于文件的名称与一个文件夹中的所有条目存入不同的数组中,然后分别输出。
但是最终做的时候如何去判断到底是ROOT下的文件还是其他的文件夹中的文件。主要还是自己还没有建立递归的思维。
认真思考的话,如果在每次递归的时候才新开数组,而统一把读入‘f’时与读入‘d时分成两种情况处理。
把所有文件都放在一个数组中,并不会改变结果。因为这是递归程序,前面的文件夹中的文件都已经被输出了,
而且因为读到的时候会新开数组,所以并不存在问题。
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
int level=0;//level记录的是文件的层次
char tem[100];//用来消耗输入空行
//解题思想:每次读入一行的时候都用cin.peek检测,然后分别决定是进入递归程序还是保存于数组中以待最后输出
int compare(const void *x,const void *y)//快排
{
	return strcmp((char*)x,(char*) y);
}
void print()
{
	char input[500][100] = {0}, temp[100]={};//input用来存储文件名,所有的读入都会用temp消耗
	int i=0,k=0;
	while(cin.peek()!='*')//当不是结束符的时候
	{
		if(cin.peek ( ) =='d')//读到文件夹的时候
		{
			level++;//用来记录层次
			gets(temp);
			for (int k=0;k<level;k++) //level是层次
				cout<<"|     ";//要求的分隔符
			cout<<temp<<endl;
			print();
		}

		while(cin.peek()  =='f')//读到文件名的时候把其放入input数组中
		{
			gets(input[i++]);
		}

		if(cin.peek ( ) ==']')//当输入结束的时候,输出结果
		{
			gets(temp);
			qsort(input,i,sizeof(input[0]),compare);//对文件排序
			for ( k = 0; k < i; k ++ )
			{
				for ( int m = 0; m < level; m ++ )
					cout << '|' << "     ";//输出代表层次的
				cout << input[k] << endl;
			}
			level--;//把层次减少
			return;
		}
	}
	//由于是递归程序,因此所有在文件夹中的问价都已经被输出,剩余的只是root中的文件
	if(cin.peek ( ) =='*')
	{
		qsort(input,i,sizeof(input[0]),compare);
		for ( k = 0; k < i; k ++ )
		{		
			cout << input[k] << endl;
		}
		return ;
	}
}

int main()
{
	int num=1;
	while(cin.peek()!='#')
	{
		while(cin.peek()!='*')//
		{
			
			level=0;//level是全局变量
			cout<<"DATA SET "<<num<<':'<<endl;
			cout<<"ROOT"<<endl;
			num++;//
			print();//调用函数
			cout<<endl;
		}
		gets(tem);//消耗空行

	}

	return 0;
}





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值