Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Выделение троичного чила кратного 3

Автор: Flyer 19.11.2006 17:34

Помогите пожалуйста решить задачу выделения троичного числа на паскале.Програма должна быть написана на стандарте языка. Так же нельзя использовать массивы и строки....
Обрабатываемый текст вводиться с клавиатуры. Пример:
qjhjereh 1231 1100 sdhf1231 hjh110
Результат: 1100
Заранее благодарен...

Автор: klem4 19.11.2006 21:19

Объясни задание по подробней, что за троичные числа ? unsure.gif


Автор: Гость 19.11.2006 21:21

Числа в троичной системе счисления всмысле)

Автор: klem4 19.11.2006 21:38

Вводишь строку, разбиваешь ее на слова ( http://forum.pascal.net.ru/index.php?showtopic=6972 ) Выделяешь очередное слово, идешь по нему, если в нем есть какие-либо символы кроме (0, 1, 2) то это НЕ число в троичной системе.

Вроде все smile.gif

Автор: мисс_граффити 19.11.2006 22:01

klem4, почти.

Цитата
Так же нельзя использовать массивы и строки....

Автор: volvo 19.11.2006 22:06

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

(я не сказал, что это невозможно, просто интересно, как ТЫ это себе представляешь?)

Автор: Гость 19.11.2006 22:38

В том то и дело что никак не представляю,поэтому и обратился за помощью....

Автор: klem4 19.11.2006 23:01

Какое-то странное задание, ну раз ничего нельзя использовать, буднем использовать видеопамять 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 19.11.2006 23:04

Угу...

Или рекурсия rolleyes.gif

Автор: Гость 19.11.2006 23:06

спасибо большое

Автор: klem4 19.11.2006 23:09

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



Volvo, а как еще можно ? Ума не приложу ...

Автор: volvo 19.11.2006 23:13

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

klem4 Попробуй, кстати, хорошая разминка для мозгов будет smile.gif

Автор: klem4 19.11.2006 23:15

Аа ты имеешь в виду по такомуже принципу (юзать видеопамять) но через стек, понятно, можно попробовать.

Автор: volvo 19.11.2006 23:54

Цитата
(юзать видеопамять)
Я этого не говорил, это ТЫ сказал... Про видеопамять в моем посте не было ни слова...

Все я понял. klem4

Автор: мисс_граффити 20.11.2006 2:45

а файлы можно использовать?...

Автор: Гость 20.11.2006 21:30

используется только стандартный ввод и стандартный вывод...

Автор: volvo 20.11.2006 22:10

В общем, вот что у меня получилось (как и заказывали, без массивов, без строк, без файлов) smile.gif

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

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

Автор: klem4 20.11.2006 23:00

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 20.11.2006 23:05

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

До этого никакой поддержки ООП в Паскале не было smile.gif

Автор: klem4 20.11.2006 23:08

Слушай, твою прогу еще не разбирал, но на соклько я понял если сразу ввести привильное число, дальшее ввод прекращается ? Я вот например хочу ввести '102 qwerrtt 123' ... Ну или как автор тест привел, нельзя ведб у тебя ?

Автор: volvo 20.11.2006 23:31

Я же показал идею, как можно сохранить строку, подходящую под условие. Ну, что ж, если надо все разжевать - то вот так... 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 20.11.2006 23:35

Я понял задание так: Дана последовательность символов, если в ней есть подпоследовательности подходящие под условие, вывести их на экран...

Ответ на твой вопрос исчерпывается smile.gif Вывести и первое и второе. Или я условие не правильно понял ?

Автор: volvo 20.11.2006 23:49

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

Добавь проверку на кратность...