0 / 0 / 0
Регистрация: 04.12.2019
Сообщений: 12
1

Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом

04.12.2019, 19:02. Показов 2649. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ, помогите, пожалуйста. Студенту нужна помощь. Ссаными тряпками не кидайтесь
Суть вопроса. Помогите с кодом для такого задания: Дана квадратная матрица порядка n(n=7), в которой все элементы различны. Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом. Полученным числом заменить элементы главной диагонали
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2019, 19:02
Ответы с готовыми решениями:

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

Найти скалярное произведение строки в которой находится наибольший элемент матрицы, и столбца с наименьшим элементом
Составить прогримму оформив вычисления в виде подпрограммы (процедуры или функции). В головной...

Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом
Дана квадратная вещественная матрица размером N, все элементы которой различны. Найти скалярное...

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

9
0 / 0 / 0
Регистрация: 04.12.2019
Сообщений: 12
14.01.2020, 22:33  [ТС] 3
Написал тут код, но в нем есть ошибки. помогите исправить, пожалуйста. проблема еще в том, что нужно составить программу из подпрограмм, чтобы основная ее часть состояла из вызываемых подпрограмм

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
uses crt;
const n=7;
type mas = array[1..n] of real;
     matr = array[1..n] of integer;
procedure matrix (A: mas, const n=7);
    var i,j, min, max,:integer;
    begin
        randomize;
        min:=100;
        max:=0;
    for i:=1 to n do begin
    for j:=1 to n do begin
        A[i,j]:=random(25)+4;
    if A[i,j]<min then 
    begin
        min:=A[i,j];
        kmin:=j;
    end;
    if A[i,j]>max then 
    begin
        max:=A[i,j];
        kmax:=i;
    end;
    write(A[i,j]:4);
    end;
    
procedure scalar;
    var i,kmin,kmax: integer;
    begin
    for i:=1 to n do
        scal:=scal+A[kmax,i]*A[i,kmin];
        writeln;
        writeln;
        writeln('скалярное произведение: ',scal);
    end;
 
procedure zamena;
    begin
    for i:=1 to n do
        a[i,i]:=0;
    end;
//начало осн прогр
var A: mas;
    i,j,min,max,scal: integer;
begin clrscr;
    matrix(A);
    writeln;
    scalar; 
    zamena;
end.
0
Модератор
9611 / 4931 / 3252
Регистрация: 17.08.2012
Сообщений: 15,380
15.01.2020, 11:01 4
У Вас в описании типов нет описания матрицы. Для начала решите для себя, кто у Вас матрица array[1..n, 1..n] of integer; : mas или matr. Логично было бы предположить, что это matr, но Вы и к переменным типа mas пытаетесь обратиться как к матрице...

И ещё: по заданию матрица какая? В условии, вроде как, нигде об этом не сказано. А то Вас не поймёшь: одно of integer, другое of real...

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

Ошибок... Видимо-невидимо.

Похоже, Вы всё это сами делали. Это очень хорошо, потому что не страшно не знать, страшно не хотеть знать.

Ух ты! Вот это да! Сразу не заметил... Надо же... Какой-то составитель задач научился отличать "больше" от "не меньше" и "меньше" от "не больше"... Нет, вы только поглядите: "у матрицы все элементы различны"... Это для того, чтобы гарантированно были только один максимум и только один минимум. Прямо праздник какой-то. Это для моего перфекционизма. А для Вас - ещё одна проблема: по условию Вам требуется сгенерировать матрицу, все элементы которой различны. Обычно для этого в матрицу пишут возрастающую последовательность, и затем перемешивают элементы.

Программа для действительной матрицы:
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
const
  m = 7;
 
type
  matr = array[1..m, 1..m] of real;
 
//процедура генерации матрицы, "волшебные" числа в этой процедуре могут быть любыми, но в разумных пределах
procedure gen(var x: matr);
var
  i, j, ii, jj, k: integer;
  t: real;
