Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] Задача на массивы


Автор: Alex103 24.10.2006, 23:08
Дело в следующем мне нужно решить задачку по информатике а я так и не понял что от меня хотят! Может кто подскажет или поможет решить!

Заранее благодарен Александр!!!!!



1. Даны два массива: М1 = (-5, 10, 21, 35, -9, 11, 4, 5) и М2 = (1, 5, 10, -3, 4, -15, 36, 6, 11). Найти их объединение и результат записать в массив М3.


2. 



Автор: Snowy 24.10.2006, 23:18
Модератор: Перенесено из Паскаля

Автор: Palladin 25.10.2006, 01:44
Объединения это те места в которых элементы сошлись, короче строй на листе бумаги по точкам две линии, по одной на каждый из массивов, где пересекутся когда пересекутся это и будут твои точки
 М1 = (-5, 10, 21, 35, -9, 11, 4, 5) и М2 = (1, 5, 10, -3, 4, -15, 36, 6, 11).
допустим 
-5 и 1 =разошлись
10 и 5=пересеклись
21 и 10=пересеклись и расходятся ну и т.д. 

Но мне чёто кажется что задача у тебя не такая, скорее всего тебе нужно просто найти элементы которые есть и в первом и во втором массиве и вывести на экран
P.S. Может я и не прав smile 

Автор: Alex103 25.10.2006, 09:43
Да задача именно на то что нужно сделать третий масив в котором будут те элементы которых нет в одном из масивов! Тоесть нужно третему масиву началь6но значение дать 2-го масива а потом сравнить его с первым! ТОлько я не знаю как записать это на паскале! Помогите сложить код!!!!!!! Плиз! Очень нужно!Я просто в масивах плохо разбираюсь!!!!!!!!!!1

Автор: SoWa 25.10.2006, 11:05
Код

for i:=1 to n do
for j:=1 to n do
 begin
  if m1[i]=m2[j] then m3[i]:=m1[i];
 end;


C учетом того, что пересечения множеств- это одинаковые элементы.

Автор: Palladin 25.10.2006, 12:31
Вот тебе вся программа, благо время есть свободно smile 
Короче я немного улучшу программу пользователь сам будет вводить два массиваsmile
Код

program RooR;
var
m1,m2,m3:array[1..100]of integer;
i,j,m,n,k:integer;
begin
 Writeln('Vvedite kol-vo elementov massiva M1: ');
 Readln(m);
 Writeln('Vvedite kol-vo elementov massiva M2:  ');
 readln(n);
 if (m1>0)and(m2>0)and(n<=100)and(m<=100) then
  begin
   Writeln('-------------------------------Vvedite massiv M1------------------------------');
   
   for i:=1 to m do
    begin
     Write('M1[',i,']= ');
     Readln(m1[i]);
    end;  
    Writeln('-------------------------------Massiv M1 VVEDEN------------------------------');
    Writeln('-------------------------------Vvedite massiv M2------------------------------');
    
    for j:=1 to n do
     begin
     Write('M2[',j,']= ');
     Readln(m2[i]);
     end;
     k:=1;
      if n>m then begin
    for j:=1 to n do
    for i:=1 to m do
     begin
     if m1[j]=m2[i] then begin m3[k]:=m1[j]; k:=k+1;
     end; 
     end;
     end
     else
    for j:=1 to m do
    for i:=1 to n do
     begin
      if m1[j]=m2[i] then begin m3[k]:=m1[j]; k:=k+1;
     end; 
    t:=k;
    Writeln('------------------MASSIV M1--------------');
    for i:=1 to m do
    Write(m1[i]);
     
    Writeln('------------------MASSIV M2--------------');
    for j:=1 to n do
    Write(m2[i]);

        Writeln('------------------MASSIV M3--------------');
    for k:=1 to t do
    Write(m3[k]);

 end 
  else writeln('Vi vveli nekorektnuyoyu informaciyou!!!!!!');

 Readln;
end.
 
P.S. Не тестил, писал на форуме:) 
2SoWa твой вариант подходит но если кол-во элементов массивов будет разным то возможны лаги ;-) 


Добавлено @ 12:41 
Да вот тебе вторая задача smile 
ТОже пишу на форуме такчто траблы возможныsmile

