![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Altair |
![]()
Сообщение
#1
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
напишем программу:
Код var s : string[10]; b : byte; begin for b :=1 to 10 do begin writeln('s[',b,']='); readln(s[b]) end; { это мы ввели посимвольно строку } { for b:=1 to 10 do s:=s+s[b]; } {*******} writeln('s=',s); { ПОЧЕМУ СТРОКА НЕ ВЫВОДИТСЯ ? } { теперь раскоментируйте ******* и ВСЕ ПОЛУЧИТСЯ! } end. ПОЖАЛУЙСТА, ОБЪЯСНИТЕ ЭТО МНЕ, ЕСЛИ ЗНАЕТЕ! ??? ??? Сообщение отредактировано: volvo - 17.12.2004 21:18 -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
trminator |
![]()
Сообщение
#2
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
Строка в Паскале - не только набор символов в массиве, но еще и длина этого набора. Длина хранится в нулевом элементе массива. В этои примере она остается неизменной и равной нулю.
-------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
APAL |
![]()
Сообщение
#3
|
![]() Смотрю... ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 055 Пол: Мужской Реальное имя: Пшеничный Алексей Анатольевич Репутация: ![]() ![]() ![]() |
Правильнее будет так:
>напишем программу: > Код >var s : string[10]; > ch : Char; > b : byte; >begin >s:=''; >for b :=1 to 10 do begin write('s[',b,']= '); readln(Ch); {Или вместо readln - Ch:=Readkey} s:=s+ch; end; >{ это мы ввели посимвольно строку } > >{ for b:=1 to 10 do s:=s+s[b]; } {*******} > >writeln('s=',s); > >{ ПОЧЕМУ СТРОКА НЕ ВЫВОДИТСЯ ? } >{ теперь раскоментируйте ******* и ВСЕ ПОЛУЧИТСЯ! } > >end. -------------------- |
Altair |
![]()
Сообщение
#4
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Лучший способ ввести посимвольно строку:
Код const n = 10; ... For b:=1 to n do begin write('s[',b,']='); readln(s[b]); S[0]:=CHR(B) end; ... таким образом мы с каждым новым символом, увеличиваем и длинну строки! 8) Сообщение отредактировано: volvo - 17.12.2004 21:19 -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
trminator |
![]()
Сообщение
#5
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
способ конечно хороший, но не совсем корректный, в Паскале такого не предусмотрено, значит, некоторые компиляторы могут выдавать ошибку. Я чесно говоря думал, что Турбо Паскаль будет ругаться.
Также можно попробовать вместо S[0]:=CHR(B) поставить inc(s[0]) - может, чуть быстрее будет... -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
GLuk |
![]()
Сообщение
#6
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 775 Пол: Мужской Репутация: ![]() ![]() ![]() |
По-моему лучше юзать ASCIIZ строки (модуль Strings) ;)
|
SKVOZNJAK |
![]()
Сообщение
#7
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 930 Пол: Мужской Репутация: ![]() ![]() ![]() |
Круто он всех подколол! А заменить поэтапно операторы на альтернативные никто не догадался ;)
Код uses crt; var s: string[10]; R: STRING; Q,b: byte; LABEL 1; begin FOR Q:=1 TO 20 DO IF KEYPRESSED=TRUE THEN READKEY; WRITELN; for b :=1 to 10 do begin writeLn('s[',b,']='); S[B]:=READKEY; 1: FOR Q:=1 TO 20 DO IF KEYPRESSED=TRUE THEN READKEY; DELAY(400); IF KEYPRESSED=TRUE THEN GOTO 1; end; writeln('aaaaaaaa]]]GTRETRETREWOIKREWREWOPKREWOPKREWOPKREW]]]]]]]]'); writeln('s=',s); {А ВОТ НЕ БУДЕТ РАБОТАТЬ!} WRITELN; R:=S; {ЭТО ТОЖЕ НЕ БУДЕТ!!!!!!} WRITELN('ОПЕРАЦИЯ ПРИСВАИВАНИЯ НЕ РАБОТАЕТ',' ',R); FOR Q:=1 TO 10 DO R[Q]:=S[Q]; WRITELN('А ВО ТЕПЕРЬ...',' ',R); WRITE('R='); FOR Q:=1 TO 10 DO WRITE(R[Q]); WRITELN; WRITE('Q='); FOR Q:=1 TO 10 DO WRITE(S[Q]); end. ИТАК, МЫ ПОЛУЧИЛИ СТРОКУ СО СВОЙСТВАМИ МАССИВА. А НУЛЕВОЙ СИМВОЛ ЗДЕСЬ ВООДЩЕ НЕ ПРИЧЕМ. |
trminator |
![]()
Сообщение
#8
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
Мы получили не строку со свойствами массива, а массив символов. При этом потерялись все преимущества строки (знаем длину!), но не приобрелись никакие новые (не работает присваивание - видимо, из-за того, что у нас "строки" по-прежнему нулевой длины). С таким же успехом можно было описать тип TStr = array[1..10] of char а наши строки описать как TStr. Тогда, кстати, заработает присваивание.
А вот что меня си-и-ильно удивило (спасибо за классный тест ![]() -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
Altair |
![]()
Сообщение
#9
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
ОПЕРАЦИЯ ПРИСВАИВАНИЯ РАБОТАЕТ!!!!!!!!
в строке R:=S; у нас происходит следующее: строке R присваивается массив символов, где 0 символ это CHR(0) кстати у меня не работает : WRITELN('А ВО ТЕПЕРЬ...',' ',R); ( R не печатается, и не должно печататься) оператор writeln(s) или write(s) распечатает на экран столько символов, сколько сказанно в s[0] (только там символ, а не число). -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
trminator |
![]()
Сообщение
#10
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ты в отладчике проверял? Там ничего не присваивается, убедиться можно хотя бы поставив в watches не просто R, а R,M (Memory dump)
А все-таки, неужели он умеет печатать просто массивы символов? -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
GLuk |
![]()
Сообщение
#11
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 775 Пол: Мужской Репутация: ![]() ![]() ![]() |
2trminator: Вызов функции присваивания происходит, но цикл выполняется 0 раз. И, блин, первый раз вижу, что в паскале, строка, описанная как переменная - инициализируется нулем! Просто никогда до этого не использовал такой извращенный цикл присваивания, без модификации байта длины.
А что ты имел в виду под вопросом?: А все-таки, неужели он умеет печатать просто массивы символов? |
trminator |
![]()
Сообщение
#12
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата А что ты имел в виду под вопросом? Я имел ввиду, например, следующий кусок кода: Код var a: array[1..10] of char; i: integer; begin for i:=1 to 10 do readLn(a[i]); writeLn(a) end. а - не строка, но выводится как строка. В общем, я в это уже поверил, тем более что массивы не-символов (integer там, байтов) он печатать отказывается -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
![]() ![]() |
![]() |
Текстовая версия | 24.06.2025 20:07 |