Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2013, 13:54   #1
parshuk
 
Регистрация: 14.03.2013
Сообщений: 6
По умолчанию обработка массива в Паскале - работает,но...

Составил программу для обработки массива.Пользовался функцией GOTO для реализации оператора If - Then.
Заработало.
Вобщем-то,я работу сделал,но хотелось бы разобраться для себя досконально по отдельным моментам.

Я прочитал здесь "Частозадаваемые вопросы по массивам",однако это не дало ответы на многие вопросы.

Метод "пузырька":
Код:
Program Massiv(Input,Output);
Uses Crt;
Label 11,12,13;
Type Vector=array[1..6] of real;
Matrica=array[1..3,1..6] of real;
Var A,A1:Vector; B:Matrica;
Sum3B,R:real; i,j,k:byte;
Begin
//enter the array data A
ClrScr;
writeln('calculation of the values of the array A');
for i:=1 to 6 do read(A[i]);
//calculation of the values of the array B;
for i:=1 to 3 do
for j:=1 to 6 do 
B[i,j]:=sin(i)+cos(A[j]);
//The output of the elements of the arrays A and B
writeln;
writeln('array A:');
for i:=1 to 6 do write(A[i]:7:3,' ');
writeln;
writeln('array B:');
for i:=1 to 3 do
begin
for j:=1 to 6 do write(B[i,j]:7:3,' ');
writeln;
end;
Sum3B:=0;
for j:=1 to 6 do 
Sum3B:=Sum3B+B[3,j];
//The output of the values Sum3B
write('Summa 3 line Sum3B=',Sum3B:7:3,' ');
if Sum3B < 0 then goto 11 else goto 12;
11:
begin
//calculation of the values of the array A1
for j:=1 to 6 do
A1[j]:=(Sum3B+9)*A[j];
//The output of the elements of the arrays A1
writeln;
writeln('array A1:');
for j:=1 to 6 do write(A1[j]:7:3,' ');
end;
goto 13;
12:
//sortirovka elements B
writeln;
writeln('2 line array B');
for j:=1 to 6 do write(B[2,j]:7:3,' ');
begin
for k:=1 to 5 do {vspomogatelnaya peremennaya}
for j:=1 to 6-k do 
if B[2,j] > B[2,j+1] then
begin
R:=B[2,j];
B[2,j]:=B[2,j+1];
B[2,j+1]:=R;
end;
writeln;
writeln('uporyadochenniya 2 line array B');
for j:=1 to 6 do write(B[2,j]:7:3,' ');
end;
13:
End.
Меня интересует место,где написано "Вспомогательная переменная".
Вот оно:
Код:
begin
for k:=1 to 5 do {vspomogatelnaya peremennaya}
for j:=1 to 6-k do 
if B[2,j] > B[2,j+1] then
begin
R:=B[2,j];
B[2,j]:=B[2,j+1];
B[2,j+1]:=R;
end;
Пузырёк должен работать без этой строки,напрямую,вот так:
Код:
begin
for j:=1 to 5 do 
if B[2,j] > B[2,j+1] then
begin
R:=B[2,j];
B[2,j]:=B[2,j+1];
B[2,j+1]:=R;
end;
Однако,упорядочивания элементов по возрастанию в этом случае не происходит.

Следующий вопрос.
Не могу реализовать выбор по условию через логическую переменную F,вот так:
Код:
Program Massiv(Input,Output);
Uses Crt;
Label 13;
Type Vector=array[1..6] of real;
Matrica=array[1..3,1..6] of real;
Var A,A1:Vector; B:Matrica;F:boolean;
Sum3B,R:real; i,j,k:byte;
Begin
//enter the array data A
ClrScr;
writeln('calculation of the values of the array A');
for i:=1 to 6 do read(A[i]);
//calculation of the values of the array B;
for i:=1 to 3 do
for j:=1 to 6 do 
B[i,j]:=sin(i)+cos(A[j]);
//The output of the elements of the arrays A and B
writeln;
writeln('array A:');
for i:=1 to 6 do write(A[i]:7:3,' ');
writeln;
writeln('array B:');
for i:=1 to 3 do
begin
for j:=1 to 6 do write(B[i,j]:7:3,' ');
writeln;
end;
Sum3B:=0;
for j:=1 to 6 do 
Sum3B:=Sum3B+B[3,j];
//The output of the values Sum3B
write('Summa 3 line Sum3B=',Sum3B:7:3,' ');
if Sum3B < 0 then
begin
F:=true;
//calculation of the values of the array A1
for j:=1 to 6 do
A1[j]:=(Sum3B+9)*A[j];
//The output of the elements of the arrays A1
writeln;
writeln('array A1:');
for j:=1 to 6 do write(A1[j]:7:3,' ');
F:=false;
end;
If F then goto 13;
//sortirovka elements B
writeln;
writeln('2 line array B');
for j:=1 to 6 do write(B[2,j]:7:3,' ');
begin
for k:=1 to 5 do {vspomogatelnaya peremennaya}
for j:=1 downto 6-k do 
if B[2,j] > B[2,j+1] then
begin
R:=B[2,j];
B[2,j]:=B[2,j+1];
B[2,j+1]:=R;
end;
writeln;
writeln('uporyadochenniya 2 line array B');
for j:=1 to 6 do write(B[2,j]:7:3,' ');
end;
13:
End.
(прим.Пузырёк служит для упорядочивания в порядке возрастания 2й строки массива B)

