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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2009, 00:31   #1
fawr
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 25
По умолчанию задача с функцией

дано натуральное n значное число P. Верноли что данное число содержит три одинаковые цифры? задача pascal
вобщем число вводиться с клавиатуры, а вот то что n значное - это вообще всеголишь заскоки препода... пусть будет n<999999...
ну так вот... я вообще не представляю как это можно осушиствить сравнение каждой цифры...
есть пара идей а вы подскажите что лучше и вообще имеет ли смысл, будет ли работать...:
1) думал ввести каждую цифру числа как элемент массива... а потом производить сравнение каждого элемента со всеми остальными через цикл( так как n число занаков будет указано) и в случае совпадения прибавлять один и уже потом в конце стравнить сумму этих прибавлений с 3 - вывести ответ верно или нет
2) отделять от введённого числа каждую цифру через mod, div и тут же производить её сравнение... только вот с чем... и это через цикл...
------------------------- также необходимо в коде использовать function...
я думал всётаки через массив... но не могу придумать что там можно будет запихнуть в функцию...
fawr вне форума Ответить с цитированием
Старый 19.10.2009, 00:33   #2
Вавел из ГМТУ
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 896
По умолчанию

Какой ЯП? (10 символов)
Вавел из ГМТУ вне форума Ответить с цитированием
Старый 19.10.2009, 00:53   #3
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
uses crt;
var
   p,n,i,j,k:integer;
   mas:array[1..6] of integer;
begin clrscr;
write('Vvedite P: ');
readln(p);
if p < 100 then
   writeln('Net')
else
    begin
    n:=1;
    while p > 0 do
            begin
             mas[n]:=p mod 10;
             p:=p div 10;
             inc(n);
            end;
    k:=0;
    for i:=1 to n-1 do
    begin
    for j:=1 to n-1 do
        if mas[i] = mas[j] then
           inc(k);
    if k = 3 then
       begin
            writeln('Da');
            break;
       end
       else
       begin
            writeln('Net');
                   break;
       end;
       k:=0;
    end;
    end;
end.
В функцию запихни сам

Цитата:
я думал всётаки через массив... но не могу придумать что там можно будет запихнуть в функцию...
Сделай функцию что бы возвращала true (если нашло) или false (если не нашло) и в функцию передавай твое введенное число.

Последний раз редактировалось profi; 19.10.2009 в 01:00.
profi вне форума Ответить с цитированием
Старый 19.10.2009, 01:01   #4
Грымзик
Пользователь
 
Регистрация: 17.09.2009
Сообщений: 40
По умолчанию

За один проход можно. Создаешь массив из
10 элементов. m[i] показывает сколько раз
цифра i-1 встречалась в числе.
inc(m[(p mod 10)+1]);
и сразу же проверяешь не превысило ли значение 3.
Тут и n вообще знать не надо.
Грымзик вне форума Ответить с цитированием
Старый 19.10.2009, 02:07   #5
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Я бы сделал вот так
Код:
Const NumBase = 10; { Основание системы счисления. Обычно пользуемся десятичной. }
Const NumDigitsNeeded=3;
var count:array[0..(NumBase-1)] of Longint;

function CharToDigit(c:char):Byte;
Begin
  CharToDigit := 255;
  if (ord(c)<=ord('9')) then CharToDigit := ord(c)-ord('0');

  { Это на случай системмы с основанием больше 10 например для шестнадцатеричной }
  if ((ord(c)>=ord('A')) and (ord(c)<=ord('Z'))) then CharToDigit := ord(c)-ord('A')+10;
  if ((ord(c)>=ord('a')) and (ord(c)<=ord('z'))) then CharToDigit := ord(c)-ord('a')+10;
End;

function IsCorrectNumber(s:string):boolean;
var i:word;
Begin
  IsCorrectNumber := length(s)<>0;
  for i := 1 to length(s) do
  Begin
    if (CharToDigit(s[i])>=NumBase) then IsCorrectNumber := false;
  End;
End;

function DigitToChar(d:Byte):char;
Begin
  if (d<10) then 
    DigitToChar := chr(d+ord('0'))
  else
  { Это на случай системмы с основанием больше 10 например для шестнадцатеричной }
    DigitToChar := chr(d-10+ord('A'))
End;

var s:string;
    i:word;
Begin
  Write('Введите число:'); ReadLN(s);
  while (IsCorrectNumber(s)=false) do
  Begin
    WriteLN('Вы ввели неправильное число');
    Write('Введите число:'); ReadLN(s);
  End;
  for i:=1 to length(s) do
  Begin
    Inc(count[CharToDigit(s[i])]);
  End;
  for i:= 0 to (NumBase-1) do
  Begin
    if (count[i]=NumDigitsNeeded) then Begin
      WriteLN('Цифра ',DigitToChar(i),' встречается ',count[i],' раз');
    End;
  End;
end.
Единственное здесь не сделал проверку числа на нули в начале. Например он выдаст что цифра 0 встречается в числе 00150 три раза.

И ещё одно. Этот код правильно будет рабоотать на Borland Pascal. А на Delphi возможно придётся немного поправить. Потому как там по дефалту используются длинные строки. И если я правильно помню индиксы смволов будут не 1..length(s) а 0..(length(s)-1)
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 19.10.2009 в 02:12.
val_nnm вне форума Ответить с цитированием
Старый 25.10.2009, 15:50   #6
fawr
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 25
По умолчанию

вобщем полный фейл(( то что написал профи нормальный код, тоесть всё логично... однако он не правильно рабоатет... НО! мне счас не надо чтобы работало правильно, потому что сидеть и пыпаться добиться его работы счас бессмысленно - его никто проверять на работоспособность не будет... я вот написал через процедуру и функцию - подскажите на счёт переменных, правильно ли я написал? мне надо чтобы код вот этот выглядел как правильный... запускать его не будут

uses crt;
var
p,n,i,j,k,m:integer;
mas:array[1..9] of integer;
procedure vmassiv(var p,n:integer; m:integer);
begin
while p>0 do
begin
m:=p mod 10;
mas[n]:=m;
p:=p div 10;
inc(n);
end;
end;
function proverka(i,j,k:integer):integer;
begin
for j:=1 to n-1 do
begin
if mas[i]=mas[j] then
inc(k);
end;
proverka:=k;
end;

begin
clrscr;
write('Vvedite P: ');
readln(p);
if p < 100 then
writeln('Net. Ne verno.')
else
begin
n:=1;
vmassiv(p,n,m);
k:=0;
for i:=1 to n-1 do
if proverka(n,i,j) = 3 then
writeln('Da. Verno.')
else
writeln('Net. Ne verno.');
k:=0;
end;
readln;
end.
fawr вне форума Ответить с цитированием
Старый 25.10.2009, 16:12   #7
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

Цитата:
Сообщение от fawr Посмотреть сообщение
вобщем полный фейл(( то что написал профи нормальный код, тоесть всё логично... однако он не правильно рабоатет... НО! мне счас не надо чтобы работало правильно, потому что сидеть и пыпаться добиться его работы счас бессмысленно - его никто проверять на работоспособность не будет... я вот написал через процедуру и функцию - подскажите на счёт переменных, правильно ли я написал? мне надо чтобы код вот этот выглядел как правильный... запускать его не будут
что это за поток сознания?
m0nax вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с функцией Ximerka Паскаль, Turbo Pascal, PascalABC.NET 0 09.04.2009 00:14
Задача с функцией Серафимий Долговяз Помощь студентам 7 05.02.2009 08:09
Помогите с функцией Родион Общие вопросы Delphi 3 08.05.2008 19:18