Главная страница Случайная лекция Мы поможем в написании ваших работ! Порталы: БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика Мы поможем в написании ваших работ! |
Массив строк («Страница»)Массивы могут содержать указатели. Типичным использованием такой структуры данных является формирование массива строк. Элемент такого массива – строка, но строка является, по существу, указателем на её первый символ. Таким образом, каждый элемент в массиве строк в действительности является указателем на первый символ строки. Строки символов могут быть размещены в двумерном массиве, который должен иметь фиксированное количество столбцов на строку и это количество должно быть таким большим, как самая длинная строка. Затраты памяти на хранение большого количества строк, большинство из которых короче, чем самая длинная строка, будут значительными. Поэтому использование массива указателей на строки хотя и требует дополнительной памяти для данной структуры, но в свою очередь позволяет выделять память требуемого размера для каждой строки. Средства распределения динамической памяти позволяют увеличивать и/или уменьшать размер массива указателей до требуемого объема. Сортировка текста осуществляется посредством операций над элементами массива указателей, сами строки в памяти не перемещаются. Набор функций для работы с текстом: 1. Ввод текста через массив указателей на строки. char **Enter_Text () { char temp[N]; char **p = (char **) new char*; int n = 0; // счетчик количества строк while (1) { gets (temp); if (temp[0] == ‘\0’) break; // строка не введена p[n] = (char *) malloc (strlen (temp)+1); // выделили память strcpy (p[n], temp); n++; p = (char **) realloc (p, sizeof (char *) * (n+1)); } p[n] = NULL; return p; } 2. Посчитать количество слов в каждой строке текста. /* Функция проверяет, является ли символ разделителем */ int Letter (char ch) { if (isalnum (ch) > 0) return 1; if (((ch >= 'A') && (ch <= 'п')) || ((ch >= 'р') && (ch <= 'я'))) return 1; return 0; } /* Функция подсчета количества слов в строке */ int Count_Words (char *String) { int n = 1; if (*String == '\0') return 0; for (String ++; * String !='\0'; String ++) if (!Letter (String [0]) && Letter (String [-1]) ) n++; if ( (String [0] == '\0') && Letter (String [-1]) ) n++; return n; } /*Функция создания массива статистики */ int *Statistic (char **text) { int i, *count; // Определение количества строк в тексте for (i = 0; text [i] != NULL; i++); // Выделение памяти для массива статистики count = (int *) new [i + 1]; // Подсчет количества слов в каждой строке for (i = 0; text [i] != NULL; i++) count [i] = Count_Words (text [i]); count [i] = 0; return count; // Вернуть указатель на массив статистики } 3. Вывод текста и массива статистики. void Output_Text (char **tеxt, int *stat) { for (int i = 0; text [i] != NULL; i++) {printf ("%s \t", text[i]); printf (" - %d \n", stat[i]);} } 4. Исключить из текста строки, содержащие заданную подстроку. void Delete_String (char **text, char *Subset) { int i = 0, j; while (text [i] != NULL) if (strstr (text [i], Subset)) for (j = i; text [j] != NULL; j++) text [j] = text [j + 1]; else i++; } 5. Удалить из строки повторные вхождения слов. // Функция разбивает строку на слова int Words (char *String, char w[][N]) { int i = 0, j, k = 0, key = 0, n = strlen (String); for (j = 0; j <= n; j ++) if (Letter(String [j])) { w[k][i] = String [j]; i++; key = 1; } else if (key) { w[k][i] = '\0'; i = 0; k++; key = 0; } return k; } void Delete_Second (char Word[][N], int &n) { int i, j, l; for (i = 0; i < n - 1; i++) { j = i + 1; while (j < n) if ((strcmp (Word [i], Word [j])) == 0) { for ( l = j; l < n – 1 ; l++) strcpy (Word [l], Word [l + 1]); n --; } else j ++; } } // Функция объединяет слова в строку, разделяя их пробелами char* Result_String (char Word [][N], int n) { int i, length = 0; // определяем длину строки for (i = 0; i < n; i++) length += strlen (Word [i])+1; char *Result = new char[length]; // выделяем память strset (Result,'\0'); for (i = 0; i < n; i++) { strcat (Result, Word [i]); strcat (Result, " "); } return Result; }
Дата добавления: 2014-11-14; просмотров: 280; Нарушение авторских прав Мы поможем в написании ваших работ! |