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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2009, 19:07   #1
tanek
Форумчанин
 
Регистрация: 07.03.2009
Сообщений: 209
По умолчанию проблема с переменные

Добрый вечер..... Я написала программу которая определяет, есть ли среди цифр заданного N- значного целого числа одинаковые цифры и их количество.... Но у меня возникла такая проблема.... Мне нужно чтобы пользователь вводил только цифры, а при вводе символа программа бы опять просила бы ввода чисел...

program p6;

procedure input_numbers(var number:string);
begin
writeln('введите целое число');
readln(number);
end;
function definition_numbers(var number:string):integer;
var
i,j,records:integer;
begin
records:=0;
for i:=1 to length(number)-1 do
for j:=i+1 to length(number) do
if number[i]=number[j] then records:=records+1;

definition_numbers:=records;
end;
procedure output_summ(number:string);
begin

if definition_numbers(number)>0 then writeln('есть совпадения цифр')
else writeln('*нет совпадений цифр');
writeln('количество совпадений = ',definition_numbers(number));
writeln('для завершения программы нажмите Enter');
readln;
end;
var
number:string;

begin
input_numbers(number);
output_summ(number);
end.
tanek вне форума Ответить с цитированием
Старый 07.03.2009, 19:47   #2
Викдон
Форумчанин
 
Аватар для Викдон
 
Регистрация: 11.11.2008
Сообщений: 161
По умолчанию

Код:
const Mn: set of char ['0'..'9'];
   flag:boolean;

while true do
 begin
  flag:=false;
  input_numbers(number);
    for i:=1 to length(number) do
      if  not (number[i] in Mn)  then
        flag:=true;
    
   if flag=false then
    break;
end;
Викдон вне форума Ответить с цитированием
Старый 07.03.2009, 20:03   #3
tanek
Форумчанин
 
Регистрация: 07.03.2009
Сообщений: 209
По умолчанию

а можно это дело заменить условием repeat....until? и я что то не пойму как это дело вставить....
20:06
хех.... я поняла как ее вставить.... а как мне сделать это с помощью цикла repeat......until нет....
20:12
и скажите мне пожалуйста что означает set of в строке
const Mn: set of char ['0'..'9'];

Последний раз редактировалось mihali4; 07.03.2009 в 23:09. Причина: Объединение постов
tanek вне форума Ответить с цитированием
Старый 07.03.2009, 20:28   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

tanek, объявлена константа Mn представляющая собой
множество символов от '0' до '9'
Про множество можно прочитать в любой книжке по Паскалю, или, вкратце, можете посмотреть тут - Паскаль (язык программирования) — Википедия
или тут - Символы и строки. Множества (INTUIT.ru)

и ещё. Вы извините, но мне кажется, что Ваша функция definition_numbers работает неверно... ;-(
сколько одинаковых цифр в числе 1111 ?
мне кажется, что правильный ответ - 4
Так?...

ПОЗДРАВЛЯЕМ С 8-м Марта!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.03.2009, 20:58   #5
tanek
Форумчанин
 
Регистрация: 07.03.2009
Сообщений: 209
По умолчанию

опачки..... да...... я с вами полностью согласна..... а как же мне это исправить?
p.s. спасибочки огромное за поздравление
tanek вне форума Ответить с цитированием
Старый 07.03.2009, 21:54   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а попробуйте функцию заменить на:
Код:
function definition_numbers(const Number: string): integer;
var
  i, records: integer;
  CountDigit : array['0'..'9'] of byte;
  ch : char;
begin
  records := 0;
  for ch:=Low(CountDigit) to High(CountDigit)
     do CountDigit[ch] := 0; {обнулим массим-счётчик}
  for i := 1 to length(number) do
     inc( CountDigit[Number[i]]); {увеличиваем счётчик встреченного символа}
  for ch:=Low(CountDigit) to High(CountDigit)
  {для символов, которые встретились более одного раза 
     (т.е. были повторящиеся символы) суммируем то количество раз,
    сколько эти символы встретились!}
     do if CountDigit[ch]>1 then records := records + CountDigit[ch]; 


  definition_numbers := records;
end;
Алгоритм такой создаём массив цифр и банально, как только встретили цифру - увеличиваем счётчик.
в результате в массиве CountDigit мы получаем сколько раз встретился символ '0', сколько раз встретился символ '1' и т.д. до того, сколько раз встретился символ '9'...
потом в цикле проходим - если символ встретился более одного раза (значит есть повторы - то увеличиваем счётчик повторов на число - сколько раз встретился тот или иной символ...

Последний раз редактировалось Serge_Bliznykov; 07.03.2009 в 21:59.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.03.2009, 21:57   #7
pmarkov
Новичок
Джуниор
 
Регистрация: 07.03.2009
Сообщений: 1
По умолчанию

Молодец, у меня так не получалось.
pmarkov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переменные процесса SoLL Общие вопросы Delphi 2 31.12.2008 12:19
Переменные скрипта wall66 PHP 7 12.12.2008 17:14
Переменные REAL Terabit Паскаль, Turbo Pascal, PascalABC.NET 9 03.11.2008 21:26
переменные FoxPro Vasya Свободное общение 0 27.01.2008 00:29
Переменные из БД Кронос БД в Delphi 2 06.06.2007 11:26