Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на языке Pascal

Выпуск № 071
от 19.12.2002, 11:20

Администратор:
Имя: Sensey
URL: Информационный ресурс
ICQ: 105679124
Украина, Харьков
О рассылке:
Задано вопросов: 122
Отправлено ответов: 353
Активность: 289.3 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Vadim
Статус: Доверительный
Общий рейтинг: 145
[Подробней >>]
Zloy
Статус: Опытный
Общий рейтинг: 107.96
URL: Паскаль, просто Паскаль ...
[Подробней >>]
Melkor
Статус: Доверительный
Общий рейтинг: 134.84
[Подробней >>]
 
Lexus
Статус: Начальный
Общий рейтинг: 157.14
[Подробней >>]
Ayl
Статус: Профессиональный
Общий рейтинг: 117.45
[Подробней >>]
Ace
Статус: Доверительный
Общий рейтинг: 147.5
[Подробней >>]
 
PashaS
Статус: Начальный
Общий рейтинг: 166.66
[Подробней >>]
toshka
Статус: Начальный
Общий рейтинг: 113.75
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 108.22
[Подробней >>]
 
Tancho
Статус: Доверительный
Общий рейтинг: 131.57
[Подробней >>]
Sensey
Статус: Профессиональный
Общий рейтинг: 122.08
URL: Страничка рассылки по Паскалю
Телефон: +38 (0572) 41-76-04 дом.
[Подробней >>]
Byter
Статус: Опытный
Общий рейтинг: 125.3
[Подробней >>]
 
X-RayMan
Статус: Начальный
Общий рейтинг: 144
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 120. горю и не пойму!!!дан текстовый файл со списком нескольких самолетов(номер самолета,фирма например).... (ответов: 4)
Вопрос № 121. Программа должна работать с текстовым файлом каждую Е заменять на YLS.НО НЕ РАБОТАЕТ ОНА ЧТО В НЕЙ Н... (ответов: 7)
Вопрос № 122. Привет! Подскажите пожалуйста.Я написал программу, в ней надо сделать проверку вводимых значений. Я ... (ответов: 11)

Вопросов: 3, ответов: 22


 Вопрос № 120

горю и не пойму!!!дан текстовый файл со списком нескольких самолетов(номер самолета,фирма например).надо получить конечный файл с отсортированнымсписком по номеру самолетов.помогите!



Вопрос отправлен: 15.12.2002, 14:28
Отправитель: сергей

[Следующий вопрос >>] [Список вопросов]

Отвечает Vadim

Здравствуйте, сергей!
Чтобы не терзать голову различными способами сортировки, лучше всего использовать объект TSortedCollection в модуле OBJECTS.
См. приложение.

Приложение:

Ответ отправлен: 16.12.2002, 12:45
Отправитель: Vadim


Отвечает Zloy

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

Ответ отправлен: 15.12.2002, 21:33
Отправитель: Zloy


Отвечает Melkor

Здравствуйте, сергей!
Создаешь массив строк, качаешь туда строки из файла, сортируешь этот массив и пишешь обратно в файл.


Ответ отправлен: 15.12.2002, 23:31
Отправитель: Melkor


Отвечает Lexus

Добрый день, сергей!
Просто организуй сортировку строк по первому символу, которым будет номер самолёта. Считай все строки в массив или с помощью указателей, отсортируй их и запиши в файл. Всё просто. Сортировка любая подойдёт. Не думаю что у вас там слишком большие файлы.

Ответ отправлен: 16.12.2002, 00:51
Отправитель: Lexus


 Вопрос № 121

Программа должна работать с текстовым файлом каждую Е заменять на YLS.НО НЕ РАБОТАЕТ ОНА ЧТО В НЕЙ НЕ ПРАВИЛЬНО.ДАЖЕ НЕ ЗАХОДИТ В ЦИКЛ ЗАМЕНЫ.ПОЖАЛУСТА
uses crt;
const new:string[3]='yls';
old:string[1]='e';
var f,g:text;st,str:string;n,k:byte;
procedure zamena;
begin
reset(f);

reset (g);
rewrite (g);
clrscr;
while eof(f) do
begin
read (f,st);
n:=length(st);
while not eoln(f) do
begin
{read (f,st);
n:=length(st);}
while pos(old,st)<>0 do
begin
k:=pos(old,st);
delete(st,k,n);insert (new,st,k);
writeln(g,st);

