Студопедия

Главная страница Случайная лекция

Порталы:

БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика






Массив строк («Страница»)

Читайте также:
  1. Turbo-строки
  2. V. АКУСТИЧЕСКИЕ СВОЙСТВА ГОРНЫХ ПОРОД И МАССИВОВ. ОСНОВНЫЕ ФАКТОРЫ, ВЛИЯЮЩИЕ НА АКУСТИЧЕСКИЕ СВОЙСТВА ГОРНЫХ ПОРОД
  3. Борьба с трещинообразованием в массивных бетонных сооружениях.
  4. Воздействия на горные породы и их массивы
  5. Двумерный массив целых чисел («Матрица»)
  6. ДЕ №3 / Оценка устойчивости склонов, откосов и массивных подпорных стенок
  7. Добавление и удаление столбцов и строк.
  8. Заложение скважин на массивных залежах
  9. Изменение размеров столбцов и строк.

Массивы могут содержать указатели. Типичным использованием такой структуры данных является формирование массива строк. Элемент такого массива – строка, но строка является, по существу, указателем на её первый символ. Таким образом, каждый элемент в массиве строк в действительности является указателем на первый символ строки.

Строки символов могут быть размещены в двумерном массиве, который должен иметь фиксированное количество столбцов на строку и это количество должно быть таким большим, как самая длинная строка. Затраты памяти на хранение большого количества строк, большинство из которых короче, чем самая длинная строка, будут значительными. Поэтому использование массива указателей на строки хотя и требует дополнительной памяти для данной структуры, но в свою очередь позволяет выделять память требуемого размера для каждой строки.

Средства распределения динамической памяти позволяют увеличивать и/или уменьшать размер массива указателей до требуемого объема.

Сортировка текста осуществляется посредством операций над элементами массива указателей, сами строки в памяти не перемещаются.

Набор функций для работы с текстом:

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; просмотров: 218; Нарушение авторских прав


lektsiopedia.org - Лекциопедия - 2013 год. | Страница сгенерирована за: 0.004 сек.