У меня много мыслей по поводу Вашей программы.
fiks писал(а):
Я просто думал,что для разбирающихся людей это как 2 пальца об асфальт....
Вы правы, а что? Вы думаете, пальцы не жаль?! Вы ещё об наждак посоветуйте.
Но дело в том, что нам это не нужно. Хотя мы готовы помочь Вам.
1) Я немного переформатировал Ваш код.
Мне так легче читать. Посмотрите, может и Вам понравится.
Код:
1 program Ren74;
2 uses crt;
3
4 const
5 n = 5; (* dimmension of the array *)
6
7 type
8 dar = array [1..n,1..n] of integer;
9 ar = array [1..n] of longint;
10
11 var
12 max, min, i, k, i1, i2, k1, k2, k3, save: longint;
13 a: dar;
14 b: ar;
15
16 begin
17 clrscr;
18
19 randomize;
20
21 max:=-10;
22 min:=10;
23 i1:=0;
24 i2:=0;
25 k1:=0;
26 k2:=0;
27
28 (* random initialization *)
29 for i:=1 to n do begin
30 for k:=1 to n do begin
31 a[i,k]:=random (9);
32 end;
33 end;
34
35 (* print array *)
36 for i:=1 to n do begin
37 for k:=1 to n do begin
38 write (a[i,k]:5);
39 end;
40 writeln;
41 end;
42
43 (* find a min of abs of the other diagonal *)
44 k:=5; k3:=0; k1:=0;
45 for i:=1 to n do begin
46 if abs(a[i,k-k3]) < min then begin
47 min:=abs(a[i,k-k3]);
48 i1:=i;
49 k1:=k-k3;
50 end;
51 k3:=k3+1;
52 end;
53 writeln ('Min=',a[i1,k1],'[',i1,',',k1,']');
54
55 (* find a max of the array *)
56 for i:=1 to n do begin
57 for k:=1 to n do begin
58 if a[i,k] > max then begin
59 max:=a[i,k];
60 i2:=i;
61 k2:=k;
62 end;
63 end;
64 end;
65 writeln ('Max=',a[i2,k2],'[',i2,',',k2,']');
66
67 (* swap them *)
68 save:=a[i1,k1]; a[i1,k1]:=a[i2,k2]; a[i2,k2]:=save;
69
70 (* print updated array *)
71 writeln;
72 writeln ('Ïîñëå çàìåíû');
73 for i:=1 to n do begin
74 for k:=1 to n do begin
75 write (a[i,k]:5);
76 end;
77 writeln;
78 end;
79
80 (* swap first and second raw *)
81 i1:=1;
82 i2:=2;
83 for k:=1 to n do begin
84 b[k]:=a[i1,k];
85 end;
86 for k:=1 to n do begin
87 a[i1,k]:=a[i2,k];
88 end;
89 for k:=1 to n do begin
90 a[i2,k]:=b[k];
91 end;
92
93 (* print updated array *)
94 readln;
95 writeln('Ïîñëå çàìåíû 1-îé è 2-îé ñòðîêè');
96 for i:=1 to n do begin
97 for k:=1 to n do begin
98 write (a[i,k]:5);
99 end;
100 writeln
101 end;
102
103
104
105 max:=-999999;
106 min:=999999;
107 for k:=1 to n do begin
108 b[k]:=0;
109 end;
110
111 for k:=1 to n do begin
112 for i:=1 to n do begin
113 b[k]:=b[k]+(a[i,k]*a[i,k]);
114 end;
115 end;
116
117 for k:=1 to n do begin
118 if b[k]<min then begin
119 min:=b[k];
120 k1:=k;
121 end;
122 if b[k]>max then begin
123 max:=b[k];
124 k2:=k;
125 end;
126 end;
127
128 readln;
129 writeln ('max =',max,'');
130 writeln ('min =',min,'');
131 writeln ('Ïîñëå çàìåíû');
132 for i:=1 to n do begin
133 b[i]:=a[i,k2];
134 end
135 for i:=1 to n do begin
136 a[i,k2]:=a[i,k1];
137 end;
138 for i:=1 to n do begin
139 a[i,k1]:=b[i];
140 end;
141
142 (* print updated array *)
143 for i:=1 to n do begin
144 for k:=1 to n do begin
145 write (a[i,k]:5);
146 end;
147 writeln;
148 end;
149 readln;
150 end.
1-а) const, type, var начинают зоны. Поэтому их лучше писать на отдельной строчке, а содержимое зоны — с отступом.
1-б) Имеет смысл группировать переменные по смыслу, а не по типу. Например, max, min, save — это содержимое массива, а остальные переменные — индексы. Если Вы поменяете тип элементов массива, тип max, min, save поменяется, а тип остальных — нет. (К тому же тип индекса int, а не longint).
1-в) Я рекомендую Вам не экономить на begin-end. Даже если это ровно один оператор, пишите их! Поверьте, искать ошибки гораздо дольше, чем набрать.
1-г) Я использую (проверьте) другую стратегию отступа:
Код:
for i:=1 to n do begin
(* код с отступом *)
end;
т.е., begin находится на той же строчке, что и оператор, а end — под началом оператора. То же самое относится и к if, и к остальным.
Ну, на этот счёт существуют разные конвенции. Я не буду утверждать, что эта — лучшая в мире.
1-е) Никто ещё не разу не жаловался на осмысленные комментарии в программах. Но кроме них, полезно разбивать текст пустыми строками, подобно разбиению текста книги на абзацы — по содержанию. Обратите внимание — циклы в строчках 132-140 работают вместе, и не разбиты пустыми строками.
2) Я не увидел нигде в задании указаний на диапазон случайных чисел. Это кажется мелочью, но накладывает отпечаток на структуру программы. Например, на инициализацию min и max (строки 21, 22), и структуру цикла поиска (см. ниже).
3) Задание n константой может быть и допустимо (это зависит от преподавателя и задачи). Но раз начав, следует это делать последовательно: обратите внимание на инициализацию k в стоке 44.
4) Скриншот, очевидно, не от этой программы. Во-первых, по-видимому, n было равно 3. Во-вторых, в программе исправлена ошибка, видимая на этом скриншоте (min лежит на побочной, а не на главной диагонали).
5) Поиск min (строки 44-52) заметно упростится, если заметить, что k не меняется в цикле (и всё время равно n), а k3 всегда равно i-1 (иными словами, для a[i,j] на побочной диагонали i + j = n + 1). Поэтому и k, и k3 можно убрать.
6) Если элементы массива — произвольные целые, то задача поиска несколько усложняется (поскольку задать min и max за границами диапазона нельзя). Обычный подход — проинициализировать первым элементом, участвующим в поиске (включая инициализацию соответствующих индексов!; он всегда находится, не правда ли), а потом можно либо плюнуть на экономию и оставить всё как есть, либо начать сравнение со следующего (т.е., в Вашем случае, со второй строки).
7) Вы печатаете массив 4 раза. Не пора ли сделать процедуру печати?
8) Переставлять строки так, как это делаете Вы, конечно можно. Но не очень эффективно (на традиционном компьютере, для чистоплюев). Гораздо быстрее и практичнее заметить, что перестановка строк может быть сведена к последовательной перестановке соответствующих элементов.
9) Вы переставляете строки дважды. Ещё одна процедура?
10) Та же самая идея, что и в пункте 8: зачем нам хранить суммы квадратов элементов строк? Ведь вычислив сумму квадратов, мы можем сразу сравнить с текущими значениями min и max, после чего радостно забыть. Кроме того, см. пункты 2 и 5.
В целом, всё хорошо. Программа должна работать. Если у Вас есть вопросы, я готов ответить. Или мы можем перейти к следующей программе.
Добавлено спустя 6 минут 46 секунд:fiks писал(а):
в)Строки с макс. и мин. суммой квадратов элементов
fiks писал(а):
Это 1 программа,только не соответсвует 3 пункту задания...в задачи я поменял местами столбцы с мин и макс суммой квадратов элементов.
Как мне можно расписать в конце суммы квадратов всех столбцов?
Мне надо,чтобы на экран выводились не только значения столбцов с мин и макс сумм квадратов элементов но и всех остальных...
К сожалению, эта часть
задания я пока не могу понять. Попробуйте написать подробнее и понятнее.
На всякий случай: i-тая строка массива A: A[i, 1], A[i, 2],… A[i, n]. i-ый столбец массива A: A[1, i], A[2, i],…A[n, i]. От перестановки индексов способ работы с массивом не меняется.