Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Сумма элементов главной диагонали матрицы паскаль

Вычислить сумму элементов главной или побочной диагонали матрицы

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

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

Если была выбрана сумма главной диагонали, то при определении ее элементов второй индекс матрицы будет равен первому и начинаться с первого элемента. В случае побочной диагонали второй индекс будет начинаться с последнего элемента и заканчиваться первым. Поэтому в теле функции перед проходом по матрице второму индексу присваивается либо 1 (или 0), либо размерность квадратной матрицы (N или N-1). При проходе второй индекс либо увеличивается на каждой итерации, либо уменьшается.

const N = 10 ;
type
type_arr = array [ 1 .. N , 1 .. N ] of byte ;

var
arr : type_arr ;
i , j : byte ;
sum : byte ;
ch : char ;

function diagonal ( var arr1 : type_arr ; c : char ) : byte ;
var
sum1 : byte ;
i , j : byte ;
begin
sum1 : = 0 ;
if c = ‘1’ then j : = 1
else j : = N ;
for i : = 1 to N do begin
sum1 : = sum1 + arr1 [ i ] [ j ] ;
if c = ‘1’ then j : = j + 1
else j : = j — 1 ;
end ;
diagonal : = sum1 ;
end ;

begin
randomize ;
for i : = 1 to N do begin
for j : = 1 to N do begin
arr [ i , j ] : = random ( 10 ) ;
write ( arr [ i , j ] : 4 ) ;
end ;
writeln ;
end ;
write ( ‘Главная (1) или побочная (2): ‘ ) ;
readln ( ch ) ;
if ( ch = ‘1’ ) or ( ch = ‘2’ ) then begin
sum : = diagonal ( arr , ch ) ;
writeln ( sum ) ;
end ;
end .

Пример(ы) выполнения программы на языке Pascal:

#include
#define N 10
int diagonal ( char c ) ;
int a [ N ] [ N ] ;

main ( ) <
int i , j , sum ;
char ch ;
srand ( time ( NULL ) ) ;
for ( i = 0 ; i N ; i ++ ) <
for ( j = 0 ; j N ; j ++ ) <
a [ i ] [ j ] = rand ( ) % 10 ;
printf ( «%3d» , a [ i ] [ j ] ) ;
>
printf ( » n » ) ;
>
printf ( «Главная (1) или побочная (2): » ) ;
scanf ( «%c» , & ch ) ;
sum = diagonal ( ch ) ;
printf ( «%d n » , sum ) ;
>

int diagonal ( char c ) <
int s , i , j ;
s = 0 ;
if ( c == ‘1’ )
for ( i = 0 ; i N ; i ++ )
s += a [ i ] [ i ] ;
else
for ( i = 0 , j = N — 1 ; i N ; i ++, j — )
s += a [ i ] [ j ] ;
return s ;
>

def diagonal ( l , c ) :
s = 0
i = 0
while i N:
if c == ‘1’ :
s + = l [ i ] [ i ]
else :
s + = l [ i ] [ N-i- 1 ]
i + = 1
return s

from random import random
N = 10
a = [ ]
for i in range ( N ) :
b = [ ]
for j in range ( N ) :
n = int ( random ( ) * 10 )
b. append ( n )
print ( «%3d» % n , end = » )
a. append ( b )
print ( )

ch = input ( «Главная (1) или побочная (2): » )
if ch == ‘1’ or ch == ‘2’ :
summa = diagonal ( a , ch )
print ( summa )

цел N = 7
цел таб a [ 1 : N , 1 : N ]
алг
нач
цел i , j , sum
сим ch
нц для i от 1 до N
нц для j от 1 до N
a [ i , j ] := int ( rand ( 0 , 10 ) )
вывод a [ i , j ] , » »
кц
вывод нс
кц
вывод «Главная (г) или побочная (п): »
ввод ch
если ch = «г» или ch = «п» то
sum := diag ( ch )
вывод sum
все
кон

