1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
||||||
1 | ||||||
Черезстрочное слияние30.09.2009, 21:53. Показов 2845. Ответов 33
Метки нет (Все метки)
Появилось вот такое задание по C++:
Написать программу на языке C++ чересстрочного слияния (т.е. первая строка в выходном файле - это первая строка из первого файла, вторая строка в выходном файле - это первая строка из второго файла, третья строка в выходном файле - вторая строка из первого файла и т.д.) двух текстовых файлов с удалением в каждой строке слов после которых стоит любой знак препинания. Алгоритм программы:
0
|
30.09.2009, 21:53 | |
Ответы с готовыми решениями:
33
Слияние массивов Слияние строк Бинарное слияние Слияние массивов |
Администратор
83617 / 52195 / 244
Регистрация: 10.04.2006
Сообщений: 13,426
|
|
30.09.2009, 22:06 | 2 |
Сообщение было отмечено mik-a-el как решение
Решение
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
01.10.2009, 02:51 | 3 |
Это непонятно. Слова удаляются в строках, которые где находятся?
1)В исходных файлах 2)В выходном файле 3)Везде
0
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
|
01.10.2009, 09:52 [ТС] | 4 |
В выходном файле, и знак препинания удаляется тоже
Добавлено через 56 минут все дело в том, что по данной ссылке, как я понял программа состоит из нескольких файлов, а у меня должна состоять из одного, и мне нужно пока сделать без ООП, т.к. я даже не могу понять что там описано и происходит
0
|
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
|
|
01.10.2009, 10:06 | 5 |
kandrey58region, сбрось весь код в один файл(только правильно) и будет у тебя все работать
0
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
||||||
01.10.2009, 10:51 [ТС] | 6 | |||||
т.е. прога должна выглядеть наподобее
И вот еще одну вещь никак не могу понять, как ограничить чтобы прога нашла первую строку первого файла(т.е. чтобы она остановилась и перестала копаться в этом файле, переключилась на второй) Добавлено через 35 минут M128K145, попробовал работает, но все дело в том что там вроде методом Объектно-Ориентированного Программирования выполнено, а мне нужно в обычном виде, тем более в той проге я прост даже не могу понять и объяснить, что, как и где происходит Так то даже приблизительно представляю что будет в обычном варианте программы, но я не понимаю как задать конец строки в первом файле чтобы в том момент когда она закончится он перешел к первой строке но уже второго файла
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||||||||||||
02.10.2009, 22:07 | 7 | |||||||||||||||
Автор, на тебе в самом обычном виде.
Поскольку ты не оговорил, что делать, если количество строк в файлах разно, я взял на себя смелость написать прогу для файлов с равным количеством строк. Количество срок определяется по количеству символов следующей строки. Чтобы они были равными, ты сам должен позаботиться. В файлах не допускается наличие символа конца строки (предполагается, что файлы текстовые, следовательно, созданы в текстовом редакторе, а не в HIEW, например, то есть не содержат симолов конца строки.) Результат смотри в файле fail3.cc Привет!
Это тексты исходных файлов. Переходы на пустую строку очень важны, поскольку их количество и определяет количество строк в ТЕКСТОВОМ файле. Тестирование ими прошло успешно. fail1.cc
1
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
|||||||||||||||||||||
03.10.2009, 16:23 [ТС] | 8 | ||||||||||||||||||||
kravam, спасибо за помощь!!!
На твоих файлах вроде все работает, но щас попробовал вот на этих файлах, т.е. файлы с обычным текстом созданные в блокноте формата .txt file_1.txt
file_3.txt
а должно было получиться вот что
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
03.10.2009, 18:22 | 9 |
Ничё не выйдет.
Во-первых, это русский текст, а не английский. Но дело даже не в этом. Это бы я исправил, написав свою реализацию функции ispunct (используемая мной 99 % считает за знак пунктуации русские символы). Главное, вот что. Вот задание: "Написать программу на языке C++ чересстрочного слияния (т.е. первая строка в выходном файле - это первая строка из первого файла, вторая строка в выходном файле - это первая строка из второго файла, третья строка в выходном файле - вторая строка из первого файла и т.д.) двух текстовых файлов с удалением в каждой строке слов после которых стоит любой знак препинания." Возьмём первую строку первого файла "Сперва старинная рукопись использовалась для ведения бухгалтерии, но," После каких слов в строке стоят знаки препинания? Правильно, после всех слов. Вот я все слова и удалял. Всё верно. с удалением в каждой строке слов после которых стоит любой знак препинания."
1
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
||||||||||||||||
03.10.2009, 19:28 [ТС] | 10 | |||||||||||||||
Если честно я не очень понял вас, ведь знак препинания стоит после слов "бухгалтерии," и "но,"
Добавлено через 12 минут kravam, извини с файлами на русском языке я чтото натупил... вот с файлами на английском языке file_1.txt
file_3.txt
а в двух последних предложениях остались точки...
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
03.10.2009, 20:28 | 11 |
Раз такое дело, слушай.
прога удаляет все что встретилось ранее потому, что так было заявлено в условии. Удалить все слова, после которых встретился знак препинания. Это понимается однозначно. Если в строке есть слово, после которого стоит знак препинания, оно удаляется. Всё. То есть я понимаю, что ты имел ввиду несколько другое. Нужно было удалять слова, за которыми НЕПОСРЕДСТВЕННО стоит знак препинания. Тебе вопрос- а почему ты сразу не уточнил, введя кроме понятий "до" и "после" (какими, по умолчанию и исчерпывается описание взаиморасположений слова и знака препинания в строке) понятие "непосредственно после"? Впредь будь внимательнее. И давай к этом вопросу больше не возвращаться. ...А то знаешь, некоторый дядька оперирует термином слово... А в программёрском мире слово вообще означает другое. Что это? Последовательность печатаемых симолов? А каких? +++ слово? Вот так то. Ну и так далее. Да ладно бы это- посмотри темы. Устанешь возиться, клещами слова вытягивать из разных там... Ну, вот, а не повезло тебе в результате. Попробуй сам с исходгником повозись или покажи кому-нибудь. По поводу руссого текста- мне просто надо было вначале либо оговорить ограниченность применения кода, либо разбираться с русским текстом. Я запарился, не сделал ни того ни другого. ...А прога работает очень даже предсказуемо. Ибо твоя задача- сделать в файлах равное количество строк. (Иначе выведется не поймёшь что). Количество строк это количество ПЕРЕВОДОВ НА НОВУЮ СТРОКУ (я это оговорил!). А оно у тебя разное. В одном файле я вижу 6, а в другом 7. Так что исправляй и получай запрограммированный вывод. Хотя я понимаю, тебе такой вывод даром не нужен. Ну, извини уж.
1
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
|
08.10.2009, 12:25 [ТС] | 12 |
kravam, насчет этого извини я не прав, все дело оказалось в том, что препод напечатал в задании "слов", а не "слова"
Со строками у меня было три примера кода, которые выполняли слияние только с равнострочными файлами... Но не тут было преподу резко захотелось, чтобы теперь прога делала таким образом, например, в первом файле 5 строк, во втором файле 11 строк... Третий выходной файл получается из 10 строк (5 из первого и 5 из второго файлов), а остальные 6 строк из второго файла просто копируются без всякого переноса на другую строку... Пока не очень понял, что все же править нужно, можешь сказать, реально ли этот код под эти условия подогнать??
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
08.10.2009, 13:34 | 13 |
Конечно, всё можно. Он на то и исходник, чтобы в нём всё можно было править.
Начнём с лёгкого. Пусть у тебя 2 ТЕКСТОВЫХ файла с разным количеством строк. А это значит, что количество строк считается по символам перевода на другую строку /n Ну... самое простое, что тебе надо сделать, это написать такой код: 1) подсчитываешь количество строк в каждом файле fail1.txt и fail2.txt 2) выбираешь файл который больше. Допустим, в файле fail2.txt больше. (В файле fail1.txt допустим, 4 строки, а в файле fail2.txt 11 строк) 3) Разбиваешь файл fail2.txt на 2 текстовых файла. fail2a.txt и fail2b.txt Причём! В fail2a.txt должно быть тоже 4 строки, а в файле fail2b.txt 7 (потому, что 4+ 7== 11) Вот имеем два текстовых файла fail1.txt и fail2a.txt с равным количеством строк. Теперь к ним можно применить мою прогу. Получаешь файл на выходе. И прибавляешь к нему файл fail2b.txt. Вот пока это делай.
0
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
|
08.10.2009, 14:00 [ТС] | 14 |
Мысль с разбиением файла была... Препод говорит нельзя, нужно только чтобы было два входных и один исходный файл, а это получается один первый файл и два вторых...
Вот я и думаю, реально вообще организовать так, что прога сначала выполняет слияние, потом раз в первом или во втором файле строки закончились... Она берет и копирует из того файла в котором остались строки, все остальные строки...
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
08.10.2009, 14:13 | 15 |
Конечно, реально.
Тогда копируй файлы в память, образуя две большие-большие строки. aaa\nkkk\nlklk\nyuyuyu\nghjhj\n qq\nuuiuiu\njkjk\njkjjk\njkjkk\njkjkjkj\njkjkk\n А потом их сливаешь и попутно смотришь, в какой строке закончатся символы\n. Когда закончатся- сливание прекращаешь (в первой строке 5 символов \n, а во второй 7 Значит, первая закончится, а вторая ещё нет), дописываешь оставшиеся символы из ДРУГОЙ СТРОКИ и получаешь огромную строку-результат и выполняешь обработку огромной получившейся строки. Удаляешь из неё что тебе надо. Вот так просто и незатейливо.
0
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
||||||||||||||||||||||||||
08.10.2009, 14:53 [ТС] | 16 | |||||||||||||||||||||||||
не чтото вообще мне непонятно, что ты написал...
Попробовал вот так сделать...
file_1.txt
ну или может не return чтобы он к этому while уже не обращался...
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||
08.10.2009, 15:15 | 17 | ||||||||||
Вариантов много может быть. Например, так:
Дальше
0
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
|||||||||||||||||||||
08.10.2009, 20:56 [ТС] | 18 | ||||||||||||||||||||
ну вроде бы почти работает...
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
08.10.2009, 22:06 | 19 |
Это не страшно. Нам нужно, чтобы когда файл закончится, написалось \n То есть если
c==EOF пусть пишется перевод на другую строку. Но только один раз, а потом прога пусть игнорирует эту инструкцию. Для этого введём переменную-семафор и инициализируем её false. Теперь ты делай присвоение c= \n только если семафор равен false. Как только с станет равной EOF, ПОСЛЕДНИЙ РАЗ ПРИСВАИВАЙ "с" значение \n и СРАЗУ ЖЕ присваивай семафору значение true Всё, теперь уже переменной с значение \n не присвоится, поскольку семафор равен true А мы написали, что присваиваем c==\n только если он false
1
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
||||||
09.10.2009, 14:02 [ТС] | 20 | |||||
Если я правильно понял то нужно
0
|
09.10.2009, 14:02 | |
09.10.2009, 14:02 | |
Помогаю со студенческими работами здесь
20
Слияние массивов на с++ слияние списков Слияние массивов Слияние деревьев Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |