горю и не пойму!!!дан текстовый файл со списком нескольких самолетов(номер самолета,фирма например).надо получить конечный файл с отсортированнымсписком по номеру самолетов.помогите!
Здравствуйте, сергей! Чтобы не терзать голову различными способами сортировки, лучше всего использовать объект 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 ('первое');
Добрый день, сергей! Мда... Что тут сказать... Интересный подход... Начнем по порядку: 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 Очень жду вашего ответа.
Здравствуйте, 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.