Код

Program RooR;
var
z:array[1..100,1..100]of real;
i,j,n,m:integer;
begin
Writeln('Vvedite kol-vo strok: ');
Readln(n);
Writeln('Vvedite kol-vo stolbcov: ');
Readln(m);
 for i:=1 to n do
 for j:=1 to m do
  begin
  Write('Z[',i,j,']= ');
  readln(z[i,j]);
  end;

 for i:=1 to n do
 for j:=1 to m do
  begin
   if z[i,j]<=0 then begin  z[i,j]:=z[i,j]*z[i,j]; end
   else
  z[i,j]:=z[i,j]*z[i,j]*z[i,j];
  end;

 //Ну а тут обычный вывод массива(матрицы) на экран, сам уже напишеш :thumbs-up 
  end.


Добавлено @ 12:42 
С тебя репа smile  smile  smile 

Автор: volvo877 25.10.2006, 15:45
Цитата(RooR @  25.10.2006,  11:31 Найти цитируемый пост)
P.S. Не тестил, писал на форумеsmile 

Это теперь везде так пишется. Чтобы потом было что сказать, если вдруг обнаружатся ошибки... А они обнаружатся, даже не сомневайся:

1) ты некорректно вводишь массив m2 - все введенные значения записываются в одну и ту же ячейку, меняем i на j (та же ошибка - при выводе массивов на печать)...
2) m1 и m2 нельзя сравнивать с нулем, это, извини, массивы... Меняем на m, n
3) комбинация 
Код

      if n>m then begin
    for j:=1 to n do
    for i:=1 to m do
     begin
     if m1[j]=m2[i] then begin m3[k]:=m1[j]; k:=k+1;
     end; 
     end;
     end
     else
    for j:=1 to m do
    for i:=1 to n do
     begin
      if m1[j]=m2[i] then begin m3[k]:=m1[j]; k:=k+1;
     end; 
мало того, что ужасно выглядит (зачем одно и то же писать 2 раза, если можно сделать проще), так еще пропущен End, и будет ошибка...
4) T надо было описывать, если уж взялся писать программы.
5) K после заполнения массива m3 у тебя будет на 1 больше, чем нужно, следовательно проще изначально k := 0, и увеличивать его ПЕРЕД занесением очередного элемента...

Вот рабочий вариант:
Код
function max(a, b: integer): integer;
begin
  max := a;
  if b > a then max := b;
end;

var
m1,m2,m3:array[1..100]of integer;
i,j,m,n,k, T:integer;
begin
 Writeln('Vvedite kol-vo elementov massiva M1: ');
 Readln(m);
 Writeln('Vvedite kol-vo elementov massiva M2:  ');
 readln(n);

 if (m>0)and(n>0)and(n<=100)and(m<=100) then begin

   Writeln('-------------------------------Vvedite massiv M1------------------------------');

   for i:=1 to m do begin
     Write('M1[',i,']= ');
     Readln(m1[i]);
   end;

   Writeln('-------------------------------Massiv M1 VVEDEN------------------------------');
   Writeln('-------------------------------Vvedite massiv M2------------------------------');

   for j:=1 to n do begin
     Write('M2[',j,']= ');
     Readln(m2[j]);
   end;

   k:=0;
   for j := 1 to max(n, m) do
     for i := 1 to (n + m) - max(n, m) do
       if m1[j] = m2[i] then begin
         inc(k); m3[k] := m1[j];
       end;

    t := k;
    Writeln('------------------MASSIV M1--------------');
    for i:=1 to m do Write(m1[i]:4);
    writeln;

    Writeln('------------------MASSIV M2--------------');
    for j:=1 to n do Write(m2[j]:4);
    writeln;

    Writeln('------------------MASSIV M3--------------');
    for k:=1 to t do Write(m3[k]:4);
    writeln;
 end
   else writeln('Vi vveli nekorektnuyoyu informaciyou!!!!!!');
 Readln;
end.

