[H-L-L.ru]

Форма входа

Меню сайта

Categories
1. Основы работы в среде C++ Builder.Основы языка Си++ [9]
2. Операторы ветвления и операторы передачи управления [4]
3. Операторы цикла и операторы передачи управления [5]
4. Одномерные массивы [3]
5. Многомерные массивы [3]
6. Указатели.Динамическое распределение памяти [6]
7. Отладка программы [3]
8. Функции [8]
9. Строки [5]
10. Функция Main [2]
11. Типы данных,определяемые пользователем [5]
12. Потоки ввода/вывода [7]
13. Основы объектно-ориентированного программирования [5]
Приложения [11]

Главная » Статьи » Лекции по C++ » 9. Строки

4. Примеры программ

Выделение слов

Выделение слов организуется на основе поиска разделителей слов – пробелов, точек, запятых и т.п. Если разделители расположены до начала слова, они пропускаются. Указатель *ptr[i] ( i – номер слова) устанавливается на первый не разделитель – начало слова  (Таблица 3.1). Затем происходит поиск разделителя в конце слова. Он заменяется на ноль ‘\0’. Все изложенные процедуры по выделению следующего слова повторяются до тех пор, пока не будет достигнут конец обрабатываемой строки. Запись нулей в исходную строку модифицирует ее и, если строка нужна в оригинале, ее следует предварительно сохранить.

Таблица 3.1

Адрес

 

Ptr[0]

 

 

 

 

Ptr[1]

 

 

Ptr[2]

 

 

Строка

 

q

w

e

 

 

t

y

 

r

t

\0

Дополнение

 

 

 

 

\0

 

 

 

\0

 

 

 

 

//Пример программы выделения слов

char St[21]="";// 20 символов и \0

int k,i=0;

cout<<RUS("Введите строку:");

gets(St);

k=strlen(St);

cout<<RUS("\nДлина строки = ")<<k;

char *Delimiters = " .!?,;:\"'/0123456789@#$%^&*()<>{}[]~+-=";

char *ptr[20];

int x=0;bool prDelim=true;

ptr[i]=St;

do

{do

        {

         while ((*ptr[i]!=Delimiters[x])&&(Delimiters[x]!='\0')) x++;

         if (Delimiters[x]!='\0') ptr[i]++;

        }

 while (Delimiters[x]!='\0');

i++;ptr[i]=ptr[i-1];//найдено начало слова

for(;;)

  {   ptr[i]++;if (*ptr[i]=='\0') {prDelim=false;break;}//найден конец строки

      x=0;

      while ((*ptr[i]!=Delimiters[x])&&(Delimiters[x]!='\0')) x++;

      if (Delimiters[x]!='\0')

      {*ptr[i]='\0';ptr[i]++;prDelim=true;break;}//найден конец слова

  }

}

while (prDelim);

for(int j=0;j<i;j++)cout<<'\n'<<ptr[j];//вывод массива слов

 

В библиотеке string.h есть функция выделения слова strtok(St,Delimiters). Она выделяет одно слово строки St по перечню разделителей Delimiters. Если нужно выделить последующие слова, функцию используют с параметром NULL вместо St. Тогда она продолжает выделять слова в строке St. По завершению всех слов функция возвращает ноль и  это следует использовать для выхода из цикла выделения.

char St[21]="";// 20 символов и \0

int k,i=0;

cout<<RUS("Введите строку:");

gets(St);

strrev(St);

puts(St);

k=strlen(St);

cout<<RUS("\nДлина строки = ")<<k;

char *Delimiters = " .!?,;:\"'/0123456789@#$%^&*()<>{}[]~+-=";

char *ptr[20];

ptr[i] = strtok(St, Delimiters);//выделение первого слова

while(ptr[i])

{i++;

ptr[i] = strtok(NULL,Delimiters );// выделение следующего слова

}

for(int j=0;j<i;j++)cout<<'\n'<<ptr[j];//вывод массива

 

При выводе:

если обращение как ptr[j] – вывод слова полностью

если обращение как *ptr[j] – вывод 1-го символа слова

если обращение как *(ptr[j]+1) – вывод 2-го символа слова

если обращение как *(ptr[j] +n) – при n> длины слова выводятся буквы следующего слова

Сортировка символов по алфавиту

Сортировка осуществляется пузырьковым методом, рассмотренным в п. 1.1.1. Для проверки правильности в приложении I приведена таблица кодов символов по стандарту ASCII. Сортировать символы в строке не имеет смысла, поэтому рассмотрим программу сортировки слов по начальной букве. Программа является дополнением к программе предыдущего раздела по выделению слов. На начало каждого слова указывает переменная ptr[i].

int N=i;//N-число слов

char* t;

for(int j=0;j<N;j++)

strlwr(ptr[i]);                //преобразование к строчным буквам

  for(int i=N-1;i>0;i--)   //начало сортировки

        for(int j=0;j<i;j++)

          if(*ptr[j]>*ptr[j+1])

          {

            t=ptr[j];

            ptr[j]=ptr[j+1];

            ptr[j+1]=t;

          };      //конец сортировки

for(int j=0;j<N;j++)cout<<'\n'<<ptr[j];//вывод массива

 

Для сортировки по второй букве необходимо повторить процедуру внутри рядов с одинаковыми первыми буквами. Так что, предварительно нужно вычислить количество слов по каждой букве… Читателю предлагается самому разработать пример такой программы.



Источник: выделение слов c++ сортировка символов по алфавиту

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Полная версия сайта