Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Строка (http://www.tehnari.ru/f41/t59092/)

Ильгиза 29.10.2011 15:23

Строка
 
Здравствуйте!!!Помогите пожалуйста решить!(((

Дана строка, состоящая из символов. Определить сколько в ней символов '*',';',':'
Со строкой надо работать как с единым объектом: использовать строковые процедуры и функции.


Заранее большое спасибо!!!

Vladimir_S 29.10.2011 15:57

Ильгиза, я, конечно, догадываюсь, что подразумевается (по всей вероятности) Паскаль, однако ЯП следует указывать. Особенно размещая запросы в этом разделе. Впрочем, я могу и ошибаться - недавно вот тоже решил, что нужен Паскаль, сочинил программку, а выяснилось, что требуется, видите ли, С++. А об сообщить эту информацию - ну никак! Имейте хоть толику уважения к тем, кто старается помочь.

AlexZir 29.10.2011 16:43

Вычислительная часть программы на языке Pascal:
Код:

n:=0;
for i:=1 to length(s) do
if (s[i] in ['*',':',';']) then inc(n);
writeln(n);

Отальное допишите сами :))

Ильгиза 06.11.2011 17:05

Строка, паскаль
 
Здравствуйте! Не можете ли вы предложить иной вариант решения данной задачи, кроме этой:


n:=0;
for i:=1 to length(s) do
if (s[i] in ['*',':',';']) then inc(n);
writeln(n);

Дана строка, состоящая из символов. Определить сколько в ней символов '*',';',':'
Со строкой надо работать как с единым объектом: использовать строковые процедуры и функции.

AlexZir 06.11.2011 17:41

А чем вам не понравилось это решение? В нем используются строковые функции length(s) - определение длины строки, и s[i] - обращение к i-ому символу строки. Если i-тый символ строки равен одному из символов, принадлежащих указанному в условии множеству, то счетчик числа символов увеличивается на 1. Полный вариант решения следующий:
Код:

var i,n:integer;
s:string;
begin
writeln('Enter string');
readln(s);
n:=0;
for i:=1 to length(s) do
if (s[i] in ['*',':',';']) then inc(n);
writeln('Char *,:,; in string ', n);
readln
end.

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

var i,n:integer;
s:string;
begin
writeln('Enter string');
readln(s);
n:=0;
for i:=1 to length(s) do
if (s[i]='*') or (s[i]=';') or (s[i]=':') then inc(n);
 writeln('Chars *:; in string ', n);
readln
end.

Как видите, разница не сильно большая, но в первом случае обращение к строке производится только 1 раз, а во втором случае - трижды считывается i-ый элемент, что немного замедляет выполнение программы. Первый вариант решения более гибкий, во множество легко добавить или из него удалить символы, которые нужно анализировать. Плюс во втором листинге использованы логические операторы, каждый из которых также замедляет программу. Ну и если нужно будет добавить новые символы для анализа, то условие будет слишком длинным, что просто неудобочитаемо и некрасиво :)

P.S. А что вы имеете в виду под:
Цитата:

Сообщение от Ильгиза (Сообщение 613218)
Со строкой надо работать как с единым объектом:

??? С точки зрения программирования, строка это своего рода массив символов, каждый из которых имеет свой порядковый номер. Строка уже по своему определению никак не может быть единым объектом. И еще, допустим, что есть возможность работать со строкой как с единым объектом, тогда возникает парадокс: разбивать строку на символы по условию мы не имеем права, а в задании нужно подсчитать количество именно символов, это взаимно исключающие действия. Как тогда, по вашему, должна решаться эта задача?


Часовой пояс GMT +4, время: 18:05.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.