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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2018, 19:26   #1
Ymti
 
Регистрация: 15.05.2018
Сообщений: 6
По умолчанию [РЕШЕНО][Pascal ABC.NET] Cкопировать в новый список информацию о четырехкомнатных квартирах, общая площадь которых больше заданного значения.

Запись с полями: адрес квартиры; количество комнат; общая площадь квартиры.

1. Найти квартиру с минимальной средней площадью комнаты. Средняя площадь комнаты определяется как (общая площадь квартиры)/(количество комнат).
2. Скопировать в новый список информацию о четырехкомнатных квартирах, общая площадь которых больше заданного значения.
Не могу понять как сделать 2 задание можете помочь, вот код:

Код:
type
  college = record
    adr:string;
    kom:integer;
    plo:real;
  end;

type
  position = ^celltype;
  celltype = record
    info: college;
    next: position;
  end;
  list = ^celltype;

var
  l: List;
  p, k: position;
  n, a: Integer;
  
procedure Ins_SingleList(x: college; var L: LIST; var p: position);
var  q: position;   
begin
  New(q);   q^.info := x;
  if L = nil then begin
    q^.next := nil;
    L := q;
  end else begin
    q^.next := p^.next;
    p^.next := q;
  end;
  p := q;
end;

procedure InsFirst_SingleList(x: college; var L: LIST; var p: position);
var
  q: position;
begin
  New(q);
  q^.info := x;
  if L = nil then 
    q^.next := nil
  else
    q^.next := L;
  L := q;
  p := l;
end; 

procedure loadFromFile(filename: String; var l: list; var k: Integer);
var
  f: text;
  el: college;
  first: boolean;
begin
  k := 0;
  first := true;
  assign(f, filename);
  reset(f);
  while not eof(f) do
  begin
    if first then
    begin
      readln(f, el.adr);
      readln(f, el.kom);
      readln(f, el.plo);
      InsFirst_SingleList(el, l, p);
      inc(k);
      first := false;
    end else
    begin
      readln(f, el.adr);
      readln(f, el.kom);
      readln(f, el.plo);
      Ins_SingleList(el, l, p);
      inc(k);
    end;
  end;
  close(f);
end;

procedure output(l: list);
var
  q: position;
begin
  q := l;
  Writeln('|   Адрес квартиры    |    Кол-во комнат    |    Площадь комнат(м2)    |');
  while q <> nil do
  begin
    with q^.info do Writeln(adr:19,kom:15,plo:26);
    q := q^.next;
  end;
end;

procedure pmin(l: list; var k:position);
var
  q: position; 
  kom: integer; plo, min: real;
 begin 
  k:=l;
  q:= l;
  min := 1000;
  while q <> nil do
  
    begin
      if ((q^.info.plo/q^.info.kom)<min) then
      begin
        min := q^.info.plo/q^.info.kom; 
        k:=q
      end;
    q := q^.next;  
   end;
   
 end;

begin
  l := nil;
  p := nil;
  loadFromFile('laba4.txt', l, n);
  output(l);
  readln;
 
 
  pmin(l,k);    
  Writeln(k^.info.adr:19,k^.info.kom:15,k^.info.plo:16); 
      
  for var i := 0 to n do dispose(l);
 end.
Решения:
http://www.programmersforum.ru/showp...25&postcount=2
http://www.programmersforum.ru/showp...55&postcount=4

Последний раз редактировалось Вадим Мошев; 16.05.2018 в 15:40.
Ymti вне форума Ответить с цитированием
Старый 16.05.2018, 00:14   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
procedure PrintAll4rooms_bigger_than(l: list; zadan_plo : real );
var
  q: position;
begin
  q := l;
  Writeln('|   Адрес квартиры    |    Кол-во комнат    |    Площадь комнат(м2)    |');
  while q <> nil do
  begin
    with q^.info do
        if (kom>=4) and (plo>zadan_plo) then
             Writeln(adr:19,kom:15,plo:26);
    q := q^.next;
  end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.05.2018, 00:23   #3
Ymti
 
Регистрация: 15.05.2018
Сообщений: 6
По умолчанию

Большое спасибо, вы очень помогли. Я уже отчаялся...
Ymti вне форума Ответить с цитированием
Старый 16.05.2018, 09:38   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Да не за что.

Код Вам нельзя брать один в один.
1) нужно вывести только 4-х комнатные квартиры ( у меня в коде выводятся 4-х и больше)
нужно строго
Код:
   if (kom=4) and ...
2) Вам нужно вывести это в новый список.
поэтому код должен выглядеть примерно так
Код:
var
  l, l2: List;
...
procedure CopyAllbig_4rooms_to_new_list(l: list; var newList :list; zadan_plo : real );
var
  q,   p : position;
  first : boolean
begin
  newList := nil; 
  first := true;
  q := l;
  while q <> nil do
  begin
    with q^.info do 
        if (kom=4) and (plo>zadan_plo) then begin
              if first then
               begin
                  InsFirst_SingleList(q, newList, p);
                  first := false;
               end 
               else
                  Ins_SingleList(q, newList, p);
        end;       
        q := q^.next;
  end;
end;
p.s. разумеется, код не проверял.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[free Pascal]: Получить новый массив путём удаления из заданного массива все числа, больше заданного R Jon_Morgan Помощь студентам 1 24.12.2016 18:58
Turbo Pascal. Даны целочисленные файлы f и g одинаковой длины. Оставить в f только те компоненты, значения которых больше... ALena77 Помощь студентам 7 19.01.2016 22:05
Определить количество элементов, значения которых больше 2 элемента масива Димон222 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 12.11.2012 19:12
целое число N больше 0. найти сумму. 1+1/2+1/3+...+...1/N (Pascal ABC.net) gogomon93 Паскаль, Turbo Pascal, PascalABC.NET 2 22.06.2011 07:37
Сформировать вектор Х из тех элементов вектора А, сумма цифр которых в десятичной записи больше заданного Dimati87 Помощь студентам 1 06.03.2009 14:36