begin
  //заполнение матрицы неповторяющейся последовательностью случайных чисел
  t := -0.1; //начальное значение случайного числа (минимум по модулю)
  for i := 1 to m do
    for j := 1 to m do
      begin
        t := t + 0.1 + 3.9 * random; //генерируем положительное случайное число, большее предыдущего
        k := 1 - 2 * random(2); //генерируем знак числа
        x[i, j] := k * t //записываем число со знаком в массив
      end;
  //перемешивание матрицы
  for k := 1 to 54321 do
    begin
      i := random(m) + 1; //генерируем случайные индексы
      j := random(m) + 1;
      ii := random(m) + 1;
      jj := random(m) + 1;
      t := x[i, j]; //обмениваем случайные элементы матрицы
      x[i, j] := x[ii, jj];
      x[ii, jj] := t
    end;
end;
 
//процедура печати матрицы
procedure prn(const s: string; const x: matr);
var
  i, j: integer;
begin
  writeln(s);
  for i := 1 to m do
    begin
      for j := 1 to m do write(x[i, j]:11:3);
      writeln
    end
end;
 
//процедура поиска ИНДЕКСОВ максимума и минимума
procedure max_min(const x: matr; var maxi, maxj, mini, minj: integer);
var
  i, j: integer;
begin
  mini := 1;
  minj := 1;
  maxi := 1;
  maxj := 1;
  for i := 1 to m do
    for j := 1 to m do
      if x[i, j] < x[mini, minj]
        then begin
          mini := i;
          minj := j
        end
        else if x[i, j] > x[maxi, maxj]
          then begin
            maxi := i;
            maxj := j
          end
end;
 
//функция нахождения скалярного произведения строки на столбец
function scalar(const x: matr; row, col: integer): real;
var
  k: integer;
  sc: real;
begin
  for k := 1 to m do sc := sc + x[row, k] * x[k, col];
  scalar := sc
end;
 
//процедура замены элементов главной диагонали матрицы заданным числом
procedure change(var x: matr; n: real);
var
  k: integer;
begin
  for k := 1 to m do x[k, k] := n
end;
 
//начало основной программы
var
  a: matr;
  imax, jmax, imin, jmin: integer;
  p: real;
begin
  randomize; //инициализация ГПСЧ
  gen(a); //генерация матрицы
  prn('Исходная матрица:', a); //печать исходной матрицы
  max_min(a, imax, jmax, imin, jmin); //поиск индексов max и min
  writeln('Максимум : A[', imax, ', ', jmax, '] = ', a[imax, jmax]:0:3); //убрать, если вывод не нужен
  writeln('Минимум  : A[', imin, ', ', jmin, '] = ', a[imin, jmin]:0:3); //убрать, если вывод не нужен
  p := scalar(a, imax, jmin); //находим скалярное произведение строки на столбец
  writeln('Скалярное произведение строки ', imax, ' на столбец ', jmin, ' равно ', p:0:3); //убрать, если вывод не нужен
  change(a, p); //замена главной диагонали
  prn('Изменённая матрица:', a); //печать результата
  readln //ожидание реакции пользователя, если не нужно - убрать
end.
Разбирайтесь.
0
0 / 0 / 0
Регистрация: 04.12.2019
Сообщений: 12
25.01.2020, 22:07  [ТС] 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
uses crt;
const n=7;
type mas = array[1..n,1..n] of integer;
var A: mas;
    i,j,kmin,kmax,min,max,scal: integer;
 
procedure massiv(min, max, i, j:integer; A:mas);
begin
        randomize;
        min:=100;
        max:=0;
for i:=1 to n do begin
        for j:=1 to n do begin
            A[i,j]:=random(25)+4;
    if A[i,j]<min then
        begin
        min:=A[i,j];
                kmin:=j;
    end;
    if A[i,j]>max then
        begin
        max:=A[i,j];
                kmax:=i;
    end;
    write(A[i,j]:4);
        end;
    writeln
        end;
end;
procedure scalar(scal, kmin, kmax:integer; A: mas);
    begin
    for i:=1 to n do
        scal:=scal+A[kmax,i]*A[i,kmin];
        writeln;
        writeln;
        writeln('skalyarnoe proizvedenie: ',scal);
    end;
 
