Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 16.03.2014, 20:47   #1 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Lightbulb Программы с процедурами

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

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

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

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

PHP код:
uses   System;
const  
  
m=5
type
 
    Mass
=array[1..mof integer
    
Mas=array[1..mof integer;
 
Procedure  Izmena ( Var C:Mass;Var D:Mas ;Const Pm:byte;var Pmin:integerPi_min:integeri: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.
Для обмена в матрице строк с произвольными номерами использовать процедуру.

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


Заранее спасибо!
Madara вне форума   Ответить с цитированием

Старый 16.03.2014, 20:47
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Данные топики могут содержать в себе важную информацию

Программы
Поиск программы
Поиск программы
Бесплатные программы
Написать программу в Pascal с процедурами и функциями

Старый 16.03.2014, 21:52   #2 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,872
Сказал(а) спасибо: 318
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от Madara Посмотреть сообщение
Я решал, общую форму программы написал примерно,
Да... что-то, я смотрю, совсем у Вас программирование не идет... То, что Вы написали, это, увы, в основном просто набор каких-то символов типа "вокруг да около". Ну где, скажите на милость, Вы видели, чтобы константа была параметром процедуры?!
Вот, например, рабочая программка:
Код:
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.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 16.03.2014, 22:20   #3 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,872
Сказал(а) спасибо: 318
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от Madara Посмотреть сообщение
В этой задаче я испытал огромные сложности, не придя к правильному решению...
Да тоже, в общем, пустяки:
Код:
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.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 16.03.2014, 23:18   #4 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо большое! Уже который раз выручаете))

Программирование не идёт совсем Вы правы...
Преподаватель объясняет плохо, а заниматься самообучением времени нет, т.к. нельзя отставать по другим предметам (Учусь в университете на техническом, на электроэнергетика)...
Пытаюсь кое как понять. Ещё раз спасибо)
Madara вне форума   Ответить с цитированием
Старый 25.03.2014, 00:59   #5 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Получил от преподавателя вторую программу обратно с таким комментарием:
PHP код:
Type
 Matr
=Array[1..5,1..5of Integer;
Var
 
A,B:Matr;
 
p,q:Integer;

Procedure Izmena(N,s1,s2:Integer; Var C:Matr);
var
 
V:Array[1..5of 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]:=3A[1,2]:=2A[1,3]:=4A[1,4]:=1;
     
A[2,1]:=5A[2,2]:=2A[2,3]:=3A[2,4]:=1;
     
A[3,1]:=6A[3,2]:=4A[3,3]:=5A[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]:=3B[1,2]:=2B[1,3]:=5B[1,4]:=1B[1,5]:=7;
     
B[2,1]:=9B[2,2]:=1B[2,3]:=2B[2,4]:=6B[2,5]:=5;
     
B[3,1]:=1B[3,2]:=8B[3,3]:=4B[3,4]:=7B[3,5]:=1;
     
B[4,1]:=2B[4,2]:=0B[4,3]:=9B[4,4]:=3B[4,5]:=5;
     
B[5,1]:=7B[5,2]:=2B[5,3]:=3B[5,4]:=1B[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. немного изменил программу...
Madara вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 25.03.2014, 10:00   #6 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,872
Сказал(а) спасибо: 318
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от Madara Посмотреть сообщение
Пробовал через одну переменную сделать, не получилось(
Хорошо, попробуйте предложить такой вариант:
Код:
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.
Цитата:
Сообщение от Madara Посмотреть сообщение
P.S. немного изменил программу...
Ох, уж и изменили... Ну зачем, объясните Вы мне, присвоение исходных значений элементов матриц загонять ВНУТРЬ тела цикла?!!! Таким образом, для первой матрицы Вы осуществляете это присвоение 12 раз, а для второй - 25 раз!!!! Оно Вам надо?
Между прочим, по моему разумению, именно на этот момент должен был в первую очередь обратить внимание почтеннейший, вместо того, чтобы ловить блох в части оптимизации алгоритма обмена строк.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 25.03.2014, 21:04   #7 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

И ещё не подскажете?
Вместо записи:
PHP код:
A[1,1]:=3A[1,2]:=2A[1,3]:=4A[1,4]:=1;
A[2,1]:=5A[2,2]:=2A[2,3]:=3A[2,4]:=1;
A[3,1]:=6A[3,2]:=4A[3,3]:=5A[3,4]:=1
Можно как то записывать примерно так:
PHP код:
A=((3241),
   (
5231),
   (
6451)
); 
Или нельзя?

Заранее спасибо)
Madara вне форума   Ответить с цитированием
Старый 26.03.2014, 09:59   #8 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,872
Сказал(а) спасибо: 318
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 03:18.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.