Задача: сформировать и вывести на экран двумерный массив оценок ряда учеников (их количество произвольно) по четырём школьным предметам. Оценки считать целыми случайными числами от 1 до 5. Сосчитать средний балл успеваемости всех учеников по всем предметам. Математика ФизикаИнформатика Литература Петров 4354 Иванов 5453 Петров 5544 Сидоров 3233
Схематично двумерный массив А(m,n) можно представить в виде следующей матрицы: a 11 a 12 a 13 …a 1n a 21 a 22 a 23 …a 2n …………… a m1 a m2 a m3 …a mn Где m – количество строк, n – количество столбцов Действительно, таблица очень напоминает зрительный зал, где m – количество рядов, а n – количество мест в ряду. Если всю матрицу обозначить одним именем, например А, то каждый элемент матрицы будет иметь два индекса – А[i,j], где первый индекс i обозначает номер строки (i=1…m), второй индекс j - номер столбца (j=1…n). Такую матрицу можно описать следующим образом : 1 способ : c использованием типа 2 способ : Type T=array [1..m,1..n] of integer; Var A: array [1..m,1..n] of integer; Var A: T; При решении задач с использованием двумерных массивов во всех случаях (кроме некоторых частных) организуются вложенный циклы.
2. Заполнение двумерного массива 3 х 4: 1. по строке: 2. по столбцу: For i:=1 to 3 do For j:=1 to 4 do For j:=1 to 4 do For i:=1 to 3 do a[i,j]:=random(100); a[i,j]:=random(100); а 11 а 12 а 12 а 13 а 13 а 14 а 21 а а 11 а 12 а 12.. а 21 а а 31 а 31...
3. Печать содержимого на экран : For i:=1 to m do begin For j:=1 to n do Write (A[i,j]:4); {Вывод элементов одной строки матрицы} Writeln; { переход на следующую строку экрана} end; где А - имя массива; i - индекс строки; j - индекс столбца; m - количество элементов в строке; n - количество элементов в столбце.
Что изменится в алгоритме, если надо будет суммировать элементы строки с номером k? 4. Вычисление суммы элементов отдельной строки, столбца. Дана матрица MxN. Найти сумму элементов столбца с номером k. CONST N=3; TYPE MAS=array [1..N,1..N] of real; Var a: MAS; i: 1..3; j : 1..3; s:real; BEGIN For i:=1 to n do For j:=1 to n do a[i,j]:=Random(98)+1; {Вывод значений массива} For i:=1 to n do begin For j:=1 to n do Write (a[i,j]:5:1); Writeln; end; s:=0; Write(Введите номер столбца); Readln(k); For i:=1 to n do s:=s+a[i,k]; Writeln(Сумма элементов,k,-го столбца =,s:5:2); end.
5. Вычисление суммы элементов всего двумерного массива S:=0; for i:=1 to m do for j:=0 to n do S:=S+a[i,j]; Поиск и вывод максимального элемента каждой строки: Ищем максимальные элементы каждой строки : For i:=0 to m do begin max[i]:=a[i,1]; nmax:=1; for j:=1 to n do if a[i,j]>max then begin max[i]:=a[i,j]; nmax:=j; end; writeln(max строки,i,=,max[i]); writeln(его номер, nmax); end; Для чего сумму S до цикла обнулили? А если надо искать произведение?
7. Поиск и вывод минимального элемента каждого столбца: For j:=0 to n do begin max[j]:=a[1,j]; nmax:=1; for i:=1 to m do if a[i,j]>max[ j] then begin max[ j]:=a[i,j]; nmax:=i; end; writeln(max столбца,j,=,max[ j]); writeln(его номер, nmax); end; 8. Поиск минимального элемента и его индексов для всего массива. Min:=a[1,1]; nstr:=1; nstolb:=1; for i:=1 to m do for j:=1 to n do if a[i,j]<min then begin min:=a[i,j]; nstr:=i; nstolb:=j; end;
9. Дан двумерный массив А(5,6). В каждой строке найти среднее арифметическое CONST m=5; n=6; TYPE MAS=array [1..m,1..n] of real; Var a: MAS; sr: array[1..m] of real; i: 1..m; j : 1..n; s: real; BEGIN For i:=1 to m do For j:=1 to n do a[i,j]:=Random(98)+1; For i:=0 to m do begin s:=0; for j:=1 to n do s:=s+ a[i,j]; sr[i]:=s/n; end; {Вывод значений массива} For i:=1 to m do begin For j:=1 to n+1 do Write (a[i,j]:5:0); Writeln (,sr[i]:5:1); end;
10. Дан двумерный массив A[N,M] Сформировать массив B[N,M], где SQR(A[I.J]), если I- НЕЧЕТНОЕ; B[I,J] = SQRТ(A[I.J]), если I- ЧЕТНОЕ; Program pr3; CONST N=3; M=5; TYPE MAS=array [1..N,1..M] of real; Var a,b : MAS; i: 1..N; j : 1..M; BEGIN Writeln(Введите элементы массива); For i:=1 to N do For j:=1 to M do Readln(a[i,j]); {Вывод значений массива} For i:=1 to N do begin For j:=1 to M do Write (a[i,j]:5:1); Writeln; end; For i:=1 to N do if i/2= int(i/2) Then For j:=1 to M do b[i,j]:=sqrt (a[i,j]) Else For j:=1 to M do b[i,j]:=sqr (a[i,j]) For i:=1 to N do begin For j:=1 to M do Write (b[i,j]:5:2); Writeln; end; end.
Мы с вами рассмотрели типичные примеры обработки прямоугольных матриц (M*N). Если M=N, то матрица называется квадратной (N*N). a11 a 12 a 13 a 14 a 21 a22 a 23 a 24 a 31 a 32 a33 a 34 a 41 a 42 a 43 a44 Для квадратных матриц можно выделить: Главная диагональ - элементы a 11, a 22, a 33, a 44 - индексы элементов, расположенных на главнойой диагонали равны (i=j) Пример: Найти сумму элементов главнойой диагонали: S:=0; for i:=1 to n do S:=S+a[i,i]; Побочная диагональ - элементы a 41, a 32, a 23, a 14 (j=n+1-i) Пример: Найти минимальный элемент побочной диагонали: min:=a[1,n]; for i:=1 to n do if a[i,n+1-i]<min then min:=a[i,n+1-i];
Верхняя треугольная матрица (элементы, расположенные над главнойой диагональю ненулевые (i<j); (рис 1) Нижняя треугольная матрица (элементы, расположенные под главнойой диагональю ненулевые (i>j); (рис 2) 0a 12 a 13 a 14 00a 23 a a a a 31 a a 41 a 42 a 43 0 (рис 1) (рис 2)
Задана числовая таблица размерности n на n. Заменить все отрицатьельные элементы этой таблицы на минимальный элемент главнойой диагонали. CONST n=6; Var a: array [1..n,1..n] of real; I, j, min: integer BEGIN For i:=1 to n do {формирование} For j:=1 to n do a[i,j]:=Random(25)-15; {Вывод значений массива} For i:=1 to n do begin For j:=1 to n do Write (a[i,j]:5:1); Writeln; end; REM поиск мин. элем. главной. диагонали min:= a[1,1]; FOR i:= 1 TO n do IF min > a[I,I] THEN min:= a[I,I]; Writeln (min=, min:5:1); {замена отрицать. элементов на MIN} FOR i:= 1 TO n DO FOR j:= 1 TO n DO IF a[I,j] < 0 THEN a[I,j]:=MIN; {Вывод значений массива} For i:=1 to n do begin For j:=1 to n do Write (a[i,j]:5:1); Writeln; end; Readln; End.
Задача 1: Некая фирма, торгующая мороженным в г. Н.Новгород, ведёт учёт выручки (в тыс. руб.) по четырём районам города в летние месяцы 2008 г. Исходные данные: названия районов названия летних месяцев 12 чисел, каждое из которых - выручка по конкретному району города за конкретный месяц Производные величины: суммы выручки по городу за каждый месяц средние суммы выручки по каждому району за всё лето общая сумма выручки Вывести список названий районов города, отсортированный по убыванию средней суммы выручки по каждому району за всё лето. Результат
Program morojen; Uses Crt; const r_c: array [1..4] of string=('Автоз-ий', 'Московский','Сормовский','Приокский'); m_c: array [1..3] of string=('Июнь','Июль','Август'); var r: array[1..4]of string; {названия районов} vir: array[1..4,1..3]of integer; {выручка} s_m: array[1..3] of integer; {суммы по месяцам} sr_r: array[1..4] of real; {средние выручки по районам} i,j,s,nmax: integer; r1,max: real; r2: string; begin ClrScr; RANDOMIZE; For i:=1 to 4 do {Формирование} Begin r[i]:=r_c[i]; For j:=1 to 3 do vir[i,j]:=Random(420+20); End; {сумма выручки по городу за каждый месяц} For j:=1 to 3 do begin s_m[j]:=0; For i:=1 to 4 do s_m[j]:=s_m[j]+vir[i,j]; end; {средняя сумма выручки по каждому району за всё лето} For i:=1 to 4 do begin s:=0; For j:=1 to 3 do s:=s+vir[i,j]; sr_r[i]:=s/3; end; {Вывод} gotoxy(14, WhereY); For j:=1 to 3 do Write(m_c[j]:9); Writeln('Среднее':8); For i:=1 to 4 do Begin Write(r[i]:14); For j:=1 to 3 do Write(vir[i,j]:8); Write(sr_r[i]:8:0); Writeln; End; s:=0;Write('Всего':14);For j:=1 to 3 do Begin Write(s_m[j]:8); s:=s+s_m[j]; End; Writeln(s:8);Writeln; {Сортировка} for i:=1 to 3 do begin max:=sr_r[i]; nmax:=i; for j:=i+1 to 4 do if sr_r[j]>max then begin max:=sr_r[j]; nmax:=j; end; r1:=sr_r[i]; sr_r[i]:=sr_r[nmax]; sr_r[nmax]:=r1; r2:=r[i]; r[i]:=r[nmax]; r[nmax]:=r2; end; {вывод по убыванию средней суммы выручки по каждому району за всё лето} For i:=1 to 4 do Begin Write(r[i]:14);Writeln(sr_r[i]:8:0); end; Readln; End.
Задача 2: сформировать и вывести на экран массив оценок учеников класса (их количество произвольно) по ряду (пусть пока четырём) школьным предметам. Оценки считать целыми случайными числами от 1 до 5. Сосчитать: 1. средний балл успеваемости каждого ученика по всем предметам; 2. средний балл по каждому предмету по всем ученикам; 3. средний балл успеваемости всех учеников по всем предметам; 4. максимальный и минимальный средний балл успеваемости учеников (с указанием фамилий); 5. успеваемость и качество по каждому предмету; 6. отсортировать учеников в порядке убывания их средних баллов. Результат