
Другие языки программирования и технологии
Объясните решение этой задачи Пожалуйста

Здесь во вложенных циклах все проверяется
if (j > i) // отсекли элементы выше главной диагонали
if (x[j] < 0) // выбрали из них отрицательные
k++; // прибавили счетчик
if (j > i) // отсекли элементы выше главной диагонали
if (x[j] < 0) // выбрали из них отрицательные
k++; // прибавили счетчик
скажу только что вложенные циклы сделаны глуповато.. .
получается что программа пробегает всю матрицу.. .
а зачем? ведь интересует лишь верхняя часть матрицы.. .
короче.. .
циклы по j начинаете не с нуля, а с течущего здачения i
и уберите ставший ненужным после этого if( j > i )
а что, эта программа работает?
получается что программа пробегает всю матрицу.. .
а зачем? ведь интересует лишь верхняя часть матрицы.. .
короче.. .
циклы по j начинаете не с нуля, а с течущего здачения i
и уберите ставший ненужным после этого if( j > i )
а что, эта программа работает?
"для чего нужна int** в функции vvod((int**)x,3)"
Чтобы позволить функции обращаться к двумерным массивам с различными длинами измерений.
Это указатель, в который помещается адрес начала массива. А поскольку двумерный массив по сути массив массивов, то тип этого указателя - указатель на указатель на целое.
Чтобы позволить функции обращаться к двумерным массивам с различными длинами измерений.
Это указатель, в который помещается адрес начала массива. А поскольку двумерный массив по сути массив массивов, то тип этого указателя - указатель на указатель на целое.
по строкам:
-создаются 2 прямых двумерных массивов, один 3 на 3, другой - 4 на 4.
-создаются итераторы и счетчики, счетчики инициализируются нулями, чтобы при инкрементах было чего инкрементить
-вызов функции заполнения первого массива с клавиатуры. функция ввод принимает первым параметром указатель на указатель на инт, а массивы были созданы статичными, поэтому и нужно приведение типов, чтобы компилятор не ругался. так как в любом случае имя массива есть указатель на его начало, то такое приведение (инт**) вполне законно. второй параметр - размер, но тут, я думаю, все понятно.
-запускается двойной цикл. внешний цикл будет управлять строками в массиве, внутренний - столбцами.
-условие джей>и позволяет выбрать только элементы над главной диагональю.
допустим
1 2 3
4 5 6
7 8 9
адрес единицы [0.0] - джэй>и == фолс, идем дальше.
адрес двойки [0.1] - нулевая строка, 1 столбец. джэй>и == ТРУ (джей, как я уже говорил, управляет столбцами, "и" - строками) . Так и есть - 2 над главной диагональю, поэтому она примет участие в дальнейших расчетах.
точно так же тройка [0.2] и шестерка [1.2] - они выше главной диагонали, у них джей больше "и".
-если попали на второй "иф", тут смотрим, отрицательное ли число в элементе, если да инкрементируем счетчик (инкремент - увеличение на единицу - к++ то же самое, что и к = к+1... по логике то же самое, ессесно)
-то же самое для второго массива
-по поводу функции ввода, тут затруднение может вызвать только строка с "сином", где происходит непосредственный ввод с клавиатуры. происходит тут вот что. Доступ к элементам массива можно получить через индексаторы типа такого:
массив [строка] [столбец]
для одномерного так:
массив [номер элемента]
я уже писал, что имена массивов - это указатели, а указатели - это переменные содержащие адреса ячеек памяти. операция индексации (те самые квадратные скобки []) - это всего лишь оболочка, упращающая работу с указателем, и ее можно расписаьт так:
массив [номер] то же самое, что и *(массив+номер)
Почему так? потому, что номер элемента - это смещение относительно начала массива. итак:
массив - это адрес начала массива
номер - количесво байт, которое прибавляется к адресу начала, чтобы получить доступ к определенному элементу.
Теперь по поводу звездочки. Когда звездочка указывается слева от некоторого адреса - это операция косвенной адресации . Указатель - это переменная, которая хранит адрес некоторой ячейки памяти. Так как кроме адресов мы туда ничего не можем записать (ну, точнее записать то мы может что угодно, вот только интерпретироваться это будет все равно как адрес) , такая запись в элемент массива номер 2 будет неверной:
массив+2 = 16
(массив+2) все еще ожидает адрес, поэтому и записывать туда значение элемента нельзя. Однако, по этому смому адресу, который находится в (массив+2) находится элемент номер 2 нашего массива и мы этот указатель сможем использовать для записи. Тут то и нужна операция косвенной адрсации. делает она следующее:
массив - это адрес массива
*массив - а вот тут происходит такое - из указателся берем адрес и переходит к тому месту, на который этот адрес ссылается. в этом случае на начало массива
*(массив+2) - вот тут к начальному адресу массива прибавляется количество байт, необходимое для перехода до ячейки номер 2 (зависит от размера массива) , после чего операция косвенной адресации обращается по этому адресу:
*(массив+2) = 16 - ложим число 16 в массив, элемент номер 2.
в случае с двумерными массивами тут дело такое - двумерные массивы - это, фактически, массив массивов. то есть массив, каждый элемент которого хранит адрес одномерного массива (тип данных инт** - говорит о том, что это указатель, хранящий адрес указателя на инт)
смотрим: *(*(массив+строка) +столбец) = значение
*(массив+смещение) - получаем адрес строки
*(*(массив+строка) +столбец) - смещаемся от начала строки на "столбец*размер" байт и получаем его адрес.
-создаются 2 прямых двумерных массивов, один 3 на 3, другой - 4 на 4.
-создаются итераторы и счетчики, счетчики инициализируются нулями, чтобы при инкрементах было чего инкрементить
-вызов функции заполнения первого массива с клавиатуры. функция ввод принимает первым параметром указатель на указатель на инт, а массивы были созданы статичными, поэтому и нужно приведение типов, чтобы компилятор не ругался. так как в любом случае имя массива есть указатель на его начало, то такое приведение (инт**) вполне законно. второй параметр - размер, но тут, я думаю, все понятно.
-запускается двойной цикл. внешний цикл будет управлять строками в массиве, внутренний - столбцами.
-условие джей>и позволяет выбрать только элементы над главной диагональю.
допустим
1 2 3
4 5 6
7 8 9
адрес единицы [0.0] - джэй>и == фолс, идем дальше.
адрес двойки [0.1] - нулевая строка, 1 столбец. джэй>и == ТРУ (джей, как я уже говорил, управляет столбцами, "и" - строками) . Так и есть - 2 над главной диагональю, поэтому она примет участие в дальнейших расчетах.
точно так же тройка [0.2] и шестерка [1.2] - они выше главной диагонали, у них джей больше "и".
-если попали на второй "иф", тут смотрим, отрицательное ли число в элементе, если да инкрементируем счетчик (инкремент - увеличение на единицу - к++ то же самое, что и к = к+1... по логике то же самое, ессесно)
-то же самое для второго массива
-по поводу функции ввода, тут затруднение может вызвать только строка с "сином", где происходит непосредственный ввод с клавиатуры. происходит тут вот что. Доступ к элементам массива можно получить через индексаторы типа такого:
массив [строка] [столбец]
для одномерного так:
массив [номер элемента]
я уже писал, что имена массивов - это указатели, а указатели - это переменные содержащие адреса ячеек памяти. операция индексации (те самые квадратные скобки []) - это всего лишь оболочка, упращающая работу с указателем, и ее можно расписаьт так:
массив [номер] то же самое, что и *(массив+номер)
Почему так? потому, что номер элемента - это смещение относительно начала массива. итак:
массив - это адрес начала массива
номер - количесво байт, которое прибавляется к адресу начала, чтобы получить доступ к определенному элементу.
Теперь по поводу звездочки. Когда звездочка указывается слева от некоторого адреса - это операция косвенной адресации . Указатель - это переменная, которая хранит адрес некоторой ячейки памяти. Так как кроме адресов мы туда ничего не можем записать (ну, точнее записать то мы может что угодно, вот только интерпретироваться это будет все равно как адрес) , такая запись в элемент массива номер 2 будет неверной:
массив+2 = 16
(массив+2) все еще ожидает адрес, поэтому и записывать туда значение элемента нельзя. Однако, по этому смому адресу, который находится в (массив+2) находится элемент номер 2 нашего массива и мы этот указатель сможем использовать для записи. Тут то и нужна операция косвенной адрсации. делает она следующее:
массив - это адрес массива
*массив - а вот тут происходит такое - из указателся берем адрес и переходит к тому месту, на который этот адрес ссылается. в этом случае на начало массива
*(массив+2) - вот тут к начальному адресу массива прибавляется количество байт, необходимое для перехода до ячейки номер 2 (зависит от размера массива) , после чего операция косвенной адресации обращается по этому адресу:
*(массив+2) = 16 - ложим число 16 в массив, элемент номер 2.
в случае с двумерными массивами тут дело такое - двумерные массивы - это, фактически, массив массивов. то есть массив, каждый элемент которого хранит адрес одномерного массива (тип данных инт** - говорит о том, что это указатель, хранящий адрес указателя на инт)
смотрим: *(*(массив+строка) +столбец) = значение
*(массив+смещение) - получаем адрес строки
*(*(массив+строка) +столбец) - смещаемся от начала строки на "столбец*размер" байт и получаем его адрес.
Похожие вопросы
- Запутываюсь при решении логических задач, написании программ
- Составьте программу решения старинной задачи: сколько можно купить быков (бык стоит 10рубей) , коров (по 5 рублей) и тел
- Помогите найти ошибку в решении олимпиадной задаче...
- Зачем нужен решение математические задачи в программировании
- Пожалуйста, помогите составить программы для решения следующих задач.
- Помогите пожалуйста составить решение с задачей по программированию(на любом языке программирования)
- c++ напишите решение задачи, пожалуйста (код)
- Подскажите пожалуйста решение такой задачи.
- Посоветуйте сайт для решения сложных задач по программированию, тоесть хочу научится решать сложные задачи, что читать?
- Помогите с программированием. Составить решения для задачи С++.