procedure zamena;
    begin
    for i:=1 to n do
    begin
    for j:=1 to n do
    begin
    if j=i then a[i,j]:=0;
        write(a[i,j]:3);
    end;
    writeln;
    end;
        end;
 
begin
clrscr;
massiv(min, max, i, j, A);
scalar(scal, kmin, kmax, A);
writeln;
zamena;
end.
0
Модератор
9611 / 4931 / 3252
Регистрация: 17.08.2012
Сообщений: 15,380
26.01.2020, 01:25 6
Вы совсем не читали, что я для Вас написал. Почему? Вам не требуется помощь?

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

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

Нулевая матрица у Вас возвращается потому, что Ваша процедура не изменяет нужную Вам матрицу. Я же писал:
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
И процедуры ничего не возвращают, поскольку у Вас все формальные параметры передаются исключительно по значению
То есть, в процедуру Вы передаёте значение матрицы (её копию), эту копию процедура и изменяет. Матрицу-оригинал процедура не трогает, а копию не возвращает.

И ещё, объявлять глобальные переменные до подпрограмм приводит к трудно устранимым ошибкам из-за перекрытия имён локальных и глобальных переменных. Тем более, что имена глобальных переменных у Вас совпадают с именами формальных параметров.

Понимаю, Вы ошибочно полагаете, что это - одни и те же переменные. Это совсем не так. Например, у Вас массив A в строке 4 и переменные min, max, i, j в строке 5 и переменные с такими же именами в строке 7 - это совершенно разные переменные, несмотря на совпадение имён.

У Вас четыре варианта:

1. Сделать совсем по-идиотски: те параметры, которые требуется возвратить, передавать по ссылке. Для этого нужно разместить ключевое слово var перед нужными переменными, например:
Pascal
7
procedure massiv(var min, max: integer; i, j:integer; var A:mas);
Теперь min, max в строках 5 и 7, и A в строках 4 и 7 - это как бы одни и те же переменные. Точнее, формальные параметры в строке 7 теперь ссылаются на соответствующие переменные, а не принимают их значения, и подпрограмма изменяет сами глобальные переменные, а не их копии. Так себе решение. Совсем идиотское.

2. Сделать по-идиотски: вовсе убрать все формальные параметры, поскольку глобальные переменные у Вас объявлены до подпрограмм, и видны во всех подпрограммах, а имена Ваших формальных параметров совпадают с именами соответствующих глобальных переменных. Для этого в строках 7 и 30 уберите то, что в скобках, вместе с самими скобками. Подпрограммы будут изменять глобальные переменные непосредственно. Для Вас это будет проще всего, но решение чуть менее идиотское, чем предыдущее. Да, программа будет работать нормально, плюс ещё будет примером того, как не надо писать программы.

3. Сделать кое-как. Объявить глобальные переменные после подпрограмм. То, что Вы написали, переписать, например, вот так:
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
uses crt;
 
const n=7;
 
type mas = array[1..n,1..n] of integer;
 
procedure massiv(var minimum, maximum, min_ind, max_ind: integer; var X:mas);
var i, j:integer;
begin
        randomize;
        minimum:=100;
        maximum:=0;
for i:=1 to n do begin
        for j:=1 to n do begin
            X[i,j]:=random(25)+4;
    if X[i,j]<minimum then
        begin
        minimum:=X[i,j];
                min_ind:=j;
    end;
    if X[i,j]>maximum then
        begin
        maximum:=X[i,j];
                max_ind:=i;
    end;
    write(X[i,j]:5);
        end;
    writeln
        end;
end;
 
procedure scalar(var sc:integer; min_ind, max_ind:integer; const X:mas);
var i:integer;
begin
    for i:=1 to n do
        sc:=sc+X[max_ind,i]*X[i,min_ind];
        writeln;
        writeln;
        writeln('skalyarnoe proizvedenie: ',sc);
end;
 
procedure zamena(sc:integer; var X:mas);
var i, j:integer;
begin
    for i:=1 to n do
    begin
    for j:=1 to n do
    begin
    if j=i then X[i,j]:=sc;
        write(X[i,j]:5);
end;
    writeln;
    end;
        end;
 
var A: mas;
    kmin,kmax,min,max,scal: integer;
 
