Всем привет. Помогите, плиз с алгоритмом. Как сделать, чтобы в тексте слова считывались до пробела и каждое слово писалось с новой строки(текст берется из текстового файла) и какое-нибудь слово заменялось на английский язык. Язык вобщем то неважен. Сам пишу на C#. Главное алгоритм =) Если не сложно.
чтобы в тексте слова считывались до пробела и каждое слово писалось с новой строки(текст берется из текстового файла)
Ну это легко. Я бы мог написать на Delphi (Pascal), но не знаю, поймёшь ли ты его. Поэтому чистый алгоритм:
Quote
1. Открываем файл для чтения. 2. Проверяем число символов в файле (функция есть такая). 3. Запускаем цикл со счётчиком, от 1 до сколько узнали в пункте 2. 4. Считываем символ. 5. Если символ неравен #32 (пробел), то выводим его на экран и присваиваем булевой переменной "перевод строки" значение "ложь" (деактивируем), иначе: 6. Если булева переменная "перевод строки" - имеет значение "ложь", то выводим на экран символ #13 (enter, ну или пара #10#12, хотя я не уверен точно; сам пользуюсь в Delphi символом #13, вроде бы всё нормально) и активируем (присваиваем значение "истина") булеву переменную "перевод строки", иначе ничего не делаем. 7. Уменьшаем счётчик (это происходит автоматически для цикла for, или как он там в C называется) и переходим к пункту 4. 8. Закрываем файл (чтобы память не занимал).
А вот как сделать это:
Quote (Coyote)
и какое-нибудь слово заменялось на английский язык.
я не знаю, потому что не понятно, что нужно сделать. В смысле - слово заменялось на английский? Может, ты хочешь сказать, изменить случайное слово на какое-то определённое слово (заранее заданное), или как? Поясни.
Открыть файл для чтения Пока не конец файла --Считать символ S --Если S - пробельный символ -> заменить S на символ переноса строки --Вывести S Повторить Закрыть файл
Если брать реализацию TimKruz, то лучше заменить числа кодов символов на строковые/символьные константы (т.е. сами символы), чтобы упростить поддержку кода. Ну и если пользоваться флагом eof, то отпадает необходимость проверки длины файла.
Как примечание можно сказать, что файл можно открыть как текстовый, так и бинарный. Если проверять флаг eof в текстовом файле, то область текстовых данных оканчивается на символе \0 (код символа равен нулю). Если проверять флаг eof в бинарном файле, то расчёт eof будет опираться на сравнение указателя курсора считывания и размера файла. Это всё я к тому говорю, что если вдруг придётся выбирать, как открывать файл - как текстовый или как бинарный (работа с текстовыми файлами быстрее).
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Вторник, 06 Сентября 2011, 08:37
Coyote, кинь пример текстового файла, могу на питоне показать. Если тебе нужно организовать чтение/запись есть библиотеки для сериализации данных, лучше использовать их. Например YAML, точно не скажу есть ли для С#, думаю можно найти другую.
Quote (froex)
работа с текстовыми файлами быстрее
В каком смысле? Двоичный поток выполняется без преобразования, и думаю быстрее. С текстовым удобней работать, т.к. воспринимается лучше.
Сообщение отредактировал serg-kkz - Вторник, 06 Сентября 2011, 14:34
froex, ох, ну я что-то напутал с этим в своём алгоритме, это точно. Давно не программировал, забываются самые простые вещи. Проще, конечно, так: "пока не конец файла, повторять следующее:..." Так и не надо заморачиваться на счёт длины файла и лишних переменных... Вот пробел, конечно, можно обозначить как ' ' (или " ", смотря какой язык), но как по-другому обозначить символы конца строки и перевода каретки?..
Quote (froex)
работа с текстовыми файлами быстрее
Quote (serg-kkz)
Двоичный поток выполняется без преобразования, и думаю быстрее
Правильно, быстрее, но для современных компьютеров это без разницы. А с текстовыми файлами удобней работать, т.к. там преобразование в символы и обратно идёт автоматически. Для банального копирования это не нужно, но если идёт какая-нибудь обработка текста (именно как текста) - лучше открывать файл как текстовый.
Это при записывании, если ты как о разделители, то этого по ним не делается. т.к. это знаки форматирования, и не является текстовыми символами, и не учитываются (или игнорируется не знаю, как сказать)
Сообщение отредактировал serg-kkz - Вторник, 06 Сентября 2011, 18:21
string letters = "Привет как дела?"; string[] ltrs = letters.Split(' '); foreach (string l in ltrs) { Console.WriteLine(l); } Console.ReadLine();
Функция Split разбивает строку на отдельные элементы, разделяя ее по символу, который указан в параметре функции и возвращает массив слов (или словосочетаний ).
Сообщение отредактировал den94ka - Вторник, 06 Сентября 2011, 18:22
Раз ты о ней заговорил, предполагаю, что ты знаешь, что это такое. Тогда вопрос - почему её предлагаешь? Я не вижу смысла в ней для данного случая.
Quote (serg-kkz)
В каком смысле? Двоичный поток выполняется без преобразования, и думаю быстрее. С текстовым удобней работать, т.к. воспринимается лучше.
Quote (TimKruz)
Правильно, быстрее, но для современных компьютеров это без разницы.
Quote (TimKruz)
с текстовыми файлами удобней работать
Какой поток? Всегда работа происходит с файловым дескриптором. Во время успешного открытия файла создается файловый дескриптор, через него всё происходит - не важно, как открыт файл. Кстати, отличия текстового и бинарного файлов заключаются только в алгоритме определения конца файла. Для текстового файла считывание происходит до нулевого символа, в бинарном сравнивается позиция курсора чтения с размером файла. Алгоритм для бинарного файла более ёмок.
Quote (TimKruz)
как по-другому обозначить символы конца строки и перевода каретки?
В разных языках существуют разные именованные константы и/или макросы обозначения конца строки и перевода каретки. В паскале чаще всего записывают комбинацию #10 #13 (коды символов переноса строки и возврата каретки), для Си это символы '\n' и '\r' (для многих языков такая запись существует). В С++ добавили std::endl (преимущество перед '\n' заключается в сбросе буфера, что избавляет от использования flush вручную).
Таблица ASCII двоичных кодов символов в начале содержит служебные символы. Коды 10 и 13 за редким исключением не являются символами переноса строки и возврата каретки. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Вторник, 06 Сентября 2011, 21:14
Раз ты о ней заговорил, предполагаю, что ты знаешь, что это такое. Тогда вопрос - почему её предлагаешь? Я не вижу смысла в ней для данного случая.
Quote (Coyote)
Как сделать, чтобы в тексте слова считывались до пробела и каждое слово писалось с новой строки(текст берется из текстового файла) и какое-нибудь слово заменялось на английский язык.
Сообщение отредактировал serg-kkz - Среда, 07 Сентября 2011, 09:54
о, тут было про сплит. На самом деле этот метод отупливает программистов. Я не редко очень часто задаю следующий вопрос: есть строка = '(1пробел)a(2 пробела)ss(3 пробела)a'; какой размер массива будет, если эту строку разбить через splite('(1пробел)'); ??? Но это все фигня. Что касается вопроса тс. Я нифига не понял. Вернее я понял что есть текст (а какой он? в файле, или в переменной), и надо вывести каждое слово в новой строке. Это можно описать вот так: Напишу на питоне, мне так легче:
Code
f = open('1.txt') text = "" while True: char = f.read(1) if not char: break if char == ' ': if text!= "": print text text = "" else: text = text + char f.close()
какой размер массива будет, если эту строку разбить через splite('(1пробел)'); ???
noTformaT, с тобой не поспоришь
Думаю к чему себе делать проблемы городя несколько пробелов подряд, обычно когда пишешь в файл заранее думаешь как читать то его.
Можно так, на этот случай. Но есть подвох если окажется пробел после строки, перед кареткой перевода. можно бороться проверками whitespace, но раньше я этого не касался не знаю поможет нет.
Code
f = open('1.txt') text = f.read() f.close() list = text.split(' ') for i in list: if (i != ''): print i
Ну блин, обычная школьная задача, для которой и нужны всякие там Бейсики так ругаемые вами! Автор - открываешь текстовый файл для чтения, создаёшь литерную переменную нулевой длинны, последовательно читаешь весь текстовый файл символ за символом, если символ не пробел - прибавляешь к литерной переменной, если пробел - конец слова. Проверяешь длинну литерной переменной (в которой теперь содержится слово) - чтобы не была нулевой (такое может быть при двух и более пробелах подряд, в таком случае просто читаешь следующий символ и повторяешь вышеизложенное), сравниваешь её со словом которое нужно заменить на английский вариант, и печатаешь либо то, либо английский. Обнуляешь переменную (в смысле делаешь её нулевой длинны) и считываешь следующий символ, повторяя операцию сначала... Вот и всё. В конце файла всё само остановится, ну или можешь проверить на EOF.
Ну блин, обычная школьная задача, для которой и нужны всякие там Бейсики так ругаемые вами!
не соглашусь с окончанием фразы. Что бы ты ответил на месте руководителя, если тебе программист шарпа скажет, что такое только на BASIC решал? Иногда интересно сравнивать решения на различных языках программирования. Зачастую приходится придумывать разные алгоритмы решения, т.к. не ко всем языкам программирования они будут подходить.
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.