Помощь - Поиск - Пользователи - Календарь
Полная версия: одномерный массив
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
электрик
помогиет решить задачу!! срочно, не могу зачет здать!
вот она:
Составьте прогу, проверяющую, можно ли, меняя местами элементы одномерного массива А, получить одномерный массив В
klem4
сортируешь оба массива, а потом поэлементам сравниваешь соответственные :
a[1] & b[1]
a[2] & b[2]
...
a[n] & b[n].
если пара не равна, то flag:=false => конец цикла проверки.

зы это естественно для массивов А и Б размерности N (одинаковой)
электрик
Цитата(klem4 @ 22.05.05 13:36)
сортируешь оба массива, а потом поэлементам сравниваешь соответственные :
a[1] & b[1]
a[2] & b[2]
...
a[n] & b[n].
если  пара не равна, то flag:=false => конец цикла проверки.

зы это естественно для массивов А и Б размерности N (одинаковой)


Я чуть тока шарю, но не понятно. Если можно, то поподробнее чуть об алгоритме.
volvo
Выбери любой из методов сортировки отсюда: FAQ: Методы сортировки
, отсортируй по возрастанию оба массива и сравнивай числа с одинаковыми индексами... Что неясно?
klem4
Сортируешь оба массива по возрастанию(убыванию) на твой вкус, естественно оба или так или так.

далее делаешь примерно так :

var

{необходимые переменные}
...
flag:boolean;

begin
...
flag:=false;
i:=1;
while(i<=n)and(not(flag)) do
begin
if not(a[i]=b[i]) then
flag:=true;
inc(i);
end;

if not(flag) then writeln('Yes')
else writeln('No');
электрик
Цитата(volvo @ 22.05.05 13:43)
Выбери любой из методов сортировки отсюда: FAQ: Методы сортировки
, отсортируй по возрастанию оба массива и сравнивай числа с одинаковыми индексами... Что неясно?



понял как сортировать по возростанию( в тетрадке нашел!!)Но как их сравнивать не очень...
volvo
flag := true;
for i := 1 to n do
flag := flag and (a[i] = b[i]);

if flag then writeln('Можно') else writeln('Нельзя');
электрик
Цитата(volvo @ 22.05.05 13:55)
flag := true;
for i := 1 to n do
  flag := flag and (a[i] = b[i]);

if flag then writeln('Можно') else writeln('Нельзя');



т.е я сортирую потом добавляю
ag := true;
for i := 1 to n do
flag := flag and (a[i] = b[i]);

if flag then writeln('Можно') else writeln('Нельзя');
и все
klem4
Цитата(volvo @ 22.05.05 13:55)
flag := true;
for i := 1 to n do
  flag := flag and (a[i] = b[i]);

if flag then writeln('Можно') else writeln('Нельзя');



это короче, но и тут лучше while использовать, ведь вовсе не обязательно нужен полный просмотр массива, согласись ;)
электрик
а что обозначают:
flag := true;
flag:=false;
а то потом препод спрашивать будет
volvo
Цитата(klem4 @ 22.05.05 13:59)
это короче, но и тут лучше while использовать, ведь вовсе не обязательно нужен полный просмотр массива, согласись ;)

Нет, не соглашусь... Что, из For нельзя выйти как только Flag = False? Можно. Так почему While? У тебя же все-таки фиксированное количество проходов...
klem4
Цитата(volvo @ 22.05.05 14:23)
Нет, не соглашусь... Что, из For нельзя выйти как только Flag = False? Можно. Так почему While? У тебя же все-таки фиксированное количество проходов...


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

а по поводу фиксировонного числа, если у нас в массиве пара тысяч элементов, а уже первая пара не сошлась, то все что будет происходить дальше бессмысленно, так что, электрик, либо exit сувай, либо цикл через while органиовывай :yes:
volvo
klem4
специально для тебя:
flag := true;
for i := 1 to n do begin
flag := flag and (a[i] = b[i]);
if not flag then break;
end;

if flag then writeln('Можно') else writeln('Нельзя');

и сколько сравнений тебе понадобится? И где ты видел Exit? Кстати, мне как-то все равно, что преподы любят, а что нет.
электрик
Цитата(volvo @ 22.05.05 14:37)
klem4
специально для тебя:
flag := true;
for i := 1 to n do begin
  flag := flag and (a[i] = b[i]);
  if not flag then break;
end;

if flag then writeln('Можно') else writeln('Нельзя');

и сколько сравнений тебе понадобится? И где ты видел Exit? Кстати, мне как-то все равно, что преподы любят, а что нет.



и Как лучше закончить?
электрик
короче посидел подумал и вот задача:
Program laba7;

uses
crt;

type
matr=array [1..7,1..7] of real;

var
ma:matr;
n,m:byte;
pol:integer;

Procedure Zastavka;

const
x=40;
y=10;
c=9;
var
i:byte;

Begin
clrscr;
gotoxy(x,y);
textcolor©;
write('Программа');
gotoxy(wherex-21,wherey+1);
write('‚Вычисление математических функций');
gotoxy(wherex-26,wherey+1);
textcolor(15);
write('Автор: Макаев А,Р,');
textcolor(15);
for i:=1 to 2 do
delay(65535);
clrscr;
end;


Procedure xread(var ma:matr; var n,m:byte);

var
i,j:byte;
Begin
Writeln('Vvedite kolichestvo strok');
readln(n);
Writeln('Vvedite kolichestvo stolbcov');
readln(m);
for i:=1 to n do
begin
Writeln('Vvedite ',i,' stroku');
for j:=1 to m do
read(ma[i,j]);
end;
end;

Function pol1(ma:matr;n,m:byte):integer;

Var
i,j:byte;
pol2:integer;