begin
clrscr;
randomize;
massiv(min, max, kmin, kmax, A);
scalar(scal, kmin, kmax, A);
writeln;
zamena(scal, A)
end.
Все три вышеприведённых варианта содержат алгоритмическую ошибку: если вдруг все элементы массива сгенерируются одинаковыми, то процедура massiv возвратит kmax=0, после чего в процедуре scalar (в строке 36) возникнет ошибка, связанная с выходом индекса за границы массива, и программа завершится аварийно. Конечно, 49 одинаковых чисел подряд генерируются крайне редко, но всё же... Ошибка, она ошибка и есть. Также эта программа не полностью соответствует заданию: по заданию, все элементы матрицы должны быть различны. У Вас это не так. Более того, у Вас матрица со всеми различными элементами вообще не может быть сгенерирована, поскольку генерируются только 25 различных значений, а для матрицы 7х7 нужно не менее 49 различных значений.

3. Сделать по-человечески. Для вещественных чисел уже сделано. Для целых чисел нужно кое-что поменять:
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
const
  m = 7;
 
type
  matr = array[1..m, 1..m] of integer;
 
//процедура генерации матрицы, "волшебные" числа в этой процедуре могут быть любыми, но в разумных пределах
procedure gen(var x: matr);
var
  i, j, ii, jj, k, t: integer;
begin
  //заполнение матрицы неповторяющейся последовательностью случайных чисел
  t := -100; //начальное значение случайного числа
  for i := 1 to m do
    for j := 1 to m do
      begin
        t := t + random(9); //генерируем положительное случайное число, большее предыдущего
        x[i, j] := t //записываем число в массив
      end;
  //перемешивание матрицы
  for k := 1 to 54321 do
    begin
      i := random(m) + 1; //генерируем случайные индексы
      j := random(m) + 1;
      ii := random(m) + 1;
      jj := random(m) + 1;
      t := x[i, j]; //обмениваем случайные элементы матрицы
      x[i, j] := x[ii, jj];
      x[ii, jj] := t
    end;
end;
 
//процедура печати матрицы
procedure prn(const s: string; const x: matr);
var
  i, j: integer;
begin
  writeln(s);
  for i := 1 to m do
    begin
      for j := 1 to m do write(x[i, j]:10);
      writeln
    end
end;
 
//процедура поиска ИНДЕКСОВ максимума и минимума
procedure max_min(const x: matr; var maxi, maxj, mini, minj: integer);
var
  i, j: integer;
begin
  mini := 1;
  minj := 1;
  maxi := 1;
  maxj := 1;
  for i := 1 to m do
    for j := 1 to m do
      if x[i, j] < x[mini, minj]
        then begin
          mini := i;
          minj := j
        end
        else if x[i, j] > x[maxi, maxj]
          then begin
            maxi := i;
            maxj := j
          end
end;
 
//функция нахождения скалярного произведения строки на столбец
function scalar(const x: matr; row, col: integer): integer;
var
  k, sc: integer;
begin
  for k := 1 to m do sc := sc + x[row, k] * x[k, col];
  scalar := sc
end;
 
//процедура замены элементов главной диагонали матрицы заданным числом
procedure change(var x: matr; n: integer);
var
  k: integer;
begin
  for k := 1 to m do x[k, k] := n
end;
 
//начало основной программы
var
  a: matr;
  imax, jmax, imin, jmin, p: integer;
begin
  randomize; //инициализация ГПСЧ
  gen(a); //генерация матрицы
  prn('Исходная матрица:', a); //печать исходной матрицы
  max_min(a, imax, jmax, imin, jmin); //поиск индексов max и min
  writeln('Максимум : A[', imax, ', ', jmax, '] = ', a[imax, jmax]); //убрать, если вывод не нужен
  writeln('Минимум  : A[', imin, ', ', jmin, '] = ', a[imin, jmin]); //убрать, если вывод не нужен
  p := scalar(a, imax, jmin); //находим скалярное произведение строки на столбец
  writeln('Скалярное произведение строки ', imax, ' на столбец ', jmin, ' равно ', p); //убрать, если вывод не нужен
  change(a, p); //замена главной диагонали
  prn('Изменённая матрица:', a); //печать результата
  readln //ожидание реакции пользователя, если не нужно - убрать
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7534 / 4394 / 2785
Регистрация: 22.11.2013
Сообщений: 12,588
Записей в блоге: 1
26.01.2020, 09:03 7
Cyborg Drone,
Пара мелких замечаний возникла при чтении:
Вместо 54321 итераций тасование Фишера-Йетса было бы в самый раз
С точки зрения тасования массив линеен, нет смысла этому противиться

Добавлено через 10 минут
Опечаточка закралась (единичка потерялась):
Pascal
17
  Inc(t,1+Random(9));
Добавлено через 6 минут
Чистая косметика (если предположить, что TP жив (или режимы совместимости с ним)):
Pascal
72
73
  k: Integer;
  sc: Longint;
1
Модератор
9611 / 4931 / 3252
Регистрация: 17.08.2012
Сообщений: 15,380
26.01.2020, 10:43 8
Заменить процедуру генерации массива:
Pascal
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
//процедура генерации матрицы, "волшебные" числа в этой процедуре могут быть любыми, но в разумных пределах
procedure gen(var x: matr);
var
  i, j, ii, jj, k, t: integer;
begin
  //заполнение матрицы неповторяющейся последовательностью случайных чисел
  t := -100; //начальное значение случайного числа
  for i := 1 to m do
    for j := 1 to m do
      begin
        inc(t, 1 + random(7)); //генерируем положительное случайное число, большее предыдущего
        x[i, j] := t //записываем число в массив
      end;
  //перемешивание матрицы
  for k := m * m - 1 downto 1 do
    begin
      i := k div m + 1; //вычисляем индексы
      j := k mod m + 1;
      jj := random(k); //генерируем индексы
      ii := jj div m + 1;
      jj := jj mod m + 1;
      t := x[i, j]; //обмениваем последний и случайный элементы матрицы
      x[i, j] := x[ii, jj];
      x[ii, jj] := t
    end
end;
0
0 / 0 / 0
Регистрация: 04.12.2019
Сообщений: 12
02.03.2020, 22:32  [ТС] 9
Помогите, пожалуйста. В одной из процедур, а именно scalar есть ошибка. я не могу ее никак исправить. при запуске выдается такая ошибка:
88 88 77 00 88 99 66
33 00 22 00 66 00 22
77 88 33 22 66 88 66
99 77 44 00 33 33 66
22 55 66 33 22 11 55
99 00 66 77 11 33 11
00 44 66 99 88 00 22
Unhandled Exception: System.IndexOutOfRangeException: Индекс находился вне границ массива.
в lab666.mas.get_val(Int32 param) в C:\FPC\2.6.4\bin\i386-win32\lab666.pas:строка 16777215
в lab666.Program.scalar(Int32 i, Int32 scal, Int32 kmin, Int32 kmax, mas A) в C:\FPC\2.6.4\bin\i386-win32\lab666.pas:строка 21
в lab666.Program.$Main() в C:\FPC\2.6.4\bin\i386-win32\lab666.pas:строка 46
в lab666.Program.Main()Программа завершена, нажмите любую клавишу . . .


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
uses crt;
type mas = array[1..7,1..7] of integer;
 
procedure massiv(i, j:integer; A:mas);
begin
  randomize;
    for i:=1 to 7 do begin
        for j:=1 to 7 do begin
            a[i,j]:=random(10);
            write(a[i,j]);
            write(a[i,j],' ');
        end;        
    writeln;
        end;
end;
 
 
procedure scalar(i, scal, kmin, kmax:integer; A: mas);
    begin
    for i:=1 to 7 do
        scal:=scal+A[kmax,i]*A[i,kmin];
        writeln;
        writeln;
        writeln('skalyarnoe proizvedenie: ',scal);
    end;
 
procedure zamena(i,j: integer; A:mas);
    begin
    for i:=1 to 7 do
    begin
    for j:=1 to 7 do
    begin
    if j=i then A[i,j]:=0;
        write(a[i,j]);
    end;
    writeln;
    end;
        end;
        
