0 / 0 / 0
Регистрация: 04.12.2019
Сообщений: 12
|
|
1 | |
Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом04.12.2019, 19:02. Показов 2649. Ответов 9
Метки нет Все метки)
(
Народ, помогите, пожалуйста. Студенту нужна помощь. Ссаными тряпками не кидайтесь
Суть вопроса. Помогите с кодом для такого задания: Дана квадратная матрица порядка n(n=7), в которой все элементы различны. Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом. Полученным числом заменить элементы главной диагонали
0
|
|
04.12.2019, 19:02 | |
Ответы с готовыми решениями:
9
Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом |
![]() 6806 / 4565 / 4817
Регистрация: 05.06.2014
Сообщений: 22,438
|
|
04.12.2019, 19:04 | 2 |
Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом
Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, и столбца с наименьшим элементом
1
|
0 / 0 / 0
Регистрация: 04.12.2019
Сообщений: 12
|
||||||
14.01.2020, 22:33 [ТС] | 3 | |||||
Написал тут код, но в нем есть ошибки. помогите исправить, пожалуйста. проблема еще в том, что нужно составить программу из подпрограмм, чтобы основная ее часть состояла из вызываемых подпрограмм
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... И процедуры ничего не возвращают, поскольку у Вас все формальные параметры передаются исключительно по значению, либо вообще никак не объявлены. Ошибок... Видимо-невидимо. Похоже, Вы всё это сами делали. Это очень хорошо, потому что не страшно не знать, страшно не хотеть знать. Ух ты! Вот это да! Сразу не заметил... Надо же... Какой-то составитель задач научился отличать "больше" от "не меньше" и "меньше" от "не больше"... Нет, вы только поглядите: "у матрицы все элементы различны"... Это для того, чтобы гарантированно были только один максимум и только один минимум. Прямо праздник какой-то. Это для моего перфекционизма. А для Вас - ещё одна проблема: по условию Вам требуется сгенерировать матрицу, все элементы которой различны. Обычно для этого в матрицу пишут возрастающую последовательность, и затем перемешивают элементы. Программа для действительной матрицы:
0
|
0 / 0 / 0
Регистрация: 04.12.2019
Сообщений: 12
|
||||||
25.01.2020, 22:07 [ТС] | 5 | |||||
я тут поправил код, оформил заполнение матрицы через процедуру, но теперь встала проблема того, что дальнейшие вычисления просто выдают нули. Наверное, надо заменить процедуру на функцию, но функция вроде как возвращает одно значение, а не целую матрицу?
0
|
Модератор
9611 / 4931 / 3252
Регистрация: 17.08.2012
Сообщений: 15,380
|
||||||||||||||||
26.01.2020, 01:25 | 6 | |||||||||||||||
Вы совсем не читали, что я для Вас написал. Почему? Вам не требуется помощь?
Прочитайте не только то, что я написал, но и хоть что-нибудь про подпрограммы и про их параметры, а также про локальные и глобальные переменные. Я Вас очень прошу. Так, для общего развития: современные диалекты паскаля позволяют функции возвращать матрицу, если она пользовательского типа. Нулевая матрица у Вас возвращается потому, что Ваша процедура не изменяет нужную Вам матрицу. Я же писал: То есть, в процедуру Вы передаёте значение матрицы (её копию), эту копию процедура и изменяет. Матрицу-оригинал процедура не трогает, а копию не возвращает. И ещё, объявлять глобальные переменные до подпрограмм приводит к трудно устранимым ошибкам из-за перекрытия имён локальных и глобальных переменных. Тем более, что имена глобальных переменных у Вас совпадают с именами формальных параметров. Понимаю, Вы ошибочно полагаете, что это - одни и те же переменные. Это совсем не так. Например, у Вас массив A в строке 4 и переменные min, max, i, j в строке 5 и переменные с такими же именами в строке 7 - это совершенно разные переменные, несмотря на совпадение имён. У Вас четыре варианта: 1. Сделать совсем по-идиотски: те параметры, которые требуется возвратить, передавать по ссылке. Для этого нужно разместить ключевое слово var перед нужными переменными, например:
2. Сделать по-идиотски: вовсе убрать все формальные параметры, поскольку глобальные переменные у Вас объявлены до подпрограмм, и видны во всех подпрограммах, а имена Ваших формальных параметров совпадают с именами соответствующих глобальных переменных. Для этого в строках 7 и 30 уберите то, что в скобках, вместе с самими скобками. Подпрограммы будут изменять глобальные переменные непосредственно. Для Вас это будет проще всего, но решение чуть менее идиотское, чем предыдущее. Да, программа будет работать нормально, плюс ещё будет примером того, как не надо писать программы. 3. Сделать кое-как. Объявить глобальные переменные после подпрограмм. То, что Вы написали, переписать, например, вот так:
3. Сделать по-человечески. Для вещественных чисел уже сделано. Для целых чисел нужно кое-что поменять:
0
|
Модератор
![]() ![]() |
|||||||||||
26.01.2020, 09:03 | 7 | ||||||||||
Cyborg Drone,
Пара мелких замечаний возникла при чтении: Вместо 54321 итераций тасование Фишера-Йетса было бы в самый раз ![]() С точки зрения тасования массив линеен, нет смысла этому противиться ![]() Добавлено через 10 минут Опечаточка закралась (единичка потерялась):
Чистая косметика (если предположить, что TP жив (или режимы совместимости с ним)):
1
|
Модератор
9611 / 4931 / 3252
Регистрация: 17.08.2012
Сообщений: 15,380
|
||||||
26.01.2020, 10:43 | 8 | |||||
Заменить процедуру генерации массива:
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()Программа завершена, нажмите любую клавишу . . .
0
|
Модератор
9611 / 4931 / 3252
Регистрация: 17.08.2012
Сообщений: 15,380
|
|||||||||||
03.03.2020, 00:15 | 10 | ||||||||||
![]() Решение
Индексы массива у Вас могут быть от 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 найти и поменять? А так - только константу, и всё. Вот так примерно Вам нужно было написать:
Почему Вы не взяли мою готовую программу из поста #6 (ту, которая последняя)? Испугались? Так попросили бы, я бы её подрихтовал, как Вы пожелаете. По сути, моя программа ничем не отличается от того, что Вы хотите написать. За исключением генерации массива. Если массив генерировать так, как Вы, а не так, как по заданию, то из моей программы получится вот это:
Ну ладно. "Для достижения идеала" ещё названия переменных и подпрограмм на псевдорусские поменять. ![]() ![]() Посмотрите, потестируйте...
1
|
03.03.2020, 00:15 | |
Помогаю со студенческими работами здесь
10
Найти произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом Найти скалярное произведение строки, в которой находится max элемент матрицы, на столбец с min элементом
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |