Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.04.2011, 14:06
phasha phasha вне форума
Прохожий
 
Регистрация: 16.04.2011
Сообщения: 13
Репутация: 10
Вопрос нахождение трех минимальных цен

дан типизированный файл который создается программой
Код:
 program sozdat_file_agenstvo;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type agent=record
     kk:byte;
     et:integer;
     pl:real;
     cena:real;
     dt:record
     den:integer;
     mes:integer;
     god:integer;
     end;end;
type kvart=file of agent;
var i,n:integer; f:kvart; k:agent;
begin
  WriteLn('kol-vo kvartir: ');
  Readln(n);
  Assign(f, 'agenstvo.ddt');
  Rewrite(f);
  for i:=1 to N do begin
    Writeln('opishi kvartiru  ',i);
    write('komnati: ');
    Readln(k.kk);
    write('etag: ');
    Readln(k.et);
    write('ploschad: ');
    Readln(k.pl);
    write('den registr: ');
    Readln(k.dt.den);
    write('mesac registr: ');
    Readln(k.dt.mes);
    write('god registr: ');
    Readln(k.dt.god);
    write('cena: ');
    readln(k.cena);
    write(f,k);
  end;
  Close(f);
end.

после распечатываем содержимое следующей программой
Код:
program otkrit_file_agenstvo;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type agent=record
     kk:byte;
     et:integer;
     pl:real;
     cena:real;
     dt:record
     den:integer;
     mes:integer;
     god:integer;
     end;end;
type kvart=file of agent;
var i,n:integer; f:kvart; k:agent;
begin   i:=0;
 assign(f,'agenstvo.ddt');
 reset(f);
 While Not Eof(F) Do
  begin
   Inc(i);
   Read(F, K);
   Writeln('kvartira: ', i);
   Writeln('komnati: ', K.kk);
   Writeln('etag: ', K.et);
   Writeln('ploschad: ',K.pl:3:0,' kv. metrov');
   Writeln('data reg.: ', K.dt.den,'.',K.dt.mes,'.',K.dt.god,'g.');
   writeln('cena: ',k.cena:8:2,' rubley');
   writeln('----------------------------');
  end;
 readln;
  Close(f);
end.

вопрос:какое условие нужно поставить чтобы вывело 3 самых дешевых цены?((
Ответить с цитированием
  #2  
Старый 18.04.2011, 15:39
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Вам надо будет пробежаться по всем записям вначале чтобы выяснить какие записи минимальны:
вообщем
1.завести надо еще один тип запись (record)
с переменными : minim (мин. цена) и RecN номер записи
далее объявить массив arr [1..3] тип созданная запись.

2.пробежать по всем записям в файле (пусть переменная с-цена из файла).
то получим такое условие
Код:
if c<arr[1].minim then begin
arr[3].minim:=arr[2].minim;
arr[3].RecN:=arr[2].RecN;
arr[2].minim:=arr[1].minim;
arr[2].recN:=arr[1].RecN;
arr[1].minim:=c;
arr[1].RecN:=RecNo;(Текущий номер записи)
end;
По окончании цикла у вас будет 3 минимальных цены и 3 номера записи.

Примерно так, дальше шлифуйте
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"

Последний раз редактировалось Admin, 18.04.2011 в 16:26.
Ответить с цитированием
  #3  
Старый 18.04.2011, 17:18
phasha phasha вне форума
Прохожий
 
Регистрация: 16.04.2011
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от Black Raider
1.завести надо еще один тип запись (record)
с переменными : minim (мин. цена) и RecN номер записи
далее объявить массив arr [1..3] тип созданная запись.
эмммм.... то есть нужно следующее:
Код:
type zapis=record
       minim:real;
       recn:integer;
       end;
type mass=array[1..3] of zapis;
????????????????????????????????
а разве не будет ошибки о несовместимости типов agent и zapis?=(

Последний раз редактировалось phasha, 18.04.2011 в 17:20.
Ответить с цитированием
  #4  
Старый 18.04.2011, 17:23
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

нет не будет вы сравниваете не всю запись а только ее часть.
например:
Код:
zapis.minim<>agent.cena
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #5  
Старый 18.04.2011, 18:27
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А что, завести данные в массив, потом отсотрировать его и взять первые 3 элемента религия не позволяет?
Ответить с цитированием
  #6  
Старый 18.04.2011, 19:20
phasha phasha вне форума
Прохожий
 
Регистрация: 16.04.2011
Сообщения: 13
Репутация: 10
По умолчанию

хм...а это как?
Ответить с цитированием
  #7  
Старый 18.04.2011, 22:23
Аватар для AND_REY
AND_REY AND_REY вне форума
Активный
 
Регистрация: 31.03.2009
Адрес: Украина, г.Днепропетровск
Сообщения: 324
Версия Delphi: Delphi7
Репутация: 3877
По умолчанию

Вот подправил, вроде работает, может и проще можно не знаю
Код:
program otkrit_file_agenstvo;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type agent=record
     kk:byte;
     et:integer;
     pl:real;
     cena:real;
     dt:record
     den:integer;
     mes:integer;
     god:integer;
     end;end;
type kvart=file of agent;
var i,u:integer; f:kvart; k:agent; m: Array [1..3] of integer; mc: real;
begin   i:=0; u:=0;
 assign(f,'C:\agenstvo.ddt');
 m[1]:= -1;
 m[2]:= -1;
 m[3]:= -1;
 For u:=1 To 3 Do
 begin
  mc:= 9999999;
  i:= 0;
  reset(f);
  While Not Eof(F) Do
   begin
    Inc(i);
    Read(F, K);
    if k.cena < mc Then
    if (m[1]<>i)and(m[2]<>i)and(m[3]<>i) Then
     begin
      mc:= k.cena;
      m[u]:= i;
     end;
   end;
 end;
 i:= 0;
 reset(f);
 While Not Eof(F) Do
  begin
   Inc(i);
   Read(F, K);
   if (i=m[1])or(i=m[2])or(i=m[3]) Then
    begin
     Writeln('kvartira: ', i);
     Writeln('komnati: ', K.kk);
     Writeln('etag: ', K.et);
     Writeln('ploschad: ',K.pl:3:0,' kv. metrov');
     Writeln('data reg.: ', K.dt.den,'.',K.dt.mes,'.',K.dt.god,'g.');
     writeln('cena: ',k.cena:8:2,' rubley');
     writeln('----------------------------');
    end;
  end;
 readln;
  Close(f);
end.
__________________
If end Then begin;
Ответить с цитированием
  #8  
Старый 18.04.2011, 22:40
phasha phasha вне форума
Прохожий
 
Регистрация: 16.04.2011
Сообщения: 13
Репутация: 10
По умолчанию

ого=))благодарю))
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:48.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025