Последний раз редактировалось parshuk; 21.03.2013 в 19:45.
parshuk вне форума Ответить с цитированием
Старый 21.03.2013, 14:03   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Пузырёк должен работать без этой строки,напрямую,вот так
А эта k там вообще не пришей кобыле хвост. Лишний цикл, счетчик которого нигде не используется.

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


Примерно так:

Код:
if Sum3B < 0 then begin
  F:=true; //calculation of the values of the array A1
  for j:=1 to 6 do
    A1[j]:=(Sum3B+9)*A[j]; //The output of the elements of the arrays A1
  writeln;
  writeln('array A1:');
  for j:=1 to 6 do write(A1[j]:7:3,' ');
  F:=false;
end;
И сразу становится виден ответ на Ваш второй вопрос:

Цитата:
Не могу реализовать выбор по условию через логическую переменную F,вот так:
У вас же в начале этого субкода F:=true, а в конце - F:=false. Результат после выполнения таких команд - F=false всегда. Смысл условия теряется.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 21.03.2013 в 14:16.
Sciv вне форума Ответить с цитированием
Старый 21.03.2013, 19:42   #3
parshuk
 
Регистрация: 14.03.2013
Сообщений: 6
По умолчанию

Вы подтверждаете мою мысль,что "k" это лишнее звено.Тогда непонятно,почему с "k" работает,а без него НЕработает? А ведь я пробовал заходить и "слева" и "справа" и ну никак без этой лишней строки не получается.

(Составляю программу второй раз в жизни,структуирование ещё не освоил.)
parshuk вне форума Ответить с цитированием
Старый 21.03.2013, 21:23   #4
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Нет, пузырек не должен работать без k.
У пузырьковой сортировки два цикла, отсюда сложность O(n^2)

p.s. Весь текст не осилил. Мое сообщение только касательно рассуждений о сортировке пузырьком в первом посте.
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 21.03.2013, 22:00   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Нет, пузырек не должен работать без k.
У пузырьковой сортировки два цикла
Согласен, там правильная сортировка. Я как-то проглядел изначально, что второй цикл до 6-k изменяется.

Автор, у Вас все правильно с сортировкой.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 21.03.2013, 22:56   #6
parshuk
 
Регистрация: 14.03.2013
Сообщений: 6
По умолчанию

Благодарю за объяснение.

Теперь по поводу F (логической переменной):
"У вас же в начале этого субкода F:=true, а в конце - F:=false. Результат после выполнения таких команд - F=false всегда. Смысл условия теряется. "

Я так сделал исходя из примера,который давался за образец. Вообще,когда разбирался с написанием программы и она никак не хотела запускаться,то решил проверить ту,которая предлагалась ВУЗом за образец. Хм, образцовая программа тоже не запускалась.В неё нашёл своим взглядом первоклассника несколько явно пропущенных деталей - от ";" до неправильного функционирования всей программы. Привожу ту часть,которую я брал в качестве примера,тут логическая переменная называется Flag:
Код:
begin
  Flag:=True;
  for j:=3 downto 1 do
  if A1[j]>A1[j-1]
  then
    begin
       R:=A1[j-1];
       A1[j-1]:=A1[j];
       A1[j]:=R;
       Flag:=False
end;
if Flag then goto 11
end;
11:;
end
parshuk вне форума Ответить с цитированием
Старый 22.03.2013, 05:48   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Выделю цветами разные, одноуровневые, так сказать, блоки программы:

Код:
begin
  Flag:=Truе;
  fоr j:=3 dоwnto 1 dо
  if A1[j]>A1[j-1]
  thеn
    bеgin
       R:=A1[j-1];
       A1[j-1]:=A1[j];
       A1[j]:=R;
       Flag:=Falsе
    еnd;
  if Flag thеn gotо 11
end;
А вот Ваш код:

Код:
if Sum3B < 0 then begin
  F:=true; 
  for j:=1 to 6 do
    A1[j]:=(Sum3B+9)*A[j]; arrays A1
  writeln;
  writeln('array A1:');
  for j:=1 to 6 do write(A1[j]:7:3,' ');
  F:=false;
end;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка части двухмерного массива(в Паскале) Андрей77777 Помощь студентам 0 27.11.2012 21:14
Обработка одномерного массива в Паскале Андрей77777 Помощь студентам 1 18.11.2012 13:31
инициализация массива, вывод массива и обработка массива должны быть реализованы с помоshью функций airesjke Помощь студентам 0 02.03.2012 16:14
Почему программа на С++ не работает с локальным описанием массива, но работает с глобальным? >>STINGER<< Помощь студентам 4 08.03.2011 09:56