Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Массивы одномерныые и двумерные...

Автор: zara44 9.02.2007 5:05

У меня есть задание сделать одномерный и двумерный массив помогите плиз.....
1)Дан массив L1,..,L20. Заменить элементы, стоящие после Lmin, на среднее арифметическое всего ряда.

begin
closegraph;
textbackground(cyan);
clrscr;
textcolor(Magenta);
gotoxy(2,3);
writeln('DaH MACCuB L[1..20], 3ameHuTb eJIEMEHTbI IIosJIe min, Ha sredHee zna4enee ');
for i:=1 to 20 do begin
gotoxy(10,5);
textcolor(yellow);
writeln('BbeDite elementi massiva ',i);
gotoxy(10,6);
textcolor(white);
gotoxy(2+i*3,7);
readln(L[i]);
end;
s:=0;
L[min]:=L[i];
min:=i;
for i:=1 to 20 do
begin
if L[i]<L[min] then begin
L[min]:=L[i];
s:=s+L[i];
end;
end;
s:=s/20;
for i:=1 to 20 do begin
if L[i]>L[min] then L[i]:=s;
gotoxy(10,2);
writeln('Massiv gotov dlya proverki');
textcolor(black);
gotoxy(i,3+i);
writeln('i= ',L[i] :4 :0);
end;
readkey;
end.

это что я смог сделать, но программа все равно не пашет!!! И это только кусочек)))

2)В матрице найти минимальный элемент. Разделить элементы строки, в которой он находится, на найденный минимальный элемент.

P.S. Заранее спасибо за помощь good.gif

Автор: Altair 9.02.2007 13:49

Если приводишь программу, приводи всю.
Ты не написал секцию объявления переменных.

И никогда не занимайся бредом - добавление дизайна в программу, в которой не реализован основной функционал.

Вот твоя программа без дизайно-бреда:

begin

writeln('Дан массив L[1..20], заменить элементыпосле min, на среднее ');

{вводим элементы масива}
for i:=1 to 20 do begin
writeln('BbeDite elementi massiva ',i);
readln(L[i]);
end;

s:=0;


{ВНИМАНИЕ! Откуда взялось значение min ? ОТСЮДА И ДАЛЕЕ КОД ОШИБОЧЕН}


L[min]:=L[i];
min:=i;
for i:=1 to 20 do begin
if L[i]<L[min] then begin
L[min]:=L[i];
s:=s+L[i];
end;
end;
s:=s/20;
for i:=1 to 20 do begin
if L[i]>L[min] then L[i]:=s;
writeln('Massiv gotov dlya proverki');
writeln('i= ',L[i] :4 :0);
end;
end.


Теперь смотрим на код - я отметил с какого момента начинается бред.

Первое правила написания кода - сначала напиши комментарий по русски - что ты будешь делать, и после этого запиши код, реализующий комментарий.
Конечно до паранойи доходить не надо, и комментировать каждую строчку - только логические блоки кода, например

Код
{Вводим массив}
... код ...

{Подсчитываем среднее арифметическое}
... код ...

{Ищем минимальное значение}
... код ...

{Заменяем элементы после минимума на значение среднего арифметического}
... код ...

{Выводим результат}
... код ...

Автор: /7popok 9.02.2007 14:48

Скажи мне, пожалуйста, для чего тебе нужны по всей программе комманды:
textbackground, textcolor, gotoxy? это же не рисование, чтобы раскрашивать все надписи, а программирование.


for i:=1 to 20 do
begin
if L[i]<L[min] then begin
L[min]:=L[i];
s:=s+L[i];{с какой радости ты сумму считаешь здесь? а если у тебя L[i]>L[min]? ведь, сумма не будет считаться тогда!}
end;
s:=s+L[i];{этот оператор должен быть тут}
end;



а должно быть вот как:

var i,min:integer;
s:real;
L:array [1..20] of real;
begin
writeln('DaH MACCuB L[1..20], 3ameHuTb eJIEMEHTbI IIosJIe min, Ha sredHee zna4enee ');
for i:=1 to 20 do begin
writeln('BbeDite elementi massiva ',i);
readln(L[i]);
end;
s:=0;
L[min]:=L[i];
min:=i;
for i:=1 to 20 do
begin
if L[i]<L[min] then begin
L[min]:=L[i];
end;
s:=s+L[i];
end;
s:=s/20;
for i:=1 to 20 do begin
if L[i]>L[min] then L[i]:=s;
writeln('i= ',L[i] :4 :0);
end;
readln;
end.



программка-то... на 5 минут...

