Понедельник, 06 Февраля 2023, 02:19

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Общие обсуждения программистов » Помогите с алгоритмом
Помогите с алгоритмом
CoyoteДата: Суббота, 03 Сентября 2011, 20:24 | Сообщение # 1
был не раз
Сейчас нет на сайте
Всем привет. Помогите, плиз с алгоритмом.
Как сделать, чтобы в тексте слова считывались до пробела и каждое слово писалось с новой строки(текст берется из текстового файла) и какое-нибудь слово заменялось на английский язык.
Язык вобщем то неважен. Сам пишу на C#. Главное алгоритм =)
Если не сложно.
TimKruzДата: Суббота, 03 Сентября 2011, 21:14 | Сообщение # 2
старожил
Сейчас нет на сайте
Quote (Coyote)
чтобы в тексте слова считывались до пробела и каждое слово писалось с новой строки(текст берется из текстового файла)

Ну это легко. Я бы мог написать на 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)
и какое-нибудь слово заменялось на английский язык.

я не знаю, потому что не понятно, что нужно сделать. В смысле - слово заменялось на английский? Может, ты хочешь сказать, изменить случайное слово на какое-то определённое слово (заранее заданное), или как? Поясни.


ComentДата: Вторник, 06 Сентября 2011, 00:15 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Coyote используй такой клаcс (java? но думаю на С# есть похожее)

Класс Scanner

и посмотри пример, только промотать чуток надо, там задачка чуть похожая.

Example
фурилонДата: Вторник, 06 Сентября 2011, 01:22 | Сообщение # 4
У котэ свой движок. А у тебя?!
Сейчас нет на сайте
с# не знаю, а вот в с++ это почти один из первых уроков.


Если ты стоишь на краю пропасти и думаешь прыгать или нет, то лучше прыгнуть. (с) Джон Леннон
froexДата: Вторник, 06 Сентября 2011, 08:35 | Сообщение # 5
Руководитель Froexilize team
Сейчас нет на сайте
Coyote,
Quote

Открыть файл для чтения
Пока не конец файла
--Считать символ S
--Если S - пробельный символ -> заменить S на символ переноса строки
--Вывести S
Повторить
Закрыть файл

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


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.


Сообщение отредактировал froex - Вторник, 06 Сентября 2011, 08:37
serg-kkzДата: Вторник, 06 Сентября 2011, 14:29 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Coyote, кинь пример текстового файла, могу на питоне показать. Если тебе нужно организовать чтение/запись есть библиотеки для сериализации данных, лучше использовать их. Например YAML, точно не скажу есть ли для С#, думаю можно найти другую.





Сообщение отредактировал serg-kkz - Вторник, 06 Сентября 2011, 14:34
TimKruzДата: Вторник, 06 Сентября 2011, 17:29 | Сообщение # 7
старожил
Сейчас нет на сайте
froex, ох, ну я что-то напутал с этим в своём алгоритме, это точно. facepalm Давно не программировал, забываются самые простые вещи.
Проще, конечно, так: "пока не конец файла, повторять следующее:..." Так и не надо заморачиваться на счёт длины файла и лишних переменных...
Вот пробел, конечно, можно обозначить как ' ' (или " ", смотря какой язык), но как по-другому обозначить символы конца строки и перевода каретки?.. huh
Quote (froex)
работа с текстовыми файлами быстрее

Quote (serg-kkz)
Двоичный поток выполняется без преобразования, и думаю быстрее

Правильно, быстрее, но для современных компьютеров это без разницы. biggrin
А с текстовыми файлами удобней работать, т.к. там преобразование в символы и обратно идёт автоматически. Для банального копирования это не нужно, но если идёт какая-нибудь обработка текста (именно как текста) - лучше открывать файл как текстовый.


serg-kkzДата: Вторник, 06 Сентября 2011, 17:54 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Quote (TimKruz)
обозначить символы конца строки и перевода каретки?

Перевода каретки на новую строку, так: "текст \n" (питон)




Сообщение отредактировал serg-kkz - Вторник, 06 Сентября 2011, 17:56
TimKruzДата: Вторник, 06 Сентября 2011, 17:58 | Сообщение # 9
старожил
Сейчас нет на сайте
Quote (serg-kkz)
Перевода каретки на новую строку, так: "текст \n" (питон)

А, ну понятно, в каждом языке свои причуды. biggrin


serg-kkzДата: Вторник, 06 Сентября 2011, 18:07 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
Это при записывании, если ты как о разделители, то этого по ним не делается. т.к. это знаки форматирования, и не является текстовыми символами, и не учитываются (или игнорируется не знаю, как сказать)



Сообщение отредактировал serg-kkz - Вторник, 06 Сентября 2011, 18:21
den94kaДата: Вторник, 06 Сентября 2011, 18:21 | Сообщение # 11
постоянный участник
Сейчас нет на сайте
Способ раз:
Code
string letters = "Привет как дела?";
string[] ltrs = letters.Split(' ');
foreach (string l in ltrs)
{
       Console.WriteLine(l);
}
Console.ReadLine();


Функция Split разбивает строку на отдельные элементы, разделяя ее по символу, который указан в параметре функции и возвращает массив слов (или словосочетаний smile ).


Сообщение отредактировал den94ka - Вторник, 06 Сентября 2011, 18:22
den94kaДата: Вторник, 06 Сентября 2011, 18:38 | Сообщение # 12
постоянный участник
Сейчас нет на сайте
А прочитаешь и сделаешь все, что нужно я думаю сам
serg-kkzДата: Вторник, 06 Сентября 2011, 18:44 | Сообщение # 13
постоянный участник
Сейчас нет на сайте
Code
# -*- coding: utf-8 -*-
text = "Привет как дела?"
list = text.split(' ')
for i in list:
     print i

Аналог на питоне smile


froexДата: Вторник, 06 Сентября 2011, 21:11 | Сообщение # 14
Руководитель Froexilize team
Сейчас нет на сайте
Quote (serg-kkz)
есть библиотеки для сериализации данных

Раз ты о ней заговорил, предполагаю, что ты знаешь, что это такое. Тогда вопрос - почему её предлагаешь? Я не вижу смысла в ней для данного случая.
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
serg-kkzДата: Вторник, 06 Сентября 2011, 21:46 | Сообщение # 15
постоянный участник
Сейчас нет на сайте
Quote (froex)
Какой поток?

Данных, бинарные не нужно форматировать т.к. в памяти информация записана в том же в виде, как и в оперативной памяти.

Добавлено (06.09.2011, 21:46)
---------------------------------------------
Quote (froex)
Раз ты о ней заговорил, предполагаю, что ты знаешь, что это такое. Тогда вопрос - почему её предлагаешь? Я не вижу смысла в ней для данного случая.

Quote (Coyote)
Как сделать, чтобы в тексте слова считывались до пробела и каждое слово писалось с новой строки(текст берется из текстового файла) и какое-нибудь слово заменялось на английский язык.




Сообщение отредактировал serg-kkz - Среда, 07 Сентября 2011, 09:54
noTformaTДата: Вторник, 06 Сентября 2011, 22:04 | Сообщение # 16
Ukrainian independent game developer
Сейчас нет на сайте
о, тут было про сплит. На самом деле этот метод отупливает программистов. Я не редко очень часто задаю следующий вопрос:
есть строка = '(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()


в файле 1.тхт
1 11 111 1111 1(много пробелов)num1
2 22 222 2222 2(много пробелов)num2
3 33 333 3333 3(много пробелов)num3
4 44 444 4444 4(много пробелов)num4

вывод в питоне-
1
11
111
1111
1
num1
2
22
222
2222
2
num2
3
33
333
3333
3
num3
4
44
444
4444
4


@noTformaT


Сообщение отредактировал noTformaT - Вторник, 06 Сентября 2011, 22:06
serg-kkzДата: Среда, 07 Сентября 2011, 01:19 | Сообщение # 17
постоянный участник
Сейчас нет на сайте
Quote (noTformaT)
какой размер массива будет, если эту строку разбить через splite('(1пробел)'); ???

noTformaT, с тобой не поспоришь happy

Думаю к чему себе делать проблемы городя несколько пробелов подряд, обычно когда пишешь в файл заранее думаешь как читать то его.

Можно так, на этот случай. Но есть подвох если окажется пробел после строки, перед кареткой перевода. dry можно бороться проверками whitespace, но раньше я этого не касался не знаю поможет нет.

Code
f = open('1.txt')
text = f.read()
f.close()
list = text.split(' ')
for i in list:
     if (i != ''):
         print i

Глупо, но короче.


Serg1971Дата: Среда, 07 Сентября 2011, 07:07 | Сообщение # 18
Весёлый программист
Сейчас нет на сайте
Ну блин, обычная школьная задача, для которой и нужны всякие там Бейсики так ругаемые вами! smile
Автор - открываешь текстовый файл для чтения, создаёшь литерную переменную нулевой длинны, последовательно читаешь весь текстовый файл символ за символом, если символ не пробел - прибавляешь к литерной переменной, если пробел - конец слова. Проверяешь длинну литерной переменной (в которой теперь содержится слово) - чтобы не была нулевой (такое может быть при двух и более пробелах подряд, в таком случае просто читаешь следующий символ и повторяешь вышеизложенное), сравниваешь её со словом которое нужно заменить на английский вариант, и печатаешь либо то, либо английский. Обнуляешь переменную (в смысле делаешь её нулевой длинны) и считываешь следующий символ, повторяя операцию сначала... Вот и всё. В конце файла всё само остановится, ну или можешь проверить на EOF.


froexДата: Среда, 07 Сентября 2011, 11:05 | Сообщение # 19
Руководитель Froexilize team
Сейчас нет на сайте
Serg1971,


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
Форум игроделов » Программирование » Общие обсуждения программистов » Помогите с алгоритмом
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2023 Рейтинг