Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Контрольная работа информатика зИФСТ.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
709 Кб
Скачать
☆

Представление текста

Текст является упорядоченным множеством строк, и наш уровень работы с данными не позволяет предложить для его хранения что-либо иное, кроме массива символов:

char A[20][80];

char B[][40] = { "Строка","Еще строка","0000","abcdef"};

Первый индекс двумерного массива соответствует номеру строки, второй -номеру символа в нем:

int i,k;

for (k=0; A[i][k] !='\0'; k++)

{} // Работа c i-й строкой

Упорядоченные строки

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

// Функция сравнивает две строки по значениям

// кодов (гарантированный алфавитный порядок для

// латинских букв). Результат сравнения:

// 0 - строки одинаковы,

// -1 - первая строка "меньше" по алфавиту, либо

// строки равны, но первая короче

// 1 - то же самое, но для второй строки

int Compare1(unsigned char s1[],unsigned char s2[])

{

int n;

for (n=0; s1[n]!='\0' && s2[n]!='\0'; n++)

if (s1[n] != s2[n]) break;

if (s1[n] == s2[n]) return 0;

if (s1[n] < s2[n]) return -1 ;

return 1 ;

}

Обратите внимание на то, что массивы символов указаны как беззнаковые. В противном случае коды с весом более 0x80 (символы кириллицы) будут иметь отрицательные значения и располагаться в алфавите "раньше" латинских, имеющих положительные значения кодов (кроме того, еще и в обратном порядке, от Я к А). Чтобы устранить этот и другие недостатки, необходимо установить свой порядок следования символов в алфавите и использовать порядковый номер символа в последовательности (индекс в массиве) в качестве его "веса":

//---- Сравнение строк с заданными "весами" символов

char ORD[] = "АаБбВвГгДдЕе1234567890";

int Carry(char c)

{

int n;

if (c=='\0') return(0);

for (n=0; ORD[n]!='\0'; n++)

if (ORD[n]==c) break;

return n+1;

}

int Compare2(char s1[],char s2[])

{

int n;

char c1,c2;

for (n=0; (c1=Carry(s1[n]))!='\0' &&(c2=Carry(s2[n]))!='\0'; n++)

if (c1 != c2) break;

if (c1 == c2) return 0;

if (c1 < c2) return -1;

return 1;

}

Контекстная замена

Контекстная замена -поиск и замена в строке фрагментов, заданных одной строкой (контекста) на фрагмент, заданный другой, например:

Исходная строка Заменяемая Заменяющая Результат

строка строка

"abc234pe4234e" "234" "_00_" "abc_00_pe4_00_e"

Особенность программы: обработка строки производится не путем ее переписывания, а с помощью сдвига “хвоста” строки вправо или влево. Ввиду сложности алгоритма приведем его в пошаговой детализации.

Шаг 1: Исходные данные и результат. Строки заданы массивами символов s,s1,s2. Результирующая строка размещается в том же массиве, что и исходная. Контроль размерности не производится:

void Context(char s[], char s1[], char s2[]) {...}

Шаг 2: Основной цикл программы состоит в посимвольной проверке строки на вхождение в нее подстроки, начиная с текущего символа. В случае вхождения производится замена:

void Context(char s[], char s1[], char s2[])

{

int n;

for (n=0; s[n] !='\0'; n++)

{

// Если начиная с n-го символа расположена

// подстрока s1, заменить ее на s2 в строке

}

}

Шаг 3: Проверка утверждения, что начиная с n-го символа в строке s расположена подстрока s2:

int i;

for (i=0; s[n+i] !='\0' && s1[i] !='\0'; i++)

if (s[n+i] != s1[i]) break;

if (s1[n+i]=='\0')

{

// заменить s1 на s2 в строке, начиная с s[n]

}

Шаг 4: Замена подстроки s1 на s2, начиная с n-го символа строки s, заключается перемещении "хвоста" строки s вправо или влево в зависимости от знака разности длин строк и в переписывании строки s2 на место строки s1. Для получения длины строки воспользуемся стандартной функцией strlen:

int l2,dd,k;

l2 = strlen(s2)

dd = l2 - strlen(s1);

if (dd != 0)

{

// сдвинуть "хвост" строки s на dd символов

}

for (k = 0; k < l2; k++)

s[n+k] = s2[k];

Шаг 5: Для сдвига всего "хвоста" (для простоты, начиная с n-го символа) влево (dd < 0) необходимо все символы, начиная с n+dd перенести на dd позиций влево. Для перемещения вправо нужно сначала найти конец строки, чтобы от него производить перемещения символов с убывающим индексом

if (dd < 0)

{

for (k=n; s[k+dd]!='\0'; k++)

s[k] = s[k+dd];

s[k]='\0';

}

else

{

for (k=n; s[k]!='\0'; k++);

for (; k != n; k--)

s[k+dd] = s[k];

}

Примечание: в случае удачной замены проверка возможности последующей замены производится, начиная со следующего символа. Тогда при наличии замен вида "nnn" на "nnnn..." программа будет расширять строку до бесконечности.