Автор: Palladin 25.10.2006, 15:54
Значит так Volvo, по порядку
1) Не мог бы ты не нервничать и держатся в руках????
2) Там написано не два раза одно и тоже, "смотри внимательнее" это заметь твоя любимая фраза, там идёт проверка на размерность, т.е. если получится что первый массив больше другого то именно каждый элемент первого нужно сверять со всеми второго, и наоборот, если  не заметил там иф есть для этого smile 
3) Писал на форуме и это действительно так
4) По поводу end согласен мог пропустить т.к. ПИСАЛ НА ФОРУМЕ
5) С индексом лоханулся спорить не буду, но это именно потому что ПИСАЛ НА ФОРУМЕ И ЭТО УКАЗАЛ!!!
6)m1 и m2 тоже согласен сравнивать ясное дело нельзя, но это ПОТОМУ ЧТО ПИСАЛ НА ФОРУМЕ
7) По поводу убожества, то это твоё личное мнение
8) Доработал мой код до рабочего, ну и молодец, тебе попозже спасибо скажут, но мне чёто кажется что если бы я не написал эту программу ты бы даже не зашёл сюда, моё мнение: ты просто захотел в очередной раз попытатся показать своё превосходство(которого на мой взгляд нет, или же ты его оч хорошо скрываеш)

Автор: Alex103 26.10.2006, 17:58
Цитата(volvo877 @ 25.10.2006,  15:45)
Цитата(RooR @  25.10.2006,  11:31 Найти цитируемый пост)
P.S. Не тестил, писал на форумеsmile 

Это теперь везде так пишется. Чтобы потом было что сказать, если вдруг обнаружатся ошибки... А они обнаружатся, даже не сомневайся:

1) ты некорректно вводишь массив m2 - все введенные значения записываются в одну и ту же ячейку, меняем i на j (та же ошибка - при выводе массивов на печать)...
2) m1 и m2 нельзя сравнивать с нулем, это, извини, массивы... Меняем на m, n
3) комбинация 
Код

      if n>m then begin
    for j:=1 to n do
    for i:=1 to m do
     begin
     if m1[j]=m2[i] then begin m3[k]:=m1[j]; k:=k+1;
     end; 
     end;
     end
     else
    for j:=1 to m do
    for i:=1 to n do
     begin
      if m1[j]=m2[i] then begin m3[k]:=m1[j]; k:=k+1;
     end; 
мало того, что ужасно выглядит (зачем одно и то же писать 2 раза, если можно сделать проще), так еще пропущен End, и будет ошибка...
4) T надо было описывать, если уж взялся писать программы.
5) K после заполнения массива m3 у тебя будет на 1 больше, чем нужно, следовательно проще изначально k := 0, и увеличивать его ПЕРЕД занесением очередного элемента...

Вот рабочий вариант:
Код
function max(a, b: integer): integer;
begin
  max := a;
  if b > a then max := b;
end;

var
m1,m2,m3:array[1..100]of integer;
i,j,m,n,k, T:integer;
begin
 Writeln('Vvedite kol-vo elementov massiva M1: ');
 Readln(m);
 Writeln('Vvedite kol-vo elementov massiva M2:  ');
 readln(n);

 if (m>0)and(n>0)and(n<=100)and(m<=100) then begin

   Writeln('-------------------------------Vvedite massiv M1------------------------------');

   for i:=1 to m do begin
     Write('M1[',i,']= ');
     Readln(m1[i]);
   end;

   Writeln('-------------------------------Massiv M1 VVEDEN------------------------------');
   Writeln('-------------------------------Vvedite massiv M2------------------------------');

   for j:=1 to n do begin
     Write('M2[',j,']= ');
     Readln(m2[j]);
   end;

   k:=0;
   for j := 1 to max(n, m) do
     for i := 1 to (n + m) - max(n, m) do
       if m1[j] = m2[i] then begin
         inc(k); m3[k] := m1[j];
       end;

    t := k;
    Writeln('------------------MASSIV M1--------------');
    for i:=1 to m do Write(m1[i]:4);
    writeln;

    Writeln('------------------MASSIV M2--------------');
    for j:=1 to n do Write(m2[j]:4);
    writeln;

    Writeln('------------------MASSIV M3--------------');
    for k:=1 to t do Write(m3[k]:4);
    writeln;
 end
   else writeln('Vi vveli nekorektnuyoyu informaciyou!!!!!!');
 Readln;
end.

