IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Вывод символов из текста, Помогите, пожалуйста.
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Всем привет! У меня вот огромные проблемы с одной задачей на работу с текстом.
Звучит она следующим образом: вывести на экран из введенного текста только те символы, которые встречаются в тексте один раз. Вроде задача не очень сложная, но я недогоняю. Пожалуйста, помогите, мне она уже нужна на завтра! Вот что у меня получилось пока:

Код

Program Lab3;
Uses Crt;
  const
   ni=255;
  var
   simb_freq: array [1..ni] of integer;
   i: byte;
   ascode,longtxt: integer;
   txt_val:string;
begin
   clrscr;
   writeln('Vvedite, pojaluista, text: ');
   writeln;
   readln(txt_val);
   {writeln(length(txt_val));}
   i:=0;
   simb_freq[i]:=0;
    repeat
     simb_freq[i]:=i;
     i:=i+1;
    until ni<=i;
    longtxt:=length(txt_val);
      for i:=0 to longtxt do
       begin
         ascode:=ord(txt_val[i]);
         writeln(ascode:2);
         simb_freq[ascode]:=simb_freq[ascode]+1;
         {writeln(simb_freq[ascode]);}
       end;
    i:=0;
    repeat
      if simb_freq[i]=1 then
      writeln(chr(i));
      i:=i+1;
    until ni<=i;
   readln;
end.




ascode - хранение ASCII-кода текущего элемента строки,
longtxt - длина текста,
txt_val - сам текст,

Последний цикл тут совсем не нужен. Короче, у меня такие были соображения:
вводим текст, потом получаем ASCII-кода текущего элемента текста, далее:
1 вариант - далее делаем выборку тех символов, которые встречаются более 1 раза и после уже отсортированные заносим в массив с последующим выводом.
2 вариант - получаем Аски-коды всех элементов строки, заносим их в массив, но так, как там будут многие символы прописываться по 2 и более раз, то поставить какой-нибудь счетчик, который бы следил за каждой ячейкой, чтобы после можно было при опросе элементов массива узнать, сколько раз туда прописывался символ и если это количество равно 1, то выводить на экран. Вот такие вот соображения(может быть весь глупыеsmile.gif). Если что не понятно, то спрашивайте сразу. Мне уже завтра нужно нести решение, поэтому некогда тянуть время. Всем заранее спасибо за помощь!

Сообщение отредактировано: Kritic -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Kritic, все проще гораздо:
Var
freq: array[char] of integer;
i: integer;
j: char;
s: string;

begin
write('text = '); readln(s);
for i := 1 to length(s) do inc(freq[s[i]]);

for j := #0 to #255 do
if freq[j] = 1 then write(j);
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Спасибо огромное!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Volvo, объясни, пожалуйста,что делает реально Паскаль, когда выполняет данную программу?
Что происходит, когда выполняется for i := 1 to length(s) do inc(freq[s[i]]);? Когда мы сравниваем элементы массива с 1, как я понял, то мы выводим, только те символы, которые встретились 1 раз, если с 2, то которые два раза встретились. Следовательно, вопрос: элементы массива freq[j] теперь хранят то число, сколько раз символы встретились в тексте? А почему?
Объясни, пожалуйста, поподробнее, а то мне нужно иметь четкое представление того, что делает машина(просто задачу зашищать нужно будет).

И еще: программа работает корректно только 1 раз, то есть если я введу слово "просто", она выдаст буквы "прст", далее , при повторном выполнении(не выходя из нее) она начинает глючить, так как видно в массиве хранятся, информация прошлого, то есть если я далее ввожу слово "лук", она вместо "лук" выводит "лукпрст". Как вот от этого избавиться? Заранее безмерно благодарен!!!

Вот пока все, что у меня имеется:

Код

Program Lab3;
Uses Crt;
  const
   nj=#255;
  var
    freq: array [#0..nj] of integer;
    i:integer;
    j,Buk:char;
    text:string;
  begin
    clrscr;
    writeln('Программа выводит из текста только те символы, которые в нем встретились 1 раз.');
    writeln(& #39;____________________________________________________________________________
___');
    repeat
    writeln;
    writeln('Пожалуйста, введите текст: ');
    writeln;
    readln(text);
    freq[j]:=0;
    for i:=1 to length(text) do
     inc(freq[text[i]]);
     writeln;
      for j:=#0 to nj do
        begin
         if freq[j]=1 then
         write(j:2);
        end;
        writeln;
     writeln;
     writeln('Если хотите выйти, нажмите "0x".');
    buk:=Readkey;
   until Buk='0';
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Значит, так. Я дал тебе полностью работоспособную программу, которая будет выполняться на любом компиляторе Паскаля. Зачем ту ее перекроил по-своему? Смысл вот этого исправления ты мне можешь объяснить:
const 
nj = #255;
var
freq: array [#0..nj] of integer;
Ты просто потерял красивую программу, и приобрел корявую. Смысл-то от этого не изменился, но ЗАЧЕМ?
Цитата
что делает реально Паскаль, когда выполняет данную программу?
Проходит посимвольно по введенной строке, и для каждого символа строки увеличивает соответствующий ему элемент массива на 1 (для этого и используется индексация Char-ом, а не целым числом, как обычно; если использовать целое, придется делать дополнительные преобразования, а зачем, если можно проще?)...
Цитата
И еще: программа работает корректно только 1 раз, то есть если я введу слово "просто", она выдаст буквы "прст", далее , при повторном выполнении(не выходя из нее) она начинает глючить, так как видно в массиве хранятся, информация прошлого, то есть если я далее ввожу слово "лук", она вместо "лук" выводит "лукпрст". Как вот от этого избавиться?

Очистить массив...
    writeln('Пожалуйста, введите текст: ');
writeln;
readln(text);
fillchar(freq, sizeof(freq), #0);
А свою строчку
    freq[j]:=0;
Можешь убрать, она просто обнуляет один элемент массива, причем неизвестно какой...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Спасибо, за подсказку, я знал , что нужно очистить массив, но не не знал как. Программу я изменил из-за того, чтобы препод не заподозрил, что не я ее решил, поэтому я ее и искорявил.Прога заработала нормально, только хотелось бы еще уяснить один момент. Тот же пример с "просто": ввожу, выдает "прст", а после нажимаю два раза Enter, а он вместо пустой строки выдает "п". Почему? Что нужно сделать, чтобы он выдавал пустую строку, а не выводил какой-то левый символ(кстати, ты не знаешь, почему он именно его выводит?)? Извини, что такое большое кол-во вопросов, просто некогда самому уже разбирать!!! Спасибо за немалую помошь.

Сообщение отредактировано: Kritic -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 0:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name