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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2011, 21:03   #1
Heles
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 21
По умолчанию Delphi. Поиск инверсий в массиве.

Определить количество инверсий в массиве X (т.е. таких пар эле-
ментов, в которых большее число находится слева от меньшего: xi>xj при i<j).
Проблема:
Нужно чтобы при каждом значении x[i]>x[j] менялось значение k(одна пара, вторая пара и так до N).
Код:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    Edit1: TEdit;
    Label1: TLabel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Button1: TButton;
    Button2: TButton;
    Label2: TLabel;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  type
        TMas = array [1..1] of integer;
        PMas = ^TMas;

var
  Form1: TForm1;
        x:PMas;
        i,j,t: integer;
        N:Integer;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
N:=8;
Edit1.text:=IntToStr(N);
        StringGrid1.ColCount:=N;
        StringGrid2.ColCount:=N;
For i:=0 to N do begin
        StringGrid1.Cells[i,0]:=IntToStr(random(100));
        end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var k:String;
begin
GetMem(x,N*sizeof(integer));
k:='Одна пара';       //нужно чтобы при каждому x[i]>x[j] результат k менялся.
for i:=0 to N do
for j:=1 to N do begin
if x[i]>x[j] then begin
StringGrid2.Cells[0,0]:=k;
end;
end;
FreeMem(x,N*sizeof(integer));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
try
N:=StrToInt(Edit1.text);
for i:=1 to N do begin
StringGrid1.ColCount:=i;
StringGrid2.ColCount:=i;
if N>8 then Abort;
end;
if N<=0 then
        case MessageDlg('Неправильное значение N. Измените значение',mtError,[mbOk],0) of
        mrOk: begin StringGrid1.ColCount:=8; StringGrid2.ColCount:=8; N:=8; Edit1.Text:=IntToStr(N);
        end;
        end;
if N=1 then
        case  MessageDlg('Минимальное значение N равно 2',mtError,[mbOk],0) of
        mrOk: begin StringGrid1.ColCount:=2; StringGrid2.ColCount:=2; N:=2; Edit1.Text:=IntToStr(N);
        end;
        end;
except
on EAbort do
        case MessageDlg('Максимальное количество столбцов равно 8. Измените значение',mtError,[mbOk],0) of
        mrOk: begin StringGrid1.ColCount:=8; StringGrid2.ColCount:=8; N:=8; Edit1.Text:=IntToStr(N);
         end;
         end;
on EConvertError do begin ShowMessage('Введите целое число'); Exit;
        end;
        end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
for i:=0 to N do begin
StringGrid1.Cells[i,0]:=IntToStr(random(100));
end;
end;
end.
Изображения
Тип файла: jpg Безымянный.jpg (49.4 Кб, 119 просмотров)
Heles вне форума Ответить с цитированием
Старый 16.10.2011, 21:02   #2
Heles
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 21
По умолчанию

Каким образом можно реализовать данный цикл?
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var bl:boolean;
k:integer;
begin
GetMem(x,N*sizeof(integer));
bl:=x[i]>x[j];       //нужно чтобы при каждом x[i]>x[j] изменялось значение k(пары чисел).
for i:=0 to N do
for j:=1 to N do begin
if x[i]>x[j] then begin
for k:=1 to bl do // ну тут явно ошибка, но по-другому я не знаю как цикл сделать.
StringGrid2.Cells[0,0]:=k;
end;
end;
FreeMem(x,N*sizeof(integer));
end;
Heles вне форума Ответить с цитированием
Старый 16.10.2011, 22:07   #3
ByAlex
Форумчанин
 
Аватар для ByAlex
 
Регистрация: 15.03.2011
Сообщений: 465
Радость

Цитата:
Сообщение от Heles Посмотреть сообщение
Каким образом можно реализовать данный цикл?
Как то вот так -
Код:
kol:=0;
for i:=2 to n do
begin
   if arr[i]<arr[i-1] then
     inc(Kol);
end;
Попробуй!
Помог - жми на весы!
ByAlex89@mail.ru
ByAlex вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в массиве onsite Microsoft Office Excel 17 14.07.2011 16:52
определить кол-во инверсий в массиве RAMON@ Общие вопросы C/C++ 5 10.06.2010 01:00
Поиск в массиве maksim_serg Microsoft Office Excel 13 13.05.2010 17:36
Поиск в массиве VladimirAleks Общие вопросы Delphi 3 06.11.2009 15:00
задача с методом попарных инверсий lini Помощь студентам 3 06.10.2009 00:04