• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

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

  • Автор темы Автор темы Rapture
  • Дата начала Дата начала

Rapture

Ученик
Регистрация
14 Ноя 2010
Сообщения
3
Реакции
0
Баллы
0
Очень прошу помочь с задачей по двумерным массивам в Паскале.

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

Дана матрица М[9,4] номеров в купейном вагоне.Заполнить её рядом натуральных чисел от 1 до 36.
1)Записать матрицу.
2)Реализовать запрос N места,вывод его индексов и замену его 0 - с повтором запроса.
3)Вывести матрицу оставшихся мест.
4)Определить число четных и нечетных элементов(верхних и нижних мест).
Буду очень признателен за помощь!
 
А вы сами пробовали что-то делать? Спросите, что не понимаете (не получается), мы и поможем
 
Вот что смог написать
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(у меня в этом диапазоне,но повторяет их) и с остальным никак не идет.
 
Смог написать только это.Не могу понять,как выделить этот самый элемент правильно,как сделать так,чтобы он выдавал именно числа от 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;
Всё!
 
Ладно, написал целиком.
Программа зациклена; чтобы выйти из нее, следует ввести нулевой (несуществующий) номер запрашиваемого места (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.
 
Спасибо!!!!
 
Последнее редактирование:
Vladimir_S,огромнейшее вам спасибо!!!! Вы меня очень сильно выручили,не только написав,но ещё и объяснив всё,буквально "разложив по полочкам"! Жму руку вам!!
Взаимно. Рад был помочь.
 
Назад
Сверху