Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2011, 17:31   #1
proser93
Пользователь
 
Регистрация: 22.10.2011
Сообщений: 12
Смущение Паскаль: необычный цикл

Здравствуйте! Есть задача: "Определить, сколько различных символов входит в заданный текст, содержащий не более 100 символов и оканчивающийся точкой (в сам текст точка не входит)."
Я решил создать счетчик "разных символов", но столкнулся с необходимостью создать цикл, который сначала пробегает по первому элементу строки, затем по первому и второму, затем по первому, второму, третьему, и так далее.
Но в паскале в цикле for число итераций задается всего один раз, и изменять его нельзя. Что делать?
Заранее спасибо.
proser93 вне форума Ответить с цитированием
Старый 26.10.2011, 17:36   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Есть такой фокус - карта символов. Если у нас символы однобайтовые, заводим массив из 256 переменных, изначально нулей. Читаем текст посимвольно, и для каждого символа прибавляем единичку к соответствующему элементу массива. В финале имеем полную статистику, осталось вывести ненулевые элементы с соответствующими им символами.
Abstraction вне форума Ответить с цитированием
Старый 26.10.2011, 17:46   #3
proser93
Пользователь
 
Регистрация: 22.10.2011
Сообщений: 12
По умолчанию

"Читаем текст посимвольно, и для каждого символа прибавляем единичку к соответствующему элементу массива" - а как определить для каждого символа, в какой именно элемент массива плюсовать единичку?
proser93 вне форума Ответить с цитированием
Старый 26.10.2011, 17:47   #4
денис80
 
Регистрация: 26.10.2011
Сообщений: 3
По умолчанию

как решить задачу найти сумму цифр числа 5655
денис80 вне форума Ответить с цитированием
Старый 26.10.2011, 17:52   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

proser93,
Мы прочитали символ c. Эта переменная может быть рассмотрена как число (собственно, она и есть число, от 0 до 255 по всей видимости); в частности, её можно использовать как индекс в массиве - statistics[c] := statistics[c] + 1 (благо символ с кодом 0 нам вряд ли введут). Как это синтаксически проделать - увы, вопрос не ко мне, Паскаль знаю плохо.

денис80,
0) Новые вопросы задаются в новых темах обычно.
1) Ответ - 21.
Abstraction вне форума Ответить с цитированием
Старый 26.10.2011, 17:57   #6
денис80
 
Регистрация: 26.10.2011
Сообщений: 3
По умолчанию

спасибо огромное а можно еще дну задачку задать
денис80 вне форума Ответить с цитированием
Старый 26.10.2011, 18:05   #7
proser93
Пользователь
 
Регистрация: 22.10.2011
Сообщений: 12
По умолчанию

вот, есть предположение, так пойдет?
пусть строка s, p,i,n,dif - целые
тогда
n:=length(s)-1; (так как точку не надо учитывать)
p:=0; - переменная количества итераций в цикле
dif:=0; - количество разных символов (счетчик)
while p<>n do begin
p:=p+1;
i:=0;
while i<>(p+1) do begin
if s[p+1] <> s[i] then dif:=dif+1; - если последний из доступного ряда не равен ни одному из предыдущих, увеличиваем счетчик на 1
i:=i+1
end
end
write(dif);
proser93 вне форума Ответить с цитированием
Старый 26.10.2011, 18:08   #8
proser93
Пользователь
 
Регистрация: 22.10.2011
Сообщений: 12
По умолчанию

и еще вопрос: символов в паскале не может быть больше 255?
ведь ещё мб могут вводиться русский буквы...
proser93 вне форума Ответить с цитированием
Старый 27.10.2011, 12:25   #9
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Das русский буквы sind nicht verboten вводиться ) Но это нисколько не мешает их использовать в качестве индексов массива.
Делаем так :
заведем массив на 256 элементов:
Код:
var letters : array[0..255] of integer;
при считывании символа увеличиваем конкретный элемент массива на единичку, используя функцию Ord
Код:
inc(letters[ord(c]);
Учтите, каждый символ - хоть русская буква, хоть английская, хоть разного регистра, цифры, хоть даже небуквенные символы - точки , пробелы и т.п. записываются в массив. Если Вам необходимо подсчитывать буквы разного регистра как одну букву, то используйте функции ansiuppercase/uppercase
Вывод количества конкретных символов стоит ограничить :
во-первых убрать символы с нулевым вхождением
Код:
if letters[итератор_цикла_вывода] = 0 then continue;
во-вторых убрать конкретные левости, пробелы, например, или цифры, тут уж как сообразите, можно написать case в котором для левых символов будет соответствовать команда continue, а для нужных - вывод, такого же эффекта можно добиться множествами
Код:
if chr(итератор_цикла_вывода) in [' ', '.'] then continue

Последний раз редактировалось phomm; 27.10.2011 в 12:29.
phomm вне форума Ответить с цитированием
Старый 27.10.2011, 17:30   #10
Sna1L
Форумчанин
 
Аватар для Sna1L
 
Регистрация: 15.03.2011
Сообщений: 272
По умолчанию

Эм. ТС, возможно, я неправильно понял задание, но не проще ли использовать множество?
что-то типа:
Код:
var
mn:set of char;
i:integer;
c:char;

begin
i:= 0;
mn:=[];
repeat
   read(c);
   if not (c in mn) then 
      begin
      mn:=mn+[c];
      inc(i);
      end;
until(c<>'.');
end.

Последний раз редактировалось Sna1L; 27.10.2011 в 17:33.
Sna1L вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
необычный счетчик grom333 Помощь студентам 4 26.05.2011 21:31
Необычный спам mutabor Свободное общение 3 05.02.2010 23:44
Немного необычный поиск в TMemo RIO Общие вопросы Delphi 8 30.07.2009 02:12
необычный ProgressBar andrey4623 Общие вопросы Delphi 3 27.12.2007 19:25