POJ 2775

 

#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; }

上述的题目:

 

Time Limit:
1000ms
Memory limit:
65536kB
题目描述
在计算机上看到文件系统的结构通常很有用。Microsoft Windows上面的"explorer"程序就是这样的一个例子。但是在有图形界面之前,没有图形化的表示方法的,那时候最好的方式是把目录和文件的结 构显示成一个"图"的样子,而且使用缩排的形式来表示目录的结构。比如:

ROOT

| dir1

| | file1

| | file2

| | file3

| dir2

| dir3

| | file1

file1

file2


这个图说明:ROOT目录包括两个文件和三个子目录。第一个子目录包含3个文件,第二个子目录是空的,第三个子目录包含一个文件。
输入
你的任务是写一个程序读取一些测试数据。每组测试数据表示一个计算机的文件结构。每组测试数据以'*'结尾,而所有合理的输入数据以'#'结 尾。一组测试数据包括一些文件和目录的名字(虽然在输入中我们没有给出,但是我们总假设ROOT目录是最外层的目录)。在输入中,以']'表示一个目录的 内容的结束。目录名字的第一个字母是'd',文件名字的第一个字母是'f'。文件名可能有扩展名也可能没有(比如fmyfile.dat和 fmyfile)。文件和目录的名字中都不包括空格。
输出
在显示一个目录中内容的时候,先显示其中的子目录(如果有的话),然后再显示文件(如果有的话)。文件要求按照名字的字母表的顺序显示(目录 不用按照名字的字母表顺序显示,只需要按照目录出现的先后显示)。对每一组测试数据,我们要先输出"DATA SET x:",这里x是测试数据的编号(从1开始)。在两组测试数据之间要输出一个空行来隔开。

你需要注意的是,我们使用一个'|'和5个空格来表示出缩排的层次。
样例输入
file1
file2
dir3
dir2
file1
file2
]
]
file4
dir1
]
file3
*
file2
file1
*
#
样例输出
DATA SET 1:
ROOT
| dir3
| | dir2
| | file1
| | file2
| dir1
file1
file2
file3
file4

DATA SET 2:
ROOT
file1
file2
提示
一个目录和它的子目录处于不同的层次
一个目录和它的里面的文件处于同一层次

写了一中午,开始想的太复杂了,后来发现直接考虑就行,不像递归的程序,但用了递归的思想,没想到竟然一次就AC了,虽然不是难题,也庆贺一下吧~~

你可能感兴趣的:(File,测试,Microsoft,input,include,图形)