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

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

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

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

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2012, 00:32   #1
Liba
 
Регистрация: 28.11.2012
Сообщений: 4
По умолчанию Вычислить сумму тех элементов списка, значения которых меньше значений всех элементов, непосредственно следующих за ними (Delphi)

Здравствуйте! Нужно написать программу в Delphi.
Вычислите сумму тех элементов списка, значения которых меньше значений всех элементов, непосредственно следующих за ним.


______________
Название темы по правилам форума должно адекватно отражать суть решаемой задачи/проблемы.
На первый раз я исправил.
В последующем, темы с подобным названием будут закрываться или удаляться,
а автор такой темы будет получать штрафные баллы.
Учтите это на будущее.

Модератор.

Последний раз редактировалось Serge_Bliznykov; 28.11.2012 в 00:59.
Liba вне форума Ответить с цитированием
Старый 28.11.2012, 00:57   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,245
По умолчанию

наработки свои давайте.
Как минимум - ваш код, где Вы описываете список и заполняете его значениями...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.11.2012, 09:41   #3
Александр Павлович
Пользователь
 
Аватар для Александр Павлович
 
Регистрация: 25.11.2012
Сообщений: 13
По умолчанию

[QUOTE=Liba;1139441]Здравствуйте! Нужно написать программу в Delphi.
Вычислите сумму тех элементов списка, значения которых меньше значений всех элементов, непосредственно следующих за ним.

Если собрались писать сами, то вот идея:
нужно идти с конца списка, накапливая минимум пройденных элементов. Если очередной элемент меньше минимума пройденных, добавляем его к сумме.
С глубоким уважением,
Александр
Александр Павлович вне форума Ответить с цитированием
Старый 29.11.2012, 22:02   #4
Liba
 
Регистрация: 28.11.2012
Сообщений: 4
По умолчанию

Вот, вроде работает нормально))

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Size = 1..1000;

type
  TForm1 = class(TForm)
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  massive = array [Size] of integer;
  matrix = array [Size] of massive;
var
  Form1: TForm1;
  mat : matrix;
  n : integer;
  vector : massive;

implementation

{$R *.dfm}

function Count(a : integer) : integer;
var i, res : integer;
begin
  res := 0;
  for i := 1 to n do begin
    if (mat[a][i] < 0) or (mat[a][i] > 10) then
      inc(res);
  end;
  count := res;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j : integer;
begin
  randomize();
  n := strtoint(edit1.Text);
  for i := 1 to n do
    for j := 1 to n do
      mat[i][j] := random(20);
  label1.Caption := label1.Caption + inttostr(n) + ' * ' + inttostr(n) + chr(10) + chr(10);
  for i := 1 to n do begin
    for j := 1 to n do
      label1.Caption := label1.Caption + inttostr(mat[i][j]) + ' ';
    label1.Caption := label1.Caption + chr(10);
  end;
  label1.Top := 140;
  label1.Left := 8;
  form1.Height := label1.Height + label1.Top + 70;
  if (label1.Width > edit1.Width) then
    form1.Width := label1.Width + 100
  else
    form1.Width := edit1.Width + 100;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i, j : integer;
begin
  for i := 1 to n do
    vector[i] := Count(i);
  label2.Left := label1.left;
  label2.top := label1.Height + 130;
  for i := 1 to n do
    label2.Caption := label2.Caption + ' ' + inttostr(vector[i]);
end;

end.


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 29.11.2012 в 22:12.
Liba вне форума Ответить с цитированием
Старый 29.11.2012, 22:15   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,245
По умолчанию

Liba, я не хочу Вас расстраивать, но "списка" в вашем решении нет!
Вы сделали через массивы (тем более, чем статические!), допускаю, что это может "прокатить", но, будьте морально готовы, есть высокая доля вероятности, что решение не будет зачтено...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.11.2012, 22:32   #6
Liba
 
Регистрация: 28.11.2012
Сообщений: 4
По умолчанию

Не тот код скинул.. Совсем слепой стал :D

Вот)

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Edit1: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  PList = ^List;
  List = record
    x : integer;
    next : PList;
  end;

var
  Form1: TForm1;
  a : array [1..100] of List;
  n, sum : integer;
implementation


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i, r, j : integer;
    cur, last, temp : List;
    correct : boolean;
begin
  randomize();
  sum := 0;
  label3.Caption := '';
  label2.Caption := '';
  n := strtoint(edit1.Text);
  for i := 1 to n do begin
    a[i].x := random(30);
    if i > 1 then
      a[i - 1].next := @a[i];
  end;
  cur := a[1];
  a[n].next := @last;
  for i := 1 to n do begin
    label2.Caption := label2.Caption + inttostr(cur.x) + ' ';
    cur := (cur.next)^;
  end;
  cur := a[1];
  for i := 1 to n - 1 do begin
    correct := true;
    temp := (cur.next)^;
    for j := 1 to n - i do begin
      if temp.x <= cur.x then begin
        correct := false;
        break;
      end;
      temp := (temp.next)^;
    end;
    if correct then
      sum := sum + cur.x;
    cur := (cur.next)^;
  end;
  label3.Caption := label3.caption + 'Сумма равна ' + inttostr(sum);
end;

end.

Последний раз редактировалось Liba; 29.11.2012 в 22:45.
Liba вне форума Ответить с цитированием
Старый 30.11.2012, 00:34   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,245
По умолчанию

уже лучше. Только всё равно неверно.
Выбросите из программы массив a : array [1..100] of List;
Совсем.
Вместо него добавьте переменную типа PList, которая указывает на "голову" списка. И дальше всё взаимодействие со списком стройте через этот указатель.
Память под список выделяйте с помощью процедуры New()

А вообще по сути список, это набор связанных данных. Поле Next показывает на следующий элемент в списке, в нём - на следующих и т.д. Пока не встретим значение NIL в поле Next.
Поищите, тут на форуме огромная туча примеров кода работы с динамическими списками...
Serge_Bliznykov вне форума Ответить с цитированием