Определить самое большое количество подряд идущих максимумов массива

Задача: 

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

Алгоритм решения задачи: 
  • Если очередной элемент массива равен 1 (максимуму), то увеличить "текущий" счетчик максимумов.
  • Иначе (встретили 0) сравнить значение текущего счетчика максимумов со значением, записанном в переменной для хранения наибольшего числа подряд идущих максимумов (max_count). Если значение счетчика больше, то перезаписать значение переменной max_count и запомнить индекс первого или последнего элемента в найденной последовательности.
Программа на языке Паскаль: 

const
	n = 50;
var
	arr: array[1..n] of byte;
	i,count,max_count,max_id: byte;
begin
	randomize;
	for i:=1 to n do begin // заполнение и вывод массива
		arr[i] := random(2); // диапазон [0;1]
		write(arr[i]:2);
		if i mod 10 = 0 then writeln; // переход после каждого 10-го на новую строку
	end;
 
	count := 0; // счетчик текущего количества максимумов
	max_count := 0; // запоминание самого большого количества максимумов
	max_id := 0; // индекс первого элемента в самой длинной последовательности максимумов
	for i:=1 to n do begin
		if arr[i] = 1 then
			count := count + 1
		else begin
			if count > max_count then begin
				max_count := count;
				max_id := i - count;
			end;
			count := 0
		end;			
	end;
	writeln('[',max_id,';',max_id+max_count-1,']');
end.

Пример выполнения кода:

 1 0 0 0 1 1 0 1 1 1
 0 1 0 0 0 1 0 0 1 1
 1 1 0 1 1 1 0 0 0 0
 1 0 1 1 1 1 1 0 1 0
 0 1 1 1 1 1 0 0 0 0
[33;37]

Комментарии

Код работает не для всех

Код работает не для всех случаев. Попробуйте его использовать, если вместо последних 4-х нулей в Вашем примере будут единицы... А если весь массив будет из единиц? ;-)

Да. Не обработан случай,

Да. Не обработан случай, когда массив заканчивается не нулем. Надо после цикла сделать дополнительную проверку.

I need help!!!!

Добрые люди, помогите, пожалуйста, решить 5 задач на языке высокого уровня Pascal(Turbo Pascal).

Меня даже чайником трудно назвать)) Учусь на заочном на факультете менеджмента.. к субботе нужно принести готовые решения задач.

Задание 1. Написать программу в которой вводятся два операнда Х и Y и знак операции (+,–,/,*). Вычислить результат Z в зависимости от знака. Предусмотреть реакции на возможный неверный знак операции, а также на ввод Y=0 при делении. Организовать возможность многократных вычислений без перезагрузки программа (т.е. построить цикл). В качестве символа прекращения вычислений принять ‘0’.

Задание 2. Вычислить функции Y=X2+Z для 0≤X≤4 с шагом 1 и 1≤Z≤10 с шагом 2.

Задание 3. Написать программу формирования числа (до 1000 руб.) в сумму прописью (например, 103=‘сто три рубля’).

Задание 4. Написать программу, которая из заданной даты (в диапазоне 1900..2100) формирует следующую. Исходная дата задается в форме текстовой строки вида ‘дд.мм.гггг’, например ’06.04.2002’. Подсказка: признаком високосного года является кратность года числу 4. Исключением являются года с двумя нулями на конце, число сотен в которых не кратно 4 (например 1800, 1900, 2100).

Задание 5. Запрограммировать процесс выбора в детской считалке. Пусть нужно выбрать случайным образом дежурного из группы в M человек. Дети становятся в круг и “считаются” по следующему правилу. Из круга по часовой стрелке удаляется каждый третий (шаг выбора N) участник, начиная с номера 1. В конце останется только один – дежурный. Для (см. рисунок) примера M=8, N=3. Тогда последовательно из круга выйдут номера 1,4,7,3,8,6. Наконец останутся только номера 2 и 5 и счет продолжается уже между ними 2→5→2. Таким образом, “повезло” номеру 5. Задания решить способом, указанным ниже.
Алгоритм 1.Создается массив Х длиной в несколько раз больше чем M. Обозначим его размерность MM (в программе задайте ММ=30). Первые его M элементов заполняются последовательными числами от 1 до M. Остальные элементы от M+1 до MM остаются пока пустыми (=0). Строится FOR-цикл перебора всех элементов X. В нем, если номер элемента I минус 1 кратен N, этот номер (он подчеркнут) печатается и человек выбывает. Если нет, элемент переносится в правый конец занятой части массива Х (в первую свободную клетку). Если встретился элемент =0, значит произошла обработка всех чисел и процесс прекращается. На рисунке показана динамика изменения массива Х. Первоначально в нем заняты только клетки с 1 по 8. Цифры 1,4,7 печатаются, а остальное (2,3,5,6,8) последовательно переносится в свободную область Х, из которой печатаются цифры 3 и 8 и т.д. пока не будут выведены все цифры. После 22-ой ячейки остаются еще MM-22 пустых клеток. Их просматривать не нужно и для этого в цикле должен быть предусмотрен выход при X[i]=0.

Х 1 2 3 4 5 6 7 8 2 3 5 6 8 2 5 6 2 5 2 5 5 5 дальше нули
1 4 7 3 8 6 2 5 выбывание
i: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

Заранее благодарна.

вторая

var
  rub: integer;
  a, b, c, d: integer;
 
begin
  write('введите сумму: '); readln(rub);
  if rub > 9999 then writeln('слишком большая сумма') else
  begin
    a := rub div 1000; 
    b := rub mod 1000 div 100;
    c := rub mod 100 div 10;
    d := rub mod 10;
 
    case a of
      1: write('тысячa ');
      2: write('две тысячи ');
      3: write('три тысячи ');
      4: write('четыре тысячи ');
      5: write('пять тысяч ');
      6: write('шесть тысяч ');
      7: write('семь тысяч ');
      8: write('восемь тысяч ');
      9: write('девять тысяч ');
    end;
    case b of
      1: write('сто ');
      2: write('двести ');
      3: write('триста ');
      4: write('четыреста ');
      5: write('пятьсот ');
      6: write('шестьсот ');
      7: write('семьсот ');
      8: write('восемьсот ');
      9: write('девятьсот ');
    end;
    if (c = 1) and (d in [0..9]) then 
      case d of
        0: write('десять ');
        1: write('одинадцать ');
        2: write('двенадцать ');
        3: write('тринадцать ');
        4: write('четырнадцать ');
        5: write('пяитнадцать ');
        6: write('шестьнадцать ');
        7: write('семьнадать ');
        8: write('восемьнадцать ');
        9: write('девятьнадцать ');
      end else
    begin
      case c of
        2: write('двадцать ');
        3: write('тридцать ');
        4: write('сорок ');
        5: write('пятьдесят ');
        6: write('шестьдесят ');
        7: write('семьдесят ');
        8: write('восемьдесят ');
        9: write('девяносто ');
      end;
      case d of
        1: write('один ');
        2: write('два ');
        3: write('три ');
        4: write('четре ');
        5: write('пять ');
        6: write('шесть ');
        7: write('семь ');
        8: write('восемь ');
        9: write('девять ');
      end;
    end;
  end; 
  if (c = 1) and (d in [1..9]) then write('рублей') else
    case d of
      1: write('рубль');
      2..4: write('рубля');
      5..9: write('рублей');
      0: write('рублей');
    end;
 
 
end.

задача 1

Описания поименованного типа

Написать программу на языке Паскаль , которая состоит из следующих действий :

1 . Описания поименованного типа , который состоит из трех компонент согласно варианту ( табл. 15 ) .
2 . Описания переменной индексированного типа ( одномерный массив) из 7 элементов , принадлежащих поименованном типа.
3 . Описания перечислювального типа согласно варианту ( табл. 15 ) .
4 . Описания и инициирования переменных индексированного типа целых , действительных , символьных или логических значений в зависимости от варианта ( табл. 15 ) .
5 . Инициирование элементов переменной , описанной в п.2 данной задачи , используя переменные, описанные в п.4 данной задачи , и значение перечислювального типа п.3 .
6 . Обработки одномерного массива согласно варианту ( табл. 15 ) .

Табл.15
Состав поименованного типа данных:
1-я компонента Имя - значение перечислений типа;
2-я компонента: Средний балл - Вещественные значения;
3-я компонента: Курс - целое значение

Вычислить:
Процент студентов-отличников 1-го курса