Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ сложная задача на подпрограмму

Автор: HelpMe 8.12.2007 15:27

Требуется ваша помощь в решении этой задачи:

Дан символьный массив. Определить , используя подпрограмму , какие символы встречаются 2 раза , 3 раза , к раз. Повторяющиеся символы и количество их повторений вывести на экран.

Немогу составить процедуру , возникает проблема с символами которые повторяются больше 2 - ух раз , незнаю как реализовать ... требуется ваша помощь , спасибо тому кто поможет в решении


Автор: Ozzя 8.12.2007 16:43

http://forum.sources.ru/index.php?showtopic=211946

Автор: volvo 8.12.2007 19:18

Цитата
Немогу составить процедуру , возникает проблема с символами которые повторяются больше 2 - ух раз , незнаю как реализовать
Просто:

var
counts: array[char] of integer;

procedure print_chars(k: integer);
var i: char;
begin
for i := #0 to #255 do
if counts[i] = k then write(i);
end;

begin
{ здесь - заполнение массива counts ... }
...
print_chars(2);
print_chars(3);
print_chars(4);
...
end.


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

Автор: Гость 8.12.2007 23:12

Массив из символов , запоняться должен с клавиатуры ... допустим массив "a a gh pg g p p p g b" из 10 элеметнов , после выполнения программы должно выводиться на экран "a - 2 раза" , "p - 3 раза" ну и соответсвенное если бы был символ повторяющийся 4 раза, то воводился бы и он.

Автор: Ozzя 10.12.2007 12:13

Цитата(Гость @ 8.12.2007 20:12) *

Массив из символов , запоняться должен с клавиатуры ... допустим массив "a a gh pg g p p p g b" из 10 элеметнов , после выполнения программы должно выводиться на экран "a - 2 раза" , "p - 3 раза" ну и соответсвенное если бы был символ повторяющийся 4 раза, то воводился бы и он.

Нет, тебя не об этом спросили.
Попросили привести фрагмент программы заполнения символьного массива, написанного тобой.

Автор: HelpME 13.12.2007 4:23

извиняюсь , не понял вопроса сразу smile.gif



program abc;
var a:array [1..10] of string;
...
for i:=1 to 10 do
readln(a[i]);


Автор: HelpMe 15.12.2007 0:21

Volvo , объесни пожалуйста как нужно заполнять массив для нахождения в нём символов

Автор: volvo 15.12.2007 0:25

Ты сам-то понял, что у тебя написано: В задании сказано, что есть символьный массив, ты показываешь код с массивом строк... И как это понимать?

Автор: HelpMe 15.12.2007 0:29

извиняюсь , ошибочка вышла ... писал ночью , попутал чтото ... массив должен быть и в правду Char
Расскажи как нужно его заполнить и в чём суть вот этой строки в процедуре

Код
  for i := #0 to #255 do
if counts[i] = k then write(i);



Автор: volvo 15.12.2007 6:16

Мне надоело бороться с тобой. Поскольку я так и не увидел, как именно ты хотел заполнять массив - напишу свой вариант:

var
counts: array[char] of integer;

procedure print_chars(k: integer);
var i: char;
begin
{ этой строкой перебираем все символы алфавита }
for i := #0 to #255 do
if counts[i] = k then write(i);
writeln; { добавлено... Чтоб красивее было... }
end;

var
a: array [1..10] of char;
i: integer;

begin
i := 0;
{ ввод строки - постарайся не вводить больше 10 символов, а то будут проблемы }
while not eoln do begin
inc(i);
read(a[i]);
end;
readln;

{ вот так заполняем массив-счетчик }
for i := 1 to 10 do inc(counts[a[i]]);

write('2: '); print_chars(2);
write('3: '); print_chars(3);
write('4: '); print_chars(4);
end.

Суть в том, что массив counts индексируется не числом, а символом, то есть, count['a'] после заполнения будет содержать количество символов 'a' в массиве, и т.д.

В процедуре - пробегаем по всем символам таблицы ASCII, начиная от #0 (символа с кодом 0), заканчивая #255 (соответственно, символом с кодом 255), и проверяем, равен ли счетчик повторений очередного символа переданному в процедуру значению. Если равен - то печатаем символ... Поскольку символы (в стандартной кодировке 866) расположены по алфавиту в порядке возрастания кодов, и пробегаем мы по всем символам тоже в порядке возрастания их кодов, то и выведенные символы будут упорядочены по алфавиту...

Автор: HelpMe 16.12.2007 0:56

Volvo , спасибо за помощь , но твоя программа ищет в массиве только повторения символа "k" , а в условие нужно найти повторение любых символов введённых с клавиатуры , т.е. вводим 10 любых символов (какие символы в условие не оговоренно) и программы выдаёт какие символы повторяются 2 и т.д. раз например
вводим с клавиатуры массив "a b a d a b d i d d" на экране выдаётся "2: b" "3: a" "4: d" , вот в этом и проблема ... как реализовать это я даже не представляю , учусь только первый семестр ...

Автор: Client 16.12.2007 1:45

посмотри здесь, мож поможет http://forum.pascal.net.ru/index.php?showtopic=20117

Автор: volvo 16.12.2007 17:12

Цитата
программа ищет в массиве только повторения символа "k" , а в условие нужно найти повторение любых символов введённых с клавиатуры
Да ты что? "А мужики-то не знают" (С) blink.gif Моя программа ищет в массиве (который ты, кстати, заполняешь неправильно! У тебя 10 символов - максимально, ты же вводишь 19!!! Теперь ты понимаешь, ПОЧЕМУ я все время добивался от тебя информации, КАК ты наконец заполняешь массив? Чтоб ты потом не сказал, что моя же программа неправильно работает!) все символы, которые встречаются К раз, а не все символы "К". Это во-первых. А во-вторых, никто не мешает вызвать процедуру в цикле:
  for i := 2 to 10 do begin { Ну, можно и не до 10, а до скольки нужно... }
write(i, ': '); print_chars(i);
end;