Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 14.11.2010, 23:59   #1 (permalink)
Rapture
Новичок
 
Регистрация: 14.11.2010
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Очень прошу помочь с задачей по двумерным массивам в Паскале.

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

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

Старый 14.11.2010, 23:59
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Попробуйте упростить решение проблемы, почитайте схожие топики

Прошу помочь со светодиодами
Прошу помочь с выбором

Старый 15.11.2010, 00:30   #2 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

А вы сами пробовали что-то делать? Спросите, что не понимаете (не получается), мы и поможем
MrSTEP вне форума   Ответить с цитированием
Старый 15.11.2010, 00:37   #3 (permalink)
Rapture
Новичок
 
Регистрация: 14.11.2010
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Вот что смог написать
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(у меня в этом диапазоне,но повторяет их) и с остальным никак не идет.
Rapture вне форума   Ответить с цитированием
Старый 15.11.2010, 11:17   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Rapture Посмотреть сообщение
Смог написать только это.Не могу понять,как выделить этот самый элемент правильно,как сделать так,чтобы он выдавал именно числа от 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   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ладно, написал целиком.
Программа зациклена; чтобы выйти из нее, следует ввести нулевой (несуществующий) номер запрашиваемого места (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 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 15.11.2010, 20:42   #6 (permalink)
Rapture
Новичок
 
Регистрация: 14.11.2010
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо!!!!

Последний раз редактировалось Rapture; 15.11.2010 в 20:52
Rapture вне форума   Ответить с цитированием
Старый 15.11.2010, 20:53   #7 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Rapture Посмотреть сообщение
Vladimir_S,огромнейшее вам спасибо!!!! Вы меня очень сильно выручили,не только написав,но ещё и объяснив всё,буквально "разложив по полочкам"! Жму руку вам!!
Взаимно. Рад был помочь.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.