Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
1 / 1 / 0
Регистрация: 18.03.2020
Сообщений: 81

Определить количество столбцов с нулевыми элементами и номер строки с самой длинной серией одинаковых элементов

13.04.2020, 19:58. Показов 4388. Ответов 6

Студворк — интернет-сервис помощи студентам
Дана целочисленная прямоугольная матрица. Определить:
A. количество столбцов, содержащих хотя бы один нулевой элемент (оформить в виде функции);
B. номер строки, в которой находится самая длинная серия одинаковых элементов (оформить в виде процедуры).

Я пытаюсь сделать все в 1м ведь если объявлять функцию отдельно, онав не должна мешать исполняться процедуре.
Желательно подробное описание, что бы я мог разобрать ее для себя на части и понять в общем и полностью.
Заранее спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.04.2020, 19:58
Ответы с готовыми решениями:

Определить число столбцов, содержащих хотя бы 1 нулевой элемент и номер строки с самой длинной серией одинаковых чисел
В целочисленной прямоугольной матрице определить кол-во столбцов, содержащих хотя бы 1 нулевой элемент и номер строки с самой длинной...

Двумерный массив. Определить номер строки с самой длинной серией одинаковых элементов
Всем привет! Нужна помощь в следующем задании: дана целочисленная прямоугольная матрица, определить номер строки с самой длинной серией...

Цикл, определяющий номер строки, с самой длинной серией одинаковых элементов
Номер строки, в которой находится самая длинная серия одинаковых элементов. Помогите пожалуйста написать цикл, не представляю, как это...

6
2374 / 776 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
14.04.2020, 02:32
Лучший ответ Сообщение было отмечено AlexeyNo как решение

Решение

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
program Project1;
 
uses
  CRT;
const
  maxelem = 20;
 
type
  TMatrint = array[1..maxelem+1,1..maxelem+1] of integer;
 
 
procedure InfInMatr(var arr: TMatrint; var nn: integer);
{Процедура для ввода информации в матрицу}
var
  i,j: integer;
begin
  write('Введите значение размерности матрицы (не более ',maxelem,'): ');
  repeat
    Readln(nn);
    if (nn < 1) or (nn > maxelem) then
      writeln('Ошибка ввода! Повторите попытку.')
    else
      break;
  until false;
  for i:= 1 to nn do
    for j:= 1 to nn do
    begin
      write('Введите значение элемента [',i,',',j,']: ');
      Read(arr[i,j]);     { Ввод значений в двумерный массив.}
    end;
  Readln;
end;
 
procedure InfOutMatr(arr: TMatrint; nn: integer);
{Процедура для вывода матрицы в консоль}
var
  i,j: integer;
begin
  for i:= 1 to nn do
    begin
      for j:= 1 to nn do
        write(' ',arr[i,j]:5);    { Вывод двумерного массива в консоль.}
      Writeln;
    end;
end;
 
 
function NumberColNullElement(arr: TMatrint; nn: integer): integer;
{ Функция, которая подсчитывает количество столбцов матрицы в которых
  содержатся элементы с нулевым значением.}
var
   i,j,k: integer;
begin
  k:= 0;
  for j:= 1 to nn do          {Перебор индексов столбцов}
    for i:= 1 to nn do        {Перебор индексов строк}
        if arr[i,j] = 0 then  {Условие для поиска элементов с нулевым значением}
          begin
            inc(k);         {Подсчет количества совпадений}
            break;          {Прерывание работы второго цикла.
                             Если прерывания не будет, то программа будет подсчитывать
                             все нулевые элементы в массиве}
          end;
  NumberColNullElement:= k;
end;
 
 
procedure NumRowMaxSeriesElement(arr: TMatrint; nn: integer; var NumberRow: integer);
{ Процедура, которая находит номер строки с самой длинная
  серией одинаковых элементов}
var
   i,j,k: integer;  { Вспомогательные переменные для организации циклов.}
   maxseries: integer; { Переменная для хранения значения максимального количества обнаруженных серий в строках массива }
   maxrow: integer; { Переменная для хранения значения максимального количества обнаруженных серий в одной строке }
   st: integer; { Вспомогательная переменная для хранения значения начального адреса серии одинаковых элементов}
begin
  maxrow:= 0;
  for i:= 1 to nn do    { Цикл для перебора номеров  строк}
    begin
      st:= -1;  {Начальные значения флага и наибольшей длины}
      maxseries:= 0;
      for j:= 2 to nn+1 do   {Цикл для перебора номеров  столбцов с учетом выхода за диапазон}
        begin
          if arr[i,j-1] = arr[i,j] then {пока подряд одинаковые}
            begin
              if st < 0 then
                st:= j-1;   {запоминаем начало интервала}
            end
          else
            if st > 0 then {если элемента не равен, запоминаем номер этого элемента}
              begin
                k:= j-st;{считаем длину пройденного интервала}
                if k > maxseries then  {если она больше всех}
                  maxseries:= k; {то она макс}
                st:= -1; {ищем новый интервал}
              end;
        end;
      if maxseries > maxrow then  {Условие для поиска наибольшего количества серий одинаковых элементов среди строк}
        begin
          maxrow:= maxseries;
          NumberRow:= i;      {Нахождение номера строки с наибольшим количеством найденных серий}
        end
  end;
end;
 
 
var
  a: TMatrint; { Переменная для хранения матрицы}
  n: integer; { Переменная для хранения значения размерности матрицы}
  number: integer; {Переменная для хранения значения номера строки с наибольшим количеством серий элементов}
begin
  InfInMatr(a,n);          { Ввод информации в матрицу}
  clrscr;
  writeln('Исходная матрица: ');
  InfOutMatr(a,n);         { Вывод элементов матрицы в консоль}
  writeln('Количество столбцов, в которых содержатся нулевые элементы: ',NumberColNullElement(a,n));
  NumRowMaxSeriesElement(a,n,number); {Поиск номера строки в которой наибольшее количество серий}
  writeln('Номер строки, в которой наибольшее количество серий из элементов: ',number);
  Readln;
end.
1
1 / 1 / 0
Регистрация: 18.03.2020
Сообщений: 81
29.06.2020, 18:18  [ТС]
Есть ли вариант оформить ее короче?
0
Модератор
10416 / 5703 / 3401
Регистрация: 17.08.2012
Сообщений: 17,363
29.06.2020, 21:39
Лучший ответ Сообщение было отмечено AlexeyNo как решение

Решение

Не по теме:

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

Дубли объединены.



Можно и покороче. Убрать все подпрограммы, не требующиеся по заданию, и упростить алгоритм процедуры определения строки с максимальной серией.
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
const
  m = 20; //максимальный ранг матрицы
 
type
  matrix = array[1..m, 1..m] of integer; //тип для матрицы
 
function z(const x: matrix; p: integer): integer; //копия NumberColNullElement от ValentinNemo
var
  i, j, k: integer;
begin
  k := 0;
  for j := 1 to p do
    for i := 1 to p do
      if x[i, j] = 0 then
        begin
          inc(k);
          break
        end;
  z := k
end;
 
procedure s(const x: matrix; p: integer; var im: integer); //матрица, её ранг, строка с макс. длиной серии
var
  i, j, q, qm: integer; //счётчики, текущая длина серии, максимальная длина серии
begin
  im := 1; //пока считаем, что первая строка - с макс. серией
  qm := 1; //пока максимальная длина серии = 1
  for i := 1 to p do //цикл по строкам
    begin
      q := 1; //пока текущая длина серии = 1
      for j := 2 to p do //цикл по элементам строки
        if x[i, j - 1] = x[i, j] then //если одинаковые элементы подряд (серия), то
          begin
            inc(q); //увеличиваем текущую длину серии
            if q > qm then //если размер текущей длины серии больше максимальной длины серии, то
              begin
                qm := q; //запминаем новую максимальную длину серии
                im := i //и запоминаем новый номер строки с макс. серией
              end
          end
        else q := 1 //иначе текущая длина серии = 1
    end
end;
 
var
  a: matrix; //матрица
  i, j, n, imax: integer; //счётчики, ранг матрицы, номер строки с максимальной серией
begin
  repeat //ввод ранга матрицы с проверкой диапазона
    write('n в диапазоне [1..', m, ']; n = ');
    readln(n)
  until n in [1..m];
  writeln('Введите матрицу ', n, 'x', n, '.');
  writeln('Числа в строке разделяйте прбелами, строки разделяйте нажатием <Enter>.');
  for i := 1 to n do //ввод матрицы
    for j := 1 to n do
      read(a[i, j]);
  readln;
  writeln('Количество столбцов с нулями: ', z(a, n)); //пункт A
  s(a, n, imax); //пункт B
  writeln('Строка с длиннейшей серией одинаковых элементов: ', imax);
  readln
end.
Если есть несколько строк с максимальной серией, то выводится номер первой найденной строки. Если нужен номер последней найденной строки, нужно заменить
Pascal
35
            if q >= qm then
Если нужны номера всех строк с максимальной серией, требуется существенная доработка программы. Но это вряд ли, поскольку в задании говорится про строку, а не про строки.
1
1 / 1 / 0
Регистрация: 18.03.2020
Сообщений: 81
29.06.2020, 22:14  [ТС]
Спасибо а ввод от случайной последовательности чисел здесь подойдет?
к read(a[i,j]); немного изменить a[i,j]:=random(100);???
0
Модератор
10416 / 5703 / 3401
Регистрация: 17.08.2012
Сообщений: 17,363
29.06.2020, 22:50
Лучший ответ Сообщение было отмечено AlexeyNo как решение

Решение

Подойдёт, и строку 58 сотрите. Она нужна для чистки буфера клавиатуры, чтобы программа не закрылась, не дав налюбоваться результатом. Но, раз уж рандом, то и ранг матрицы незачем вводить и передавать как формальный параметр в подпрограммы.

Сейчас напишу вариант с рандомом.

Добавлено через 16 минут
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
const
  n = 10; // ранг матрицы
 
type
  matrix = array[1..n, 1..n] of integer; //тип для матрицы
 
function z(const x: matrix): integer; //копия NumberColNullElement от ValentinNemo
var
  i, j, k: integer;
begin
  k := 0;
  for j := 1 to n do
    for i := 1 to n do
      if x[i, j] = 0 then
        begin
          inc(k);
          break
        end;
  z := k
end;
 
procedure s(const x: matrix; var im: integer); //матрица, её ранг, строка с макс. длиной серии
var
  i, j, q, qm: integer; //счётчики, текущая длина серии, максимальная длина серии
begin
  im := 1; //пока считаем, что первая строка - с макс. серией
  qm := 1; //пока максимальная длина серии = 1
  for i := 1 to n do //цикл по строкам
    begin
      q := 1; //пока текущая длина серии = 1
      for j := 2 to n do //цикл по элементам строки
        if x[i, j - 1] = x[i, j] then //если одинаковые элементы подряд (серия), то
          begin
            inc(q); //увеличиваем текущую длину серии
            if q > qm then //если размер текущей длины серии больше максимальной длины серии, то
              begin
                qm := q; //запминаем новую максимальную длину серии
                im := i //и запоминаем новый номер строки с макс. серией
              end
          end
        else q := 1 //иначе текущая длина серии = 1
    end
end;
 
var
  a: matrix; //матрица
  i, j, imax: integer; //счётчики, ранг матрицы, номер строки с максимальной серией
begin
  randomize;
  for i := 1 to n do //генерация и печать матрицы
    begin
      for j := 1 to n do
        begin
          a[i, j] := -9 + random(19);
          write(a[i, j]:3)
        end;
      writeln
    end;
  writeln('Количество столбцов с нулями: ', z(a)); //пункт A
  s(a, imax); //пункт B
  writeln('Строка с длиннейшей серией одинаковых элементов: ', imax);
  readln
end.
Ранг матрицы сделал сравнительно небольшой. Элементы генерируются в диапазоне [-9; 9]. Если взять предложенный Вами диапазон [0; 99] (это диапазон random(100)), то столбцы с нулями и подряд идущие одинаковые элементы в строках генерируются крайне редко, и ответ практически всегда
Количество столбцов с нулями: 0
Строка с длиннейшей серией одинаковых элементов: 1
При этом максимальная длина серии равна 1, иными словами, в (первой) строке нет подряд идущих одинаковых элементов.
1
1 / 1 / 0
Регистрация: 18.03.2020
Сообщений: 81
29.06.2020, 22:56  [ТС]
Большое спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.06.2020, 22:56
Помогаю со студенческими работами здесь

Найти номер строки матрицы с самой длинной серией одинаковых элементов
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { ...

Найти строку матрицы с самой длинной серией одинаковых элементов
Нужно в матрице найти строку с самой длинной серией одинаковых элементов.Подскажите, пожалуйста, хоть идею как это сделать, а то в голове...

Вывести номер строки матрицы с самой длинной последовательностью одинаковых элементов
Пожалуста, кто знает решите пожалуста задачку: Дана квадратная матрица m*m, написать программу которая выводит номер той строки в матрице...

Определить номер строки матрицы, которая содержит максимальное количество одинаковых элементов
3. Дана целочисленная прямоугольная матрица. Определить номер строки матрицы, которая содержит максимальное количество одинаковых...

Определить количество элементов в самой длинной подпоследовательности из подряд идущих нулей
Помогите, пожалуйста, решить! Очень надо, но не знаю как их решать! 1. В любой последовательности из n целых чисел, вводимых с...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru