Помощь - Поиск - Пользователи - Календарь
Полная версия: Хочу разобраться в символьном типе
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
CormiX
Как использовать символьный тип для решения задач?
Например:
есть текст в котором есть хотябы 1 двоеточие(":"). Получить символы, которые располагаются между 1-ым и 2-ым
двоеточиями, если 2-го нет - то до конца текста.
И вот не могу понять, задаю символьный тип и как ему присвоить значение?

s1:array[1..N] of char, как ето использовать для определения ":" в вышенаписаной задаче?
andriano
var c : char;
begin
  c := ':';
Lapp
Цитата(CormiX @ 27.12.2009 11:09) *
Как использовать символьный тип для решения задач?
Например:
есть текст в котором есть хотябы 1 двоеточие(":"). Получить символы, которые располагаются между 1-ым и 2-ым
двоеточиями, если 2-го нет - то до конца текста.
И вот не могу понять, задаю символьный тип и как ему присвоить значение?

s1:array[1..N] of char, как ето использовать для определения ":" в вышенаписаной задаче?
Вообще-то, для таких задач есть типа String, который поддерживается рядом процедур и функций. Но он, правда, имеет существенное ограничение в 255 символов..

Если хочешь работать с массивом символьного типа, то это будет примерно так:

...
var
  s1:array[1..N] of char;
  flag: boolean;
  i: integer;
...

begin
  ...
  flag:=false;
  for i:=1 to N do begin
    if s1[i]=':' then flag:=not flag else if flag then Write(s1[i])
  end;
...
CormiX
А после begin писать:

write('Flag:=','Write the text');
readln(flag);

Так? Только есл я глупость написал то не смейтесь, я ток позавчера начал Паскаль учить)
все в голове в перемешку)
andriano
1. Ладно, Паскаль начал учить вчера, а какие языки программирования ты уже знаешь?

2. Во-первых, переменная flag описана вполне конкретного типа. И этот тип совсем не тот, о котором ты спрашиваешь (т.е. не символьный). А во-вторых, если ты ставишь пользовательский ввод flag перед строкой flag := false, то последняя затрет результат ввода. Какой в этом смысл?

Ты никогда не слышал о примере вычисления вероятности того, что обезьяна, посаженная за пишущую машинку и беспорядочно стучащая по клавишам, напечатает "Войну и мир"?
Так вот, попытка беспорядочно использовать операторы имеет такую же вероятность получения нужной программы.
СНАЧАЛА следует в точности сформулировать алгоритм по-русски (и Паскаль задесь совершенно не нужен), и только ПОТОМ, когда будут ликвидированы все неясности, можно попросту переписать алгоритм с русского на Паскаль.
CormiX
Других языков к сожалению не знаю(((

Алгоритм думаю такой:
1. Сначало нужно задать символьный массив.
2. Нужно определить место расположения двоеточия.
3. Ну и вывести результат.

В том то и проблема что я не знаю как ето описать в Pascal...
andriano
Твой алгоритм, мягко говоря, недостаточно подробный. Ни в Паскале, ни в каком другом языке программирования нет команды "определить место расположения двоеточия". Есть, правда, функция pos, которая при надлежащем вызове сделает то, что ты сформулировал в п.2.
Но я подозреваю, что программа, написанная по твоему алгоритму, сделает не то, что тебе нужно. Ведь результатом поиска на шаге 2 будет "место" расположения двоеточия. Именно это "место" и будет выведено на шаге 3. А по условию требуется "Получить символы, которые располагаются между ...". Согласись, это далеко не одно и то же.
CormiX
Ага тоесть нужно выделить ети символы и копировать?
Но не знаю как.

Добавлено через 14 мин.
program strins_1;
uses crt;
var s1,s:string;
    i:integer;
begin
clrscr;
writeln('BBegiTb P9goK CuMBoJIiB Ta o6oB93KoBo gBoKpa/7Ky');
readln(s);
i:=pos(':',s);
delete(s,1,i);
i:=pos(':',s);
if i=0 then writeln(s)
else
begin
s1:=copy(s,1,i-1);
writeln(s1);
end;
readln;
end.

во я разобрался, правда не массивом...)
Lapp
Цитата(CormiX @ 27.12.2009 12:12) *
Так? Только есл я глупость написал то не смейтесь, я ток позавчера начал Паскаль учить)
все в голове в перемешку)

Давай упорядочивать твою перемешку.
flag - это булева переменная. Если ты еще не учил про такой тип, советую обратиться к учебнику. Без такой переменной в этой задаче, конечно, можно обойтись, но это будет не совсем естественно. Поэтому прочитай про них. Могу начать объяснение..

Переменная типа boolean (от Булевой алгебры, которая названа по имени основателя основателя Джорджа Буля) может принимать только два значения: ложь или правда. В Паскале это совпадает с английским написанием: false и true. Булева переменная может быть использована везде, где может стоять условие - например, в операторе if .. then или while .. do или repeat .. until. Значение можно задавать либо константой (false, true), либо вычислением условия (типа x>0).

В нашем примере мы сначала устанавливаем значени флага в ложь (флаг не поднят). Затем, когда встречается первое ":", занчение становится not false. то есть правда (флаг поднят). При поднятом флаге срабатывает второй if и символы выводятся на печать. Затем, когда снова встречается ":", значение флага становится not true (флаг сбрасывается), и вывод символов прекращается.

