14.11.2010, 23:59 | #1 (permalink) |
Новичок
Регистрация: 14.11.2010
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Очень прошу помочь с задачей по двумерным массивам в Паскале.
Очень прошу помочь с задачей по двумерным массивам в Паскале. Дана матрица М[9,4] номеров в купейном вагоне.Заполнить её рядом натуральных чисел от 1 до 36. 1)Записать матрицу. 2)Реализовать запрос N места,вывод его индексов и замену его 0 - с повтором запроса. 3)Вывести матрицу оставшихся мест. 4)Определить число четных и нечетных элементов(верхних и нижних мест). Буду очень признателен за помощь! |
14.11.2010, 23:59 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Попробуйте упростить решение проблемы, почитайте схожие топики Прошу помочь со светодиодами Прошу помочь с выбором |
15.11.2010, 00:37 | #3 (permalink) |
Новичок
Регистрация: 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(у меня в этом диапазоне,но повторяет их) и с остальным никак не идет. |
15.11.2010, 11:17 | #4 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Прежде всего - Вы абсолютно неправильно заполняете матрицу. Есть стандартный купейный вагон, в нем девять купе, каждое купе на четыре места, причем места имеют сквозную по всему вагону последовательную нумерацию - так при чем тут, скажите на милость, случайная выборка?!! Матрицу следует заполнять так: Код:
For i:=1 to 9 do {номера купе} For j:=1 to 4 do {места в купе} R[i,j]:=j+(i-1)*4; {номера мест} Далее - обработка запроса. О чем речь? Представьте себе, что позвонил пассажир и попросил зарезервировать для него, допустим, место № 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; Теперь - обработка запроса. Перед этим необходимо заполнить матрицу, как написано выше, и сделать обращение к процедуре: Код:
Matrix_output(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); Всё! |
|
15.11.2010, 12:41 | #5 (permalink) |
Специалист
Регистрация: 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. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
15.11.2010, 20:53 | #7 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|