| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > программу простейшего редактора текстов. |
| Автор: Yanochka 18.12.2004, 18:13 |
| Помогите пожалуйста. http://www5.pochta.ru/hosting/N36c689cf0f3bc66b7e90f139a5c0602/go/?f=%2FDelphi_3_i.doc Что то я не понимаю что от меня хотят, помогите мне |
| Автор: Vladimir13 18.12.2004, 18:28 |
| Задача 1 Условие задачи. Разработать программу простейшего редак-тора текстов. С экрана вводится произвольный текст. Текст построчно со-храняется в файле. Прочитать текст построчно из файла и в ка-ждой строке удалить лишние пробелы между словами, кроме од-ного. Вывести преобразованный текст в другое экранное окно. Пояснения к решению задачи. Решение задачи с большим объ-емом входной информации, типа многострочного текста, требует обеспечения работы пользователя в более удобной форме, чем обычный ввод данных с клавиатуры компьютера. Чтобы один раз введенный текст не приходилось набирать заново, его предлагается сохранять в файле. Если в условии задачи предлагается работать с текстом, то для работы с текстом надо определить текстовый файл. Запихиваешь текст в Мемо ( Memo1.Lines.LoadFromFile(filename) ). Потом считываешь построчно, пробегаешь циклом удаляя пробелы, и записываешь новую строку в новый ММемо. Понятно? |
| Автор: Yanochka 18.12.2004, 18:35 |
| не, не понятно, не могу по алгоритму составить текст функции для удаления лишних пробелов в одной строке текста. Добавлено @ 18:36 у меня есть первое решение, так мне выдает ошибку после того как текст введен, и не удаляет пробелы |
| Автор: Vladimir13 18.12.2004, 18:39 |
| for k:=1 to Memo1.LinesCount do for i:=1 to Lendth(Memo1.Lines[k]) do begin if copy(Memo1.Lines[k],i,1)=' ' then del(Memo1.Lines[k],i,1); end; |
| Автор: Yanochka 18.12.2004, 18:44 |
| У меня вот как function Stroka(s:string):string; var i,k:integer; begin k:=length(s); for i:=1 to k do while (s[i]=' ') and (s[i+1]=' ') do begin delete(s,i+1,1); k:=k-1;end; Stroka:=s; |
| Автор: Vladimir13 18.12.2004, 18:46 |
| чуть не дочитал условие |
| Автор: Yanochka 18.12.2004, 18:50 | ||
| не знаю Вот смотри что у меня:
|
| Автор: Vladimir13 18.12.2004, 18:53 |
| вместо while надо if Добавлено @ 18:56 алгоритм правильный: найти пробел - если за ним еще пробел то удалить предыдущий и вернуть позицию на 1 назад |
| Автор: Vit 19.12.2004, 05:05 | ||||||
Удаление двойных пробелов:
Добавлено @ 05:07 Не самое лучшее решение...
Лучше так:
|
| Автор: Vladimir13 19.12.2004, 20:34 |
| есть решение: for i:=1 to Memo1.LinesCount do begin for j:=1 to length( Memo1.Lines[i]) do begin if copy(memo1.Lines[i],j,1)=' ' and copy(memo1.Lines[i],j+1,1)=' ' then delete(memo1.Lines[i],j+1,1); end; Memo2.Lines[i]:=Memo1.Lines[i]; end; |
| Автор: Vit 19.12.2004, 20:39 |
| Vladimir13, хех... а ошибок то в этом коде... проверяйте границы массивов, потом вылавливать такие ошибки замучаешся - их лучше такие не делать. Да и алгоритм работать будет со сбоями... |
| Автор: Vladimir13 19.12.2004, 20:49 |
| можно поставить условие if j= length( Memo1.Lines[i]) and copy(memo1.Lines[i],j,1)=' ' then memo2.Lines[i]:=Memo1.Lines[i] |
| Автор: Yanochka 19.12.2004, 22:39 |
| У меня выходит когда хочу запусть на исполнение : Invalid threading model (STAThreadATTribute is required) потом когда ввожу текст, потом записать пытаюсь тогда ошибка : index was outside the bonus of the array |
| Автор: Vladimir13 20.12.2004, 01:57 |
| что то лучше чем ничто. Прежде чем критиковать - убедись, что то, что ты предложил работает. а мое и подработать можно при желании |
| Автор: Vit 20.12.2004, 02:11 | ||||||||
А что ты делаешь? И смысл задачи? Это учебная задача или реальная? Если учебная то алгоритм будет такой:
Если реальная то я уже дал тебе решение:
Добавлено @ 02:12
Подработать можно, но очень сложно, код неправильно изначально разработан, доработать - это его заново переписать, а решение я уже давал, вот и ещё раз даю... |
| Автор: Ddddddelphi 20.12.2004, 05:45 | ||
я попробовал сделать вот такой
здесь получаем строку вобще без пробелов, но прибавить пробел, или заставить в команде delete оставлять один пробел тоже не получилось, иначе выдаст - fdss и всё. есть идея запоминанать строки в строковом массиве, но не думая, что моя идея здесь подойдёт |
| Автор: Vit 20.12.2004, 07:46 |
| Ddddddelphi - аааа зачем так? Чем мой код плох? |
| Автор: Ddddddelphi 20.12.2004, 08:17 | ||
я после этих строк... но если работает зашибись! = |
| Автор: Yanochka 20.12.2004, 12:50 |
| Vit Задача моя учебная. Дело в том, что мне надо вточности как в задании написано. Я уже импровезировала, когда придыдущие делала, но мне за это снижали оценки. Вот и мучаюсь теперь все в точности по условию делать. |
| Автор: Vit 20.12.2004, 16:52 | ||
Другими словами надо пробелы удалять построчно? Тогда:
Добавлено @ 16:57 Yanochka - опубликуй условие задачи целиком, оно у меня не грузится по тому линку |
| Автор: SlaUr 20.12.2004, 17:41 |
| 1.copy(memo1.Lines[i],j,1) это все равно что memo1.Lines[i][j] 2.IMHO Лучший предложеный вариант для убирания лишних пробелов while pos(' ',s)>0 do Delete(s,pos(' ',s),1);(самый простой и работающий без ошибок) |
| Автор: Yanochka 20.12.2004, 17:53 | ||
Вот что мне надо сделать.. Может http://www2.pochta.ru/hosting/Nb84792e3a67844902e6a9b7dba02793/go/?f=%2FDelphi_3_i.doc скачается |
| Автор: SlaUr 20.12.2004, 18:06 | ||||||
Функция Для определения размера файла(выдает -1 если файла нет)
2. Для чтения данных по строкам из файла Если бы не было написано по строкам то можно было бы написать просто Memo1.lines.LoadFromFile а так придется вручную:
2. Для записи данных по строкам в файл
|
| Автор: Vit 20.12.2004, 18:22 | ||||||||||||||||||||||||||||||||
Нет, если строка короче чем j то copy(memo1.Lines[i],j,1) проглотит без ошибок, а memo1.Lines[i][j] чревато многочисленными проблемами, от index out of bound в лучшем случае до необъяснимого Access Violation в каком-то случайном месте.
Var t:TextFile;
2. Для записи данных по строкам в файл ________
Применение: WriteToFile('c:\myText.txt', Memo1.lines);
Применение: ReadFromFile('c:\myText.txt', Memo1.lines);
1. Связь конкретного файла с файловой переменной AssignFile(t, FileName);
Имеется ввиду reset/rewrite/append или FileMode? 4. Добавление записи в текстовый файл без перезаписи данных Append(t); 5. Закрытие файла CloseFile(t); Вопрос 4. Проверьте свои знания по компоненту OpenDialog: 1. Назовите страницу, на которой находится компонент: На той на которую поставишь, Дельфи позволяет менять эту страницу. По умолчанию - Dialogs 2. Запишите предложение для проверки существования файла:
3. Запишите сообщение об отсутствии требуемого файла:
Этого я не понял!
Выделенная красным брехня! Для строковых типов ограничений по длинне нет, есть только некомпетентность преподавателей, испрользуем:
Пожалуйста - этот код записывает строку в 100000 символов! Напишите текст функции для удаления лишних пробелов в одной строке текста. В списке формальных параметров функции обязательно надо указать строковую переменную. Тип результата вычисления функции должен быть также строкой.
Пример уже давал PS. Господи! За что ты наказываешь нас преподавателями-дегенератами! |
| Автор: Yanochka 20.12.2004, 18:27 |
| Vit Большое тебе спасибо И всем кто старался мне помочь. |
| Автор: SlaUr 21.12.2004, 05:43 | ||
Насколько я знаю ограничение строки все же есть (речь идет о Гигабайтах) или я не прав? |
| Автор: Vit 21.12.2004, 05:50 | ||
Да, ограничения типа String - 2 Gb, но ведь тип свой городить не надо для этого! Тов. преподаватель там явно путает типизированные и текстовые файлы, это в типизированных файлах нужен какой-то дериват от shortstring типа string[20], для текстовых файлов - это на фиг не нужно... |
| Автор: SlaUr 21.12.2004, 05:55 | ||
Понятно что преподователь не прав и кстати очень мало преподов действительно знающих и умеющих программировать. Я знаю только одного.Хотя работаю в универе и с преподавтелями сталкивался когда был администратором класса ,над одним я вообще посмеивался (незлобно) он такую чушь молол по Паскалю.Ну может не чушь но некачественные у него были занятия. |
| Автор: Alex 16.3.2005, 08:14 |
| |