Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Очень прошу помочь с задачей по двумерным массивам в Паскале. (http://www.tehnari.ru/f41/t42063/)

Rapture 14.11.2010 23:59

Очень прошу помочь с задачей по двумерным массивам в Паскале.
 
Доброго времени суток!
Очень прошу помочь с задачей по двумерным массивам в Паскале.

Дана матрица М[9,4] номеров в купейном вагоне.Заполнить её рядом натуральных чисел от 1 до 36.
1)Записать матрицу.
2)Реализовать запрос N места,вывод его индексов и замену его 0 - с повтором запроса.
3)Вывести матрицу оставшихся мест.
4)Определить число четных и нечетных элементов(верхних и нижних мест).
Буду очень признателен за помощь!

MrSTEP 15.11.2010 00:30

А вы сами пробовали что-то делать? Спросите, что не понимаете (не получается), мы и поможем

Rapture 15.11.2010 00:37

Вот что смог написать
program zadachka3;
uses crt;
var
R: array[1..9,1..4] of integer;
i,j:integer;
obrazec:integer;
found:boolean;
begin
ClrScr;
randomize;
writeln('Matrica R:');
for i:= 1 to 9 do
begin
for j:= 1 to 4 do
begin
R[i,j]:=random(36);
write(R[i,j]:3);
end;
writeln;
end;
write('Vvedite obrazec dlya poiska ->');
readln(obrazec);
found:=false;
i:=1;
j:=1;
repeat
if R[i,j]=obrazec then found:=true else i:=i+1; j:=j+1;
until (i>36) and (j>36) or (found);
if found then
writeln('Sovpadenie s elementom nomer',I:3,'. ',j:3,'. ','Poisk uspeshen')
else writeln ('Sovpadenii net');
writeln('Please press "Enter"');
readln;
end.

Смог написать только это.Не могу понять,как выделить этот самый элемент правильно,как сделать так,чтобы он выдавал именно числа от 1 до 36(у меня в этом диапазоне,но повторяет их) и с остальным никак не идет.

Vladimir_S 15.11.2010 11:17

Цитата:

Сообщение от Rapture (Сообщение 418044)
Смог написать только это.Не могу понять,как выделить этот самый элемент правильно,как сделать так,чтобы он выдавал именно числа от 1 до 36(у меня в этом диапазоне,но повторяет их) и с остальным никак не идет.

Так.
Прежде всего - Вы абсолютно неправильно заполняете матрицу. Есть стандартный купейный вагон, в нем девять купе, каждое купе на четыре места, причем места имеют сквозную по всему вагону последовательную нумерацию - так при чем тут, скажите на милость, случайная выборка?!! Матрицу следует заполнять так:
Код:

For i:=1 to 9 do {номера купе}
 For j:=1 to 4 do {места в купе}
  R[i,j]:=j+(i-1)*4; {номера мест}

И никаких Random в программе быть не должно!
Далее - обработка запроса.
О чем речь?
Представьте себе, что позвонил пассажир и попросил зарезервировать для него, допустим, место № 18. Ваша задача: определить, в каком купе находится это место (строка матрицы), каков его "внутрикупейный номер" (столбец матрицы), и далее, если это место свободно, зарезервировать его, т.е. заменить соответствующий элемент матрицы нулем, а если занято, т.е. там уже ноль - предложить пассажиру сменить запрос на другое место, и так повторять до тех пор, пока не последует запрос на свободное место. А в промежутке выводить матрицу и при этом рассчитывать, сколько осталось свободных "нижних" (нечетных) и "верхних" (четных) мест. Во всяком случае, именно так я понял.
Поскольку вывод матрицы будет производиться несколько раз, целесообразно его оформить в виде процедуры:
Код:

Procedure Matrix_output(var bm:boolean);
 VAR
  N_even, N_odd:BYTE;
  i,j:Integer;
 Begin
  N_even:=0;
  N_odd:=0;
  For i:=1 to 9 do
  begin
    for j:=1 to 4 do
    begin
      write(R[i,j]:4);
      If (R[i,j]>0) and ((R[i,j] mod 2)=0) then Inc(N_even);     
      If (R[i,j]>0) and ((R[i,j] mod 2)=1) then Inc(N_odd);
    end; 
    writeln;
  end;
  Writeln;
  Writeln(N_even, ' even places and ',N_odd,' odd places are free');
  If N_even+N_odd=0 then bm:=true else bm:=false;
 End;

Здесь заодно проверяется наличие свободных мест в вагоне вообще; если таковых нет, то логическому параметру присваивается значение true.
Теперь - обработка запроса. Перед этим необходимо заполнить матрицу, как написано выше, и сделать обращение к процедуре:
Код:

Matrix_output(b);
(булеву переменную b нужно ввести в список глобальных).
Далее
Код:

found:=false;
Repeat
 Write('N= ');
 ReadLn(N);
 If b then writeln('Sorry, but there are no free places') else
 begin
  i:=((N-1) div 4)+1;
  j:=((N-1) mod 4)+1;
  if R[i,j]>0 then
  begin
    found:=true;
    R[i,j]:=0;
  end;
  end;
Until found or b;
Matrix_output(b);

Теперь осталось только всё это объединить и не забыть в конце поставить останов в виде или Readln;, или, если Вы подключаете модуль CRT, ReadKey;
Всё!

Vladimir_S 15.11.2010 12:41

Ладно, написал целиком.
Программа зациклена; чтобы выйти из нее, следует ввести нулевой (несуществующий) номер запрашиваемого места (N=0).
Код:

VAR
 R:ARRAY[1..9,1..5] of Byte;
 N:Byte;
 i,j:Integer;
 b,found:Boolean;

Procedure Matrix_output(var bm:boolean);
 VAR
  N_even, N_odd:BYTE;
  i,j:Integer;
 Begin
  N_even:=0;
  N_odd:=0;
  For i:=1 to 9 do
  begin
    for j:=1 to 4 do
    begin
      write(R[i,j]:4);
      If (R[i,j]>0) and ((R[i,j] mod 2)=0) then Inc(N_even);
      If (R[i,j]>0) and ((R[i,j] mod 2)=1) then Inc(N_odd);
    end;
    writeln;
  end;
  Writeln;
  Writeln(N_even, ' even places and ',N_odd,' odd places are free');
  If N_even+N_odd=0 then bm:=true else bm:=false;
 End;

BEGIN
 For i:=1 to 9 do
  For j:=1 to 4 do
  R[i,j]:=j+(i-1)*4;
 Matrix_output(b);
 found:=false;
 REPEAT
  Write('N= ');
  ReadLn(N);
  If N>0 then
  Repeat
    i:=((N-1) div 4)+1;
    j:=((N-1) mod 4)+1;
    if R[i,j]>0 then
    begin
      found:=true;
      R[i,j]:=0;
    end else
      writeln('Sorry, but this place is already occupied; try another');
  Until found or b;
  Matrix_output(b);
 UNTIL b OR (N=0);
 If b then
  begin
  writeln('Sorry, but there are no free places');
  ReadLn;
  end;
END.


Rapture 15.11.2010 20:42

Спасибо!!!!

Vladimir_S 15.11.2010 20:53

Цитата:

Сообщение от Rapture (Сообщение 418370)
Vladimir_S,огромнейшее вам спасибо!!!! Вы меня очень сильно выручили,не только написав,но ещё и объяснив всё,буквально "разложив по полочкам"! Жму руку вам!!

Взаимно. Рад был помочь.


Часовой пояс GMT +4, время: 02:10.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.