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

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

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

Автор: Tan 11.04.2007 17:00

1. Забавное задание, в чём его смысл ?
2. Именно если ввести то просто посимвольно считываешь и потом можно скинуть в массив чаров и вывести.

Автор: Perfez 11.04.2007 17:01

Если я не ошибаюсь, такое громадище с клавиатуры ты вряд ли сможешь ввести:ввод с клавиатуры в Паскале имеет буфер, как и всё на свете имеюший определённые границы... yes2.gif так что понапрасну не трудись-лучше работать с файлом, хотя и это несколько неудобно... smile.gif но можно привыкнуть ко всему, вроде smile.gif .Смотри http://forum.pascal.net.ru/index.php?showtopic=3584.

Автор: volvo 11.04.2007 17:47

Цитата
так что понапрасну не трудись
Кто-то запрещает работать с PChar и посимвольным вводом (через ReadKey)? Нет... Тем более, что нечто подобное (если я не ошибаюсь - для строк до 400 символов) уже спрашивали, попробуй поискать (это к автору темы) ...

Автор: anchik 11.04.2007 19:00

Цитата(Tan @ 11.04.2007 14:00) *

1. Забавное задание, в чём его смысл ?
2. Именно если ввести то просто посимвольно считываешь и потом можно скинуть в массив чаров и вывести.

Это часть решения задчки. Из файла считать могу, но такое условие в задаче, чтобы ввод с клавиатуры sad.gif

А как его посимвольно считывать?
Я, например, писала так:
 
var
str1: string;
begin
readLn(str1);



Как можно посимвольно считать?
Или надо readLn внутрь цикла поставить, считывать символы и складывать их в массив длиной 1100?

Автор: Tan 11.04.2007 19:05


sum:=0;
repeat
ch:=readkey;
inc (sum);
until (ord(ch) = 13) or (sum = 1100); {ENTER}

Ну условие цикла сам под задание подредактируй. А так по идее если ты работать будешь с каждым элементом в отдельности, то создай массив чаров ms : array [1..1100] of char и после чтения пиши туда свой символ. Очень интересно для решения какого задания ты используешь такую операцию, отпиши главное задание если не трудно. Возможно это не лучший метод.

Автор: Malice 12.04.2007 0:45

Можно приспособить вот такой вариант:

{$m 1024,0,65536}
uses dos;
begin
exec(getenv('comspec'),' /c cmd /c copy con test.$$$');
end.

Все введенное будет записано в файл test.$$$. Окончание ввода- Ctrl+Z, Enter. За то в качестве бонуса текст может быть многострочным smile.gif

Автор: anchik 12.04.2007 1:13

Цитата(Tan @ 11.04.2007 16:05) *


sum:=0;
repeat
ch:=readkey;
inc (sum);
until (ord(ch) = 13) or (sum = 1100); {ENTER}

Ну условие цикла сам под задание подредактируй. А так по идее если ты работать будешь с каждым элементом в отдельности, то создай массив чаров ms : array [1..1100] of char и после чтения пиши туда свой символ. Очень интересно для решения какого задания ты используешь такую операцию, отпиши главное задание если не трудно. Возможно это не лучший метод.


Упс. Запрещено использовать CRT. sad.gif
Что делать, если и файл не использовать?

Автор: Гость 14.04.2007 23:52

Цитата(Malice @ 11.04.2007 20:45) *

Можно приспособить вот такой вариант:
{$m 1024,0,65536}
uses dos;
begin
exec(getenv('comspec'),' /c cmd /c copy con test.$$$');
end.

Все введенное будет записано в файл test.$$$. Окончание ввода- Ctrl+Z, Enter. За то в качестве бонуса текст может быть многострочным smile.gif

Спасибо!
Все равно вопрос остается открытым: как сделать без записи в файл?

Автор: Malice 15.04.2007 2:27

Делай тогда как Tan показал, readkey сделай сам своей функцией на асме. Выглядеть будет примерно так:

function readkey:char; assembler;
asm
xor ax,ax
int 16h
end;

Автор: tchib 15.04.2007 3:17

На сколько я знаю, максимальная длина строки 255 символов, поэтому, как ни крути, сделать ее такой невозможно. Значит остается только массив из символов длинной 1100 элементов.
Поскольку CRT использовать нельзя, то остается только read. В цикле вводим каждый символ и все...

Цитата
в Паскале имеет буфер, как и всё на свете имеюший определённые границы... так что понапрасну не трудись-лучше работать с файлом

этот буффер и есть файл, причем текстовый, и процедура read без указания файловой переменной читает из файла input.txt, хотя на счет разширения точно сказать не могу.

Автор: Malice 15.04.2007 3:59

Цитата(tchib @ 15.04.2007 0:17) *

Поскольку CRT использовать нельзя, то остается только read. В цикле вводим каждый символ и все...

Не получится.. Первый же Read(c:char) будет вводить в буфер всю строку и ждать enter-a. После энтера прочитается в "c" первый символ этой строки, следующие read-ы будут брать символы из буфера. Т.к. длина буфера ограничена (127 символов) - длина строки будет таже.

Автор: tchib 15.04.2007 14:02

так я и не говорю вводить всю строку. Можно просто ввести символ, нажать энтер, и так 1100 разsmile.gif