| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > замена вложенных циклов |
| Автор: kachu 5.6.2013, 15:53 | ||
| здравствуйте. Нужно было написать программу, а задание следующее: Имеется телефонный справочник в текстовом формате. В каждой строке файла указаны фамилия, имя, адрес, телефон, дата рождения. Поля разделены пробелом. Записать в новый текстовый файл все данные об однофамильцах. Имена всех файлов задаются в командной строке. программу написал, но очевидно, что первый (внешний) цикл while сработает 1 (один) раз. Подскажите как это можно исправить?
|
| Автор: mes 5.6.2013, 16:26 |
в обоих циклах один и тот же идентификатор условия окончания цикла (fin) |
| Автор: kachu 5.6.2013, 16:31 |
| mes, я понимаю, но не знаю как можно не создавая копию этого потока исправить это, т.е. не создавая ifstream fin2(argv[1]) например. |
| Автор: mes 5.6.2013, 18:23 |
сформулировать для начала на словах алгоритм действий.. другими словами: определите, что должен делать Ваш внешний цикл, а что внутренний.. |
| Автор: volatile 5.6.2013, 18:29 | ||
|
| Автор: kachu 5.6.2013, 18:45 | ||
| mes, внешний цикл - перебор строк файла, а внутренний - аналогично перебирает строки того же файла и сравнивает строку, полученную во внешнем цикле со всеми остальными строками. т.е. аналог
volatile, я думал вернуться в начало файла, но опять же не понял как это реализовать. |
| Автор: volatile 5.6.2013, 19:07 |
| kachu, я бы отсортировал, (если память конечно позволяет) потом одним циклом вывел всех однофамильцев. Двойным циклом, как вы хотите будут одни и теже выводицца по нескольку раз, если однофамильцев больше двух. |
| Автор: kachu 5.6.2013, 19:11 |
| volatile, спасибо за идею, буду пробовать |
| Автор: volatile 5.6.2013, 20:02 | ||
| Можно вообще просто сделать. (нехорошо поступаю конечно, что готовый ответ даю
|
| Автор: mes 5.6.2013, 20:08 |
| volatile, в простой мапе теряется информация о всех однофамильцах... Добавлено через 1 минуту и 23 секунды плюс боюсь трудновато будет тс с ходу понять... |
| Автор: volatile 5.6.2013, 20:16 |
ах, сорри, не обратил внимания... ну дописывать уже не буду. пусть ТС сам дальше... |
| Автор: kachu 6.6.2013, 14:13 | ||||
| volatile, mes, спасибо Вам. по поводу map: нельзя мне использовать, т.к. разрешено использовать только то что даётся преподавателем. проблему с повторным открытием потока в цикле решил, разобрался всё-таки с seekg. использовал такую конструкцию:
всё работает, но замечание
конечно справедливо, но в данном случае можно сдать работу и так. |
| Автор: volatile 7.6.2013, 08:16 | ||
kachu, Молодец! Правильно все сделали. Мне лишь не нравицца алгоритм двойного прохода. мало того что он не правильный, он еще и очень долгий. сложность O(N^2), что при больших N выльецца в очень долгий процесс. Скорей всего, здесь подразумеваецца что справочник отстортирован по фамилиям. Иначе, задание слишком сложное, для новичка не проходившего стл-овские массивы. |
| Автор: kachu 8.6.2013, 10:38 |
| volatile, спасибо за похвалу по поводу сложности вы видимо правы, из всех заданий это одно помечено "*", и единственное вызвало затруднения |