Автор: zara44 9.02.2007 14:51


program lab7;
var
L:array[1..20] of real;
min,s:real;
i:integer;
begin
clrscr;
writeln('DaH MACCuB L[1..20], 3ameHuTb eJIEMEHTbI IIosJIe min, Ha sredHee zna4enee ');
for i:=1 to 20 do begin
writeln('Введите элементы массива');
readln(L[i]);{вводим элементы массива}
end;
s:=0;
min:=L[i];
for i:=1 to 20 do
begin
if L[i]<min then begin
min:=L[i];{тут узнаем минимум}
s:=s+L[i];
end;
end;
s:=s/20;{тут узнаем среднее значение}
for i:=1 to 20 do begin
if L[i]>L[min] then L[i]:=s;
writeln('i= ',L[i] :4 :0);{А тут уже должен выводиться на экран готовый массив}
end;
readkey;
end.


Вот я и написал все что я понял. Помогите разобраться. Очень надо!!!! В понедельник уже Отчет сдавать!!!

Добавлено через 1 мин.
Спасибо /7popok. Щас опробую прогу. А можешь посмотреть по двухмерным массивам????


Добавлено через 1 мин.
А gotoxy,textbackground и т.д.. Мне нужны, у нас преподаватель очень требовательна к интерфейсу.

Автор: volvo 9.02.2007 14:56

zara44, допущена грубая ошибка: когда ты ищешь минимум, ты запоминаешь само значение,

Цитата
if L[i]<min then begin
min:=L[i];{тут узнаем минимум}


а когда заменяешь на минимальный элемент - пытаешься заменить по индексу...
Цитата
if L[i]>L[min] then L[i]:=s;

Так нельзя... И там и там должно быть что-то одно: или индексы, или сами значения...

Автор: /7popok 9.02.2007 14:59

zara44,
а по аналогии самому сложно?
добавляешь второй цикл по j, только уменьши размер массива, а то ты его вводить только час будешь.

Автор: zara44 9.02.2007 15:06

/7popok . Программу которую ты мне написал. Она тоже не правильно считает у меня


Автор: /7popok 9.02.2007 15:10

она считает всё и пишет правильно, но, признаюсь, есть один глюк. он последний элемент не изменяет.

Автор: volvo 9.02.2007 15:12

Цитата(Пророк)
min:=i;
после окончания цикла делать нельзя - i не определено... Еще раз запостишь программу НЕ проверяя (и даже не думая) - буду принимать меры...

Автор: zara44 9.02.2007 15:15

У меня выходит примерно так.

Привожу пример
Введите элементы массива:
9 8 9 8 9 8 9 8 9 8 9 8 1(минимум) 4 6 8 7 9 7 9 7 89 7 67 6

А выводит на экран примерно это

7 7 7 7 7 7 7 7 7 7 7 7 1(минимум) 7 7 7 7 7 7 7 7 7 7 7 7 1





Добавлено через 2 мин.
volvo я конечно все понимаю, но я просто уже запутался во всем что можно!!!!! Мне дали задание сделать световое меню и в нем 2 программы на массивы дали. Световое меню я сделал, а вот программы я не могу делать, очень много ошибок у меня. ((((

Добавлено через 1 мин.
volvo а как мне тогда сделать???

Автор: volvo 9.02.2007 15:24

const n = 20;
var
i, min:integer;
s: real;
L: array [1 .. n] of real;

begin
writeln('DaH MACCuB L[1..20], 3ameHuTb eJIEMEHTbI IIosJIe min, Ha sredHee zna4enee ');

min := 1; s := 0;

for i:=1 to n do begin
writeln('BbeDite elementi massiva ',i);
readln(L[i]);

{ Сразу здесь же считаем И сумму И минимум }
if L[i] < L[min] then min := i;
s := s + L[i];
end;

s := s / n;
for i := 1 to n do begin
if i > min then L[i] := s; { <--- Сказано же, для всех ИНДЕКСОВ больше ИНДЕКСА минимума !!! }
writeln('i= ',L[i] :4 :0);
end;
readln;

end.


Автор: /7popok 9.02.2007 15:26

volvo
после цикла оно же равно 20, так как цикл закончился на цифре 20

Автор: zara44 9.02.2007 15:32

Спасиба теперь программа работает. Теперь остается только 2)В матрице найти минимальный элемент. Разделить элементы строки, в которой он находится, на найденный минимальный элемент.

Автор: мисс_граффити 9.02.2007 15:35

Попробуй сам по аналогии... Напиши хоть что-нибудь...

Автор: zara44 9.02.2007 15:38

Ок. Постараюсь что нибудь сделать. А щас я в колледж поехал... good.gif good.gif good.gif

Автор: volvo 9.02.2007 15:38

Цитата
после цикла оно же равно 20, так как цикл закончился на цифре 20
Да? Уверен? Я - нет... И доки на Паскаль тоже со мной согласны. Во-первых, оно должно быть равно не 20, а 21, потому как в конце тела цикла происходит изменение управляющей переменной. Ну, а во-вторых:

Цитата
Если оператор, содержащийся в теле оператора for, изменяет значение управляющей переменной, то это является ошибкой. После выполнения оператора for значение управляющей переменной становится неопределенным, если только выполнение оператора for не было прервано с помощью оператора перехода.
(цитата - отсюда: http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr7.shtml#14)

Автор: мисс_граффити 9.02.2007 16:24

Да в любом случае вот это - бред.


L[min]:=L[i];
min:=i;

ну, ты считаешь, что i=20
а чему равен min ДО выполнения второй строчки?
if L[i]<L[min] then begin
L[min]:=L[i];

тебя кто-то просил присваивать "бывшему" минимуму значение нового? это же перековеркает весь массив... а если он был отстортирован в обратном порядке - представляешь, что получится?
if L[i]>L[min] then L[i]:=s;

естественно, больше (ну, для нескольких эл-тов равно) - мы же так минимум и искали, правда?

Автор: zara44 10.02.2007 18:49

Вторую задачу смог сделать только так, плиз покажите где ошибки!!!!!!


program lab;
uses crt;
const n = 20;
var
j,i, min1,min2:integer;
s: real;
A:array[1..5,1..5] of real;
begin
clrscr;
min1:= 1; min2:= 1;
for i:=1 to 5 do begin
for j:=1 to 5 do begin
gotoxy(2,2);
writeln('BbeDite element massiva ',i,'x',j);
gotoxy(4+j*2,4+i);
readln(A[i,j]);
{ TyT MbI BBODuM MACCuB }
if A[i,j] < A[min1,min2] then begin
min1 := i;
A[min1,min2]:= A[i,j]; {HAshli minimal'nuu stro4ku i min element}
end;
end;
end;
for i := min1 to min1 do begin
for j:= 1 to 5 do begin
A[min1,j] := A[min1,j]/A[min1,min2]; {Stroku podelili na min !!! }
end;
end;
for i := 1 to 5 do begin
for j:= 1 to 5 do begin
gotoxy(35,2);
writeln('poluchen massiv ');
gotoxy(35+i*2,4+j);
writeln('',A[i,j] :4 :0);
end;
end;
readln;

end.

Заранее спасибо!!!!

Автор: мисс_граффити 10.02.2007 19:34

1. Общие правила форума действуют для всех:
 ! 
8. Запрещена любая реклама и спам.
Форум и сайт "Все о Паскале" - НЕ коммерческий проект, и никакая реклама на нем неприемлема!


Если хочешь, чтобы тебе помогали - уважай требования.
2. Нормальное форматирование делает половину ошибок заметными.
Думаешь, у кого-то есть желание тратить свое время на расставление отступов в твоем коде?
3. Поясни, пожалуйста, вот эти фрагменты (моих знаний не хватает на проникновение в их сокровенный смысл):

if A[i,j] < A[min1,min2] then begin
{
если текущий элемент меньше элемента в строке, где был минимум,
и в первом столбце - min2 нигде не изменяется и остается равным 1, то
}
min1 := i; {запомнили новую строку с минимальным}
A[min1,min2]:= A[i,j]; {первый элемент в этой строке заменили минимальным по строке}
end;


 for i := min1 to min1 do begin {этот цикл выполнится ровно 1 раз}

Автор: TarasBer 10.02.2007 19:43

Zara, сделайте пожалуйста так, чтобы я мог это читать. Все строки между бегин и енд сдвигаются на 2 символа. Все строки между подразумевающимися бегин и енд (это когда if p then {begin} ... {end} - здесь бегин и енд не стоят, потому что между ними 1 строчка) тоже. Посмотрите, например, на программу Вольво.
А то готоиксигрик с одним пробелом, после него врайтлээн с 2 пробелами... Не могу это читать.

Автор: zara44 10.02.2007 20:27

Ну так у меня получается


program lab;
uses crt;
const n = 20;
var
j,i, min1,min2:integer;
s: real;
A:array[1..5,1..5] of real;
begin
clrscr;
min1:= 1; min2:= 1;
for i:=1 to 5 do begin
for j:=1 to 5 do begin
gotoxy(2,2);
writeln('BbeDite element massiva ',i,'x',j);
gotoxy(4+j*2,4+i);
readln(A[i,j]);
{ TyT MbI BBODuM MACCuB }
if A[i,j] < A[min1,min2] then begin
min1 := i;
A[min1,min2]:= A[i,j]; {HAshli minimal'nuu stro4ku i min element}
end;
end;
end;
for i := 1 to 5 do begin
for j:= 1 to 5 do begin
A[min1,j] := A[min1,j]/A[min1,min2]; {Stroku podelili na min !!! }
gotoxy(35,2);
writeln('poluchen massiv ');
gotoxy(35+i*2,4+j);
writeln('',A[i,j] :4 :0);
end;
end;
readln;
end.


Плиз я не понимаю что здесь надо поправить!!!!

Автор: мисс_граффити 10.02.2007 21:01

ты просьбы и вопросы игнорируешь?
ну что ж... пожалуйста.
только непохоже, что ты

Цитата
хочу стать программером

иначе бы слушал, что говорят, и пытался исправлять

Автор: zara44 10.02.2007 21:39

Я просто не понимаю чего от меня хотят!!! Мисс_граффити...


program lab;
uses crt;
var
j, i, min1,min2:integer;
g,k, s: real;
A:array[1..5,1..5] of real;
begin
clrscr;
A[min1,min2]:=A[i,j];
for i:=1 to 5 do begin
for j:=1 to 5 do begin
gotoxy(2,2);
writeln('BвeDite element massiva ',i,'x',j);
gotoxy(4+j*2,4+i);
readln(A[i,j]);{ Вводим массив }
if A[i,j] < A[min1,min2] then begin
A[min1,min2] := A[i,j]; {Тут вроде находится минимум}
min1 := i;
end;
end;
end;
k:=A[i,j]/A[min1,min2];
for i:= 1 to 5 do begin
for j:= 1 to 5 do begin
if i=min1 then A[i,j] :=k;
gotoxy(35,2);
writeln('Массив готов ');
gotoxy(35+i*2,4+j);
writeln(A[i,j] :4 :0);
end;
end;
readln;
end.


Вот, я смог сделать более понятнее????

Автор: мисс_граффити 10.02.2007 21:45

от тебя хотят нормального форматирования.
то есть твоя программа должна выглядеть например так:

  clrscr;
A[min1,min2]:=A[i,j];
for i:=1 to 5 do
begin
for j:=1 to 5 do
begin
gotoxy(2,2);
writeln('BвeDite element massiva ',i,'x',j);
gotoxy(4+j*2,4+i);
readln(A[i,j]);{ Вводим массив }
if A[i,j] < A[min1,min2] then
begin
A[min1,min2] := A[i,j]; {Тут вроде находится минимум}
min1 := i;
end;
end;
end;

чтобы было видно, какой begin с каким end связан
отредактируй, пожалуйста, свои сообщения, приведя в порядок ВСЮ программу (не только показанный мной фрагмент): не надо каждый раз приводить один и тот же код без изменений.

кроме того, обрати внимание на фрагменты, которые я процитировала на прошлой странице.
объясни, пожалуйста, зачем выполнять эти шаманские действия? у тебя перед глазами пример работы с одномерным массивом... разберись, где что чему присваивается.

понимаешь, мне не сложно написать за тебя эту программу - но ведь от этого никому не будет пользы....

Автор: zara44 10.02.2007 21:56

Я понял. Постараюсь нормально писать... А одномерный пример, я пробовал переделывать у меня не получается. Пожалуйста сделай плиз, мне к понедельнику надо уже программу показывать, да еще и отчет делать!!!!

Автор: мисс_граффити 10.02.2007 22:39

А ты понял, что там происходит в одномерном примере?
По-моему, нет.
То есть абсолютно не разобрался, где что запоминаем и что чему присваиваем.

Смотри: в этой программе тебе нужно знать строку, в которой находится минимум (ее потом делить надо), и чему он равен. Можно запоминать строку и значение, но [на мой взгляд] логичнее строку и столбец.
Для этого нам понадобится 2 переменные.
кроме того, нам нужны счетчик по строкам/столбцам и сам массив.

var i,j,mini,minj: byte;
A: array [1..5,1..5] of real;

Сначала предположим, что самый маленький - первый элемент.
mini:=1;
minj:=1;

После этого начинаем заполнение и поиск...
Заполнять массив и искать минимум можно одновременно.
for i:=1 to 5 do {для каждой строки}
for j:=1 to 5 do {для каждого столбца}
begin
readln(A[i,j]); {ввели элемент}
if A[i,j]<A[mini,minj] then {если он меньше минимального}
begin
mini:=i; {запомнили номер строки}
minj:=j; {запомнили номер столбца}
end;
end;


обрати внимание: элементы массива мы не меняем (кроме ввода с клавиатуры)!!! никаких
 A[min1,min2]:=A[i,j];
(тем более ДО заполнения массива).

В итоге мы знаем, в где находится минимальный элемент (всегда сможем к нему обратиться), и знаем строку, в которой он находится.

Доделывай...

Автор: zara44 11.02.2007 3:30

Вроде все написал правильно. А на экран выводит только столбец!!!! почему????


program lab;
uses crt;
var
j, i, min1, min2: byte;
A:array[1..5,1..5] of real;
begin
clrscr;
min1:=1; min2:=1;
for i:=1 to 5 do
for j:=1 to 5 do
begin
gotoxy(2,2);
writeln('BbeDite element massiva ',i,'x',j);
gotoxy(4+j*2,4+i);
readln(A[i,j]);{ TyT MbI BBODuM MACCuB }
if A[i,j] < A[min1,min2] then
begin
min1 := i; {Hawli minimal'nuu stro4ku i min element}
min2 := j;
end;
end;
for i := 1 to 5 do
for j := 1 to 5 do
begin
if i=min1 then
A[i,j]:=A[i,j]/A[min1,min2];
gotoxy(35,2);
writeln('poluchen massiv ');
gotoxy(35+j*2,4+i);
writeln(A[i,j] :4 :0);
end;
readkey;
end.


Автор: volvo 11.02.2007 3:58

А вот так:

gotoxy(35,2); write('poluchen massiv  ');

for i := 1 to 5 do
for j := 1 to 5 do begin
if i=min1 then
A[i,j]:=A[i,j]/A[min1,min2];

gotoxy(35+j*5, 4+i);
write(A[i, j] :4 :0);
end;
?

Но у тебя в коде есть еще одна проблема: как только ты разделишь сам минимальный элемент на себя же - все остальные элементы этой строки не изменятся, т.к. новое значение A[min1, min2] будет равно 1, а не то, что было раньше... Так что тебе придется запоминать все-таки значение минимума, а не только его индексы...

Автор: zara44 11.02.2007 4:08

ладно щас попробую!!!

Добавлено через 9 мин.
И вправду все получается, если бы не одно но!!!! Привожу пример

 введите массив 
6 6 6 6 6
6 6 6 6 6
6 4 2 6 8
8 8 8 8 8
8 8 8 8 8

Полученный массив
6 6 6 6 6
6 6 6 6 6
3 2 1 6 8
8 8 8 8 8
8 8 8 8 8


То есть, после миниму в строке он не делит!!! (((((

Вот текст программы который получился

program lab;
uses crt;
var
j, i, min1, min2: byte;
A:array[1..5,1..5] of real;
begin
clrscr;
min1:=1; min2:=1;
for i:=1 to 5 do
for j:=1 to 5 do
begin
gotoxy(2,2);
writeln('BbeDite element massiva ',i,'x',j);
gotoxy(4+j*5,4+i);
readln(A[i,j]);{ TyT MbI BBODuM MACCuB }
if A[i,j] < A[min1,min2] then
begin
min1 := i; {Hawli minimal'nuu stro4ku i min element}
min2 := j;
A[min1,min2]:=A[i,j];
end;
end;
gotoxy(35,2); write('poluchen massiv ');
for i := 1 to 5 do
for j := 1 to 5 do
begin
if i=min1 then
A[i,j]:=A[i,j]/A[min1,min2];
gotoxy(35+j*5, 4+i);
write(A[i, j] :4 :0);
end;
readkey;
end.

Автор: volvo 11.02.2007 4:25

Ты внимательно посты будешь читать? Я тебе о чем чуть выше сказал? Повторять не буду - ищи и исправляй!

Автор: zara44 11.02.2007 4:52

Простите за глупость не внимательно читаю!!!! )))) Спасибо всем кто со мной мучался, вы очень помогаете!!!! heart.gif heart.gif heart.gif

Автор: zara44 11.02.2007 6:17

Кому интересно могут посмотреть прогу!!!!! Может для кого нибудь она станет полезной(со световым меню). good.gif good.gif good.gif


Прикрепленные файлы
Прикрепленный файл  LABA7.PAS ( 4.58 килобайт ) Кол-во скачиваний: 202