Консультация № 176056
15.01.2010, 12:33
43.65 руб.
15.01.2010, 13:09
0 16 0
Уважаемые эксперты, подскажите, пожалуйста, как вывести подряд в одну строку переменные типов integer, real, char и string?

Вывод с помощью банального
Код:
 var a:Integer; b:Real; c:char; d:string;
begin
readln (a,b,c,d);
writeln (a,b,c,d);
end.

корректно не работает. Ввод переменной типа string также не осуществляется (если разделить оператор ввода, то все нормально).
И почему такое происходит?
Turbo Pascal 7.0
Спасибо.

Обсуждение

Неизвестный
15.01.2010, 12:50
общий
Сучкова Татьяна Михайловна:
Ну почему не корректно? Все вполне предсказуемо.
Код:
program Project1;

var a:Integer; b:Real; c:char; d:string;

begin
readln(a,b,c,d);
writeln('a=',a,' b=',b,' c="',c,'" d="',d,'"');
end.

Код:
/tmp/project1
2 2.5 string
a=2 b= 2.50000000000000E+000 c=" " d="string"

Так же когда вы пишете ReadLn(a); ReadLn(b); Вы не просто разделяете операторы, а говорите компилятору, что нужно прочесть данные до символа перевода строки. Который, в этом случае, служит своеобразным разделителем данных. А иначе данные берутся из потока последовательно вместе с пробелами и прочей ерундой(на то он и потоковый ввод/вывод )
давно
Старший Модератор
31795
6196
15.01.2010, 12:52
общий
Сучкова Татьяна Михайловна:
как вывести подряд в одну

Ввод переменной типа string также не осуществляется

Насколько я понял вам нужно вводить. Да?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Мастер-Эксперт
425
4118
15.01.2010, 13:05
общий
Сучкова Татьяна Михайловна:
А Вы после ввода каждого значения кнопку "ENTER" не давите (даже если очень хочется ), а давите её когда введёте все значения. Тогда будет всё нормалёк...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
680
2811
15.01.2010, 13:13
общий
sir Henry:
Гениально, но не то. Нужны все четыре - ввести и вывести.
давно
Мастер-Эксперт
680
2811
15.01.2010, 13:26
общий
Micren:
Так вот мне не пробел нужен вместо shar, а вводимая переменная.
давно
Профессор
401888
1232
15.01.2010, 13:28
общий
как вывести

Код:
var a,t,c:integer;
b,r:real;
ch:char;
s,s1,s2,s3,vyv:string;
begin
write('Введите целое число a=');
readln(a);
write('Введите вещественное число b=');
readln(b);
write('Введите символ ch=');
readln(ch);
write('Введите строку s=');
readln(s);
str(a,s1);
str(b:0:3,s2);
s3:=ch;
vyv:=s1+' '+s2+' '+s3+' '+s;
write(vyv);
readln
end.
давно
Мастер-Эксперт
425
4118
15.01.2010, 13:31
общий
Сучкова Татьяна Михайловна:
Цитата: Сучкова Татьяна Михайловна
но не работает. Error 106

Error 106 - неправильный формат цифры. Смотрите внимательно, что вводите. Это уже Ваши проблемы.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
15.01.2010, 13:35
общий
Сучкова Татьяна Михайловна:
Цитата: Сучкова Татьяна Михайловна
Так вот мне не пробел нужен вместо shar, а вводимая переменная
Дело в том, что когда Вы пишете Read(c), где c:Char, то берется первый символ из стандартного потока ввода. И компилятору все равно, что там может быть пробел(или любой другой не печатаемый символ). Вся эта забота ложится целиком на программиста. Например, можно считать строку, а потом из нее извлечь первый не пробельный символ, или пропускать пока не встретится что надо. А вообще, лучше было бы разделить операторы ввода. Так как кроме этого тут еще другие побочные эффекты могут возникнуть.
давно
Мастер-Эксперт
680
2811
15.01.2010, 13:51
общий
sir Henry:
нет-нет, с этим уже все
давно
Старший Модератор
31795
6196
15.01.2010, 14:07
общий
Сучкова Татьяна Михайловна:
Цитата: Сучкова Татьяна Михайловна
Так вот мне не пробел нужен вместо shar, а вводимая переменная.

Смотрим
Цитата: хелп
ReadLn (процедура)
Выполняется процедура Read, затем выполняется переход на следующую строку файла.
Объявление: Procedure ReadLn([ var F : Text; ] V1 [, V2, ...,Vn ]);
Режим: Windows, Real, Protected
Замечания: После выполнения Read, ReadLn переходит на начало следующей строки файла.

Read (процедура)
- Для типизированных файлов, считывает компонент файла в переменную.
- Для текстовых файлов, считывает одно или большее количество значений в одну или большее количество переменных
Объявление:
Типизированные файлы: Procedure Read(F , V1 [, V2,...,Vn ] );
Текстовые файлы: Procedure Read( [ Var F : Text; ] V1 [, V2,...,Vn ] );
Режим: Windows, Real, Protected
Замечания:
Для строковых переменных:

Read считывает все символы до (но не включая) следующего маркера конца строки или пока Eof(F) станет равным True. Read не переходит к следующей строке после чтения. Если полученная в результате строка длиннее, чем максимальная длина строковой переменной, то она усекается. После первого Read, каждые последующие вызовы Read будут видеть маркер конца строки и возвращать строку нулевой длины. Используйте несколько обращений к ReadLn, чтобы считать несколько строковых значений. Когда включена опция Extended Syntax, процедура Read может считывать строки с нулевым окончанием в нуль-основанные массивы символов.

Для переменных типа Integer или Real:

Read будет пропускать любые пробелы, метки табуляции или маркеры конца строки, предшествующие числовой строке. Если числовая строка не соответствует ожидаемому формату, происходит ошибка ввода/вывода, иначе переменной присваивается полученное значение. Следующий Read начнется с пробела, знака табуляции или маркера конца строки, которые завершали числовую строку.

Помоему больше и добавить нечего.
Скачайте ТР7 с русской справкой.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
15.01.2010, 14:28
общий
Сучкова Татьяна Михайловна:
Вот так будет работать со значениями в одной строке (разделять при вводе одиночным пробелом):
Код:

var
a:Integer;
b:Real;
c:char;
d:string;
t:char;
begin
readln (a,b,t,c,t,d);
writeln (a,b,c,d);
end.

Результат работы:
Код:

1 1.1 a a string
1 1.1000000000E+00aa string
давно
Мастер-Эксперт
680
2811
15.01.2010, 15:03
общий
_Ayl_:
О. Вот, похоже, как раз то, чего бы я не догадалась сделать. Большое спасибо.
Неизвестный
15.01.2010, 19:18
общий
Сучкова Татьяна Михайловна:
Это не решение. А если встретится 2(или больше) пробела в строке?
давно
Мастер-Эксперт
680
2811
15.01.2010, 22:20
общий
Micren:
Да, это не универсально, конечно, Вы правы.
Но это учебное задание (я спросила - сказали, это не часть какой-то другой задачи). Раздельный ввод и вывод с конкатенацией - это они сделают, но, как я поняла, в данном случае интересует, чтоб сделать как можно короче. Т.е. лишним пробелам вроде неоткуда взяться - ручной ввод (разве что по ошибке), сhar идет перед string на вводе.
Конечно, можно изменить условие, например, поменять порядок переменных на вводе или вообще предусмотреть в задании такую вещь, как произвольный порядок ввода (с выводом проблемы не возникнет, если переменные введены правильно и хранятся раздельно), и тогда получатся задания совершенно иного плана. Тогда уже точно придется вводить все как строку и анализировать, как Вы предлагали.
Неизвестный
15.01.2010, 23:48
общий
Сучкова Татьяна Михайловна:
Цитата: Сучкова Татьяна Михайловна
Тогда уже точно придется вводить все как строку и анализировать, как Вы предлагали.
Первые два параметра можно ввести как числа(предварительно отключив проверку данных {$I-} и проанализировав IOResult), а остаток как строку и парсить ее на наличие whitespaces.
Неизвестный
17.01.2010, 21:16
общий
Сучкова Татьяна Михайловна:
Добрый вечер! Вариант, если можно менять порядок ввода: readln (c,d,a,b);
Тогда <символ><строка><[Enter]><число><[пробел] или [Enter]><число><[Enter]>.
Форма ответа