Помощь - Поиск - Пользователи - Календарь
Полная версия: Задачка на строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
-Виктория-
Код
В строке посчитать по отдельности кол-во входящих в неё символов "а", "б" и "в" за менить на символ "?".
Результирующую строку и кол-во символов вывести на экран.

В программе использвать строковые переменные строкового типа.
Altair
Var
 s:string;
 a,b,v,i:byte;
begin
 write('Enter string: '); readln(s);
 for i:=1 to ord(s[0]) do  begin
  case s[i] of
   'а':begin inc(a); s[i]:='?' end;
   'б':begin inc(B); s[i]:='?' end;
   'в':begin inc(v); s[i]:='?' end;
  end 
 end;
 writeln(s,' ',a,' ',b,' ',v);
end.


после выполнения программы, в a,b,v соответсвенно хранится число встретившихся символов "а", "б" и "в".
Все они были заменены в строке символом "?".

Виктория, если что непонятно, спрашивайте! И вообще, почему у вас не получилось сделать? Если вы не будете стараться сделать сами, вы не научитесь! :rose:
:flowers:
-Виктория-
А можно вас поправить? :D

 ...
case s[i] of
   'а':begin inc( a ); s[i]:='?' end;
   'б':begin inc( B ); s[i]:='?' end;
   'в':begin inc( v ); s[i]:='?' end;
...

Торопились наверное smile.gif.

А ещё вопросик: почему после выполнения программы, после знаков вопроса выводит "1 1 0" и т.п.? huh.gif

И если вам нетрудно, можете подробно описать что выполняет каждая из строк sad.gif
FreeMan
Цитата
после знаков вопроса выводит "1 1 0"

сложный вопрос. могу предположить, что это кол-во "а","б" и "в" в строке
-Виктория-
Немного изменила программу:

program vika

Var
 s:string;
 a,b,v,i:byte;
begin
 write('Enter string: '); readln(s);
 for i:=1 to ord(s[0]) do  begin
case s[i] of
   'а':begin inc(a); s[i]:='?' end;
   'б':begin inc (Ь); s[i]:='?' end
   'в':begin inc(v); s[i]:='?' end;

  end 
 end;
 writeln(s,' ',a,'а  ',b,'б  ',v);
end.



А вот как записать что сколько будет v затрудняюсь sad.gif.
klem4
Код
writeln(s, ' ', a, 'а  ' , b, 'б  ' ,v , 'в ');
? huh.gif
Altair
Вика,вы просили коментировать..


program vika
Var
 s:string; {строкавая переменная}
 a,b,v,i:byte; {счетчики для подсчета и счетчки для прохода построке}
begin
 write('Enter string: '); readln(s); {запрос и ввод строки}
 for i:=1 to ord(s[0]) do  begin {проходим от 1 элепетна до длинны строки}
case s[i] of {смотрим i символ строки}
   'а':begin inc(a); s[i]:='?' end; {если а, то УВЕЛИЧИВАЕМ на 1 счетчик a, ставим ?}
   'б':begin inc (Ь); s[i]:='?' end;{если б, то УВЕЛИЧИВАЕМ на 1 счетчик б, ставим ?}
   'в':begin inc(v); s[i]:='?' end;{если в, то УВЕЛИЧИВАЕМ на 1 счетчик в, ставим ?}
  end 
 end;
 writeln(s,' ',a,'а  ',b,'б  ',v,' в'); {выод результата}
end.

Думаю вопросов больше нет....
-Виктория-
Altair
Спасибо! :thanks: Если что, можно я ещё буду задавать вопросики? :yes:
Altair
Конечно можно, для этого мы здесь smile.gif :flowers:
-Виктория-
Приветики smile.gif
Пожалуйста, объсните что значит "ord(s[0])" sad.gif
Altair
можно заменить на length(s)
это выражение возвращает длинну строки текущую.
Так строка утроенна - в 0 позиции храниться длинна.
ord возвращает код символа.
так что код 0 символа это длинна...
-Виктория-
Нет, заменить нельзя, тогда программа работает некорректно.
зы а всегда "0" - длина строки?
volvo
-Виктория-, а вот с этого места, пожалуйста, поподробнее: в чем именно программа начинает вести себя некорректно?
Altair
Цитата
Нет, заменить нельзя, тогда программа работает некорректно.

чего?....
я сказал -
ORD(s[0]) РАВНОСИЛЬНО выражению
length(s)
причем второе логичнее и правильнее!

и вообще вопросы пошли несущественные...
про строки читаем здесь:
http://forum.pascal.net.ru/index.php?showtopic=2361
-Виктория-
А как решить следующую задачу:
Код
Определить сколько раз в строке встречается определённое слово, определить номера позиций вхождения в исходную строку и вывести их на экран.


Пыталась решить её подобным способом, но ничего не получилось sad.gif
volvo
Эта задача не должна решаться "подобным способом"... Используй Pos(subs, s) для поиска заданного слова в строке (возвращает позицию подстроки subs в строке s). Как только Pos вернет 0, значит нет больше вхождений.

Но для того, чтобы не зациклить программу нужно принимать определенные меры... smile.gif

P.S. В поиске по форуму посмотри, там было что-то ОЧЕНЬ похожее...
-Виктория-
Да ничего я не понимаю sad.gif блин sad.gif
volvo
Цитата(-Виктория- @ 23.10.2005 17:26)
Да ничего я не понимаю sad.gif блин  sad.gif

А как ты думаешь, если я тебе дам готовое решение, ты будешь понимать больше? Ну, посмотрим:
var
  s, wrd: string;
  first, p: integer;
begin
  s := 'start finish start start end begin';
  wrd := 'start';
  first := 0;
  repeat
    p := pos(wrd, copy(s, first + 1, 255));
    if p > 0 then begin
      writeln('position ', first + p);
      inc(first, p + length(wrd));
    end;
  until p = 0;
end.

Разбирайся...
-Виктория-
Вот как я поняла:

var
  s, wrd: string;
  first, p: integer; {описания переменных}
begin
  s := 'start finish start start end begin'; {строка откуда берётся слово}
  wrd := 'start'; {само слово}
  first := 0; {начальному значению присваиваем 0}
  repeat {цикл с постусловием, операторы повторяются, пока выражение ложное, если становится истинным - цикл завершается}
    p := pos(wrd, copy(s, first + 1, 255)); {мда ... споткнулась :(}
    if p > 0 then begin 
      writeln('position ', first + p);
      inc(first, p + length(wrd));
    end;
  until p = 0;
end.
Altair
Цитата
Вот как я поняла:

я это понимаю так - ты ничего не поняла.. потом учто совсем не обязательно писать что repeat это
Цитата
цикл с постусловием, операторы повторяются, пока выражение ложное, если становится истинным - цикл завершается

то что ты написала в данном случае полнейший бред, который можно было заменить на одну фразу
Цитата
повторять пока находятся вхождения

----------


Цитата
{мда ... споткнулась :  ( }

на
записать в p позицию с которйо начинется вхождение wrd в строку s , обрезанную спереди на first символов...

а логика программы - урезая строку спереди, путем копирвоания, подситываем кол-во вхождений (пос возвращет номер 1 вхождения, поэтому обрезаем спереди), в строку...
вот и все.

тебя прежупреждали что не поймешь.. все от лени делать что либо самой..

ЗЫ: попала под мою горячую руку и плохое настроение! angry.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.