Решения (задачи 165-188)
Задача 173
{ Подводит итоги Олимпийских игр } const N=10; (количество стран-участниц } strana: array[1..N] of string[9]=('Австрия','Германия', 'Канада','Китай','Корея','Норвегия','Россия', 'США','Финляндия' array[1..МАХ,1..MAX] of integer; { матрица) n: integer; { размер проверяемой матрицы } ok:boolean; { TRUE – матрица является маг. квадратом} i,j: integer; { индексы массива } sum: integer; { сумма эл-тов главной диагонали матрицы temp: integer;{ сумма элементов текущей строки, столбца или второй диагонали матрицы } begin write('Введите размер матрицы (3..4), и нажмите Enter › '); readln(n); Writeln('Введите строки матрицы1); Writeln('После ввода строки', n,' целых чисел,', 'нажимайте Enter'); for i: = 1 to n do begin write(' › '); for j: = l to n-1 do read(a[i,j]); readln(a[i,n]); end; ok: = TROE; { пусть матрица – магический квадрат } sum: = 0; { вычислим сумму элементов главной диагонали } for i: =1 to n do sum: = sum+a[i,i]; { вычисляем суммы по строкам} i: = 1 repeat temp: = 0; { сумма эл-тов текущей строки } for j: = l to n do temp: = temp+a[i,j]; i: = i+l; if temp <> sum then ok: = FALSE; until (not ok) or (i > n); if ok then { здесь сумма элементов каждой строки равна сумме эл-тов главной диагонали } end. { вычисляем суммы по столбцам } repeat temp: = 0; { сумма эл-тов текущего столбца }, for i: = l to n do temp: = temp+a[i,j]; if temp <> sum then ok: = FALSE; until (not ok) or (j > n); if ok then (здесь сумма эл-тов каждой строки равна сумме эл-тов каждого столбца и равна сумме эл-тов главной диагонали} begin (вычислим сумму эл-тов второй главной диагонали } temp: = 0; j: = n; for i: = l to n do begin temp: = temp+a[i,j]; end; if temp <> sum then ok: = FALSE; end; end; write('Введенная матрица '); if not ok then write('не '); writeln('является магическим квадратом.'); readln; { Подводит итоги Олимпийских игр } const N=10; (количество стран-участниц } strana: array[1..N] of string[9]=('Австрия','Германия', 'Канада','Китай','Корея','Норвегия','Россия', 'США','Финляндия таблица результатов } result: arrayfl..N+l, 1..5] of integer; { N+1-я строка используется как буфер при сортировке таблицы } i,j: integer; max: integer; { номер строки таблицы, в которой количество очков максимально } buf: string[9]; { используется при сортировке } begin writeln('Итоги Олимпийских игр'); writeln('Введите в одной строке количество золотых, ', 'серебряных и бронзовых медалей.'); { ввод исходных данных } for i: = l to N do begin write(strana[i],' › '); read(result[i,1],result[i,2]); { кол-во золотых и серебряных } readln(result[i,3]); { кол-во бронзовых } end; { вычислим общее кол-во медалей и очков } for i: = l to N do begin result[i,4]: = result[i, 1]+result[i,2]+result[i,3]; result [i,5]: = result[i,1]*7+result[i,2]* 6+result[ i, 3 ] * 5; end; { сортировка массива в соответствии с количеством очков } { методом простого выбора } for i: = l to N-l do begin (в части таблицы начиная со строки i найти j-ю строку, в которой элемент result [j, 5] максимальный } max: = i; { пусть это строка с номером i } for j: = i+l to N do if result[j,5] > result[max,5] thenmax: = j; { Обменяем i-ю строку со строкой с номером max В качестве буфера используем последнюю, не используемую строку таблицы. } buf: = strana[i]; strana[i]: = strana[max]; strana[max]: = buf; for j: = 1 to 5 do begin result[N+l,j]: = result[ i, j ]; end; for j: =1 to 5 do begin result[i,j]: = result[max,j]; end; for j: = 1 to 5 do begin result[max,j]: = result[N+l,j]; end; end; { здесь таблица упорядочена } writeln; writeln('Итоги зимней Олимпиады в Нагано, 1998 г.1); writeln{'Страна':12,'Золото':8,'Серебро':8,'Бронза':8, 'Всего':8,'Очков': 8); for i: = l to N do begin write(i:2,strana[i]:10); for j: = 1 to 5 do write(result[i,j]:8); writeln; end; readln; end.