Помогите пожалуйста решить задачу выделения троичного числа на паскале.Програма должна быть написана на стандарте языка. Так же нельзя использовать массивы и строки....
Обрабатываемый текст вводиться с клавиатуры. Пример:
qjhjereh 1231 1100 sdhf1231 hjh110
Результат: 1100
Заранее благодарен...
Объясни задание по подробней, что за троичные числа ?
Числа в троичной системе счисления всмысле)
Вводишь строку, разбиваешь ее на слова ( http://forum.pascal.net.ru/index.php?showtopic=6972 ) Выделяешь очередное слово, идешь по нему, если в нем есть какие-либо символы кроме (0, 1, 2) то это НЕ число в троичной системе.
Вроде все
klem4, почти.
В том то и дело что никак не представляю,поэтому и обратился за помощью....
Какое-то странное задание, ну раз ничего нельзя использовать, буднем использовать видеопамять ) Это ведь не запрещено ?
Хотя это конечно маразм Но для хранения нашей последовательности мы не используем ни байта. Ну точнее один байт - 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, а как еще можно ? Ума не приложу ...
Я написал выше - рекурсией Зачем использовать строку, если можно задействовать стек? Правда, будут небольшие проблемы при печати числа (оно захочет печататься "задом наперед", но это тоже преодолимо)
klem4 Попробуй, кстати, хорошая разминка для мозгов будет
Аа ты имеешь в виду по такомуже принципу (юзать видеопамять) но через стек, понятно, можно попробовать.
а файлы можно использовать?...
используется только стандартный ввод и стандартный вывод...
В общем, вот что у меня получилось (как и заказывали, без массивов, без строк, без файлов)
Решение пока не открываю, может, кто-то захочет решить самостоятельно...
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.
Это смотря какой язык считать стандартом... Объекты появились только с 5.5
До этого никакой поддержки ООП в Паскале не было
Слушай, твою прогу еще не разбирал, но на соклько я понял если сразу ввести привильное число, дальшее ввод прекращается ? Я вот например хочу ввести '102 qwerrtt 123' ... Ну или как автор тест привел, нельзя ведб у тебя ?
Я же показал идею, как можно сохранить строку, подходящую под условие. Ну, что ж, если надо все разжевать - то вот так...
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.
Я понял задание так: Дана последовательность символов, если в ней есть подпоследовательности подходящие под условие, вывести их на экран...
Ответ на твой вопрос исчерпывается Вывести и первое и второе. Или я условие не правильно понял ?