var A: mas;
    i,j,kmin,kmax,scal: integer;
    
begin
clrscr;
massiv(i, j, A);
scalar(i, scal, kmin, kmax, A);
writeln;
zamena(i,j, A)
end.
0
Модератор
9611 / 4931 / 3252
Регистрация: 17.08.2012
Сообщений: 15,380
03.03.2020, 00:15 10
Лучший ответ Сообщение было отмечено Klukva10 как решение

Решение

Индексы массива у Вас могут быть от 1 до 7. Глобальные числовые переменные инициализируются нулём, в том числе, kmin и kmax. В строке 46 Вы передаёте в процедуру scalar в качестве формальных параметров сплошные нули. В строке 21 в качестве индексов используются kmin и kmax, которые равны 0, а должны быть в пределах от 1 до 7, вот Вам и выход за границы массива.

Но это всё ерунда. Вы не обратили внимание, что перед некоторыми формальными параметрами я пишу префиксы var и const? Как думаете, зачем я это делаю?
1) для красоты
2) для ровного счёта
3) чтобы повыпендриваться
4) чтобы изменить способ передачи формального параметра

Выбрали ответ? Неверно, правильный ответ 4).

Ваши процедуры и функции, по сути, не делают ничего, потому что они ничего не возвращают в основную программу. Параметры, переданные по значению (без префиксов var и const), при их изменении в подпрограмме, в основной программе не изменяются. Все параметры Вы только так и передаёте, поэтому, если заставить программу заработать без var и const, окажется, что внутри процедуры massiv матрица успешно сгенерировалась и напечаталась, а после выхода из процедуры почему-то все её элементы как были, так и остались нулевыми... Изумлению не будет предела.

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

Также по ссылке часто передаются переменные, занимающие большой объём памяти, для исключения копирования этого самого большого объёма памяти. В этом случае, если требуется предотвратить изменение переменной в подпрограмме, вместо префикса var используется префикс const.

Вы не используете локальные переменные (это такие, которые видны в подпрограмме, но не видны в основной программе). Вместо этого Вы передаёте глобальные переменные в подпрограмму по значению.

Процедуру randomize принято запускать в основной программе.

У Вас массив печатается два раза. Имеется смысл вынести печать массива в отдельную процедуру.

Размер массива лучше объявить константой. Вот скажет Вам преподаватель: "А сделайте массив 5х5". Сколько Вам 7 на 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
uses crt;
const
  m = 7;
type mas = array[1..m, 1..m] of integer;
 
  procedure massiv(var x: mas);
  var
    i, j: integer;
  begin
    for i := 1 to m do
      for j := 1 to m do
        x[i, j] := random(10)
  end;
 
  procedure vyvod(const x: mas);
  var
    i, j: integer;
  begin
    for i := 1 to m do
      begin
        for j := 1 to m do write(x[i, j]:4);
        writeln
      end;
    writeln
  end;
 
  procedure scalar(var sc: integer; mn, mx: integer; x: mas);
  var
    i: integer;
  begin
    for i := 1 to m do sc := sc + x[mx, i] * x[i, mn];
  end;
 
  procedure zamena(t: integer; var x: mas);
  var
    i: integer;
  begin
    for i := 1 to m do x[i, i] := t
  end;
 
var
  A: mas;
  kmin, kmax, scal: integer;
 
begin
  clrscr;
  randomize;
  massiv(A); //массив у Вас генерируется не так, как указано в задании
  writeln('Source array:');
  vyvod(A);
  // Вы должны написать код для определения kmin и kmax и заменить им нижеследующую строку
  kmin := 3; kmax := 3;
  scalar(scal, kmin, kmax, A);
  writeln('Scalar product: ', scal);
  writeln;
  zamena(scal, A);
  writeln('Result:');
  vyvod(A);
  readln
end.
Если честно, как-то оно всё-таки у... Вас... не слишком гладко получается... Лучше бы эту программу того... Записать в тренаж...

