• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Программы с процедурами

  • Автор темы Автор темы Madara
  • Дата начала Дата начала

Madara

Новые
Регистрация
29 Ноя 2013
Сообщения
50
Реакции
0
Баллы
0
Программы с процедурами

Помогите с двумя задачами, одну частично выполнил...
Задача №1
Задача на использование формальных массивов в процедурах.

Составить процедуру, исходными данными которой является матрица А из n строк и n столбцов, либо два массива B1,B2,...,Вn; C1,C2,...,Cm, либо один из них. Для проверки составленной внешней процедуры разработать головной модуль.
Важно. Процедура не должна использовать «внутри себя» глобальных переменных. Все необходимое для работы процедуры и передачи результата должно осуществляться через параметры процедуры.

Вывести измененный массив C1,C2,...,Cm: каждый элемент, предшествующий минимальному, помножен на него, а все следующие за минимальным уменьшены на 1.

Я решал, общую форму программы написал примерно, а с позицией минимального элемента проблема....

PHP:
uses   System;
const  
  m=5; 
type
 
    Mass=array[1..m] of integer; 
    Mas=array[1..m] of integer;
 Procedure  Izmena ( Var C:Mass;Var D:Mas ;Const Pm:byte;var Pmin:integer; Pi_min:integer; i:integer ); // Pm-кол-во элементов, Pmin-минимальный элемент, Pi_min-позиция минимального элемента
         
        begin
          i:=i+1;
          Pmin:=Pm;
          for i:=1 to Pm do 
          D[i]:=C[i];
           
             for i:=1 to Pm do
           Begin
             if C[i]<Pmin then 
           Begin
             Pmin:=C[i];
             Pi_min:=i;
             writeln(Pi_min);
             end; 
            end;
           end;
   
    Var
  B:Mas;
  A:Mass:=((5,5,4,2,7));
  min,i_min,ia:integer;
   begin
   Izmena(A,B,m,min,i_min,ia);
   writeln('минимум ',min, ', стоит на ', i_min, ' месте'); 
   writeln(i_min);
   for ia:=1 to m do
   
   
   end.

...каждый элемент, предшествующий минимальному, помножен на него, а все следующие за минимальным уменьшены на 1... Я представил как
PHP:
for i:=1 to Pm do
   
   ...if i<Pi_min then
   D[i]:=C[i]*Pmin;
   
   
   if i>Pi_min then
   D[i]:=C[i]-1...
Не знаю, верно это или нет


Задача №2
Задача на разработку программы с использованием созданной в задании процедуры.

Составить программу с разработкой и использованием указанной в задании процедуры.
Напоминание: процедура не должна использовать «внутри себя» глобальных переменных. Все необходимое для работы процедуры и передачи результата должно осуществляться через параметры процедуры.
В каждой из матриц: A (3 строки, 4 столбца) и B (5 строк, 5 столбцов) поменять местами две строки: в матрице A - строки 2 и 3, в матрице B - строки 2 и 4.
Для обмена в матрице строк с произвольными номерами использовать процедуру.

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


Заранее спасибо!
 
Я решал, общую форму программы написал примерно,
Да... что-то, я смотрю, совсем у Вас программирование не идет... То, что Вы написали, это, увы, в основном просто набор каких-то символов типа "вокруг да около". Ну где, скажите на милость, Вы видели, чтобы константа была параметром процедуры?!
Вот, например, рабочая программка:
Код:
const
 m=5;
type
 Mass=array[1..m] of integer;

Var
 C:Mass;
 j:Integer;

Procedure Izmena (Mi:Integer; var Ci:Mass);
var
 i,i_min,min:Integer;
begin
 min:=Ci[1];
 i_min:=1;
 for i:=2 to Mi do
  if Ci[i]<min then
   begin
    min:=Ci[i];
    i_min:=i;
   end;
 for i:=1 to i_min-1 do Ci[i]:=Ci[i]*min;
 for i:=i_min+1 to Mi do Ci[i]:=Ci[i]-1;
