Консультация № 197035
10.11.2019, 18:23
0.00 руб.
0 7 1
Здравствуйте! (PascalABC) У меня возникли сложности с написанием данной программы: Напечатать в обратном порядке элементы вещественного файла до элемента, номер которого равен значению серединного элемента другого целочисленного файла. Количество элементов в каждом файле неизвестно. У меня есть наработки



Приложение:
program ves;
const
N=10000;
Type
celmas=array [1..N] of integer;
vesmas=array [1..N] of real;
Var
i,j,k: integer;
p: ^celmas;
q: ^vesmas;
Celfile: file of 1..100;
Vesfile: file of real;
begin
new(p); //получение динам.объекта p
reset(Celfile); {перевод эл-в этого файла в массив}
i:=0;
while not eof(Celfile) do
begin i:=i+1;
p^[i]:=Celfile^; get(Celfile)
end;
i:=p^[(i div 2)+1]; {нахожд. серединного эл-та}
dispose(p); //удаление динам. объекта p
new(q); //получение динам.объекта q
reset(Vesfile); //перепись эл-в вещфайла в массив
j:=0;
while not eof(Vesmas) do
begin j:=j+1;
q^[j]:=Vesfile^;
get(Vesfile)
end;
//печать эл-в в обратном порядке до эл-та с индексом =i включительно
for k:=j downto i do write(q^[k],'_');
writeln
end.

Обсуждение

давно
Профессор
401888
1232
10.11.2019, 19:12
общий
Адресаты:
Нужно
номер которого равен значению серединного элемента

Но номер это целое число, а значение элемента вещественное число. Как быть?
давно
Посетитель
403344
3
10.11.2019, 19:15
общий
[q=401888][/q] я не знаю, извините. Препод дал задание и исчез в неизвестном направлении до сдачи лабы
давно
Старший Модератор
31795
6196
10.11.2019, 19:21
общий
Адресаты:
Цитата: IvanDorohov
Количество элементов в каждом файле неизвестно

Как, а N=10000;, т.е. неизвестность у Вас заканчивается на 10'000. Я думал неизвестно = бесконечность.

Читаете хелп:
FileSize(f) функция = возвращает количество элементов в типизированном файле

Seek(f,n) процедура = перемещает файловый указатель в типизированном файле на n-тый элемент (нумерация начинается с нуля)

Т.е. прочитали количество, нашли средину, прочитали значание.
Ну а дальше по аналогии.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403344
3
10.11.2019, 19:39
общий
Адресаты:
промахнулся в лайках, извините, на сайте недавно. Вопрос: при пробеге по программе выходит ошибка на строке в var p: ^celmas; . Ошибка: Указатели на ссылочные типы недопустимы. Посмотрел в пособиях, вроде всё должно быть нормально. Как бороться с этой ошибкой?
давно
Старший Модератор
31795
6196
10.11.2019, 20:47
общий
АВС - учебная программа.
В первых паскалях было program(input,output) и там допускалось input^ читать, ещё до чтения как такового.
То, что в нормальном пасале проходит на ура, в АВС ="попытка разименовать указатель".


Прочитайте моё сообщение(выше) ещё раз и Вы найдете решение без указателей и динамической памяти.

Цитата: IvanDorohov
промахнулся в лайках,


Я на это уже давно не обращаю внимание. Тем более мою подпись читали:
Цитата: Зенченко Константин Николаевич
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Профессор
401888
1232
11.11.2019, 08:08
общий
Адресаты:
Извиняюсь, невнимательно прочитал условие
серединного элемента другого целочисленного файла.
давно
Профессор
401888
1232
11.11.2019, 09:51
общий
это ответ
Здравствуйте, IvanDorohov!
Предлагаю такой вариант.
[code lang=pascal]var f:file of real;
g:file of integer;
x,y:real;
a,b,c,n,i,j:integer;
begin
//создадим файлы с неизвестным количеством элементов
//вещественный
assign(f,'fileF');
rewrite(f);
writeln('Вводите в файл вещественные числа, окончание ввода 0');
repeat
readln(x);
if x<>0 then write(f,x);
until x=0;
//целый
assign(g,'fileG');
rewrite(g);
writeln('Вводите в файл целые числа, окончание ввода 0');
repeat
readln(a);
if a<>0 then write(g,a);
until a=0;
writeln('Содержание исходного файла вещественных чисел');
reset(f);
while not eof(f) do
begin
read(f,x);
write(x,' ');
end;
writeln;
writeln('Содержание исходного файла целых чисел');
reset(g);
while not eof(g) do
begin
read(g,a);
write(a,' ');
end;
writeln;
//сортировка файла целых чисел для поиска срединного элемента(медианы)
reset(g);
for i:=0 to filesize(g)-2 do
for j:=i+1 to filesize(g)-1 do
begin
seek(g,i);
read(g,a);
seek(g,j);
read(g,b);
if a>b then
begin
seek(g,i);
write(g,b);
seek(g,j);
write(g,a);
end;
end;
writeln('Содержание отсортированого файла целых чисел');
reset(g);
while not eof(g) do
begin
read(g,a);
write(a,' ');
end;
writeln;
reset(g);
c:=filesize(g)div 2;
if odd(filesize(g))then //если размер файла нечетный
begin
seek(g,c); //медиана равна среднему элементу
read(g,n);
end
else //иначе
begin
seek(g,c);
read(g,a);
seek(g,c-1);
read(g,b);
n:=(a+b) div 2;//медиана равна полусумме двух центральных
end;
writeln('Значение срединного элемента=',n);
close(g);
//печатаем в обратном порядке элеметы после n
reset(f);
if filesize(f)<n-1 then write('В файле вещественных чисел не хватает чисел для печати')
else
begin
writeln('Элементы файла вещественных чисел с конца до номера ',n);
for i:=filesize(f)-1 downto n-1 do
begin
seek(f,i);
read(f,x);
write(x,' ');
end;
end;
close(f);
end.[/code]
5
Спасибо большое, посмотрю вечером на пк
Форма ответа