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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.12.2009, 16:15
Kobe_Bryant_24 Kobe_Bryant_24 вне форума
Прохожий
 
Регистрация: 28.12.2009
Сообщения: 8
Репутация: 10
По умолчанию программа работает неправильно

не знаю что изменить в коде чтобы программа работала правильно.

Задание: Составьте программу, проверяющую, можно ли, меняя местами элементы одномерного массива А, получить целочисленный массив В.

Текст программы
PHP код:
unit Unit1;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsGridsStdCtrls;

type
  TForm1 
= class(TForm)
    
StringGrid1TStringGrid;
    
StringGrid2TStringGrid;
    
Label1TLabel;
    
Button1TButton;
    
Edit1TEdit;
    
Button2TButton;
    
Label2TLabel;
    
Label3TLabel;
    
Label4TLabel;
    
Label5TLabel;
    
Label6TLabel;
    
procedure Button1Click(SenderTObject);
    
procedure Button2Click(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(SenderTObject);
var 
ninteger;
begin
  n
:=StrToInt(Edit1.Text);
  
StringGrid1.RowCount:=n;
  
StringGrid2.RowCount:=n;
end;


procedure TForm1.Button1Click(SenderTObject);
var 
i,j,n,s:integer;
begin
   n
:=StrToInt(Edit1.Text);
   
s:=0;
   for 
i:=1 to n do
    for 
j:=1 to n do
     
begin
       
if (StringGrid1.Cells[0,i]=StringGrid2.Cells[0,j]) then s:=s+1;
     
end;
     
label2.Caption:=IntToStr(s);
    if 
s=n then label1.caption:='можно' else label1.Caption:='нельзя'
end;


end

Последний раз редактировалось Kobe_Bryant_24, 29.12.2009 в 16:17.
Ответить с цитированием
  #2  
Старый 29.12.2009, 16:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не совсем понятно, что надо сделать.
Как я понимаю:
У тебя есть некоторый массив A с числати типа Double (Extended) и т.д.
И есть некоторое целое число n - длинна желаемого массива.
Надо проверить, можно ли найти n целых чисел в массиве A, что бы составить массив B длинной n. Если так, то задача решается просто:
Код:
function CheckForB(A : Array Of Double; n : Integer) : Boolean;
var
  I : Integer;
  C : Integer;
begin
   Result := False;
   C := 0;
   For I := Low(A) To High(B) Do
     If Int(A[i]) = A[i] Then Inc(C);
   Result := C >= n;
end;
Ответить с цитированием
  #3  
Старый 29.12.2009, 16:29
Kobe_Bryant_24 Kobe_Bryant_24 вне форума
Прохожий
 
Регистрация: 28.12.2009
Сообщения: 8
Репутация: 10
По умолчанию

Вначале я задаю два одномерных массива А и В. А в задании вопрос:проверить можно ли, меняя местами элементы массива А получить массив В.

P.S. в моём коде переменная s - есть количество совпадений
Ответить с цитированием
  #4  
Старый 29.12.2009, 16:46
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А-а-а... Да, это немного другая задача.
Алгоритм такой. Берем массив B. Идем по нему циклом. проверяем каждый элемент на наличие в массиве A. Если элемент найден, то удаляем такой элемент из массива A и переходим к следующему элементу массива B. Если прошли весь массив B и нашли для него соотв. элементы в A, то можно. Иначе - нельзя.

ЗЫ. Код писать лень Там все просто. Тебе надо не только проверять на совпадения, но и контролировать их кол-во. Т.е. если в массиве B есть две 1, то и в массиве А их должно быть как минимум столько же. Ну и длинны массивов надо проверить для начала.
Ответить с цитированием
  #5  
Старый 29.12.2009, 18:30
Kobe_Bryant_24 Kobe_Bryant_24 вне форума
Прохожий
 
Регистрация: 28.12.2009
Сообщения: 8
Репутация: 10
По умолчанию

напишите код пожалуйста
Ответить с цитированием
  #6  
Старый 29.12.2009, 19:37
Kobe_Bryant_24 Kobe_Bryant_24 вне форума
Прохожий
 
Регистрация: 28.12.2009
Сообщения: 8
Репутация: 10
По умолчанию

люди! напишите код пожалуйста!
яп просто уже целый день сижу, не могу сообразить ничего!
Ответить с цитированием
  #7  
Старый 29.12.2009, 21:31
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

наверное гдето так:
Код:
function TForm1.Compare2Mass(A, B: array of Integer): Boolean;
var
  i, n, k, lenA : Integer;
  X: array of Integer;
  noIn,
  netA: Boolean;
begin
  Result := false;
  lenA := Length(A);
  if lenA <> Length(B) then
    Exit;  // если длины не совпадают то не получится

  SetLength(X, lenA);

  for i := 0 to lenA - 1 do
  begin // для каждого элемента B[i] проверяем
    netA := true;
    for n := 0 to lenA - 1 do // проверяем массив А
      if B[i] = A[n] then // есть такой элемент в массиве А
      begin
        noIn := true;
        for k := 0 to i - 1 do
          if n = X[k] then
          begin // его уже сопоставили с другим элементом массива В
            noIn := false;
            break;
          end;
        if noIn then
        begin // этот элемент еще не сопостовляли
          X[i] := n;
          netA := false; // нашли новый элемент в А соответствующий очередному в В
          break;
        end;
      end;
    if netA then // не нашли новый элемент в А соответствующий очередному в В
      Exit;
  end;
  // если еще не вышли значит все элементы найдены
  Result := true;
end;
Ответить с цитированием
  #8  
Старый 29.12.2009, 21:46
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Пришло на ум, одно из решений) отсортировать оба массива, а потом пробежаться в одном цикле по обоим массивам, до конца(истина) или до первого несовпадения(ложь)...
Ответить с цитированием
  #9  
Старый 30.12.2009, 08:44
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от Asinkrit
Пришло на ум, одно из решений) отсортировать оба массива, а потом пробежаться в одном цикле по обоим массивам, до конца(истина) или до первого несовпадения(ложь)...
А я сразу не сообразил. Только не так, а как сказано в задании - пытаемся перестроить ( отсортировать ) А под В
PHP код:
function TForm1.Compare2Mass2(AB: array of Integer): Boolean;
var
  
intmplenA Integer;
  
netABoolean;
begin
  Result 
:= false;
  
lenA := Length(A);
  if 
lenA <> Length(Bthen
    
Exit;  // если длины не совпадают то не получится

  
for := 0 to LenA do // перестроим А как В
    
if B[i] <> A[ithen
    begin 
// очередной несовпадает
      
netA := true;
      
// ищем в оставшихся
      
for := 1 to LenA do
        if 
B[i] = A[nthen
        begin  
// если нашли переставляем
          
tmp := A[i];
          
A[i] := A[n];
          
A[n] := tmp;
          
netA := false;
          break;
        
end;
      if 
netA then // если не нашли значит нельзя
        
Exit;
    
end;
  
// если еще не вышли значит все элементы переставлены
  
Result := true;
end
Ответить с цитированием
  #10  
Старый 30.12.2009, 16:46
Kobe_Bryant_24 Kobe_Bryant_24 вне форума
Прохожий
 
Регистрация: 28.12.2009
Сообщения: 8
Репутация: 10
По умолчанию

всем спасибо, сделал немного по-другому, тоже с сортировкой, работает
завтра сдам на зачёт всё вместе с этим)
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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