end;

Begin
 C[1]:=5; C[2]:=5; C[3]:=4; C[4]:=2; C[5]:=7;
 for j:=1 to m do write(C[j]:5);
 writeln;
 Izmena(m,C);
 for j:=1 to m do write(C[j]:5);
 Readln
End.
 
В этой задаче я испытал огромные сложности, не придя к правильному решению...
Да тоже, в общем, пустяки:
Код:
Type
 Matr=Array[1..5,1..5] of Integer;
Var
 A,B:Matr;
 p,q:Integer;

Procedure Exchange(N,s1,s2:Integer; Var C:Matr);
var
 V:Array[1..5] of Integer;
 j:integer;
begin
 for j:=1 to N do V[j]:=C[s1,j];
 for j:=1 to N do C[s1,j]:=C[s2,j];
 for j:=1 to N do C[s2,j]:=V[j];
end;

Begin
 Randomize;
 Writeln('Old A matrix:');
 for p:=1 to 3 do
  begin
   for q:=1 to 4 do
    begin
     A[p,q]:=Random(10);
     Write(A[p,q]:3);
    end;
   writeln;
  end;
 writeln;
 Writeln('Old B matrix:');
 for p:=1 to 5 do
  begin
   for q:=1 to 5 do
    begin
     B[p,q]:=Random(10);
     Write(B[p,q]:3);
    end;
   writeln;
  end;
 writeln;
 Exchange(4,2,3,A);
 Exchange(5,2,4,B);
 Writeln('New A matrix:');
 for p:=1 to 3 do
  begin
   for q:=1 to 4 do Write(A[p,q]:3);
   writeln;
  end;
 writeln;
 Writeln('New B matrix:');
 for p:=1 to 5 do
  begin
   for q:=1 to 5 do Write(B[p,q]:3);
   writeln;
  end;
 Readln
End.
 
Спасибо большое! Уже который раз выручаете))

Программирование не идёт совсем Вы правы...
Преподаватель объясняет плохо, а заниматься самообучением времени нет, т.к. нельзя отставать по другим предметам (Учусь в университете на техническом, на электроэнергетика)...
Пытаюсь кое как понять. Ещё раз спасибо)
 
Получил от преподавателя вторую программу обратно с таким комментарием:
PHP:
Type
 Matr=Array[1..5,1..5] of Integer;
Var
 A,B:Matr;
 p,q:Integer;

Procedure Izmena(N,s1,s2:Integer; Var C:Matr);
var
 V:Array[1..5] of Integer; // вот этот массив вообще не нужен и он зависим
 j:integer;                // от реальных размеров матриц - это плохо
begin
 for j:=1 to N do V[j]:=C[s1,j]; // здесь просто в ОДНОМ цикле через ОДНУ 
 for j:=1 to N do C[s1,j]:=C[s2,j]; // вспомогат.переменную меняются
 for j:=1 to N do C[s2,j]:=V[j];    // все элементы строк.
end;

Begin
 Writeln('Исходная матрица А:');
 for p:=1 to 3 do
  begin
   for q:=1 to 4 do
    begin
     A[1,1]:=3; A[1,2]:=2; A[1,3]:=4; A[1,4]:=1;
     A[2,1]:=5; A[2,2]:=2; A[2,3]:=3; A[2,4]:=1;
     A[3,1]:=6; A[3,2]:=4; A[3,3]:=5; A[3,4]:=1;
     Write(A[p,q]:3);
    end;
   writeln;
  end;
 writeln;
 Writeln('Исходная матрица В:');
 for p:=1 to 5 do
  begin
   for q:=1 to 5 do
    begin
     B[1,1]:=3; B[1,2]:=2; B[1,3]:=5; B[1,4]:=1; B[1,5]:=7;
     B[2,1]:=9; B[2,2]:=1; B[2,3]:=2; B[2,4]:=6; B[2,5]:=5;
     B[3,1]:=1; B[3,2]:=8; B[3,3]:=4; B[3,4]:=7; B[3,5]:=1;
     B[4,1]:=2; B[4,2]:=0; B[4,3]:=9; B[4,4]:=3; B[4,5]:=5;
     B[5,1]:=7; B[5,2]:=2; B[5,3]:=3; B[5,4]:=1; B[5,5]:=4;
     Write(B[p,q]:3);
    end;
   writeln;
  end;
 writeln;
 Izmena(4,2,3,A);
 Izmena(5,2,4,B);
 Writeln('Меняем строки');
 Writeln;
 Writeln('Измененная матрица А:');
 for p:=1 to 3 do
  begin
   for q:=1 to 4 do Write(A[p,q]:3);
   writeln;
  end;
 writeln;
 Writeln('Измененная матрица В:');
 for p:=1 to 5 do
  begin
   for q:=1 to 5 do Write(B[p,q]:3);
   writeln;
  end;