begin
pol2:=0;
for i:=1 to n do
for j:=1 to m do
if ma[i,j]>=0 then
pol2:=pol2+1;pol1:=pol2;
end;


BEGIN
zastavka;
Xread(ma,n,m);
pol:=pol1(ma,n,m);
writeln ('Количество положительных элементов ',pol);
readln;
readln;
end.
volvo
А ты в курсе, что она неверно оформлена? У тебя ее ни один преподаватель не примет smile.gif Вот из-за этого:
  pol:=pol1(ma,n,m);

а pol - глобальная переменная... smile.gif Нехорошо. Тогда зачем делать это функцией? Оформи, как процедуру.
электрик
ИЗВИНИТЕ СКИНУЛ НЕ ТУ ЗАДАЧУ:( ТА ЗАДАЧАЧА ВЫДАЕТ СНАЧАЛА ЗАСТАВКУ ,А ПОТОМ СЩИТАЕТ В ВАШЕЙ МАТРИЦЕ ЧИСЛО ПОЛОЖИТЕЛЬНЫХ ЭЛЕМЕНТОВ, ПРИЧЕМ ВСЕ СДЕЛАННО ЧЕРЕЗ ПРОЦЕДУРЫ),А ЭТО ВОТ ТА САМААЯ ЗАДАЧА!!!


Исходный код
Program rgz2;
uses crt;
const
n = 10;
type
t = array[1..n] of integer;
v = array[1..n] of integer;

var
a : t;
b : v;
flag : boolean;

j:integer;
procedure massiv(n:integer; var a:t);
var j:integer;
begin

for j:=1 to n do begin
writeln( 'ўўҐ¤ЁвҐ',j,'-© н«Ґ¬Ґ­в 1-Ј® ¬ ббЁў ='); readln(a[j]);end;
writeln;
end;

procedure massiv1(n:integer; var b:v);
var j:integer;
begin

for j:=1 to n do begin
writeln( 'ўўҐ¤ЁвҐ',j,'-© н«Ґ¬Ґ­в 2-Ј® ¬ ббЁў ='); readln(b[j]);end;
writeln;
end;

Procedure bubble(n : integer; var a : t);
var
i, j, p : integer;
begin
for i := 2 to n do
for j := n downto i do
if a[j] < a[j-1] then
begin
p := a[j];
a[j] := a[j-1];
a[j-1] := p
end;
writeln('гЇ®а冷з­л© Ї®­ҐгЎлў ­Ёо 1 ¬ ббЁў');
for i := 1 to n do write(a[i], ' ');
writeln
end;
Procedure bubble1(n : integer; var b : v);
var
i, j, p : integer;
begin
for i := 2 to n do
for j := n downto i do
if b[j] < b[j-1] then
begin
p := b[j];
b[j] := b[j-1];
b[j-1] := p
end;
writeln('гЇ®а冷з­л© Ї®­ҐгЎлў ­Ёо 1 ¬ ббЁў');
for i := 1 to n do write(b[i], ' ');
writeln
end;

begin
massiv(n, a);
massiv1(n, B);
bubble(n, a);
bubble1(n, B);
begin
flag:=true;
for j:=1 to n do
flag:=flag and (a[j]=b[j]);
if flag then writeln('yes')else writeln('no'); end;
readln;
end.



KLEM4,А ТЫ ГОВОРИШЬ, ЧТО САМ НЕ РЕШАЮ....ПРОСТО Я ЭЛЕКТРИК В ПРЯМОМ СМЫСЛЕ УЧУСЬ НА ЭЛЕКТРОЭНЕРГЕТИЧЕСКОМ, И НЕ ШАРЮ В ВАШИХ ЯЗЫКАХ, ДА ЕЩЕ ПРЕПОД, НЕ ДАЙ БОГ ВАМ ТАКОГО.... ВОТ И ДОСТАЮ ВАС, ИЗВИНИТЕ КОНЕЧНО....

Вот только кричать не надо...
volvo
Ну и смысл? Зачем тебе 2 одинаковые процедуры ввода массива и 2 одинаковые процедуры сортировки? А если у тебя будет 4 массива? Copy+Paste? Для того она и процедура, чтобы выполнять повторяющуюся последовательность действий, а ты при первом же повторе определяешь вторую процедуру blink.gif Так делай совсем без процедур...
электрик
Цитата(volvo @ 5.06.05 20:24)
А ты в курсе, что она неверно оформлена? У тебя ее ни один преподаватель не примет smile.gif Вот из-за этого:
  pol:=pol1(ma,n,m);

а pol - глобальная переменная... smile.gif Нехорошо. Тогда зачем делать это функцией? Оформи, как процедуру.


а мне и надо функцией
volvo
Ну, тогда и используй функцию по прямому назначению !
...
BEGIN
zastavka;
Xread(ma,n,m);
writeln ('Количество положительных элементов ', pol1(ma,n,m));
readln;
readln;
end.
Shura
Люди, по поводу "сравнения элементов массивов с одинаковыми индексами".
А разве нельзя просто использовать стандартные операции сравнения массивов (if a=b then...)? Там ведь наверно используется алгоритм сравнения до первой неравной пары. К чему вручную мучится?
volvo
Цитата(Shura @ 6.06.05 16:53)
А разве нельзя просто использовать стандартные операции сравнения массивов (if a=b then...)?

:D
Интересно, где это они "стандартные"?
Попробуй, запусти:
type
arrType = array[1 .. 4] of integer;

const
a: arrtype = (1, 2, 3, 4);
b: arrtype = (1, 2, 3, 5);

begin
writeln( a = B );
end.

Что видишь на экране?
Shura
Упс... Извинтиляюсь. Это я перепутал с ( a:=B ). Блин, во всех учебниках пишут "Не забудьте об этой операции!". Вот я и не забыл! :-)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.