0 / 0 / 0
Регистрация: 19.11.2019
Сообщений: 4

Исправить код (работа с матрицей)

19.11.2019, 20:43. Показов 2182. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дана целочисленная матрица Aij i=1...n;j=1..n , n<=100. Если в матрице нет строк с нулевой суммой элементов,
и в каждом столбце есть простые числа, упорядочить элементы столбцов по не возрастанию суммы цифр.
Использовать процедуры и функции.
Написал код, но видимо где-то в функции Prostota накосячил, возможно ещё где нибудь, поправьте пожалуйста.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
const
  nmax = 10000;
 
var
  prost: boolean;
 
type
  Tmas = array[1..nmax, 1..nmax] of Integer;
 
 
 
procedure Vvod(var a: Tmas; var n, m: Integer);
var
  i: integer;
  j: integer;
begin
  writeln('Введите количество строк:');
  read(n);
  writeln('Введите количество столбцов:');
  read(m);
  writeln('Введите последовательность элементов через пробел:');
  for i := 1 to n do 
  begin
    for j := 1 to m do 
    begin
      read(a[i][j]);
    end;
    j := 1;
  end;
end;
 
 
 
 
function Sum(a: Tmas;  n, m: Integer): Boolean;
var
  i, j, d: integer;
  b: boolean;
begin
  b := false;
  for i := 1 to n do  
  begin
    for j := 1 to m do  
    begin
      d := a[i][j] + d;
    end;
    j := 1;
    if(d = 0) then begin
      b := true;
    end;
    if(b = true) then begin
      break;
    end;
    Sum := b;
  end;
end;
 
 
 
function Prostota(a: Tmas;  n, m: Integer): Boolean;
var
  k, i, j: Integer ;
var
  c: Boolean;
begin
  prost := true;
  i := 1;
  while (i < n) do  
  begin
    while (j < m) do  
    begin
      if (abs(a[i][j]) < 2) then begin
        c := false;
      end
      else begin
        for k := 2 to round(sqrt(a[i][j])) do
          if a[i][j] mod k <> 0 then begin
            c := true;
          end
          else begin
            c := false;
            break;
          end;
        if(c = true) then begin
          if(i = n) then begin
            prost := true;
          end
          else begin
            i := i + 1;
            j := 1;
            prost := true;
          end;
        end;
        if(c = false) then begin
          prost := false;
        end;
      end;
    end;
    j := j + 1;
  end;
  j := 1;
  i := i + 1;
  Prostota := prost;
end;
 
function SumCh(x: Integer): Integer;
var
  c, z: Integer;
begin
  z := 0;
  while(c <> 0) do 
  begin
    c := x mod 10;
    z := z + c;
    x := x div 10;
  end;
  SumCh := z;
end;
 
 
procedure Sortirovka(var a: Tmas; n, m: Integer; var h, g: Boolean);
begin
  var j, i: Integer;
  if(h=true) and (g=false)  then begin
    for j := 1 to m do
    begin
      for i := 1 to n do
      begin
        if(SumCh (a[i][j]) < SumCh(a[i][j + 1])) then 
          swap(A[i][j], A[i][j + 1]);
      end;
    end;
  end;
end;
 
 
 
procedure Vivod(var a: Tmas; var n, m: Integer);
var
  i, j: integer;
begin
  writeln('Результат:');
  for i := 1 to n do  
  begin
    for j := 1 to m do  
    begin
      write(a[i][j], ' ');
    end;
    writeln('');
    j := 1;
  end;
end;
 
 
 
 
var
  a: Tmas;
  n, m: integer;
  h, g: Boolean;
 
begin
  Vvod(a, n, m);
  
  h := Prostota(a, n, m);
  g := Sum(a, n, m);
  
  Sortirovka(a, n, m, h, g);
  
  Vivod(a, n, m);
end.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.11.2019, 20:43
Ответы с готовыми решениями:

Пояснить код работы с матрицей
Доброго времени суток. Учусь писать на Pascale, интересно, но есть много непонятных вещей... Расщитываю на помощь :) Вот, к примеру,...

Работа с матрицей
Помогите решить ошибку в коде, в строке 31 Const n = 5; m = 5; {n-строка, m-столбец} Var A: array of integer; i, j,...

Работа с матрицей + модуль
Всем доброго времени суток, задача такая: Массив символов. В процедуре отсортировать массив по алфавиту в обратном порядке. составить...

2
 Аватар для JuriiMW
5096 / 2662 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
20.11.2019, 06:02
Pascal
1
2
const
  nmax = 10000;
А не устанете вводить?
По моему, даже 100 будет слишком! Хотя именно эта цифра озвучена в задании.
Вполне бы хватило и 20…

Pascal
51
    if(b = true) then begin
Pascal
84
        if(c = true) then begin
Pascal
94
        if(c = false) then begin
Pascal
124
  if(h=true) and (g=false)  then begin
За такое просто нужно предавать анафеме и полное отлучение от компьютера!
Давать в руки Кнута. И пока не перескажет первые два тома, заставлять держать их на вытянутых вперёд руках… ;–)

Зачем вам по всему коду лишние операторные скобки?
Они только портят читабельность программы!

А ещё, есть такой принцип „разделяй и властвуй“!
Так и нужно разделять программу на элементарные подпрограммы, а не городить огороды.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
const
  nmax = 100;
 
type
  Tmas = array[1..nmax, 1..nmax] of Integer;
 
procedure Vvod(var a: Tmas; var rows, cols: Integer);
begin
  rows := ReadLnInteger('Введите количество строк:');
  cols := ReadLnInteger('Введите количество столбцов:');
  for var row := 1 to rows do 
    for var col := 1 to cols do
      repeat
        a[row,col] := ReadLnInteger($'a[{row},{col}] =');
        if a[row,col] < 0 then WriteLn('Ошибка! Повторите ввод.');
      until a[row,col] >= 0;
end;
 
function RowSumZero(a : Tmas; rows, cols : Integer) : Boolean;
begin
  Result := True; // предположим, что есть такие
  for var row := 1 to rows do
    begin
      var sum := 0;
      for var col := 1 to cols do
        sum += a[row, col];
      if sum = 0 then Exit; // нашли. нет резона дальше проверять
    end;
  Result := False; // дошли до конца, но не нашли
end;
 
function isPrime(n : Integer) : Boolean;
begin
  Result := False; // предположим, что число составное
  if not odd(n) and (n>2) then Exit; // чётное и больше 2
  var(d,q) := (3,Round(sqrt(n)));
  while d<=q do
    begin
      if n mod d=0 then Exit; // делится на d
      d+=2; // следующее нечётное
    end;
  Result := True; // значит оно всё таки простое
end;
 
function PrimeInEveryCols(a : Tmas; rows, cols : Integer) : Boolean;
begin
  Result := False; // Если случится так, что в проверяемом столбце не будет ни одного простого
  for var col := 1 to cols do
    begin
      var find := False; // ещё не найдено простое число
      for var row := 1 to rows do
        begin
          find := isPrime(a[row,col]); // найдено простое
          break; // можно больше не проверять
        end;
      if not find then Exit; // в колонке не найдено простое число
    end;
  Result := True; // Всё сложилось удачно
end;
 
procedure OrderOneCol(var a : Tmas; rows, col : Integer);
begin
  var changes : Integer;
  repeat
    changes := 0;
    for var row := 1 to rows-1 do
      if a[row,col] < a[row+1,col] then
        begin
          Swap(a[row,col], a[row+1,col]);
          changes+=1;
        end;
  until changes = 0;
end;
 
procedure OrderCols(var a : Tmas; rows, cols : Integer);
begin
  for var col := 1 to cols do
    OrderOneCol(a, rows, col);
end;
 
procedure OutArray(a : Tmas; rows, cols : Integer);
begin
  WriteLn('Результат:');
  for var row := 1 to rows do
    begin
      for var col := 1 to cols do
        Write(a[row,col]:5);
      WriteLn;
    end;
end;
 
var
  a: Tmas;
  n, m: integer;
 
begin
  Vvod(a, n, m);
  
  if Not RowSumZero(a, n, m) and PrimeInEveryCols(a, n, m) then
    OrderCols(a, n, m);
  
  OutArray(a, n, m);
end.
1
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
20.11.2019, 09:05
Лучший ответ Сообщение было отмечено LupDiDu как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
const nmax=100;//по условию матрица квадратная A[n,n], nmax=100
type Tmas=array[1..nmax, 1..nmax] of integer;
//сумма в строке k матрицы
function Sum(a:Tmas;n,k:integer):integer;
var i,j,s:integer;
begin
s:=0;
for i:=1 to n do
s:=s+a[k,i];
Sum:=s;
end;
//простое ли число
function Prostota(x:integer):boolean;
var b:boolean;
    i:integer;
begin
if x=2 then b:=true
else if (x<2)or(x mod 2=0) then b:=false
else
 begin
  b:=true;
  i:=3;
  while (i*i<=x)and b do
  if x mod i=0 then b:=false else inc(i,2);
 end;
Prostota:=b;
end;
//есть ли строки с суммой=0
function row_zero(a:Tmas;n:integer):integer;
var i,k:integer;
begin
k:=1;
i:=1;
while(i<=n)and(k=1) do
if Sum(a,n,i)=0 then k:=0
else inc(i);
row_zero:=k;
end;
//есть ли в каждом столбце простое
function col_prst(a:Tmas;n:integer):integer;
var i,j,k,p,s:integer;
begin
k:=1;//пусть простые есть во всех столбцах
j:=1;//идем по столбцам
while(j<=n)and(k=1) do
 begin
  i:=1;//идем по столбцу пока не конец и не простые
  while(i<=n)and not Prostota(a[i,j]) do inc(i);
  if i>n then k:=0//в столбце нет простых
  else inc(j);
 end;
col_prst:=k;
end;
function SumCh(x:integer):integer;
var c,z:integer;
begin
c:=abs(x);
z := 0;
while(c>0) do
 begin
  z:=z+c mod 10;
  c:=c div 10;
 end;
SumCh := z;
end;
//сортировка столбца k
procedure Sortirovka(var a:Tmas;n,k:integer);
var i,j,x:integer;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if SumCh(a[i,k])<SumCh(a[j,k]) then
 begin //не во всех паскалях есть процедура Swap
  x:=a[i,k];
  a[i,k]:=a[j,k];
  a[j,k]:=x;
 end;
end;
procedure Vvod(var a:Tmas;var n:integer);
var i,j:integer;
begin
randomize;
//вводить для тестирования вручную до 10000 чисел мне как-то влом
//но Вы напишите ручной ввод
repeat
write('Введите размер матрицы от 2 до ',nmax,' n=');
readln(n);
until n in [2..nmax];
for i:=1 to n do
for j:=1 to n do
a[i,j]:=-10+random(21);
end;
procedure Vivod(a:Tmas;n:integer;s:string);
var i,j:integer;
begin
writeln(s);
for i:=1 to n do
 begin
  for j:=1 to n do
  write(a[i,j]:4);
  writeln;
 end;
end;
var a:Tmas;
    n,j:integer;
begin
Vvod(a,n);
Vivod(a,n,'Исходная матрица');
if row_zero(a,n)+col_prst(a,n)=2 then
 begin
  writeln('В матрице нет строк с нулевой сумой и в каждом столбце есть простые числа');
  for j:=1 to n do
  Sortirovka(a,n,j);
  Vivod(a,n,'Сортировка столбцов по невозрастанию сумм цифр элементов');
 end
else
 begin
  if row_zero(a,n)=0 then writeln('В матрице есть строки с нулевой суммой');
  if col_prst(a,n)=0 then writeln('Не в каждом столбце есть простые числа');
 end;
end.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.11.2019, 09:05
Помогаю со студенческими работами здесь

Работа с матрицей через процедуры - исправить код
почему не работает? объясните program f; uses crt; type matrix = array of integer; var mass: matrix;

Работа с матрицей - исправить ошибки в коде
работать не хочет... вылетает после 35 строки.(компилит нормально) как быть друзья? #include &lt;stdio.h&gt; #include...

Работа с матрицей. Какой необходим код?
Дан двумерный массив размера 3x4. Найти максимальный элемент во второй строке. Вывести на экран максимальный элемент и номера его строки и...

Работа с матрицей (дописать код) (не могу вывести)
Задание : Дана символьная матрица. Расстоянием между двумя строками назовем количество позиций, в которых различаются эти строки. Для...

Работа с мышью - исправить код
почему не работает сие творение .386 ;определяем с командами какого процессора работаем code segment 'code' ; определение кодового...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru