Помогите пожалуйста решить задачу выделения троичного числа на паскале.Програма должна быть написана на стандарте языка. Так же нельзя использовать массивы и строки.... Обрабатываемый текст вводиться с клавиатуры. Пример: qjhjereh 1231 1100 sdhf1231 hjh110 Результат: 1100 Заранее благодарен...
klem4
19.11.2006 21:19
Объясни задание по подробней, что за троичные числа ?
Гость
19.11.2006 21:21
Числа в троичной системе счисления всмысле)
klem4
19.11.2006 21:38
Вводишь строку, разбиваешь ее на слова ( Разбиение на слова. Все способы. ) Выделяешь очередное слово, идешь по нему, если в нем есть какие-либо символы кроме (0, 1, 2) то это НЕ число в троичной системе.
Вроде все
мисс_граффити
19.11.2006 22:01
klem4, почти.
Цитата
Так же нельзя использовать массивы и строки....
volvo
19.11.2006 22:06
Цитата
Так же нельзя использовать массивы и строки....
Тогда, как, извини, ты собрался хранить результат? Допустим, я буду вводить символы, которые гарантированно составляют число в системе счисления с основанием 3, КАК ты это число запомнишь (без строк и массивов), чтобы потом его же напечатать в качестве результата?
(я не сказал, что это невозможно, просто интересно, как ТЫ это себе представляешь?)
Гость
19.11.2006 22:38
В том то и дело что никак не представляю,поэтому и обратился за помощью....
klem4
19.11.2006 23:01
Какое-то странное задание, ну раз ничего нельзя использовать, буднем использовать видеопамять ) Это ведь не запрещено ?
Хотя это конечно маразм Но для хранения нашей последовательности мы не используем ни байта. Ну точнее один байт - 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
Угу...
Или рекурсия
Гость
19.11.2006 23:06
спасибо большое
klem4
19.11.2006 23:09
Гость, если честно, я очень сомневаюсь что задачу надо решать именно так ))) Уточни задание, я уверено как минимум одну строковую переменную использовать можно. (Чтобы ввести последовательность). А больше и не надо ничего
Volvo, а как еще можно ? Ума не приложу ...
volvo
19.11.2006 23:13
Я написал выше - рекурсией Зачем использовать строку, если можно задействовать стек? Правда, будут небольшие проблемы при печати числа (оно захочет печататься "задом наперед", но это тоже преодолимо)
klem4 Попробуй, кстати, хорошая разминка для мозгов будет
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
В общем, вот что у меня получилось (как и заказывали, без массивов, без строк, без файлов)
Решение пока не открываю, может, кто-то захочет решить самостоятельно...
Спойлер(Показать/Скрыть)
uses crt;
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 ch := readkey; write(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')); ch := readkey; write(ch); 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
До этого никакой поддержки ООП в Паскале не было
klem4
20.11.2006 23:08
Слушай, твою прогу еще не разбирал, но на соклько я понял если сразу ввести привильное число, дальшее ввод прекращается ? Я вот например хочу ввести '102 qwerrtt 123' ... Ну или как автор тест привел, нельзя ведб у тебя ?
volvo
20.11.2006 23:31
Я же показал идею, как можно сохранить строку, подходящую под условие. Ну, что ж, если надо все разжевать - то вот так...
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;
А у меня тогда встречный вопрос: а если будет введена строка "nono 123456 yes 12012 haha 2121 bye"
КАКОЕ из чисел ты должен вывести? Автор молчит по этому поводу... Некорректно поставленное задание? Почему ты ЕГО не спросил, а спросил меня о моей программе?
klem4
20.11.2006 23:35
Я понял задание так: Дана последовательность символов, если в ней есть подпоследовательности подходящие под условие, вывести их на экран...
Ответ на твой вопрос исчерпывается Вывести и первое и второе. Или я условие не правильно понял ?
volvo
20.11.2006 23:49
Цитата
Или я условие не правильно понял ?
И это присутствует... Я только что заметил... Читаем заголовок:
Цитата
Выделение троичного чила кратного 3
, то есть из приведенных мной ни одно число не должно напечататься
Добавь проверку на кратность...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.