Помощь - Поиск - Пользователи - Календарь
Полная версия: Выделение троичного чила кратного 3
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Flyer
Помогите пожалуйста решить задачу выделения троичного числа на паскале.Програма должна быть написана на стандарте языка. Так же нельзя использовать массивы и строки....
Обрабатываемый текст вводиться с клавиатуры. Пример:
qjhjereh 1231 1100 sdhf1231 hjh110
Результат: 1100
Заранее благодарен...
klem4
Объясни задание по подробней, что за троичные числа ? unsure.gif

Гость
Числа в троичной системе счисления всмысле)
klem4
Вводишь строку, разбиваешь ее на слова ( Разбиение на слова. Все способы. ) Выделяешь очередное слово, идешь по нему, если в нем есть какие-либо символы кроме (0, 1, 2) то это НЕ число в троичной системе.

Вроде все smile.gif
мисс_граффити
klem4, почти.
Цитата
Так же нельзя использовать массивы и строки....
volvo
Цитата
Так же нельзя использовать массивы и строки....
Тогда, как, извини, ты собрался хранить результат? Допустим, я буду вводить символы, которые гарантированно составляют число в системе счисления с основанием 3, КАК ты это число запомнишь (без строк и массивов), чтобы потом его же напечатать в качестве результата?

(я не сказал, что это невозможно, просто интересно, как ТЫ это себе представляешь?)
Гость
В том то и дело что никак не представляю,поэтому и обратился за помощью....
klem4
Какое-то странное задание, ну раз ничего нельзя использовать, буднем использовать видеопамять smile.gif) Это ведь не запрещено ?

Хотя это конечно маразм crazy.gif Но для хранения нашей последовательности мы не используем ни байта. Ну точнее один байт - ch и тот после ввода естественно будет хранить последний символ.

uses crt;

type

TVideoWord = record
Symbol, Attrib: Byte;
end;

TVideoText = array[1..43 * 50] of TVideoWord;

PVideoText = ^TVideoText;

function GetScreenPtr: Pointer;
begin
if ( Mem[0:$0410] and $30) = $30 then
GetScreenPtr := Ptr($B000, 0)
else
GetScreenPtr := Ptr($B800, 0)
end;

var
V: PVideoText;
Ch: char;
Count, i, back, j: Integer;
bad: Boolean;
begin
Clrscr;

V := GetScreenPtr;

Count := 0;

repeat
Ch := readkey;
if Ch <> #13 then begin
write(Ch);
inc(Count);
end;
until ch = #13;

writeln;

i := 1;

while (i <= count) do begin
while (Char(V^[i].Symbol) = ' ') and (i <= count) do inc(i);
if i <= count then begin
back := i;
bad := false;
while (Char(V^[i].Symbol) <> ' ') and (i <= count) do begin
if not(Char(V^[i].Symbol) in ['0'..'2']) then bad := true;
inc(i);
end;
if not bad then begin
writeln;
for j := back to pred(i) do write(Char(V^[j].Symbol));
end;
end;
end;

Readln;
end.
volvo
Угу...

Или рекурсия rolleyes.gif
Гость
спасибо большое
klem4
Гость, если честно, я очень сомневаюсь что задачу надо решать именно так smile.gif)))
Уточни задание, я уверено как минимум одну строковую переменную использовать можно. (Чтобы ввести последовательность). А больше и не надо ничего smile.gif



Volvo, а как еще можно ? Ума не приложу ...
volvo
Я написал выше - рекурсией smile.gif Зачем использовать строку, если можно задействовать стек? Правда, будут небольшие проблемы при печати числа (оно захочет печататься "задом наперед", но это тоже преодолимо) smile.gif

klem4 Попробуй, кстати, хорошая разминка для мозгов будет smile.gif
klem4
Аа ты имеешь в виду по такомуже принципу (юзать видеопамять) но через стек, понятно, можно попробовать.
volvo
Цитата
(юзать видеопамять)
Я этого не говорил, это ТЫ сказал... Про видеопамять в моем посте не было ни слова...

Все я понял. klem4
мисс_граффити
а файлы можно использовать?...
Гость
используется только стандартный ввод и стандартный вывод...
volvo
В общем, вот что у меня получилось (как и заказывали, без массивов, без строк, без файлов) smile.gif