алг цел diag ( сим c )
нач
цел s , i , j
s := 0
нц для i от 1 до N
если c = «г» то
s := s + a [ i , i ]
иначе
s := s + a [ i , N — i + 1 ]
все
кц
знач := s
кон

Эффективно вычислить суммы диагоналей матрицы

Учитывая двумерную квадратную матрицу, найдите сумму элементов в главной и вторичной диагонали. Например, рассмотрим следующую матрицу ввода 4 X 4.

Первичная диагональ образована элементами A00, A11, A22, A33.

  1. Условие для главной диагонали. Условием строки-столбца является строка = столбец.
    Вторичная диагональ образована элементами A03, A12, A21, A30.
  2. Условие для вторичной диагонали. Условием строки-столбца является row = numberOfRows — столбец -1.

Примеры :

В этом методе мы используем два цикла, то есть цикл для столбцов и цикл для строк, а во внутреннем цикле мы проверяем условие, указанное выше:

Читать еще:  Ошибка установки параметр командной строки adminfile

// Простая программа на C ++ для нахождения суммы диагоналей
#include

using namespace std;

const int MAX = 100;

void printDiagonalSums( int mat[][MAX], int n)

int principal = 0, secondary = 0;

for ( int i = 0; i

for ( int j = 0; j

// Условие для главной диагонали

// Условие для вторичной диагонали

cout «Principal Diagonal:»

cout «Secondary Diagonal:»

// Простая Java-программа для поиска
// сумма диагоналей

public class GFG <

static void printDiagonalSums( int [][]mat,

int principal = 0 , secondary = 0 ;

for ( int i = 0 ; i

for ( int j = 0 ; j

// Условие для принципала

// Условие для вторичного

System.out.println( «Principal Diagonal:»

System.out.println( «Secondary Diagonal:»

static public void main (String[] args)

// Этот код предоставлен vt_m.

# Простая программа на Python для
# найти сумму диагоналей

def printDiagonalSums(mat, n):

for i in range ( 0 , n):

for j in range ( 0 , n):

# Условие для главной диагонали

# Условие для вторичной диагонали

print ( «Principal Diagonal:» , principal)

print ( «Secondary Diagonal:» , secondary)

# Этот код добавлен
# от ihritik

// Простая программа на C # для поиска суммы
// диагоналей

public class GFG <

static void printDiagonalSums( int [,]mat,

int principal = 0, secondary = 0;

for ( int i = 0; i

for ( int j = 0; j

// Условие для принципала

// Условие для вторичного

Console.WriteLine( «Principal Diagonal:»

Console.WriteLine( «Secondary Diagonal:»

static public void Main ()

// Этот код предоставлен vt_m.

// Простая PHP-программа для
// найти сумму диагоналей

function printDiagonalSums( $mat , $n )

for ( $i = 0; $i $n ; $i ++)

for ( $j = 0; $j $n ; $j ++)

$principal += $mat [ $i ][ $j ];

if (( $i + $j ) == ( $n — 1))

$secondary += $mat [ $i ][ $j ];

echo «Principal Diagonal:» ,

echo «Secondary Diagonal:» ,

$a = array ( array ( 1, 2, 3, 4 ),

printDiagonalSums( $a , 4);

// Этот код создан ajit
?>

Выход:

Этот код занимает O (n ^ 2) времени и O (1) вспомогательного пространства

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

// Эффективная программа на C ++ для нахождения суммы диагоналей
#include

using namespace std;

const int MAX = 100;

void printDiagonalSums( int mat[][MAX], int n)

int principal = 0, secondary = 0;

for ( int i = 0; i

secondary += mat[i][n — i — 1];

cout «Principal Diagonal:»

cout «Secondary Diagonal:»

// Эффективная Java-программа для поиска
// сумма диагоналей

public class GFG <

static void printDiagonalSums( int [][]mat,

int principal = 0 , secondary = 0 ;

for ( int i = 0 ; i

secondary += mat[i][n — i — 1 ];

System.out.println( «Principal Diagonal:»

System.out.println( «Secondary Diagonal:»

static public void main (String[] args)

// Этот код предоставлен vt_m.

# Простая программа на Python3 для поиска
# сумма диагоналей

def printDiagonalSums(mat, n):

for i in range ( 0 , n):

secondary + = mat[i][n — i — 1 ]

print ( «Principal Diagonal:» , principal)

print ( «Secondary Diagonal:» , secondary)

# Этот код добавлен
# от ihritik

// Эффективная программа на C # для поиска
// сумма диагоналей

public class GFG <

static void printDiagonalSums( int [,]mat,

int principal = 0, secondary = 0;

for ( int i = 0; i

secondary += mat[i,n — i — 1];

Console.WriteLine( «Principal Diagonal:»

Console.WriteLine( «Secondary Diagonal:»

static public void Main ()

// Этот код предоставлен vt_m.

// Эффективная программа PHP
// найти сумму диагоналей

function printDiagonalSums( $mat , $n )

$principal = 0; $secondary = 0;

for ( $i = 0; $i $n ; $i ++)

$principal += $mat [ $i ][ $i ];

Читать еще:  Файл журнала ошибок

$secondary += $mat [ $i ][ $n — $i — 1];

echo «Principal Diagonal:» ,

echo «Secondary Diagonal:» ,

$a = array ( array (1, 2, 3, 4),

printDiagonalSums( $a , 4);

// Этот код предоставлен aj_36
?>

Выход :

Этот код занимает O (n) времени и O (1) вспомогательного пространства

Эта статья предоставлена Мохаком Агравалом . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

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

Двумерные массивы паскаль

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

Рассмотрим матрицу 3*3, то есть она будет состоять из 3 строк и 3 столбцов:

Каждый элемент обладает 2-мя индексами. Первый — номер строки, в котором располагается элемент, а второй – номер столбца. Следовательно, индекс элемента определяется местом пересечением столбца и строки . Например, a13 – это элемент, стоящий в первой строке и в третьем столбце массива.

Описание двумерного массива Паскаля.

Имеется ряд методов объявления двумерного массива.

Рассмотри способ, в котором указывается тип элемента и переменные.

В данном варианте матрица mas состоит из 4 строк, в каждой из которых 9 столбцов. При этом мы можем обратиться к любой i -й строке через mas [ i ], а к j -му элементу внутри i строки – m [ i , j ].

Во втором и третьем способе матрицу можно задать в одну строку.

Как и в предыдущем варианте, матрица имеет 4 строки и 9 столбцов, обращение к какому-либо элементу массива имеет вид: mas [ i , j ]. Значит, что элемент, расположен в i -й строке и j -м столбце. Важно не перепутать строки со столбцами, иначе произойдет ошибка в ответе.

Основные действия с двумерными массивами Паскаля

Все основные действия над матрицами выполняются поэлементно, причем типы данных элементов должны быть одинаковыми. То есть, если матрица состоит из чисел, то действия можно выполнять только с числами. Однако для реализации операции присваивания массивам достаточно быть одного размера. Например, дан массив

в ходе выполнения такой программы матрице а можно присвоить значения матрицы b ( a := b ).

Ввод двумерного массива Паскаля.

Для поочередного ввода элементов в матрицу необходимо перебрать элементы с 1-го столбца 1-ой строки до последнего столбца последней строки. Для этого используется два оператора цикла for, причем один вложен в другой.

Проанализируем образец ввода двумерного массива Паскаля с клавиатуры:

Способ заполнения двумерного массива Паскаля зависит от поставленной задачи. Например, функцию random (N) позволяет заполнять матрицу случайными величинами a[i,j]:=random(25)-10. Некоторые задачи требуют содержание выражений в матрице. Не забывайте, что в любом случае должен быть определен каждый элемент в каждых строках и столбцах.

Вывод двумерного массива Паскаля на экран.

При выводе элементы должны печатать по порядку индексов, то есть в строках элементы стоят друг за другом, а в столбах один под другим. Для этого необходимо написать следующие элементы кода:

Примечание! Использовать операторы readln ( a [ i , j ]), writeln именно в таком виде, в противном случае компилятор не сможет считать и напечатать элемент. Ввод в программу операторов в таком виде readln (a), writeln (a) не допустим, так как а – это переменная типа массив.

Представление двумерного массива Паскаля в памяти

В памяти ЭВМ элементы двумерного массива располагаются последовательно и занимают несколько байт. Например, элементы массива типа integer, будут занимать по 2 байта. А весь массив займет S^2 байта, где S – количество элементов в массиве.

Читать еще:  Как найти ошибки в ворде

В матрице для каждого элемента типа integer потребуется 2 байта памяти. Рассмотрим пример.

В данном случае необходимо 24 байт памяти.

Модель размещения массива M типа matrix в памяти.

Для любого элемента предоставляется две ячейки памяти, размещение осуществляется от первой строки до нижней, в порядке изменения индекса.

Между переменной и адресом ячейки устанавливается соответствие, однако, при объявлении матрицы программе известно только адрес начала массива, к остальным элементам адрес вычисляется по формуле:

где Addres – местоположение первого элемента, выделенного для массива; I , J – индексы элемента в двумерном массиве; SizeElemt – размер элемента массива (например, 2 байта для элементов типа integer ); sum – количество элементов в строке.

SizeElemt * sum *( I -1)+ SizeElemt *( J -1) — смещение относительно начала массива.

Какой размер памяти выделяется для массива?

Чтобы программа работала нормально, компьютер выделят память сегментами по 64 Кбайт. Один из сегментов отводится для данных, которые обрабатываются программой. Для каждой переменной отводится свой сегмент. Например, если переменная состоит из массива, то он не сможет занимать места больше, чем 65536 байт. Естественно, кроме массива в сегменте могут находится и другие переменные, поэтому объем памяти вычисляется по формуле 65536- S , где S – размер памяти, ранее отведенные под другие переменные.

Рассмотрим пример, в котором:

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

Можно без труда подсчитать количество элементов, которые допустимы по формуле: 65536/2 –1=32767. Однако, других переменных не должно быть. Матрицы обладают еще меньшими пределами индексов.

Решим задачу с двумерным массивом Паскаля.

Задача: Вычислить произведение ненулевых элементов матрицы.

Решение:

  • Для начала нужно установить переменные: матрицу, состоящую из целочисленных элементов; P – произведение элементов, не равное 0; I , J – индексы массива; N , M – количество строк и столбцов в матрице.
  • Входные данные N , M пусть вводятся с клавиатуры, а матрица зададим с помощью функции random ().
  • Выходными параметром получим P (произведение).
  • Выведем матрицу на экран, для проверки работы программы.

А теперь поговорим о процедурах.

Примечание! Тип массива должен быть определен заранее. Например:

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

Print – процедуры вывода на экран матрицы, которая передается по значению.

Для реализации вложенных циклов внутри процедуры нужно ввести счетчики – k и h . Алгоритм вывода матрицы на экран был описан выше, используем это описанием.

Итак, опишем ход выполнения программы.

  • Ввод значений N и M ;
  • Обращаемся к процедурам vvod ( a ) и print ( a ) для ввода и вывода матрицы соответственно, где а – матрица;
  • Переменной, которая отвечает за произведение P, присвоим значение 1;
  • Поочередно перебираем элементы матрицы с индексом 11 до элемента с индексом Каждый элемент матрицы должен удовлетворять условию: если a ij ? 0, то произведение P умножаем на элемент a ij ( P = P * a ij );
  • Выводим на экран результат произведения ненулевых элементов матрицы – P
Ссылка на основную публикацию
Adblock
detector