[H-L-L.ru] |
Форма входа |
Меню сайта |
Главная » Статьи » Лекции по C++ » 9. Строки |
Выделение словВыделение слов организуется на основе поиска разделителей слов – пробелов, точек, запятых и т.п. Если разделители расположены до начала слова, они пропускаются. Указатель *ptr[i] ( i – номер слова) устанавливается на первый не разделитель – начало слова (Таблица 3.1). Затем происходит поиск разделителя в конце слова. Он заменяется на ноль ‘\0’. Все изложенные процедуры по выделению следующего слова повторяются до тех пор, пока не будет достигнут конец обрабатываемой строки. Запись нулей в исходную строку модифицирует ее и, если строка нужна в оригинале, ее следует предварительно сохранить. Таблица 3.1
//Пример программы выделения слов 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 | |