После begin тебе нужно организовать ввод символьного массива s1. Попроьуй это сделать и паокажи результат.
Lapp
Цитата(CormiX @ 27.12.2009 13:10) *
во я разобрался, правда не массивом...)

Ну, разобрался - и хорошо.
Видишь, как важно ПРАВИЛЬНО ставить вопрос. И не вводить в заблуждение ни других, ни себя..
CormiX
Только я там удалил ту строку, что идет перед первым двоеточием.
Но ето через strings. А мне надо массив.

flag:=false;
for i:=1 to n do begin
if s1[i]=':' then flag:=not flag else if flag then write(s1[i])
end;
else 
flag:=true;
for i:=1 to n do begin
if s1[i]=':' then flag then write(s1[i])
end;


так?)
Lapp
Цитата(CormiX @ 27.12.2009 13:33) *
так?)

Нет.
С самим выводом ничего менять не нужно. Все я уже написал, не нужно ничего добавлять.
А нужно добавить ПЕРЕД этим ВВОД массива.
andriano
Цитата(CormiX @ 27.12.2009 13:10) *

во я разобрался, правда не массивом...)
Ну, вообще-то, строка - это массив символов (хотя и несколько своеобразный).
И еще.
При обработке строк (и любых других массивов) есть два подхода:
1. Мы курочим саму строку, добиваясь, чтобы в ней осталось только то, что нам нужно. При этом не используется дополнительная память (например, другая строка, у тебя s2).
2. Оригинальная строка сохраняется, а нужное мы формируем в другой строке. При этом дополнительная память, та самая вторая строка, используется.

Ты же на первом этапе курочишь строку, а на втором - переносишь ее часть в другую переменную. Было бы гораздо логичнее, если бы ты, найдя втрое вхождение двоеточия, отрезал "хвост" строки той же delete.
CormiX
Тогда использовалась бы только 1 строка правильно?
andriano
Цитата(Lapp @ 27.12.2009 12:02) *

  ...
  flag:=false;
  for i:=1 to N do begin
    if s1[i]=':' then flag:=not flag else if flag then Write(s1[i])
  end;
...

По условию количество двоеточий в тексте ничем не ограничено, а выводить нужно только фрагмент между первым и вторым.


Добавлено через 4 мин.
Цитата(CormiX @ 27.12.2009 13:46) *

Тогда использовалась бы только 1 строка правильно?

Да.
Это, естественно, относится к варианту со строками.
В варианте с массивами нужно либо писать для них собственные варианта pos и delete, либо искать индексы первого и второго (если есть) двоеточий, либо, как предлагает Lapp, отслеживать состояние. Но я бы в качестве индикатора состояния ввел не логическую, а целую переменную, т.к. количество состояний больше двух:
1. До первого двоеточия,
2. Псле первого но до второго,
3. После второго.
CormiX
Тоесть результат таков:

program xxx_1;
uses crt;
const n=100;
var s1:array[1..n] of char;
  flag: boolean;
  i: integer;
 begin
write('i=');
  readln(i);
    for i:=1 to n do
 begin 
write('s1[',i,']=');
readln(s1[i]);  
end;
  flag:=false;
  for i:=1 to N do begin
    if s1[i]=':' then flag:=not flag else if flag then Write(s1[i])
  end;
end.
Lapp
Цитата(CormiX @ 27.12.2009 13:52) *
Тоесть результат таков:

Что это там за массив a? Он не описан.
Ты пытался откомпилить эту прогу?


Добавлено через 3 мин.
Да, после исправления получше стало.

Но ты бы все же обратил внимание на формат..
Код
Я
тебе                                    даю правильно
             отформатированные                                          куски кода
    ,
но когда вижу потом их в твоей программе - впору за голову хвататься
CormiX
А что не так?(
ета прога почемуто не работает(((
Lapp
Цитата(CormiX @ 27.12.2009 14:16) *
ета прога почемуто не работает(((
Ты запутался немного в пределах. Я исправил. Отдельно нужно иметь макисмальный размер массива (это m сейчас) и количество вводимых символов (это n).
Вот так:
program xxx_1;
uses
  crt;
const
  m=100;
var
  s1:array[1..m] of char;
  flag: boolean;
  i,n: integer;
begin
  write('n=');
  readln(n);
  for i:=1 to n do begin
    write('s1[',i,']=');
    readln(s1[i]);
  end;
  flag:=false;
  for i:=1 to n do begin
    if s1[i]=':' then flag:=not flag else if flag then Write(s1[i])
  end;
end.

И постарайся заботиться о формате. Если бы первый вариант был правильно отформатирован, ошибка была бы замечена раньше - это я тебе гарантирую.


CormiX
Огромное спасибо!!!
andriano
Код
n=10
s1[1]=a
s1[2]=:
s1[3]=b
s1[4]=:
s1[5]=c
s1[6]=:
s1[7]=d
s1[8]=:
s1[9]=e
s1[10]=:
bd
Lapp, почему выводится 2 буквы, когда между 1 и 2 вхождениями двоеточия содержится только одна?
const
  m=100;
var
  s1:array[1..m] of char;
  state : integer;
  i,n: integer;
begin
  write('n=');
  readln(n);
  for i:=1 to n do begin
    write('s1[',i,']=');
    readln(s1[i]);
  end;
  state:=0;
  for i:=1 to n do begin
    if s1[i]=':' then inc(state) else if state = 1 then Write(s1[i])
  end;
end.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.