end;
writeln (g,st);
end;
writeln (g,st);
end;
close (g);
close(f);
end;
procedure vyvod (var h:text);
begin
reset (h);
while not eof(h) do
begin
readln(h,str);
writeln(str);
end;
close (h);
end;
begin
assign (f,'c:killme.txt');
assign (g,'newkillme.txt');
writeln ('первое');

zamena;
writeln ('vtoroe');
vyvod (g);
end.



Вопрос отправлен: 15.12.2002, 14:33
Отправитель: сергей

[Следующий вопрос >>] [Список вопросов]

Отвечает Ayl

Добрый день, сергей!
Мда... Что тут сказать... Интересный подход...
Начнем по порядку:
1. reset (g);
rewrite (g);
Здесь reset (g) не нужен.
2. while eof(f) do
Это просто песня! Выполнять цикл, пока обнаружен конец файла? Вот поэтому и не входит в процедуру замены. Надо писать:
while not eof (f) do
3. Далее даже и смотреть не хочется - такое наворочено! И работать не будет, по крайней мере правильно.
Кстати, зачем читать из файла по read? Есть же функция readln - прочитать полную строку. И с eoln тогда работать не надо. Или это задание такое - использовать eoln? Или указано, что длина строки в файле может быть больше 255 символов?
В общем, я бы написал вот так (см. Приложение).

Приложение:

Ответ отправлен: 16.12.2002, 14:04
Отправитель: Ayl


Отвечает Ace

Здравствуйте, сергей!
Держи работающую программу.

Приложение:

Ответ отправлен: 15.12.2002, 19:51
Отправитель: Ace


Отвечает Zloy

Приветствую Вас, сергей!
не стал вдумываться, что ты пытался сделать, но строки
reset (g);
rewrite (g);
убедили меня (дальше идёт диагноз), что ты ВООБЩЕ не понимащь принципов работы с файлами.
лечение: запускаешь bp, нажимашь Shift+F1, вводишь почереди reset и rewrite и внимательно, вдумываясь в каждое слово, читаешь то что там написанно... и если после этого, ты ещё раз напишешь такое, значит диагноз смертельный.

Ответ отправлен: 15.12.2002, 21:33
Отправитель: Zloy


Отвечает Melkor

Добрый день, сергей!
Мне не очень понятен алгоритм твоей программы, но могу сказать точно, что в первом цикле процедуры замены надо писать while not eof(f), т.к. eof(f) возвращает True, если обнаружен конец файла.

Ответ отправлен: 15.12.2002, 23:45
Отправитель: Melkor


Отвечает Lexus

Приветствую Вас, сергей!
Читай строку, определяй её длинуи организуй цикл. Сверяй каждый символ с "е". Найдя этот символ удаляй его процедурой delet. Дальше вставляй "YLS" процедурой input.
Не забудь после этого увеличить i на 2, что бы не сравнивать L и S.
Удачи.

Ответ отправлен: 16.12.2002, 00:51
Отправитель: Lexus


Отвечает Vadim

Добрый день, сергей!
См. приложение.

Приложение:

Ответ отправлен: 16.12.2002, 08:55
Отправитель: Vadim


Отвечает PashaS

Доброе время суток, сергей!
В вашей программе допущено много логических ошибок:
1) Попытка открыть файлы в процедуре, связанные с файловыми переменными в теле основной программы. Что странно, вторая процедура в этом отношении написана правильно;
2) Открытие файла с измененным текстом сначала reset'ом, а потом перезапись rewrite.
3) Лишний цикл с постусловием while not eoln(f) do. И вообще с циклами что то накручено много лишнего...
В приложении исправленный вариант.

Приложение:

Ответ отправлен: 16.12.2002, 19:11
Отправитель: PashaS


 Вопрос № 122

Привет!
Подскажите пожалуйста.Я написал программу, в ней надо
сделать проверку вводимых значений. Я написал с использованием меток,
но препод сказал, что нельзя использовать метки. Вот кусок это программы:
Begin
Writeln ('Введите колличество значений массива А');
m1: Readln (k);
If k<=0 then writeln ('Введите положительное число, больше 1');
If k<=0 then goto m1;
If k=1 then writeln ('Введите число, больше 1');
If k=1 then goto m1;
Writeln ('Введите переменную В - нижнее значение интервала');
Readln (B); {Ввод переменной B}
m2: Writeln ('Введите переменную C - верхнее значение интервала');
Readln (C); {Ввод переменной C}
If C<=B then writeln ('Ошибка!!! Верхний интервал не может быть меньше нижнего');
If C<=B then goto m2;
Writeln ('Введите ',k,' заначени(й,я) элементов массива А');
For I:=1 to k do readln (A[i]); {Ввод в память значаний массива}
If p6(b,c)=0 then Firstvetv(b,c) else SecondVetv(p6(b,c));
Write ('Нажмите Enter, для выхода из программы');
readln;
end.
---
Как можно написать без использования меток?
Будьте добры. Пришли пожалуйста ответ на ozolc@mail.ru
Очень жду вашего ответа.



