Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.12.2015, 13:20
Appolinariya_ Appolinariya_ вне форума
Прохожий
 
Регистрация: 26.09.2015
Сообщения: 13
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Три одинаковые цифры в числе

Дано натуральное число. Верно ли, что данное число содержит три одинаковые цифры?
В моем понимании эта программа должна выглядеть как-то так. Помогите, пожалуйста, исправить, что неправильно.
Мне кажется, что целесообразней присвоить переменной значение первой цифры и сравнить ее с остальными цифрами, ведь саму цифру, которая повторяется, выводить не требуется. Нет смысла проверять все цифры от 0 до 9, когда большей части из них вообще в числе не окажется.
Код HTML:
program qwe; {$APPTYPE CONSOLE} uses SysUtils; var n,m:string; k:integer; procedure proverka(const n:string); var c,i,j:integer; begin c:=length(n); k:=0; for i:=1 to c do begin m:=n mod 10; for j:=1 to c do begin if m=n[j] then inc(k); end; end; end; begin write('n= '); readln(n); poverka(n); if k=3 then write('Verno ') else write('Neverno '); readln; end.
Ответить с цитированием
  #2  
Старый 15.12.2015, 17:21
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

если у тебя n - это строка, то вот эта строчка
Код:
m:=n mod 10;
не скомпилируется.
во вторых, даже если сделаешь правильную проверку, надо об этом как-то сообщить пользователю.

А проверка должна быть такой

Код:
function proverka(const n:string):boolean;
var
 k,i,j:integer;
begin
 
  for i:=1 to length(n) do
  begin
    k:=0;//именно здесь;
    for j:=1 to length(n) do
    begin
      if n[i]=n[j] then
        inc(k);
    end;//for j

    if(k>=3) then begin//поставить строгое равенство, 
                              //если нужно только три повторения
      writeln(' digit ',n[i],' occurs ',k,' times');
      result:=true;
      exit;  
    end;

  end;//for i
 Result:=false;
end;
Кроме того, у Вас не сделана проверка, что введено именно число.
Ответить с цитированием
  #3  
Старый 15.12.2015, 20:36
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А я бы делал по другому. Всего цифр может быть 10 (0..9). Соответсвенно, можно просто в массиве посчитать количество цифр. Типа бин-сорт.
Понимаю, что фигово объяснил, код, наверное будет понятнее:
Код:
function Proverka(n : Integer) : Boolean;
var
  A : Array [0..9] Of Integer;
  I : Integer;
begin
  For I := 0 To 9 Do A[i] := 0; // инициализируем массив

  // Теперь считаем цифры
  While n > 0 Do
    Begin
      A[n mod 10] := A[n mod 10] + 1;
      n := n div 10;
    End;

  for I := 0 To 9 Do
    begin
      Result := A[i] => 3; // поставить строгое равенство, если нужно только три повторения
      If Result Then Break; // если есть цифра 3 раза (или больше), то выходим
    end;
end;
Ответить с цитированием
  #4  
Старый 16.12.2015, 14:24
Appolinariya_ Appolinariya_ вне форума
Прохожий
 
Регистрация: 26.09.2015
Сообщения: 13
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Код:
function proverka(const n:string):boolean;
var
 k,i,j:integer;
begin
 
  for i:=1 to length(n) do
  begin
    k:=0;//именно здесь;
    for j:=1 to length(n) do
    begin
      if n[i]=n[j] then
        inc(k);
    end;//for j

    if(k>=3) then begin//поставить строгое равенство, 
                              //если нужно только три повторения
      writeln(' digit ',n[i],' occurs ',k,' times');
      result:=true;
      exit;  
    end;

  end;//for i
 Result:=false;
end;

Я все поняла, только если вводить число, в котором три раза встречаются две цифры, то выведется только одна цифра, которая встречается первая. При вводе числа 2241211, выводит, что число 2 встречается два раза, хотя тут есть ещё и 1.
Ответить с цитированием
  #5  
Старый 16.12.2015, 15:24
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

lmikle, вываливаться нужно было сразу из первого цикла сделав в нем проверку на количество.

Appolinariya_, задача звучала так: Дано натуральное число. Верно ли, что данное число содержит три одинаковые цифры? Результатом решения этой задачи должен быть, на мой взгляд, ответ "Да" или "Нет". Никаких условий на количество и вывод цифр в ТЗ нет. Если подразумевалось посчитать кол-во цифр встречающихся больше 3 раз, и найти эти цифры - эти мысли следовало отразить в ТЗ.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #6  
Старый 16.12.2015, 16:23
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А если совсем G-кодом
Код:
var
 c: array[0..9] of integer = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

function proverka(const n: string): string;
var
 i, b: integer;
begin
 Result:= 'Neverno ';
 for i := 1 to Length(n)-1 do
  for b := 0 to 9 do
   if n[i] = IntToStr(b) then inc(c[b]);
 for b:= 0 to 9 do
  if c[b] = 3 then Result:= 'Verno ';
end;
Ответить с цитированием
  #7  
Старый 16.12.2015, 19:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Aristarh Dark
lmikle, вываливаться нужно было сразу из первого цикла сделав в нем проверку на количество.

Можно, но тут закладка на будущую модификацию. С учетем того, что там макс 30 итераций - пофиг. Даже для Int64 будет ну, скажем 60-70 итераций.

И еще один момент. Тут писал задачку для одного студозиуса. Ну и написал в стиле professional (как раз совмещение первичной обработки и сортировки в одном цикле), так потом пришлось объяснять отдельно, почему это будет работать и как устроено. Так что для студентов - чем проще, тем лучше.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:51.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025