Решение пока не открываю, может, кто-то захочет решить самостоятельно...

Спойлер (Показать/Скрыть)
klem4
smile.gif

uses crt;

type

PList = ^TList;

TList = record
Data: Char;
Next: PList;
end;

TStack = Object
public
constructor Create;
destructor Free;
procedure Push(value: Char);
procedure DisplayPart(_from, _to: PList);
procedure Main;
private
First: PList;
end;


constructor TStack.Create;
begin
First := nil;
end;

destructor TStack.Free;
var
R, T: PList;
begin

R := First;

while (R <> nil) do begin
T := R^.Next;
Dispose( R );
R := T;
end;

end;

procedure TStack.Push(value: Char);
var
R, T: PList;
begin

GetMem(R, sizeof(TList));

R^.Data := value;
R^.Next := nil;

if First = nil then First := R

else begin

T := First;

while (T^.Next <> nil) do T := T^.Next;

T^.Next := R;

end;

end;

procedure TStack.DisplayPart(_from, _to: PList);
var
R: PList;
begin

R := _from;

writeln;

while (R <> nil) and (Integer® <= Integer(_to)) do begin
write(R^.Data);
R := R^.Next;
end;

end;

procedure TStack.Main;
var
i, f, t: PList;
ch: Char;
bad: Boolean;
begin

repeat
ch := readkey;
if ch <> #13 then begin
write(ch);
Push(ch);
end;
until ch = #13;

writeln;

i := First;

while (i <> nil) do begin
while (i <> nil) and (i^.Data = ' ') do i := i^.Next;
if i <> nil then begin
f := i;
bad := false;
while (i <> nil) and (i^.Data <> ' ') do begin
if not (i^.Data in ['0'..'2']) then bad := true;
i := i^.Next;
end;
if not(bad) then DisplayPart(f, i);
end;
end;

end;

var
S: TStack;

begin
clrscr;

S.Create;
S.Main;
S.Free;

readln;
end.
volvo
Это смотря какой язык считать стандартом... Объекты появились только с 5.5

До этого никакой поддержки ООП в Паскале не было smile.gif
klem4
Слушай, твою прогу еще не разбирал, но на соклько я понял если сразу ввести привильное число, дальшее ввод прекращается ? Я вот например хочу ввести '102 qwerrtt 123' ... Ну или как автор тест привел, нельзя ведб у тебя ?
volvo
Я же показал идею, как можно сохранить строку, подходящую под условие. Ну, что ж, если надо все разжевать - то вот так... wacko.gif

program T(input, output);

procedure print_number(n: integer; the_mod: integer);
begin

if n > 0 then print_number(n div 3, n mod 3);

if the_mod >= 0 then write(the_mod);

end;

var
ch: char;
flag: boolean;
num: longint;

begin
read(input, ch);
while (ch <> #13) do begin


flag := true; num := 0;

while (ch <> #13) and (ch <> ' ') do begin
flag := flag and (ch in ['0' .. '2']);
num := 3 * num + (ord(ch) - ord('0'));
read(input, ch);
end;

if flag and (num mod 3 = 0) then begin

writeln;
write('number = ');
print_number(num, -1);
break;

end
else read(input, ch);

end;

end.


А у меня тогда встречный вопрос: а если будет введена строка
"nono 123456 yes 12012 haha 2121 bye"

КАКОЕ из чисел ты должен вывести? rolleyes.gif Автор молчит по этому поводу... Некорректно поставленное задание? Почему ты ЕГО не спросил, а спросил меня о моей программе?
klem4
Я понял задание так: Дана последовательность символов, если в ней есть подпоследовательности подходящие под условие, вывести их на экран...

Ответ на твой вопрос исчерпывается smile.gif Вывести и первое и второе. Или я условие не правильно понял ?
volvo
Цитата
Или я условие не правильно понял ?
И это присутствует... Я только что заметил... Читаем заголовок:
Цитата
Выделение троичного чила кратного 3
, то есть из приведенных мной ни одно число не должно напечататься smile.gif

Добавь проверку на кратность...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.