Вопрос отправлен: 16.12.2002, 10:19
Отправитель: nizar (ozolc@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Melkor

Здравствуйте, nizar!
Использование меток и goto в программе обычно сводится к минимуму, и, вообще, если можно без них обойтитсь, их использовать не надо, можно, например, использовать циклы (Пример выслан на твой mail).

Ответ отправлен: 16.12.2002, 21:37
Отправитель: Melkor


Отвечает toshka

Приветствую Вас, nizar!
Begin
Writeln ('Введите колличество значений массива А');
repeat
Readln (k);
If k<=1 then writeln ('Введите положительное число, больше 1');
until k > 1;
Writeln ('Введите переменную В - нижнее значение интервала');
Readln (B); {Ввод переменной B}
Writeln ('Введите переменную C - верхнее значение интервала');
repeat
Readln (C); {Ввод переменной C}
If C<=B then writeln ('Ошибка!!! Верхний интервал не может быть меньше нижнего');
until C > B;
.....

Ответ отправлен: 16.12.2002, 10:44
Отправитель: toshka


Отвечает vitya

Приветствую Вас, nizar!
самый простой вариант реализации проверок на ввод (на мой взгляд)
var:
b:boolean;
begin
b := true;
while (b) do
begin
{читать данные}
if (data_is_ok)
b := false;
end;
end.
вот и все

Ответ отправлен: 16.12.2002, 10:54
Отправитель: vitya


Отвечает Tancho

Приветствую Вас, nizar!
Надо пользовать оператор цикла repead ... until(условия)
Смотри приложению!

Приложение:

Ответ отправлен: 16.12.2002, 14:30
Отправитель: Tancho


Отвечает Sensey

Приветствую Вас, nizar!
Прогу писать не буду, просто скажу: Почитай о continue и break
Если с английским слабо, вольный перевод :)
continue- переход в начало цикла
break - досрочный выход с цикла
То есть тебе надо сделать что-то типа
repeat
readln(...);
if неправильный ввод then continue;
if правильный ввод then break;
until ...


Ответ отправлен: 16.12.2002, 14:43
Отправитель: Sensey


Отвечает Byter

Добрый день, nizar!
Нету времени на мыло слать!
Пользуйся циклами!

Ответ отправлен: 16.12.2002, 17:04
Отправитель: Byter


Отвечает Ayl

Добрый день, nizar!
Например вот так (см.Приложение)

Приложение:

Ответ отправлен: 16.12.2002, 17:30
Отправитель: Ayl


Отвечает Ace

Добрый день, nizar!
Смотри мыло.

Ответ отправлен: 16.12.2002, 18:35
Отправитель: Ace


Отвечает PashaS

Здравствуйте, nizar!
Один из вариантов (наверное самый оптимальный) использовать цикл с постусловием, в цикле запрашивать данные, а условия окончания правильность ввода.
В проверке k можно не проводить проверку k<=0, т.к. k в любом случае должно быть больше 1.

Приложение:

Ответ отправлен: 16.12.2002, 19:11
Отправитель: PashaS


Отвечает Vadim

Доброе время суток, nizar!
Вот тоже самое, но без меток.
См. приложение.

Приложение:

Ответ отправлен: 17.12.2002, 07:41
Отправитель: Vadim


Отвечает X-RayMan

Доброго времени суток, nizar!
Для этого служат циклы типа:
repeat..until <условие> - выполняется пока <условие> ложно.
Или
while <условие> do - выполняется пока <условие> истинно.
См. приложение.

Приложение:

Ответ отправлен: 17.12.2002, 08:27
Отправитель: X-RayMan



Форма отправки вопроса

Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (39)
C / C++ (30)
Perl (5)
Delphi (21)
Pascal (24)
Basic / VBA (10)
Java / JavaScript (6)
PHP (4)
MySQL / MSSQL (5)
Пользователю
Windows 95/98/Me (32)
Windows NT/2000/XP (25)
"Железо" (33)
Поиск информации (14)
Администратору
Windows NT/2000/XP (9)
Linux / Unix (14)
Юристу
Гражданское право (8)
Семейное право (3)
Трудовое право (5)
КоАП (2)

Отправить вопрос всем экспертам выбранной рассылки.




Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное