Вопрос № 178560: Добрый день,уважаемые эксперты!!!! Помогите пожалуйста сделать задачу на тему:"типизированные файлы" файл с инструкцией, что необходимо сделать: http://rfpro.ru/upload/2462 http://rfpro.ru/upload/2461 -это индивидуальное за...
Вопрос № 178787: Даны текстовый файл, в котором находится прямоугольная матрица. Определить: 1) Количество столбцов, содержащий хотя бы один нулевой элемент( оформить виде функции) 2) Номер строки, в которой находится самая длинная серия одинаковых элементов(оф...
Вопрос № 178789: Здравствуйте, уважаемые эксперты! Помогите разобраться.. некорректно работает программа бинарного поиска. Текст программы в приложении (у меня нерекурсивная реализация, программа: ABC), также, если возможно подскажите рекурсивный вариант. Зар...
Вопрос № 178560:
Добрый день,уважаемые эксперты!!!! Помогите пожалуйста сделать задачу на тему:"типизированные файлы" файл с инструкцией, что необходимо сделать: http://rfpro.ru/upload/2462 http://rfpro.ru/upload/2461 -это индивидуальное задание(оно рабочее) на основе которого нужно сделать задание по файлам
будет запускаться на pascal abc Прошу,пожалуйста помогите! С уважением!
Отвечает lamed, Профессионал :
Здравствуйте, angel.nero! Приношу извинения за задержку. Проверено на ABC. Возможные улучшения: 1. Быстрая сортировка 2. В данной программе в случае операций удаления/добавления индексные массивы пересоздаются, можно, просто добавлять или удалять соответствующую запись. 3. Выгодней создать структуру, которая содержит как индексный массив, так и функцию сравнения 4. Можно ввести массив указателей на индексные массивы, тогда можно менять их число ... Если потребуются дополнения или уточнения,
пишите в мини-форум
Код:
uses Crt; const MAX_RECORDS = 500; // максимальное число записей в файле type TIndex = record arr: array[0..MAX_RECORDS-1] of integer; size: integer; end;
function find( const f:TBase; const recno: integer; var FoundRec: TOneInfo): integer; // если запись существует // возвращает recno или -1, если запись не существует // foundrec присваивается значение найденной записи // иначе возвращает
-1 // var fSize: integer; begin fSize := FileSize(f); if (fSize=0) or (recno < 0) or (recno >=fSize) then find := -1 else begin seek(f, recno); read(f, FoundRec); find := recno; end; end; { find }
function gtName(const rec1, rec2: TOneInfo): boolean; // истина, если название улицы первой записи лексикографически следует // за названием улицы второй записи begin gtName := rec1.Name
> rec2.Name; end; { gtName }
function gtHouse(rec1, rec2: TOneInfo): boolean; // истина, если номер дома первой записи больше номера дома второй записи begin gtHouse := rec1.House > rec2.House; end; { gtHouse }
function gtFlat(const rec1, rec2: TOneInfo): boolean; // истина, если номер квартиры первой записи больше номера квартиры второй записи begin gtFlat := rec1.Flat > rec2.Flat; end; { gtFlat }
function gtFloor(const rec1, rec2: TOneInfo): boolean; //
истина, если номер этажа первой записи больше номера этажа второй записи begin gtFloor := rec1.floor > rec2.floor; end; { gtFloor }
procedure CreateIdx(const f: TBase; var idx: TIndex); // Создание индексного массива var rec: TOneInfo; i : integer; begin idx.size := FileSize(f); for i:= 1 to idx.size do idx.arr[i] := i-1; end; { CreateIdx }
procedure Sort(const f: TBase; var idx: TIndex; const
gt: TGreater); // Сортировка индексного массива // Метод "пузырька" как самый простой для восприятия var i,j,n : integer; tmp: integer; rec1, rec2: TOneinfo; begin
n:= filesize(f); seek(f,0); for i:= 1 to idx.size-1 do for j:= idx.size downto i+1 do begin seek(f, idx.arr[j]-1); read(f, rec1); read(f, rec2);
if gt(rec1, rec2) then begin tmp := idx.arr[j]; idx.arr[j] := idx.arr[j-1];
idx.arr[j-1] := tmp; end; end; end; { Sort }
procedure CreateIdxAll( const f: TBase; var idx1, idx2, idx3: TIndex; const gt1, gt2, gt3: TGreater); // Создание и сортировка всех индексных файлов begin CreateIdx(f, idx1); Sort(f, idx1, gt1);
procedure AddRec(var f: TBase); // Вв
од новой записи и добавление в файл var i, House, Flat: integer; name: string; rec: TOneinfo;
begin writeln(
'Ввод базы данных');
write('Название улицы '); readln(rec.name);
write('номер дома '); readln(rec.House);
write('этаж '); readln(rec.floor);
write('номер квартиры '); readln(rec.Flat);
seek(f, filesize(f)); write(f, rec);
readln; end; { AddRec }
procedure PrintRec(const rec:TOneinfo); // Печать одной записи var i: integer; begin with rec do writeln('ул.',
name, ',', House, ',кв.', flat, ',', floor, '-й этаж'); end; { Print }
procedure PrintFile(const f: TBase; const idx: TIndex); //Процедура вывода всех записей var i: integer; rec: TOneinfo; begin for i:= 1 to idx.size do begin seek(f, idx.arr[i]); read(f, rec); PrintRec(rec); end; readln; end; { PrintAll }
procedure PrintAll(const f: TBase; const idx1, idx2, i
dx3: TIndex); // Печать всех записей файла, сортировка по трем условиям begin clrscr; writeln('Сортировка по номеру дома'); PrintFile(f, idx1); writeln('Сортировка по номеру квартиры'); PrintFile(f, idx2); writeln('Сортировка по номеру этажа'); PrintFile(f, idx3); end; { PrintAll }
function MaxFlat(const f: TBase): TOneInfo; //процедура, определяет запись с наибольшим номером квартиры var i: integer; rec, max: TOneinfo; begin
max.Flat := -MaxInt-1; seek(f,0); while not eof(f) do begin read(f,rec); if rec.Flat > max.Flat then max := rec; end; MaxFlat := rec; end; { MaxFlat }
function FirstFloor(const f: TBase): integer; // функцию, определяющую количество жителей первого этажа var k: integer; rec: TOneinfo; begin k := 0; seek(f,0); while not eof(f) do begin re
ad(f,rec); if rec.floor =1 then inc(k); end; FirstFloor:=k; end; { FirstFloor }
procedure DelRec(var f: TBase; const RecNo: integer); // Удаление записи var rec, tmp: TOneInfo; fSize : integer; begin fSize := FileSize(f); if (recno >= 0) and (recno < fSize) then begin seek(f, FileSize(f)-1); read(f, rec); seek(f, recno); write(f, rec); seek(f, fSize-1); Truncate(f); writeln('Запись
удалена'); end else writeln('Неверный номер. Удаление невозможно'); end; { DelRec }
procedure menu; begin writeln('1. Добавить запись'); writeln('2. Вывести на печать одну запись'); writeln('3. Вывести на печать все записи'); writeln('4. Наибольший номер квартиры'); writeln('5. Количество жителей первого этажа'); writeln('6. Удалить запись'); writ
eln('0. Выход'); end; { menu }
var choice : integer; // выбор пункта f : TBase; rec : TOneInfo; idx1, idx2, idx3 : TIndex; // массив индексов recno : integer; fName : string;
// y, m, k, n: integer; // key: tkey; // StreetName: string[20];
var ii: integer;
begin { main } ClrScr; fName := 'city.dat'; assign(f, fName); if not FileExists(fname)
then begin rewrite(f); close(f); end;
choice := 1; while choice <> 0 do begin clrscr; menu; write('Выбор '); readln(choice); case choice of 1: begin AddRec(f); CreateIdxAll(f, idx1, idx2, idx3, gtHouse, gtFlat, gtFloor);
end; 2: begin write('Номер печатаемой записи '); readln(RecNo); if
find(f, recno, rec)>=0 then PrintRec(rec) else writeln('Номер не существует'); readln; end; 3: PrintAll(f, idx1, idx2, idx3); 4: begin writeln('Наибольший номер квартиры ', MaxFlat(f).Flat); readln; end; 5: begin writeln('Количество жителей первого этажа ', FirstFloor(f)); readln;
end; 6: begin write('Номер удаляемой записи '); readln(RecNo); DelRec(f, RecNo); CreateIdxAll(f, idx1, idx2, idx3, gtHouse, gtFlat, gtFloor); readln; end; 0: writeln('Работа завершена') else writeln('Пункты 0..6'); end; end; close(f); end.
Пример работы
Код:
1. Добавить запись 2. Вывести на печать одну запись 3. Вывести на печать все записи 4. Наибольший номер квартиры 5. Количество жителей первого этажа 6. Удалить запись 0. Выход Выбор 3 Сортировка по номеру дома ул.Моховая,1,кв.1,1-й этаж ул.Речная,1,кв.3,1-й этаж ул.Сосновая,4,кв.20,5-й
этаж ул.Сосновая,5,кв.1,1-й этаж Сортировка по номеру квартиры ул.Сосновая,5,кв.1,1-й этаж ул.Моховая,1,кв.1,1-й этаж ул.Речная,1,кв.3,1-й этаж ул.Сосновая,4,кв.20,5-й этаж Сортировка по номеру этажа ул.Сосновая,5,кв.1,1-й этаж ул.Моховая,1,кв.1,1-й этаж ул.Речная,1,кв.3,1-й этаж ул.Сосновая,4,кв.20,5-й этаж 1. Добавить запись 2. Вывести на печать одну запись 3. Вывести на печать все записи 4. Наибольший ном
ер квартиры 5. Количество жителей первого этажа 6. Удалить запись 0. Выход Выбор 4 Наибольший номер квартиры 1 1. Добавить запись 2. Вывести на печать одну запись 3. Вывести на печать все записи 4. Наибольший номер квартиры 5. Количество жителей первого этажа 6. Удалить запись 0. Выход Выбор 5 Количество жителей первого этажа 3 1. Добавить запись 2. Вывести на печать одну запись 3. Вывести на печать все записи 4. Наибольший номер квартиры 5. Количество
жителей первого этажа 6. Удалить запись 0. Выход Выбор 1 Ввод базы данных Название улицы Ленина номер дома 15 этаж 37 номер квартиры 2 1. Добавить запись 2. Вывести на печать одну запись 3. Вывести на печать все записи 4. Наибольший номер квартиры 5. Количество жителей первого этажа 6. Удалить запись 0. Выход Выбор 6 Номер удаляемой записи 15 Неверный номер. Удаление невозможно 1. Добавить запись 2. Вывести на п
ечать одну запись 3. Вывести на печать все записи 4. Наибольший номер квартиры 5. Количество жителей первого этажа 6. Удалить запись 0. Выход Выбор 2 Номер печатаемой записи 2 ул.Сосновая,4,кв.20,5-й этаж 1. Добавить запись 2. Вывести на печать одну запись 3. Вывести на печать все записи 4. Наибольший номер квартиры 5. Количество жителей первого этажа 6. Удалить запись 0. Выход Выбор 0 Работа завершена
Ответ отправил: lamed, Профессионал
Ответ отправлен: 03.06.2010, 09:09
Номер ответа: 261836
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 261836
на номер 1151 (Россия) |
Еще номера »
Вопрос № 178787:
Даны текстовый файл, в котором находится прямоугольная матрица. Определить: 1) Количество столбцов, содержащий хотя бы один нулевой элемент( оформить виде функции) 2) Номер строки, в которой находится самая длинная серия одинаковых элементов(оформить виде процедуры). P.S вывести созданную в файле матрицу на экран.
Отвечает Пупорев Юрий Борисович, Специалист :
Здравствуйте, Борис Владимирович Быков! Код программы в приложении. Создайте в папке с программой несколько текстовых файлов для тестирования, примерно такого содержания 5 6 1 3 4 5 5 2 0 2 2 2 6 8 4 4 4 4 0 9 0 2 3 5 6 6 5 6 7 8 9 0 в первой строке 2 числа это размеры матрицы в файлах сделать матрицы разных размеров, с разной длиной серий(в том числе и с нулевой), с нолями и без нолей.
Приложение:
Ответ отправил: Пупорев Юрий Борисович, Специалист
Ответ отправлен: 31.05.2010, 23:00
Номер ответа: 261781
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 261781
на номер 1151 (Россия) |
Еще номера »
Вопрос № 178789:
Здравствуйте, уважаемые эксперты! Помогите разобраться.. некорректно работает программа бинарного поиска. Текст программы в приложении (у меня нерекурсивная реализация, программа: ABC), также, если возможно подскажите рекурсивный вариант. Заранее огромное спасибо!
Отправлен: 31.05.2010, 21:16
Вопрос задал: verona, 2-й класс
Всего ответов: 1 Страница вопроса »
Собственно функция поиска у Вас работает нормально. Но бинарный поиск может быть применен только к упорядоченным данным, а Вы заполняете массив случайными числами. Я изменил процедуру Init для заполнения массива упорядоченными числами и добавил рекурсивную функцию CheckR (см. приложение). Массив передается в функцию как var-параметр — это уменьшает накладные расходы, что особенно важно в случае рекурсии. Функция CheckR возвращает индекс элемента или -1, если элемент не найден,
поскольку, как правило, в практических приложениях данные — это некоторые структуры, и с найденным элементом потом что-то делают.
В Вашей программе мне еще показалось странным объявление
Type mas=array [1..n*2] of integer;
Совершенно непонятно умножение верхней границы на 2 — в программе используется только n первых элементов. Поэтому я изменил определение на
Type mas=array [1..n] of integer;
Программа проверена в Borland
Pascal 7.0. Должна работать и в других реализациях Паскаля.