Advertisement
Guest User

Untitled

a guest
May 25th, 2015
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.27 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5.  
  6. #define MAX_SIZE 256
  7.  
  8. /**
  9.  * Implementacni test IB002 2015 - uloha 1 (max 10 bodu)
  10.  *
  11.  * Vyplnte nasledujice udaje:
  12.  * Jmeno:
  13.  * UCO:
  14.  * Skupina (v ktere jste zapsan):
  15.  *
  16.  * V tomto prikladu budete pracovat se stromem, reprezentujici hierarchii unixoveho
  17.  * souboroveho systemu. Uzel stromu Directory reprezentuje jednu slozku. Klic uzlu obsahuje
  18.  * String se jmenem slozky (tento klic musi byt unikatni mezi sourozenci), list nasledniku
  19.  * a ukazatele na rodice (nebudeme ulohu komplikovat simulaci .. a .). Presnejsi popis
  20.  * struktury Directory najdete dole.
  21.  * Vasi ulohou bude v tomto zadani implementovat metodu mkdirp. Ta bude simulovat
  22.  * prikaz mkdir s prepinacem -p. Prikaz mkdir ma za ukol vytvorit adresar v zadane
  23.  * ceste (pro zjednoduseni vzdy budeme adresovat absolutne, tedy celou cestou).
  24.  * Prepinac -p slouzi k tomu, aby v pripade neexistence slozek v ceste k nove vytvarene
  25.  * slozky, byly vytvoreny vsechny chybejici slozky.
  26.  * Vstupem funkce bude String path, coz je retezec, ktery popisuje vetev stromu,
  27.  * kde jednotlive klice jsou rozdeleny znakem "/". Prvni existujici slozka je
  28.  * korenovy adresar, ktery ma jako klic prazdny retezec, jen po nem nasleduje "/".
  29.  *
  30.  * Priklad:
  31.  * mejme cestu: /home/user/Documents
  32.  * ta znaci 4 uzly ve stromu: uzel korenoveho adresare "", uzel "home", uzel "user"
  33.  * a uzel "Documents".
  34.  * Posloupnost prikazu:
  35.  * f.mkdirP("/home/user");
  36.  * f.mkdirP("/tmp/tmp/tmp");
  37.  * f.mkdirP("/tmp/tmp2/tmp");
  38.  * f.mkdirP("/tmp/tmp2/tmp2");
  39.  * f.mkdirP("/tmp/tmp2/tmp2"); //toto nic neprovede
  40.  * f.mkdirP("/home/user/Documents");
  41.  * vytvori tento strom (klice budu nadale obalovat ""):
  42.  *
  43.  *                         "" (= Files.root)
  44.  *                       /                  \
  45.  *                    "home"               "tmp"
  46.  *                      |                /       \
  47.  *                 "Documents"        "tmp"     "tmp2"
  48.  *                                      |       /    \
  49.  *                                    "tmp"  "tmp"  "tmp2"
  50.  *
  51.  * @author Karel Kubicek, Matus Madzin
  52.  */
  53.  
  54.  
  55. /**
  56.  * Struktura Directory predstavuje jeden adresar stromu.
  57.  * String directory_name je klicem, ktery unikatni v dane slozce (tedy nemohou 2
  58.  * slozky se stejnym jmenem mit stejneho rodice).
  59.  * Klic muze byt prazdny retezec jen v pripade korenoveho adresare.
  60.  * parent je ukazatel na rodice, v pripade korenoveho adresare je null
  61.  * List sub_directory je seznam ukazatelu na potomky. Pokud je prazdny,
  62.  * je slozka listem stromu.
  63.  */
  64. typedef struct _directory {
  65.     char* directoryName;
  66.     struct _directory* parent;
  67.     struct _directory* subDirectory[MAX_SIZE];
  68.     int subDirectoryCount;
  69. } Directory;
  70.  
  71. /*
  72.  * Globalni promenna pro ulozeni vysledku funkce pathSplit pro rozdeleni
  73.  * cesty na jednotlive jmena slozek
  74.  * Za platnymi jmeny slozek se nachazi retezec "", muzete tedy iterovat jen po nej
  75.  * nebo muzete zjistit pocet klicu z navratove hodnoty pathSplit
  76.  */
  77. char pathNames[MAX_SIZE][MAX_SIZE];
  78.  
  79. /*
  80.  * Tato funkce rozdeli retazec path podle '/'. Ziskane retezce ulozi v globalni
  81.  * promenne pathNames.
  82.  * @param  retazec ktery chceme rozdelit
  83.  * @return pocet klicu, na ktere byl retezec rozdelen
  84.  */
  85. int pathSplit(char* path);
  86.  
  87. /**
  88.  * vypise pracovni adresar = prevedeni slozky zpet na retezec
  89.  * @param from
  90.  * @param totalPath stores result of the function
  91.  */
  92. int pwd(Directory* from, char *totalPath);
  93.  
  94. /**
  95.  * vlozi do slozky to novou slozku na posledni pozici
  96.  * nekontroluje, zdali slozka se stejnym klicem ve slozce neni, to musite
  97.  * kontrolovat sami
  98.  * @param to ukazatel na Directory, ve ktere chcete novou slozku vytvorit
  99.  * @param name klic nove slozky, neni kontrolovan na jedinecnost
  100.  * @return ukazatel na nove vlozenou slozku
  101.  */
  102. Directory* dirInsert(Directory* to, char* name);
  103.  
  104. /**
  105.  * TODO: naimplementujte funkci mkdirP
  106.  * V pripade, ze vstupni retezec path je NULL, pak nic neprovadite
  107.  * Korenovy adresar jiz existuje, to je jedina slozka, kterou nevytvarite
  108.  * Pro prazdny retezec nevytvarejte slozku, prazdny retezec je jmenem jen
  109.  * korenoveho adresare, ktery nevytvarite vy
  110.  * Tato funkce nebude volana s nesmyslnym vstupem typu nesmysl/home/user,
  111.  * ale vzdy bude volana s / na zacatku
  112.  * V pripade existence cesty nic neprovadite
  113.  *
  114.  * pro rozdeleni cesty pouzijte pathSplit, ktera je okomentovana vyse
  115.  * jestli se retezce rovnaji zjistite pomoci strcmp(prvni, druhy) == 0
  116.  *
  117.  * po volani malloc(sizeof(Directory))
  118.  * nezapomente nastavit vsechny parametry nove slozky, jinak je v nich smeti
  119.  *
  120.  * @param path cesta, kterou mate v pripade neexistence vytvorit
  121.  */
  122. void mkdirP(Directory* root, char* path) {
  123.     //TODO dopsat sem telo funkce
  124. }
  125.  
  126. int main()
  127. {
  128.     /* svuj kod mozete testovat tu: */
  129.  
  130.     /* nasledujuci kod nemente*/
  131.     Directory d;
  132.     d.directoryName = "";
  133.     d.parent = NULL;
  134.     d.subDirectoryCount = 0;
  135.     int ret;
  136.  
  137.     //test 1
  138.     puts("Test 1.:");
  139.     mkdirP(&d, "/home/user");
  140.  
  141.     char homePath[MAX_SIZE];
  142.     Directory* home = d.subDirectory[0];
  143.     pwd(home, homePath);
  144.     if(strcmp(homePath, "/home/") == 0) {
  145.         puts("OK, ");
  146.     }
  147.     else {
  148.         printf("Chyba, cesta mela byt /home/, vase cesta byla %s\n", homePath);
  149.     }
  150.  
  151.     //test 2
  152.     puts("Test 2.:");
  153.     char userPath[MAX_SIZE];
  154.     Directory* user = home->subDirectory[0];
  155.     pwd(user, userPath);
  156.     if(strcmp(userPath, "/home/user/") == 0) {
  157.         puts("OK");
  158.     }
  159.     else {
  160.         printf("Chyba, cesta mela byt /home/user/, vase cesta byla %s\n", userPath);
  161.     }
  162.  
  163.     //test 3
  164.     puts("Test 3.:");
  165.     mkdirP(&d, "/home/user");
  166.     if(d.subDirectoryCount > 1) {
  167.         puts("Chyba, vytvarite 2 slozky stejneho jmena");
  168.     }
  169.     else {
  170.         puts("OK");
  171.     }
  172.  
  173.     //test 4
  174.     puts("Test 4.:");
  175.     mkdirP(&d, "/home/user/Documents");
  176.     Directory* doc = user->subDirectory[0];
  177.  
  178.     char docPath[MAX_SIZE];
  179.     pwd(doc, docPath);
  180.     if(strcmp(docPath, "/home/user/Documents/") == 0) {
  181.         puts("OK");
  182.     }
  183.     else {
  184.         printf("Chyba, cesta mela byt /home/user/Documents/, vase cesta byla %s\n",
  185.                docPath);
  186.     }
  187.  
  188.     //test 5
  189.     puts("Test 5.:");
  190.     mkdirP(&d, "/home/user/tmp");
  191.     mkdirP(&d, "/tmp/tmp/tmp");
  192.     mkdirP(&d, "/tmp/tmp2/tmp");
  193.     mkdirP(&d, "/tmp/tmp2/tmp2");
  194.  
  195.     if(d.subDirectoryCount == 2) {
  196.         puts("OK");
  197.     }
  198.     else {
  199.         printf("Chyba, korenovy adresar mel obsahovat 2 slozky, vas obsahuje %i\n",
  200.                d.subDirectoryCount);
  201.     }
  202.  
  203.     //test 6
  204.     puts("Test 6.:");
  205.  
  206.     if(d.subDirectory[1]->subDirectoryCount == 2 &&
  207.             d.subDirectory[1]->subDirectory[1]->subDirectoryCount == 2) {
  208.         puts("OK");
  209.     }
  210.     else {
  211.         printf("Chyba, adresar /tmp ma obsahovat 2 slozky, vas obsahuje %i\n",
  212.                d.subDirectory[1]->subDirectoryCount);
  213.         printf("nebo, adresar /tmp/tmp2 ma obsahovat 2 slozky, vas obsahuje %i\n",
  214.                d.subDirectory[1]->subDirectory[1]->subDirectoryCount);
  215.     }
  216.   return 0;
  217. }
  218.  
  219. int pathSplit(char* path) {
  220.     char tmp[MAX_SIZE];
  221.     strcpy(tmp, path);
  222.  
  223.     int j = 0;
  224.  
  225.     char *name = strtok(tmp, "/");
  226.  
  227.     while(name != NULL) {
  228.         strcpy(pathNames[j], name);
  229.         name = strtok(NULL, "/");
  230.         j++;
  231.     }
  232.  
  233.     strcpy(pathNames[j], "");
  234.     return j;
  235. }
  236.  
  237. Directory* dirInsert(Directory* to, char* name) {
  238.     Directory* newDir = malloc(sizeof(Directory));
  239.     char* newName = malloc(MAX_SIZE*sizeof(char));
  240.     strcpy(newName, name);
  241.     newDir->directoryName = newName;
  242.     newDir->parent = to;
  243.     newDir->subDirectoryCount = 0;
  244.     to->subDirectory[to->subDirectoryCount] = newDir;
  245.     to->subDirectoryCount++;
  246.     return newDir;
  247. }
  248.  
  249. int pwd(Directory* from, char* totalPath) {
  250.     if(from == NULL) {
  251.         return 0;
  252.     }
  253.  
  254.     char path[MAX_SIZE];
  255.     int i = 0;
  256.  
  257.     while(from != NULL) {
  258.         if(i == 0) {
  259.             strcpy(totalPath, from->directoryName);
  260.             strcat(totalPath, "/");
  261.         }
  262.         else {
  263.             strcpy(path, totalPath);
  264.             strcpy(totalPath, from->directoryName);
  265.             strcat(totalPath, "/");
  266.             strcat(totalPath, path);
  267.         }
  268.  
  269.         from = from->parent;
  270.         i++;
  271.     }
  272.     return 1;
  273. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement