0 / 0 / 0
Регистрация: 09.04.2017
Сообщений: 3

Побочный эффект в подпрограмме

09.04.2017, 09:56. Показов 1679. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, форумчане! Помогите, пожалуйста, я написал программу, где надо определить, какой из векторов имеет наибольшую длину, но у меня глобальные переменные используются в функциях и из-за этого возникает побочный эффект, помогите его убрать!
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
{
Задача: 
   Дана вещественная квадратная матрица A порядка n, n-мерный вещественный 
   вектор x. Среди векторов x, Ax, Ax – x, найти тот, который имеет наибольшую 
   длину. 
}
 
program PROG_A10_12;
const 
  n = 4;                          // размерность матрицы и вектора
 
type
  vec = array[1..n] of real;           // тип вектора одномерный массив
 
var
  a: array[1..n,1..n] of real;        // матрица А
  x, AX, AXX: vec;                    // вектора х, A*X, A*X-X
  lx, lax, laxx: real;                // длины векторов 
  i, j: integer;                      // индексы
 
 {Создание матрицы}
  function MATRIX(i,j:integer;n:integer):real;
  begin
   randomize;
   for i:=1 to n do                    // задаем исходные данные
    begin
     for j:=1 to n do
      a[i,j] := random(10);        // исходная матрица
      x[i] := random(10);            // исходный вектор
    end;
  end;
 
 {Вывод матрицы}
  function printMATRIX(i,j:integer;const n:integer):real;
   begin
    writeln('Матрица А:');
    for i:=1 to n do
     begin
      for j:=1 to n do
       write(a[i,j]:6);
       writeln;
     end;
    writeln;
   end;
 
 {Функция вычисляет длину вектора}
  function l(x:vec): real;
  var
   i: integer;
   dl: real;
  begin
   dl := 0;
   for i:=1 to n do
    begin
     dl := dl + x[i]*x[i];
    end;
    l := sqrt(dl);  
  end;
  
 {Вывод вектора x}
  function printX(i:integer;const n:integer;x:vec):real;
  begin
   write('Вектор X:  (');
   for i:=1 to n do
    write(x[i]:6);
   writeln(')   Длина вектора равна ',l(x));
  end;
  
 {Вычисление вектора AX}
  function vecAX(i,j:integer;const n:integer;x:vec): real;
  begin
   for i:=1 to n do
    begin
     AX[i]:=0;
     for j:=1 to n do
      AX[i]:=AX[i]+a[i,j]*x[j];
    end;
  end;
  
 {Вычисление вектора AX-X}
  function vecAX_X(i,j:integer):real;
  begin
   for i:=1 to n do
    AXX[i] := AX[i] - x[i];
  end;
  
 {Вывод вектора AX}
  function printAX(i:integer;const n:integer):real;
  begin
   write('Вектор AX:  (');
  for i:=1 to n do
   write(ax[i]:6);
  writeln(')   Длина вектора равна ',l(ax));
  end;
  
 {Вывод вектора AX-X}
  function printAX_X(i:integer;const n:integer):real;
  begin
   write('Вектор AX-X:  (');
  for i:=1 to n do
   write(axx[i]:6);
  writeln(')   Длина вектора равна ',l(axx));
  end;
  
 
  
//------------------------------------------------------------------------------
 
begin
  MATRIX(i,j,n);
  printMATRIX(i,j,n);
  
  printX(i,n,x);
  
  vecAX(i,j,n,x);
  printAX(i,n);
  
  vecAX_X(i,j);
  printAX_X(i,n);
  
 {Сравнение длины векторов}
  if l(x) > l(ax) then   
    if l(x) > l(axx) then
      writeln('Вектор имеет X наибольшую длину ',l(x))
    else
      writeln('Вектор имеет AX-X наибольшую длину ',l(axx))
  else
    if l(ax) > l(axx) then
      writeln('Вектор AX имеет наибольшую длину ',l(ax))
    else
      writeln('Вектор AX-X имеет наибольшую длину ',l(axx));
  
end.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2017, 09:56
Ответы с готовыми решениями:

Побочный эффект при использовании рекурсии
Почему при штатном запуске программы в расчетах возникает ошибка, а при выполнении по шагам ошибки нет? Код считает сумму первых N членов...

Ошибка в подпрограмме
Ошибка в подпрограмме помогите исправить program rasad; uses crt; type mas=array of real; const d=10; function...

Заполнение динамического массива в подпрограмме
Что-то до меня не доходит как работают эти динамические массивы, а точнее как использовать с ними подпрограммы, так что прошу вашей помощи...

5
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8614 / 4454 / 1664
Регистрация: 01.02.2015
Сообщений: 13,829
Записей в блоге: 10
09.04.2017, 10:06
Перенесите блок var с глобальными переменными к begin основной программы.
И начинайте исправлять ошибки компиляции (идентификатор не найден).

Добавлено через 1 минуту
При попытки компиляции получил сообщения, что все функции не получают присвоения результата.
0
0 / 0 / 0
Регистрация: 09.04.2017
Сообщений: 3
09.04.2017, 10:09  [ТС]
Я уже и так, и сяк пытался делать, но вылазят всякие другие ошибки, никак не могу =(
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8614 / 4454 / 1664
Регистрация: 01.02.2015
Сообщений: 13,829
Записей в блоге: 10
09.04.2017, 10:19
Лучший ответ Сообщение было отмечено WvladW как решение

Решение

Нет там других ошибок.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
{
Задача:
   Дана вещественная квадратная матрица A порядка n, n-мерный вещественный
   вектор x. Среди векторов x, Ax, Ax – x, найти тот, который имеет наибольшую
   длину.
}
 
program PROG_A10_12;
 
const
  n = 4;                          // размерность матрицы и вектора
 
type
  vec = array[1..n] of real;           // тип вектора одномерный массив
  TMatrix = array[1..n, 1..n] of real;
 
  {Создание матрицы}
  function MATRIX(var a: TMatrix; var x: vec; n: integer): real;
  var
    i, j: integer;
  begin
    randomize;
    for i := 1 to n do                    // задаем исходные данные
    begin
      for j := 1 to n do
        a[i, j] := random(10);        // исходная матрица
      x[i] := random(10);             // исходный вектор
    end;
  end;
 
  {Вывод матрицы}
  function printMATRIX(var a: TMatrix; const n: integer): real;
  var
    i, j: integer;
  begin
    writeln('Матрица А:');
    for i := 1 to n do
    begin
      for j := 1 to n do
        Write(a[i, j]: 6);
      writeln;
    end;
    writeln;
  end;
 
  {Функция вычисляет длину вектора}
  function l(x: vec): real;
  var
    i:  integer;
    dl: real;
  begin
    dl := 0;
    for i := 1 to n do
    begin
      dl := dl + x[i] * x[i];
    end;
    l := sqrt(dl);
  end;
 
  {Вывод вектора x}
  function printX(const n: integer; x: vec): real;
  var
    i: integer;
  begin
    Write('Вектор X:  (');
    for i := 1 to n do
      Write(x[i]: 6);
    writeln(')   Длина вектора равна ', l(x));
  end;
 
  {Вычисление вектора AX}
  function vecAX(const n: integer; var AX: vec; x: vec; a: TMatrix): real;
  var
    i, j: integer;
  begin
    for i := 1 to n do
    begin
      AX[i] := 0;
      for j := 1 to n do
        AX[i] := AX[i] + a[i, j] * x[j];
    end;
  end;
 
  {Вычисление вектора AX-X}
  function vecAX_X(var AXX: vec; AX, x: vec): real;
  var
    i: integer;
  begin
    for i := 1 to n do
      AXX[i] := AX[i] - x[i];
  end;
 
  {Вывод вектора AX}
  function printAX(AX: vec; const n: integer): real;
  var
    i: integer;
  begin
    Write('Вектор AX:  (');
    for i := 1 to n do
      Write(ax[i]: 6);
    writeln(')   Длина вектора равна ', l(ax));
  end;
 
  {Вывод вектора AX-X}
  function printAX_X(AXX: vec; const n: integer): real;
  var
    i: integer;
  begin
    Write('Вектор AX-X:  (');
    for i := 1 to n do
      Write(axx[i]: 6);
    writeln(')   Длина вектора равна ', l(axx));
  end;
 
  //------------------------------------------------------------------------------
var
  a: TMatrix;        // матрица А
  x, AX, AXX: vec;                     // вектора х, A*X, A*X-X
begin
  MATRIX(a, x, n);
  printMATRIX(a, n);
 
  printX(n, x);
 
  vecAX(n, AX, x, a);
  printAX(AX, n);
 
  vecAX_X(AXX, AX, x);
  printAX_X(AXX, n);
 
  {Сравнение длины векторов}
  if l(x) > l(ax) then
    if l(x) > l(axx) then
      writeln('Вектор имеет X наибольшую длину ', l(x))
    else
      writeln('Вектор имеет AX-X наибольшую длину ', l(axx))
  else
  if l(ax) > l(axx) then
    writeln('Вектор AX имеет наибольшую длину ', l(ax))
  else
    writeln('Вектор AX-X имеет наибольшую длину ', l(axx));
end.
2
0 / 0 / 0
Регистрация: 09.04.2017
Сообщений: 3
09.04.2017, 10:42  [ТС]
Цитата Сообщение от ФедосеевПавел
Нет там других ошибок.
Спасибо большое! Но у меня есть еще несколько вопросов по задаче:
1) У меня всегда вектор AX имеет наибольшую длину
2) В ошибках пишет: Параметр цикла for должен описываться в заголовке цикла и возвращение функции MATRIX, printMATRIX, printX, vecAX, vecAX_X, printAX, printAX_X не определено, это может допускаться?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8614 / 4454 / 1664
Регистрация: 01.02.2015
Сообщений: 13,829
Записей в блоге: 10
09.04.2017, 10:56
Те функции, которые не должны что-либо возвращать (например, printAX) преобразуйте в процедуры.
Pascal
93
94
95
96
97
98
99
100
101
102
  {Вывод вектора AX}
  procedure printAX(AX: vec; const n: integer);
  var
    i: integer;
  begin
    Write('Вектор AX:  (');
    for i := 1 to n do
      Write(ax[i]: 6);
    writeln(')   Длина вектора равна ', l(ax));
  end;
По переменным цикла. В С/С++/С# и, видимо, PABC.NET принято, что параметр цикла описывается в самой структуре цикла. Там есть смысл и в оптимизации и в том, что за пределами цикла параметр цикла не определён (это даже в ГОСТах на Pascal записано). Можно проигнорировать и описать i в блоке var этой функции.Чуть позже освоитесь в программировании - будете описывать по требованию компилятора
Pascal
1
  for var i := 1 to n do
Добавлено через 1 минуту
Цитата Сообщение от WvladW Посмотреть сообщение
1) У меня всегда вектор AX имеет наибольшую длину
Просмотрите формулы, если вычисления корректны - значит Судьба такая.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2017, 10:56
Помогаю со студенческими работами здесь

Почему не происходит обращение к подпрограмме?
program _; var x1,x2,x3,y1,y2:integer; f1,f2,y,z:real; function fet1(x,y:integer; z1:real):integer; begin ...

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

В подпрограмме вычислить площадь треугольника по формуле Герона
Пожалуйста добрые люди помогите решить эти задачи чтобы перездать экзамен:( 1) Найти все целые корни уравнения Ax*x*x+Bx*x+Cx+D=0,...

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

Используя нетипизированный параметр в подпрограмме, подсчитать суммы нечетных элементов векторов из 5 и 9 компонентов
Помогите, пожалуйста, написать программу. Используя нетипизированный параметр в подпрограмме, подсчитать суммы нечетных элементов векторов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как писать чистый, тестируемый и качественный код на Python
py-thonny 12.07.2025
Помню свой первый проект на Python. Работал тогда быстро, грязно, лишь бы работало. Код был похож на запутанный клубок - переменные по одной букве, функции на 200 строк, комментарии отсутствовали как. . .
Blazor и контроллер сервопривода IoT Meadow Maple
Wired 11.07.2025
Я решил разобраться, как можно соединить современные веб-технологии с миром "железа". Интересная комбинация получилась из Blazor в качестве веб-интерфейса и микроконтроллера Meadow с его веб-сервером. . .
Генерация OpenQASM из кода Q#
EggHead 10.07.2025
Летом 2024-го я начал эксперименты с библиотекой Q# Bridge, и знаете что? Она оказалась просто находкой для тех, кто работает на стыке разных квантовых экосистем. Основная фишка этой библиотеки -. . .
Изучаем новый шаблон ИИ-чата .NET AI Chat Web App
stackOverflow 10.07.2025
В . NET появилось интересное обновление - новый шаблон ИИ-чата под названием . NET AI Chat Web App. Когда я впервые наткнулся на анонс этого шаблона, то сразу понял, что Microsoft наконец-то. . .
Результаты исследования от команды ARP (июль 2025 г.)
Programma_Boinc 10.07.2025
Результаты исследования от команды ARP (июль 2025 г. ) Африканский проект по дождям (ARP) World Community Grid снова запущен! Мы рады поделиться обновленной информацией о нашем прогрессе с осени. . .
Angular vs Svelte - что лучше?
Reangularity 09.07.2025
Сегодня рынок разделился на несколько четких категорий: тяжеловесы корпоративного уровня (Angular), гибкие универсалы (React), прогрессивные решения (Vue) и новая волна компилируемых фреймворков. . .
Code First и Database First в Entity Framework
UnmanagedCoder 09.07.2025
Entity Framework дает нам свободу выбора, предлагая как Code First, так и Database First подходы. Но эта свобода порождает вечный вопрос — какой подход выбрать? Entity Framework — это. . .
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru