Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2008, 21:10   #1
OTuser
 
Регистрация: 25.12.2008
Сообщений: 8
По умолчанию Файл из одномерных массивов.

Здравствуйте. Помогите пожалуйста доделать задачу, осталось совсем чуть-чуть.
Что требуется:
Цитата:
Создать файл, где компонентой будет массив из N чисел. Все четные по номеру компоненты участвуют в поиске минимального числа в файле, все нечетные – в поиске максимального числа файла. Компоненты, содержащие эти максимальное и минимальное значения, удалить из файла.
Что я, собственно, написал:
Код:
program Project6;

{$APPTYPE CONSOLE}

Const
N=10;
Type
mas=array[1..N] of integer;
files=file of mas;
Var
f1:files;
a:mas;
i,j,k,min,max,kmin,kmax:integer;

Procedure sozd_file;
begin
rewrite(f1);
For k:=1 to N do
begin
For i:=1 to N do
a[i]:=-1000+random(2000);
write(f1,a);
end;
close(f1);
reset(f1);
end;

Procedure vivod_file(Var f:files);
begin
reset(f);
k:=0;
while not eof(f) do
begin
read(f,a);
inc(k);
write(k,':');
For i:=1 to N do
write(a[i]:4);
writeln;
end;
end;
{Сдвиг компонент с минимальным и максимальным значениями в конец файла}
Procedure kminmax(minmax:integer);
begin
For i:=minmax to filesize(f1)-1 do
begin
seek(f1,i);
read(f1,a);
seek(f1,i-1);
write(f1,a);
end;
end;
{Обрезание сдвинутых в конец компонент}
procedure SeekAndDestroy;
begin
 seek(f1,filesize(f1)-2);
 truncate(f1);
end;


Begin
writeln;
randomize;
assign(f1,'f1-lab.txt');
{$I-}
reset(f1);
{$I+}
if ioresult<>0 then
begin
writeln('sozd_file');
sozd_file;
end;
sozd_file;
vivod_file(f1);
writeln;
reset(f1);
k:=0;
max:=-maxint;
min:=maxint;
while not eof(f1) do {Считывание компонент из файла}
begin
 read(f1,a);
 inc(k);
{-------------Начало куска-------------}
 if odd(k) then {Если компонента нечетная - поиск максимума в компоненте}
  begin
   For i:=1 to N do
   if a[i]>max then
    begin
     max:=a[i];
     kmax:=k;
    end;
 end
else {Если четная - поиск минимума}
 begin
  For i:=1 to N do
  if a[i]<min then
   begin
    min:=a[i];
    kmin:=k;
   end;
 end;
{--------------Конец-куска----------------}
end;
writeln('MIN=',min,', komponenta ',kmin);
writeln('MAX=',max,', komponenta ',kmax);
if kmin>kmax then
 begin
  kminmax(kmin);
  kminmax(kmax);
  SeekAndDestroy;
 end
else
 begin
  kminmax(kmax);
  kminmax(kmin);
  SeekAndDestroy;
end;
writeln;
vivod_file(f1);
close(f1);
readln
End.
Все работает отлично, но требуется из выделенного куска сделать функцию с передаваемым булевым параметром.
Что-то навроде:
Код:
function nomextrem(p:boolean):byte;
begin
if (a[i]>extrem)=p then...
end;
К сожалению, пропустил лекцию на тему "Процедуры и функции". Процедуры успел разобрать, а вот с функциями пока не очень получается. Исправьте пожалуйста, надеюсь этот пример поможет мне разобраться.
OTuser вне форума Ответить с цитированием
Старый 25.12.2008, 23:03   #2
OTuser
 
Регистрация: 25.12.2008
Сообщений: 8
По умолчанию

Помогите пожалуйста, через день сдавать =\
OTuser вне форума Ответить с цитированием
Старый 26.12.2008, 18:12   #3
OTuser
 
Регистрация: 25.12.2008
Сообщений: 8
По умолчанию

Прошу, уделите немного внимания...
OTuser вне форума Ответить с цитированием
Старый 26.12.2008, 18:25   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

OTuser Я переписал это в функцию, но получилось криво, т.к., чтобы получилось нормально, нужно было изначально писать прогу под функцию.
Но есть одно "НО"! При компиляции комп виснет и помогает только ребут!
Пробовал 2 раза. Больше не рискну ) Может, это только у меня. В причине пока не разобрался.

