Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 1
Регистрация: 03.12.2011
Сообщений: 43

Задачка на рекурсию...

18.12.2011, 20:42. Показов 1010. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
в общем нужно сделать прогу чтоб выводила дерево файлов и папок указанной директории....
Сделать это надо с помощью рекурсии...


Есть вот такая вот заготовка... Она считывает атрибьюты папок по указанному пути, и если папка является директорией выводит ее на печать....
В принципе то что здесь написано можно (и нужно запихнуть в функцию)....

Нужно сделать что....вывелась на печать папка, в этой папке - еще папки - они вывелись с отступом и тд...

Если кто знает можете решение не писать, а просто объяснить как это надо сделать именно с помощью рекурсии и на основе того что у меня здесь накалякано...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <Windows.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    WIN32_FIND_DATAA findData;
    HANDLE hf;
 
    hf = FindFirstFileA("D:\\avr\\*", &findData);
    //"D:\\Garmin\\*"
    if (hf == INVALID_HANDLE_VALUE)
    {
        cout << "Cannot find file" << endl;
        return -1;
    }
 
    do
    {
        if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            cout << "[DIR] ";
            
        cout << findData.cFileName << endl;
        
    }
    while (FindNextFileA(hf, &findData)); 
 
    FindClose(hf);
 
  cin.get();
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.12.2011, 20:42
Ответы с готовыми решениями:

Задачка про деревья на рекурсию
Пасаны, не особо шарю деревья, а еще нужно рекурсия.. Короче нужна помощь, хотя бы объеснить что как должно работать, буду очень...

Задачка на рекурсию
Всем доброго времени суток! Нужна помощь в написании функции на рекурсию. Нужно подсчитать \sum_{i=1}^{n}\sum_{j=1}^{n} ( {i}^{j} - i) ...

Народ задачка на рекурсию
Всех с Рождеством Христовым!У меня тут задачка.с рекурсией очень плохо,помогите пожалуйста!! Условие: Написать рекурсивную...

2
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
19.12.2011, 00:07
алгоритм примерно такой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void PrintDirContent(const string& fullDirPath, unsigned indent = 0)
{
   PrintDir(fullDirPath);
 
   // Получаем папки находящиеся в текущей директории.
   std::vector<string> subDirs = GetSubDirectories(fullDirPath);
   for_each(subDir in subDirs)
  {
     PrintDirContent(subDir, indent + 1); // печатаем все, что есть в подпапке. Рекурсивный вызов.
  }
 
   // Получаем файлы, находящиеся в текущей директории.
   std::vector<string> files = GetFiles(fullDirPath);
   for_each(file in files)
  {
     PrintFile(file, indent);
  }
}
Остается реализовать ф-ии:
GetSubDirectories(fullDirPath);
GetFiles(fullDirPath);
PrintDir(fullDirPath);
PrintFile(fullFilePath);

строки понадобатся широкие (std::wstring)

Добавлено через 1 час 45 минут
Вот. Оптимизация, обработка ошибок и прочее на ваше усмотрение:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <windows.h>
#include <iostream>
#include <string>
#include <list>
#include <algorithm>
 
using namespace std;
 
typedef WIN32_FIND_DATAW Entry;
 
std::wstring AdjustDirPath(const std::wstring& path)
{
  std::wstring result = path;
  std::replace(result.begin(), result.end(), '/', '\\');
  if (result.empty() || result[result.length() - 1] != '\\')
  {
    result += '\\';
  }
  return result;
}
 
std::wstring AppendPath(const std::wstring& path, const std::wstring& name)
{
  return AdjustDirPath(path) + name;
}
 
void GetDirEntries(const std::wstring& fullDirPath, std::list<Entry>& result)
{
  const std::wstring PARENT_DIR = L"..";
  const std::wstring CURRENT_DIR = L".";
  const std::wstring path = AdjustDirPath(fullDirPath);
  const std::wstring pattern = path + L"*";
 
  Entry entry;
  HANDLE hf = FindFirstFileW(pattern.c_str(), &entry);
  if (hf == INVALID_HANDLE_VALUE)
  {
    throw std::runtime_error("Cannot find file.");
  }
 
  std::list<Entry> tmp;
 
  do
  {
    if (PARENT_DIR != entry.cFileName && CURRENT_DIR != entry.cFileName)
    {
      tmp.push_back(entry);
    }
  }
  while (FindNextFileW(hf, &entry));
 
  FindClose(hf);
 
  result.swap(tmp);
}
 
bool IsDir(const Entry& entry)
{
  return entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? true : false;
}
 
void PrintEntry(const Entry& entry, unsigned indent)
{
  std::wcout << std::wstring(indent * 2, ' ');
  if (IsDir(entry))
  {
    std::wcout << '[' << entry.cFileName << ']';
  }
  else
  {
    std::wcout << entry.cFileName;
  }
  std::wcout << std::endl;
}
 
bool LessEntry(const Entry& lhs, const Entry& rhs)
{
  if (IsDir(lhs) && !IsDir(rhs))
    return true;
 
  if (!IsDir(lhs) && IsDir(rhs))
    return false;
 
  return std::wstring(lhs.cFileName) < rhs.cFileName;
}
 
void PrintDirContent(const std::wstring& fullDirPath, unsigned indent)
{
  std::list<Entry> entries;
  GetDirEntries(fullDirPath, entries);
  entries.sort(&LessEntry);
  for (std::list<Entry>::const_iterator it = entries.begin(), end = entries.end(); it != end; ++it)
  {
    const Entry& entry = *it;
    PrintEntry(entry, indent);
    if (IsDir(entry))
    {
      const std::wstring subDirFullPath = AppendPath(fullDirPath, entry.cFileName);
      PrintDirContent(subDirFullPath, indent + 1); // рекурсивный вызов
    }
  }
}
 
void PrintDirContent(const std::wstring& fullDirPath)
{
  std::wcout << "Content of dir \"" << fullDirPath << "\" is:" << std::endl;
  PrintDirContent(fullDirPath, 0);
}
 
int main()
{
  try
  {
    //const std::wstring fullPath = L"d:\\Docs";
    const std::wstring fullPath = L".."; // parent dir of executable file
    PrintDirContent(fullPath);
  }
  catch (std::exception& e)
  {
    std::wcerr << L"Error: " << e.what() << std::endl;
  }
 
  return 0;
}
1
0 / 0 / 1
Регистрация: 03.12.2011
Сообщений: 43
19.12.2011, 00:42  [ТС]
Спасибо!... В общем победа близка, но сегодня сил уже нету. Завтра думаю добью....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.12.2011, 00:42
Помогаю со студенческими работами здесь

Переделать рекурсию по аргументу в рекурсию по значению
эта рекурсия по аргументу, заменяющая Y на число, равное глубине вложения Y в список List, например, Y=A, List=((A B)A(C(A(A D)))) -&gt;...

Задачка с массивом и задачка с формулами Ньютона и Лагранжа
Прошу помочь решить две задачи

Задачка так задачка
Здравствуйте, Ломаю голову, но ни как не могу прийти к решению. Задача следующая: К примеру есть некий адрес в столбце &quot;624205,...

задача на рекурсию
Карта лабиринта представляет квадратное поле размером N*N. Некоторые квадраты этого поля запрещены для прохождения. Шаг в лабиринте...

Переделать рекурсию
Эта рекурсия имитирует одинарный цикл (вывод алфавита в мемо): private procedure Rec(s, n: integer); //вот эту переделать ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru