Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Оцените класс больших чисел класс big_int http://www.cyberforum.ru/cpp-beginners/thread410942.html
big_int - класс больших чисел. Цифра храниться в строке. Работать будет как int, но во много раз больше (120-тизначное число). "+" и "-" уже написал, но нашел ошибку, перепишу. Интересует в общем ваше мнение... big_int.h #include <iostream> #include <fstream> using std::cout; using std::endl;
C++ найти все слова, в которых есть двойные согласные и заменить их символом * дан текст(на англ. яз). найти все слова, в которых есть двойные согласные и заменить их *. http://www.cyberforum.ru/cpp-beginners/thread410936.html
функции (массивы) C++
Даны 3 массива найти количество отрицательных элементов каждом массиве и суммы отрицательных элементов в этих массивах и посчитать: B=((KB+KC)*SA)/((SC+SB)*KA) Собственно код предоставлен, нужна помощь по выводу количества отрицательных элементов и алгоритм по поиску сумм отрицательных элементов, а также их вывода. #include <locale.h> #include <iostream> #include <conio.h> #include...
C++ Доступ к полям класса
Имеет список list с объектами класса zapis list<zapis> list как мне получить значение поля класса, например поле Number
C++ [C++] Даны целые числа а1,....,аn... http://www.cyberforum.ru/cpp-beginners/thread410917.html
Нужна срочная помощь в решении задач! Я новичек в С++ и почти не шарю в нем.... Помогите плиз.. Вот задачи: 1) Даны целые числа а1,....,аn. Все члены последовательности с четными номерами, предшествующие первому по порядку члену со значением max(a1,...,an), домножить на max(a1,...,an). 2)Даны натуральное число m, целые числа a1,...,am и челочисленная квадратная матрица порядка m. Строку с...
C++ Стандартные потоки Пишу такой код #include <iostream> #include <thread> using namespace std; void f1() { for (int i=1;i<100;i+=2) { cout << i << " "; } подробнее

Показать сообщение отдельно
DU
1477 / 1053 / 45
Регистрация: 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;
}
 
Текущее время: 03:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru