Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2009, 20:00   #1
llTibegll
Новичок
Джуниор
 
Регистрация: 05.11.2009
Сообщений: 7
По умолчанию Задача о шести подряд идущих единицах.

Здравствуйте помогите мне пожалуйста с данной задачкой:

Вводиться натурально число. Проверить есть ли в введённом числе 6 подряд идущих единиц.

Вот мой код задачи:

Код:
procedure TForm1.Button1Click(Sender: TObject);

var n,a,sum:integer;
begin
n:=StrToInt(edit1.Text);
sum:=0;
repeat
a:=n mod 10;
  if a=1 then
  begin
  sum:=sum+a;
  n:=n div 10;
  end
  else n:=n div 10;
until N=0;
if sum= then ShowMessage('yes') else
ShowMessage('No');


end;

end.
Проблема в том что программа считает, есть ли вообще в числе 6 единиц, а нужно чтобы считала, есть ли 6 единиц подряд.

к Примеру число 211111156 - должно сказать что число верно, а число к примеру 21112111 - не верно.

Помогите пожалуйста, заранее очень вам благодарен.

Последний раз редактировалось Stilet; 06.11.2009 в 10:04.
llTibegll вне форума Ответить с цитированием
Старый 05.11.2009, 20:32   #2
NeshSoft
Максим Николаев
Форумчанин
 
Аватар для NeshSoft
 
Регистрация: 15.02.2009
Сообщений: 170
По умолчанию

В таком случае лучше работать с числом как с текстом. И просто найти в строке s подстроку '111111' - реализуется одной строкой...
NeshSoft. Программирование на заказ для студентов. Delphi/Pascal. Подробнее на сайте neshsoft.narod.ru
NeshSoft вне форума Ответить с цитированием
Старый 05.11.2009, 20:36   #3
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

1. Переводим число в строку (IntToStr);
2. Объявляем счетчик подсчета количества цифр '1' ;
3. Cчитываем строку посимвольно и сравниваем с символом '1'.При совпадении увеличиваем счетчик на еденицу и проверяем не достиг ли счетчик значения 6.(если достиг - значит есть шесть едениц подряд.Далее можно или закончить проверку или же продолжать проверку далее - это надо уточнить условием задачи)
Если нет совпадения с '1' счетчик сбрасываем в "ноль" и продолжаем проверку.
Вот такой вот алгоритм. Программная реализация не должна вызывать затруднения.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 05.11.2009, 20:36   #4
llTibegll
Новичок
Джуниор
 
Регистрация: 05.11.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от NeshSoft Посмотреть сообщение
В таком случае лучше работать с числом как с текстом. И просто найти в строке s подстроку '111111' - реализуется одной строкой...
согласен, но у меня лабораторная работа по теме "Циклы", поэтому не могу использовать функцию Pos, или какую либо другу, в этом вся и проблема.
llTibegll вне форума Ответить с цитированием
Старый 05.11.2009, 20:39   #5
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Вот и используй цикл по условию - " до конца строки" в методе #3.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 05.11.2009, 20:43   #6
llTibegll
Новичок
Джуниор
 
Регистрация: 05.11.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от DeKot Посмотреть сообщение
1. Переводим число в строку (IntToStr);
2. Объявляем счетчик подсчета количества цифр '1' ;
3. Cчитываем строку посимвольно и сравниваем с символом '1'.При совпадении увеличиваем счетчик на еденицу и проверяем не достиг ли счетчик значения 6.(если достиг - значит есть шесть едениц подряд.Далее можно или закончить проверку или же продолжать проверку далее - это надо уточнить условием задачи)
Если нет совпадения с '1' счетчик сбрасываем в "ноль" и продолжаем проверку.
Вот такой вот алгоритм. Программная реализация не должна вызывать затруднения.
если вас не затруднит, то можете написать код программы? , а то я не совсем понимаю как ваш алгоритм перевести в код.
llTibegll вне форума Ответить с цитированием
Старый 05.11.2009, 20:45   #7
NeshSoft
Максим Николаев
Форумчанин
 
Аватар для NeshSoft
 
Регистрация: 15.02.2009
Сообщений: 170
По умолчанию

Цитата:
Сообщение от llTibegll Посмотреть сообщение
Проблема в том что программа считает, есть ли вообще в числе 6 единиц, а нужно чтобы считала, есть ли 6 единиц подряд.
А что мешает обнулить счетчик единиц, если текущая цифра не "1".

В любом случае я согласен с DeKot, цикл можно применить более эффективно. А использовать столько раз деление - неразумно.
NeshSoft. Программирование на заказ для студентов. Delphi/Pascal. Подробнее на сайте neshsoft.narod.ru
NeshSoft вне форума Ответить с цитированием
Старый 05.11.2009, 20:54   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а что должна выдать программа, если в числе 7 (или более единиц подряд!?

а так вот простенький вариант:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var n, a, CntOne: integer;
  Is6DigitFound : boolean;
begin
  n := StrToInt(edit1.Text);
  CntOne := 0;
  Is6DigitFound := False;
  repeat
    a := n mod 10;
    if a = 1 then
    begin
      CntOne := CntOne +1;
      if CntOne = 6 then Is6DigitFound := true;
    end
    else
      // если встретили не единицу
      //     - сбрасываем счётчик единиц
      CntOne := 0;
    n := n div 10;
  until (N = 0) or Is6DigitFound;
  if Is6DigitFound
   then ShowMessage('yes')
   else ShowMessage('No');
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.11.2009, 21:12   #9
llTibegll
Новичок
Джуниор
 
Регистрация: 05.11.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а что должна выдать программа, если в числе 7 (или более единиц подряд!?

а так вот простенький вариант:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var n, a, CntOne: integer;
  Is6DigitFound : boolean;
begin
  n := StrToInt(edit1.Text);
  CntOne := 0;
  Is6DigitFound := False;
  repeat
    a := n mod 10;
    if a = 1 then
    begin
      CntOne := CntOne +1;
      if CntOne = 6 then Is6DigitFound := true;
    end
    else
      // если встретили не единицу
      //     - сбрасываем счётчик единиц
      CntOne := 0;
    n := n div 10;
  until (N = 0) or Is6DigitFound;
  if Is6DigitFound
   then ShowMessage('yes')
   else ShowMessage('No');
end;
Спасибо вам огромное, работает. Если 7 или более едениц и они подряд, то должна программа сказать ДА, если 7 и более цифр идут не подряд, то программа говорит НЕТ. Только могли бы вы объяснить что это Is6DigitFound : boolean; ?
llTibegll вне форума Ответить с цитированием
Старый 05.11.2009, 22:21   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
могли бы вы объяснить что это Is6DigitFound : boolean;
это переменная логического типа (логический, или ещё говорят "булевый" тип - это тип данных, который может принмать только два значения - ИСТИНА или ЛОЖЬ (TRUE или FALSE)
имя у этой переменной выбрано так, чтобы можно было догадаться, для чего она нужна:
Is6DigitFound - в вольном перевод это "Найдено6цифр"
Это своеобразный флажок - который мы устанавливаем в ИСТИНУ, если нашли шесть единиц подряд.
он же проверяется в цикле (в операторе UNTIL), поэтому, если мы нашли 6 единиц - то всё, выходим из цикла.
и последнее, по этой переменной мы решаем, какое сообщение выдавать, Yes или No
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск двух одинаковых строк идущих последовательно stasbz Microsoft Office Excel 4 21.06.2009 18:40
Массив чисел (найти 4 идущих подряд чётных числа) SeregaKo Общие вопросы Delphi 2 18.05.2009 23:09
Изобрадение идущих часов StudeHt Паскаль, Turbo Pascal, PascalABC.NET 2 03.05.2009 19:21
найти подпоследовательность из подряд идущих элементов с наибольшей суммой на С++ aj_tramp Помощь студентам 2 12.12.2008 08:57