Помощь - Поиск - Пользователи - Календарь
Полная версия: Массивы одномерныые и двумерные...
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
zara44
У меня есть задание сделать одномерный и двумерный массив помогите плиз.....
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
Если приводишь программу, приводи всю.
Ты не написал секцию объявления переменных.

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

Вот твоя программа без дизайно-бреда:
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
Скажи мне, пожалуйста, для чего тебе нужны по всей программе комманды:
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

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
zara44, допущена грубая ошибка: когда ты ищешь минимум, ты запоминаешь само значение,

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


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

Так нельзя... И там и там должно быть что-то одно: или индексы, или сами значения...
/7popok
zara44,
а по аналогии самому сложно?
добавляешь второй цикл по j, только уменьши размер массива, а то ты его вводить только час будешь.
zara44
/7popok . Программу которую ты мне написал. Она тоже не правильно считает у меня

/7popok
она считает всё и пишет правильно, но, признаюсь, есть один глюк. он последний элемент не изменяет.
volvo
Цитата(Пророк)
min:=i;
после окончания цикла делать нельзя - i не определено... Еще раз запостишь программу НЕ проверяя (и даже не думая) - буду принимать меры...
zara44
У меня выходит примерно так.
Привожу пример
Введите элементы массива:
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
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
volvo
после цикла оно же равно 20, так как цикл закончился на цифре 20
zara44
Спасиба теперь программа работает. Теперь остается только 2)В матрице найти минимальный элемент. Разделить элементы строки, в которой он находится, на найденный минимальный элемент.
мисс_граффити
Попробуй сам по аналогии... Напиши хоть что-нибудь...
zara44
Ок. Постараюсь что нибудь сделать. А щас я в колледж поехал... good.gif good.gif good.gif
volvo
Цитата
после цикла оно же равно 20, так как цикл закончился на цифре 20
Да? Уверен? Я - нет... И доки на Паскаль тоже со мной согласны. Во-первых, оно должно быть равно не 20, а 21, потому как в конце тела цикла происходит изменение управляющей переменной. Ну, а во-вторых:

Цитата
Если оператор, содержащийся в теле оператора for, изменяет значение управляющей переменной, то это является ошибкой. После выполнения оператора for значение управляющей переменной становится неопределенным, если только выполнение оператора for не было прервано с помощью оператора перехода.
(цитата - отсюда: Руководство по языку B.Pascal 7 & Objects/LR -> Операторы цикла с параметром (for))
мисс_граффити
Да в любом случае вот это - бред.

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
Вторую задачу смог сделать только так, плиз покажите где ошибки!!!!!!

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.

Заранее спасибо!!!!
мисс_граффити
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
Zara, сделайте пожалуйста так, чтобы я мог это читать. Все строки между бегин и енд сдвигаются на 2 символа. Все строки между подразумевающимися бегин и енд (это когда if p then {begin} ... {end} - здесь бегин и енд не стоят, потому что между ними 1 строчка) тоже. Посмотрите, например, на программу Вольво.
А то готоиксигрик с одним пробелом, после него врайтлээн с 2 пробелами... Не могу это читать.
zara44
Ну так у меня получается

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.


Плиз я не понимаю что здесь надо поправить!!!!
мисс_граффити
ты просьбы и вопросы игнорируешь?
ну что ж... пожалуйста.
только непохоже, что ты
Цитата
хочу стать программером

иначе бы слушал, что говорят, и пытался исправлять
zara44
Я просто не понимаю чего от меня хотят!!! Мисс_граффити...

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.


Вот, я смог сделать более понятнее????
мисс_граффити
от тебя хотят нормального форматирования.
то есть твоя программа должна выглядеть например так:
  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
Я понял. Постараюсь нормально писать... А одномерный пример, я пробовал переделывать у меня не получается. Пожалуйста сделай плиз, мне к понедельнику надо уже программу показывать, да еще и отчет делать!!!!
мисс_граффити
А ты понял, что там происходит в одномерном примере?
По-моему, нет.
То есть абсолютно не разобрался, где что запоминаем и что чему присваиваем.

Смотри: в этой программе тебе нужно знать строку, в которой находится минимум (ее потом делить надо), и чему он равен. Можно запоминать строку и значение, но [на мой взгляд] логичнее строку и столбец.
Для этого нам понадобится 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
Вроде все написал правильно. А на экран выводит только столбец!!!! почему????

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
А вот так:

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
ладно щас попробую!!!

Добавлено через 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
Ты внимательно посты будешь читать? Я тебе о чем чуть выше сказал? Повторять не буду - ищи и исправляй!
zara44
Простите за глупость не внимательно читаю!!!! )))) Спасибо всем кто со мной мучался, вы очень помогаете!!!! heart.gif heart.gif heart.gif
zara44
Кому интересно могут посмотреть прогу!!!!! Может для кого нибудь она станет полезной(со световым меню). good.gif good.gif good.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.