End.

Пробовал через одну переменную сделать, не получилось(
P.S. немного изменил программу...
 
Пробовал через одну переменную сделать, не получилось(
Хорошо, попробуйте предложить такой вариант:
Код:
Type
 Vector=Array[1..5] of Integer;
 Matr=Array[1..5] of Vector;
Var
 A,B:Matr;
 p,q:Integer;

Procedure Izmena(s1,s2:Integer; Var C:Matr);
var
 V:Vector;
begin
 V:=C[s1];
 C[s1]:=C[s2];
 C[s2]:=V;
end;

Begin
 A[1,1]:=3; A[1,2]:=2; A[1,3]:=4; A[1,4]:=1;
 A[2,1]:=5; A[2,2]:=2; A[2,3]:=3; A[2,4]:=1;
 A[3,1]:=6; A[3,2]:=4; A[3,3]:=5; A[3,4]:=1;
 B[1,1]:=3; B[1,2]:=2; B[1,3]:=5; B[1,4]:=1; B[1,5]:=7;
 B[2,1]:=9; B[2,2]:=1; B[2,3]:=2; B[2,4]:=6; B[2,5]:=5;
 B[3,1]:=1; B[3,2]:=8; B[3,3]:=4; B[3,4]:=7; B[3,5]:=1;
 B[4,1]:=2; B[4,2]:=0; B[4,3]:=9; B[4,4]:=3; B[4,5]:=5;
 B[5,1]:=7; B[5,2]:=2; B[5,3]:=3; B[5,4]:=1; B[5,5]:=4;
 Writeln('Исходная матрица А:');
 for p:=1 to 3 do
  begin
   for q:=1 to 4 do Write(A[p,q]:3);
   writeln;
  end;
 writeln;
 Writeln('Исходная матрица В:');
 for p:=1 to 5 do
  begin
   for q:=1 to 5 do Write(B[p,q]:3);
   writeln;
  end;
 writeln;
 Izmena(2,3,A);
 Izmena(2,4,B);
 Writeln('Меняем строки');
 Writeln;
 Writeln('Измененная матрица А:');
 for p:=1 to 3 do
  begin
   for q:=1 to 4 do Write(A[p,q]:3);
   writeln;
  end;
 writeln;
 Writeln('Измененная матрица В:');
 for p:=1 to 5 do
  begin
   for q:=1 to 5 do Write(B[p,q]:3);
   writeln;
  end;
End.
А не понравится - можно и так (скорее всего, Ваш многоуважаемый имел в виду что-то в этом роде):
Код:
Type
 Matr=Array[1..5,1..5] of Integer;
Var
 A,B:Matr;
 p,q:Integer;

Procedure Izmena(s1,s2:Integer; Var C:Matr);
var
 j,D:Integer;
begin
 for j:=1 to 5 do
  begin
   D:=C[s1,j];
   C[s1,j]:=C[s2,j];
   C[s2,j]:=D;
  end;
end;

Begin
 A[1,1]:=3; A[1,2]:=2; A[1,3]:=4; A[1,4]:=1;
 A[2,1]:=5; A[2,2]:=2; A[2,3]:=3; A[2,4]:=1;
 A[3,1]:=6; A[3,2]:=4; A[3,3]:=5; A[3,4]:=1;
 B[1,1]:=3; B[1,2]:=2; B[1,3]:=5; B[1,4]:=1; B[1,5]:=7;
 B[2,1]:=9; B[2,2]:=1; B[2,3]:=2; B[2,4]:=6; B[2,5]:=5;
 B[3,1]:=1; B[3,2]:=8; B[3,3]:=4; B[3,4]:=7; B[3,5]:=1;
 B[4,1]:=2; B[4,2]:=0; B[4,3]:=9; B[4,4]:=3; B[4,5]:=5;
 B[5,1]:=7; B[5,2]:=2; B[5,3]:=3; B[5,4]:=1; B[5,5]:=4;
 Writeln('Исходная матрица А:');
 for p:=1 to 3 do
  begin
   for q:=1 to 4 do Write(A[p,q]:3);
   writeln;
  end;
 writeln;
 Writeln('Исходная матрица В:');
 for p:=1 to 5 do
  begin
   for q:=1 to 5 do Write(B[p,q]:3);
   writeln;
  end;
 writeln;
 Izmena(2,3,A);
 Izmena(2,4,B);
 Writeln('Меняем строки');
 Writeln;
 Writeln('Измененная матрица А:');
 for p:=1 to 3 do
  begin
   for q:=1 to 4 do Write(A[p,q]:3);
   writeln;
  end;
 writeln;
 Writeln('Измененная матрица В:');
 for p:=1 to 5 do
  begin
   for q:=1 to 5 do Write(B[p,q]:3);
   writeln;
  end;
End.
P.S. немного изменил программу...
Ох, уж и изменили... Ну зачем, объясните Вы мне, присвоение исходных значений элементов матриц загонять ВНУТРЬ тела цикла?!!! Таким образом, для первой матрицы Вы осуществляете это присвоение 12 раз, а для второй - 25 раз!!!! Оно Вам надо?
Между прочим, по моему разумению, именно на этот момент должен был в первую очередь обратить внимание почтеннейший, вместо того, чтобы ловить блох в части оптимизации алгоритма обмена строк.
 
Спасибо, а я пытался сделать так же как вы во втором примере, но не верно запустил цикл...Что-то вообще не получается ничего с информатикой...

И ещё не подскажете?
Вместо записи:
PHP:
A[1,1]:=3; A[1,2]:=2; A[1,3]:=4; A[1,4]:=1;
A[2,1]:=5; A[2,2]:=2; A[2,3]:=3; A[2,4]:=1;
A[3,1]:=6; A[3,2]:=4; A[3,3]:=5; A[3,4]:=1;

Можно как то записывать примерно так:
PHP:
A=((3, 2, 4, 1),
   (5, 2, 3, 1),
   (6, 4, 5, 1)
);

Или нельзя?

Заранее спасибо)
 
И ещё не подскажете? Вместо записи:
PHP:
A[1,1]:=3; A[1,2]:=2; A[1,3]:=4; A[1,4]:=1; A[2,1]:=5; A[2,2]:=2; A[2,3]:=3; A[2,4]:=1; A[3,1]:=6; A[3,2]:=4; A[3,3]:=5; A[3,4]:=1;
Можно как то записывать примерно так:
PHP:
A=((3, 2, 4, 1),    (5, 2, 3, 1),    (6, 4, 5, 1) )
; Или нельзя?
Можно. Только тогда массивы нужно объявлять в разделе констант следующим образом:
PHP:
Const
 A:Array[1..3,1..4] of Integer=((3, 2, 4, 1),(5, 2, 3, 1),(6, 4, 5, 1));
Но это при условии, что у Вас НОРМАЛЬНЫЙ Паскаль (Turbo/Free). Обычный ABC в силу своей крайней убогости типизированных констант-массивов не понимает. Впрочем, в среде PascalABC.NET их ввели, там можно.
 
Назад
Сверху