Твоя программа работает ! Но делает она не то что нужно! Мне нужно что-бы 3-й массив содержал в себе только те элементы которы встречаються и в одном и другом массиве и еще те елементы которых нет в одном из массивов Короче говоря массив М3 должен иметь вид 

(1, 5, 10, -3, 4, -15, 36, 6, 11, -5, 21, 35, -9,)

Автор: Alexeis 26.10.2006, 23:29
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
const
 l1 = 10;
 l2 = 14;

var
 mas1 : array [1..l1] of Integer = (33, 17, 24, 82, 4, 39, 57, 97, -14, 71);
 mas2 : array [1..l2] of Integer = (-45, 39, 86, -13, 17, 71, 56, 33, 61, 67,
                                    2, 24, 13, 28);
                                    
 mas3 : array [1..l1 + l2] of Integer;

procedure TForm1.Button1Click(Sender: TObject);
var
 I, j, k : Integer;
 Fl: Boolean;
 s : AnsiString;

begin
  k := 1;
  for i := 1 to l1
  do
    begin
      fl := false;
      for j := 1 to l2
      do
        if mas1[i] = mas2[j]
        then
          Begin
            mas3[k] := mas1[i];
            fl := True;
            Inc(k);
            Break;
          end;
    end;

  for i := 1 to l1
  do
    begin
      fl := false;
      for j := 1 to l2
      do
        if mas1[i] = mas2[j]
        then
          Begin
            fl := True;
            Break;
          end;

        if Not Fl
        then
          begin
            mas3[k] := mas1[i];
            Inc(k);
          end;
    end;

  for i := 1 to l2
  do
    begin
      fl := false;
      for j := 1 to l1
      do
        if mas1[j] = mas2[i]
        then
          Begin
            fl := True;
            Break;
          end;

        if Not Fl
        then
          begin
            mas3[k] := mas2[i];
            Inc(k);
          end;
    end;

  s := '';
  for i := 1 to l1
  do
    s := S + IntToStr(mas1[i]) + ' ';

  Memo1.Lines.Add(S);

  s := '';
  for i := 1 to l2
  do
    s := S + IntToStr(mas2[i]) + ' ';

  Memo1.Lines.Add(S);

  s := '';
  for i := 1 to k - 1
  do
    s := S + IntToStr(mas3[i]) + ' ';

  Memo1.Lines.Add(S);
end;

end.

Автор: volvo877 27.10.2006, 08:58
Цитата(Alex103 @  26.10.2006,  16:58 Найти цитируемый пост)
Мне нужно что-бы 3-й массив содержал в себе только те элементы которы встречаються и в одном и другом массиве и еще те елементы которых нет в одном из массивов
А тебе не кажется, что ЭТО надо было писать в задании???  smile 

А ты что написал?
Цитата(Alex103 @  24.10.2006,  22:08 Найти цитируемый пост)
1. Даны два массива: М1 = (-5, 10, 21, 35, -9, 11, 4, 5) и М2 = (1, 5, 10, -3, 4, -15, 36, 6, 11). Найти их объединение и результат записать в массив М3.
Какое же к чертям собачьим объединение, если 
Цитата(Alex103 @  26.10.2006,  16:58 Найти цитируемый пост)
еще те елементы которых нет в одном из массивов
??? Думаешь, что пишешь, или как?

Автор: Alexeis 27.10.2006, 09:19
Цитата(volvo877 @  27.10.2006,  08:58 Найти цитируемый пост)
А тебе не кажется, что ЭТО надо было писать в задании??? 


Да этим страдают многие новички. Что поделаешь...

Автор: Alex103 27.10.2006, 21:44
Возникла проблемма с последней 2-ой задачей! Тот код не работает хотя должен работать!Вроди все записано правильно!Но может я не правильно вывожу на экран массив!Помогите разобраться!

Код

  for i:=1 to n do
 for j:=1 to m do
  begin
  Write(Z[i,j]:4);



Заранее благодарен!

Автор: Kuvaldis 28.10.2006, 00:25
Alex103
вывод 2-мерного массива делается обычно так (построчно)
Код

 for i := 1 to n do
begin    
     for j := 1 to m do    
         Write(Z[i, j] : 4);
     Writeln;                       // переход на новую строку
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)