Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Вложенные циклы



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

Наиболее часто вложенные циклы используются при обработке многомерных массивов.

Задача 6.14. Вычислить сумму элементов каждой строки заданной матрицы А(5,3). Составить программу решения задачи.

Тест. Вход:

     
  -5  
     
    -4
     

Выход: Сумма элементов строк

1 строка– 12

2 строка – 6

3 строка - 20

4 строка - 11

5 строка – 10

Схема решения задачи 6.14. представлена на рис. 6.9.

Решение задачи 6.14 на языке Pascal:

Program S_strok;

Var N, {количество строк}

M, {количество столбцов}

i, {номер текущей строки}

j: Integer; {номер текущего столбца}

S: Real; {сумма элементов текущей строки}

A: Array [1..10, 1..10] of Real; {матрица для хранения 100 чисел}

BEGIN

WriteLn (’Введите количество строк <=10: ’); ReadLn(N);

WriteLn (’Введите количество столбцов <=10: ’); ReadLn(M);

WriteLn(’Введите матрицу: ’, N, ’строк’, M, ’столбцов’);

For I:=1 to N do

For J:=1 to M do

ReadLn(A[I, J]);

WriteLn(‘Сумма элементов строк’);

For I:=1 to N do begin

S:=0; {Обнуление суммы для каждой строки I}

For J:=1 to M do

S:=S + A[I, J];

WriteLn (I, ’ строка - ’, S);

End;

ReadLn

END.

Пояснения к программе:

1) Матрица размером N строк и M столбцов вводится по строкам, т.е. сначала вводятся элементы первой строки, затем второй и т.д. Параметр внешнего цикла I – номер текущей строки, а внутреннего J – номер текущего столбца. Для каждого значения параметра внешнего цикла I перебираются все значения параметра внутреннего цикла J. Вложенные циклы, использованные в программе, обеспечивают ввод и просмотр элементов матрицы по строкам:

For I:=1 to N do

For J:=1 to M do

Обработка элемента A[I, J]

Для тестового примера элементы вводятся в следующем порядке

A[1,1]=4, A[1,2]=6, A[1,3]=2,

A[2,1]=8, A[2,2]=-5, A[2,3]=3,

A[3,1]=1, A[3,2]=7, A[3,3]=12,

A[4,1]=5, A[4,2]=10, A[4,3]=-4,

A[5,1]=2, A[5,2]=1, A[5,3]=7,

2) Перед оператором For внутреннего цикла выполняются подготовительные действия, в программе 6.14 – это обнуление значения суммы S для каждой строки.

После внутреннего цикла выполняются завершающие действия, в программе 6.14 – это вывод значения суммы S для каждой строки.

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

Решение задачи 6.14. на языке QBasic:

INPUT "Количество строк - ", N

INPUT "Количество столбцов - ", M

DIM A(N, M) 'Резервирование памяти для матрицы A

FOR i = 1 TO N 'Ввод матрицы

FOR j = 1 TO M

PRINT "A("; i; ", "; j; ") = ";

INPUT A(i, j)

NEXT j

NEXT I

PRINT " Суммы элементов строк равны "

FOR i = 1 TO N 'Вычисление сумм элементов строк

S = 0

FOR j = 1 TO M

S = S + A(i, j)

NEXT j

PRINT i, " строка - ", S

NEXT i

END


Рис. 6.9. Cхема алгоритма задачи 6.14.

Задача 6.15. Целочисленная квадратная матрица размерности n*n (n<=50) вводится по строкам. Составить программу определения номера столбца, имеющего максимальную сумму элементов, расположенных выше главной диагонали ().

Тест.

Входная матрица: Результат:

(точками отмечены элементы, Номер столбца с максимальной

не участвующие в задаче) суммой равен 4

n=5

           
  .       -2
  . .   -1  
  . . .    
  . . . .  
  . . . . .

Решение задачи 6.15 на языке Pascal

Program Matr;

Var N, {количество строк и столбцов}

I, {номер текущей строки}

J, {номер текущего столбца}

Jmax: Integer; {номер столбца с максим. суммой }

S, {сумма элементов текущей строки}

Smax: Real; {максимальная сумма}

A: Array [1..10, 1..10] of Real; {матрица для хранения 100 чисел}

BEGIN

WriteLn (’Введите количество строк <=10: ’);

ReadLn(N);

WriteLn(’Введите матрицу: ’, N, ’строк’, N, ’столбцов’);

For I:=1 to N do

For J:=1 to N do

ReadLn(A[I, J]);

Jmax:= 2; Smax:= A[1][2];

For J:=3 to N do begin

S:=0; {Обнуление суммы для каждого столбца J}

For I:=1 to J-1 do

S:=S + A[I, J];

if S > Smax then begin

Smax=S; Jmax=J;

end;

End;

WriteLn (‘Номер столбца с максим-й суммой =’, Jmax);

ReadLn

END.

Пояснения к программе:

1) Сначала столбец с максимальной суммой второй Jmax:= 2; а максимальная сумма Smax:= A[1][2];

2) Просмотр матрицы производится по столбцам, поэтому внешний цикл организован по индексу столбца J, а внутренний – по индексу строки I.

Просмотр матрицы начинается с третьего столбца, просматриваются строки до главной диагонали (см. тест к задаче):

For J:=3 to N do

For I:=1 to J-1 do

Задача 6.16. Сортировка чисел. Дано целое n и вещественные числа x1, x2,..., xn. Составить программу вывода заданных вещественных чисел в порядке возрастания.

Тест:

Введите количество чисел

Введите числа

3 0.5 8 5 7

Упорядоченные числа:

0.5 3.0 5.0 7.0 8.0

Порядок обработки и вывода данных не совпадает с порядком их ввода, поэтому для хранения обрабатываемых данных нужен массив. Исходные данные вводятся в массив, там сортируются - переставляются по возрастанию, а затем выводятся.

Существуют много методов сортировки. Одним из простых методов сортировки является метод обмена (метод пузырька). При просмотре массива упорядочиваются пары соседних элементов: элементы, расположенные не по возрастанию, меняются местами. После просмотра максимальный элемент переместится в конец массива. При следующем просмотре этот элемент не учитывается и просматриваются уже n - 1 элементов, затем n - 2 и т. д., последний раз просматриваются два элемента.

Решение задачи 6.16 на языке Pascal:

Program Sort;

Var N, {количество чисел}

i, { индекс текущего числа}

k: Integer; {максимальный индекс для просмотра}

r: Real; {вспомогательная переменная для обмена}

X: Array [1..100] of Real; {массив для хранения 100 чисел}

BEGIN

{ Ввод массива X }

WriteLn (’Введите количество строк <=10: ’); ReadLn(N);

WriteLn (’Введите числа: ’);

for i:=1 to N do

ReadLn(X[i]);

{ Сортировка массива x по возрастанию методом обмена }

for k:=N downto 2 do

for i:=1 to k do { Просмотр элементов x[1],..., x[k] }

if X[i] > X[i+1] then { Порядок нарушен }

begin r=X[i]; X[i]=X[i+1]; X[i+1]=r; end; {Обмен значений}

{ Вывод массива X }

WriteLn (‘Упорядоченные числа:’);

for i:=1 to N do

Write (X[i]);

END.





Дата публикования: 2015-01-14; Прочитано: 330 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.012 с)...