Вот код:
Код:
program Project6;

Const
N=10;
Type
mas=array[1..N] of integer;
files=file of mas;
Var
f1:files;
a:mas;
i,j,k,min,max,kmin,kmax:integer;

Procedure sozd_file;
begin
rewrite(f1);
For k:=1 to N do
begin
For i:=1 to N do
a[i]:=-1000+random(2000);
write(f1,a);
end;
close(f1);
reset(f1);
end;

Procedure vivod_file(Var f:files);
begin
reset(f);
k:=0;
while not eof(f) do
begin
read(f,a);
inc(k);
write(k,':');
For i:=1 to N do
write(a[i]:4);
writeln;
end;
end;
{Сдвиг компонент с минимальным и максимальным значениями в конец файла}
Procedure kminmax(minmax:integer);
begin
For i:=minmax to filesize(f1)-1 do
begin
seek(f1,i);
read(f1,a);
seek(f1,i-1);
write(f1,a);
end;
end;
{Обрезание сдвинутых в конец компонент}
procedure SeekAndDestroy;
begin
 seek(f1,filesize(f1)-2);
 truncate(f1);
end;

{-----------Та самая функция ----------}
function func(bl : boolean; ar : mas; FN : integer; fk : integer; var fkmxn : integer) : integer;
  var fi,fmax,fmin : integer;
 begin
 if bl then
 begin
   For fi:=1 to FN do
   if ar[fi]>fmax then
    begin
     fmax:=ar[fi];
     fkmxn:=fk;
    end;
  func := fmax;
  end
 else {Если четная - поиск минимума}
 begin
  For fi:=1 to FN do
  if ar[fi]<fmin then
   begin
    fmin:=ar[fi];
    fkmxn:=fk;
   end;
  func := fmin;
 end;
end;
{--------------------}

Begin
writeln;
randomize;
assign(f1,'f1-lab.txt');
{$I-}
reset(f1);
{$I+}
if ioresult<>0 then
begin
writeln('sozd_file');
sozd_file;
end;
sozd_file;
vivod_file(f1);
writeln;
reset(f1);
k:=0;
max:=-maxint;
min:=maxint;
while not eof(f1) do {Считывание компонент из файла}
begin
 read(f1,a);
 inc(k);
{-------------Начало куска-------------}
{--
 if odd(k) then {Если компонента нечетная - поиск максимума в компоненте
  begin
   For i:=1 to N do
   if a[i]>max then
    begin
     max:=a[i];
     kmax:=k;
    end;
 end
else {Если четная - поиск минимума
 begin
  For i:=1 to N do
  if a[i]<min then
   begin
    min:=a[i];
    kmin:=k;
   end;
 end;
--}

if odd(k) then max := func(odd(k),a,N,k,kmax)
else min := func(odd(k),a,N,k,min);
{--------------Конец-куска----------------}
end;
writeln('MIN=',min,', komponenta ',kmin);
writeln('MAX=',max,', komponenta ',kmax);
if kmin>kmax then
 begin
  kminmax(kmin);
  kminmax(kmax);
  SeekAndDestroy;
 end
else
 begin
  kminmax(kmax);
  kminmax(kmin);
  SeekAndDestroy;
end;
writeln;
vivod_file(f1);
close(f1);
readln
End.
PS: Не хотел вообще это выкладывать, но, раз пока больше ответов нет...
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 26.12.2008 в 18:27.
Sazary вне форума Ответить с цитированием
Старый 27.12.2008, 12:41   #5
OTuser
 
Регистрация: 25.12.2008
Сообщений: 8
По умолчанию

Цитата:
но получилось криво, т.к., чтобы получилось нормально, нужно было изначально писать прогу под функцию.
У меня, к сожалению тоже виснет...да, согласен, надо было изначально писать под ф-цию, но препод сказала что: "можно ничего не переписывая сделать ф-цию с минимальным кол-вом передаваемых параметров" =\
OTuser вне форума Ответить с цитированием
Старый 27.12.2008, 14:40   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

OTuser
Ну, если с минимальным, то можно, например N не передавать в качестве параметра и в функции использовать не FN,а N.
Да и вообще, учитывая, что все переменные глобальные, можно в функцию передавать только булево значение. Но это имхо неправильно.
Цитата:
У меня, к сожалению тоже виснет.
А это вообще отдельный вопрос.. Очень странно, что так происходит. Впервые с таким сталкиваюсь.
Попробуйте переписать функцию (вместе с куском, где она используется) сами (за основу можно взять и мой вариант). Думаю, принцип работы там понятен..
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 27.12.2008, 15:52   #7
OTuser
 
Регистрация: 25.12.2008
Сообщений: 8
По умолчанию

Хм...перезагрузился, мистическим образом перестало зависать. Однако от этого прога работать не стала, выдает рантайм эррор. Насчет "переписать функцию" - я ее уже раз 5 по-разному переписывать пробовал =\
Сейчас вот накорябал чет, минимум и максимум находится, а вот номера компонент с этими экстремумами - неверно запоминаются, и вследствие, из файла удаляются не те компоненты

Код:
program Project6rasras;

{$APPTYPE CONSOLE}

Const
N=10;
Type
mas=array[1..N] of integer;
files=file of mas;
Var
f1:files;
a:mas;
i,j,k,l,min,max,kmin,kmax,extrem,extrem2:integer;

Procedure sozd_file;
begin
rewrite(f1);
For k:=1 to N do
begin
For i:=1 to N do
a[i]:=-1000+random(2000);
write(f1,a);
end;
close(f1);
reset(f1);
end;

Procedure vivod_file(Var f:files);
begin
reset(f);
k:=0;
while not eof(f) do
begin
read(f,a);
inc(k);
write(k,':');
For i:=1 to N do
write(a[i]:4);
writeln;
end;
end;

Procedure kminmax(minmax:integer);
begin
For i:=minmax to filesize(f1)-1 do
begin
seek(f1,i);
read(f1,a);
seek(f1,i-1);
write(f1,a);
end;
end;
{--------------------obrezanie------------------------------}
procedure SeekAndDestroy;
begin
 seek(f1,filesize(f1)-2);
 truncate(f1);
end;
{Злосчастная функция}
function nextr(p:boolean):integer;
begin
if p=true then
 begin
  for i:=1 to N do
    begin
     if a[i]>extrem then
     begin
      extrem:=a[i];
      l:=k;
     end;
    end;
   nextr:=l;
 end;
if p=false then
 begin
  for i:=1 to N do
   begin
    if a[i]<extrem2 then
     begin
      extrem2:=a[i];
      l:=k;
     end;
   end;
  nextr:=l;
 end;

end;

Begin
writeln;
randomize;
assign(f1,'f1-lab.txt');
{$I-}
reset(f1);
{$I+}
if ioresult<>0 then
begin
writeln('sozd_file');
sozd_file;
end;
sozd_file;
vivod_file(f1);
writeln;
reset(f1);
k:=0;
l:=0;
extrem:=-maxint;
extrem2:=maxint;
while not eof(f1) do
begin
read(f1,a);
inc(k);
if odd(k) then
kmax:=nextr(odd(k))
else kmin:=nextr(odd(k));


end;
writeln('MAX=',extrem,', komponenta ',kmax);
writeln('MIN=',extrem2,', komponenta ',kmin);
if kmin>kmax then
 begin
  kminmax(kmin);
  kminmax(kmax);
  SeekAndDestroy;
 end
else
 begin
  kminmax(kmax);
  kminmax(kmin);
  SeekAndDestroy;
end;
writeln;
vivod_file(f1);
close(f1);
readln
End.

Последний раз редактировалось OTuser; 27.12.2008 в 16:00.
OTuser вне форума Ответить с цитированием
Старый 27.12.2008, 18:11   #8
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию

а не легче просто даже не передавать ничего в функцию ... зделать только возврат булеан ? !
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Старый 27.12.2008, 22:08   #9
OTuser
 
Регистрация: 25.12.2008
Сообщений: 8
По умолчанию

Преподаватель сказала сделать именно с передаваемым булевым параметром. Неужели никто не может подправить задачу?
OTuser вне форума Ответить с цитированием
Старый 27.12.2008, 22:42   #10
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию

Если препад сказал с минимальным количеством параметров то это = 0 ! Выдели код который надо засунуть в функцию ...
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Два одномерных массива,представляющие собой средние значения строк и столбцов исходного. Делфи 3 <DimonM@n> Помощь студентам 2 23.11.2008 21:51
Программирование операций обработки одномерных массивов Дима82 Помощь студентам 12 11.05.2008 15:24
как из двух отсортированных по возрастанию одномерных массивов сформировать третий Тоха Рыжов Общие вопросы C/C++ 1 07.10.2007 01:43