Почему Вы не взяли мою готовую программу из поста #6 (ту, которая последняя)? Испугались? Так попросили бы, я бы её подрихтовал, как Вы пожелаете. По сути, моя программа ничем не отличается от того, что Вы хотите написать. За исключением генерации массива. Если массив генерировать так, как Вы, а не так, как по заданию, то из моей программы получится вот это:
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
const
  m = 7;
 
type
  matr = array[1..m, 1..m] of integer;
 
//процедура генерации матрицы
procedure gen(var x: matr);
var
  i, j: integer;
begin
  for i := 1 to m do
    for j := 1 to m do
      x[i, j] := random(10)
end;
 
//процедура печати матрицы, параметр s - заголовок матрицы
procedure prn(const s: string; const x: matr);
var
  i, j: integer;
begin
  writeln(s);
  for i := 1 to m do
    begin
      for j := 1 to m do write(x[i, j]:10);
      writeln
    end
end;
 
//процедура поиска ИНДЕКСОВ максимума и минимума
procedure max_min(const x: matr; var maxi, maxj, mini, minj: integer);
var
  i, j: integer;
begin
  mini := 1;
  minj := 1;
  maxi := 1;
  maxj := 1;
  for i := 1 to m do
    for j := 1 to m do
      if x[i, j] < x[mini, minj]
        then begin
          mini := i;
          minj := j
        end
        else if x[i, j] > x[maxi, maxj]
          then begin
            maxi := i;
            maxj := j
          end
end;
 
//функция нахождения скалярного произведения строки на столбец
function scalar(const x: matr; row, col: integer): integer;
var
  k, sc: integer;
begin
  for k := 1 to m do sc := sc + x[row, k] * x[k, col];
  scalar := sc
end;
 
//процедура замены элементов главной диагонали матрицы заданным числом
procedure change(var x: matr; n: integer);
var
  k: integer;
begin
  for k := 1 to m do x[k, k] := n
end;
 
//начало основной программы
var
  a: matr;
  imax, jmax, imin, jmin, p: integer;
begin
  randomize; //инициализация ГПСЧ
  gen(a); //генерация матрицы
  prn('Исходная матрица:', a); //печать исходной матрицы
  max_min(a, imax, jmax, imin, jmin); //поиск индексов max и min
  writeln('Максимум : A[', imax, ', ', jmax, '] = ', a[imax, jmax]); //убрать, если вывод не нужен
  writeln('Минимум  : A[', imin, ', ', jmin, '] = ', a[imin, jmin]); //убрать, если вывод не нужен
  p := scalar(a, imax, jmin); //находим скалярное произведение строки на столбец
  writeln('Скалярное произведение строки ', imax, ' на столбец ', jmin, ' равно ', p); //убрать, если вывод не нужен
  change(a, p); //замена главной диагонали
  prn('Изменённая матрица:', a); //печать результата
  readln //ожидание реакции пользователя, если не нужно - убрать
end.
Нет, ну Вы гляньте! Убрать комментарии, заменить русский текст на латинскую транслитерацию, и получится прямо один в один именно то, что Вы пытаетесь написать. Неужели и этот вариант не устраивает?

Ну ладно. "Для достижения идеала" ещё названия переменных и подпрограмм на псевдорусские поменять. Но это не обязательно: по-моему, без разницы, что change, что zamena. Можно ещё не печатать минимальный и максимальный элементы, тогда в основной программе можно будет использовать только imax и jmin, и всё немножко упростится, но будет как-то не очень: скалярное произведение печатаем, а максимум с минимумом - почему-то не печатаем. Непорядок.

Посмотрите, потестируйте...
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2020, 00:15
Помогаю со студенческими работами здесь

Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом
Помогите плз Дана вещественная матрица размером 7 x 7, все элементы которой различны. Найти...

Найти произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом
Очень нужна помощь с задачей! Дана вещественная матрица, все элементы которой различны. Найти...

Найти скалярное произведение строки, в которой находится max элемент матрицы, на столбец с min элементом
Дана( построчно) вещественная матрица размером 4 на 4 , все элементы которой различны. Найти...

Скалярное произведение строки с наибольшим элементом матрицы на столбец с наименьшим элементом
Дана матрица целых чисел X(n, п). Вывести матрицу и скалярное произведение строки с наибольшим...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru