Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторн_робот_Ч2.doc
Скачиваний:
19
Добавлен:
03.11.2018
Размер:
2.12 Mб
Скачать

Приклади розробки функцій для обробки текстової інформації

Приклад 1. Функція обчислення довжини рядка. Наступна нижче функція має старомодну і форму, що не рекомендується стандартом, заголовка (у стандартній бібліотеці їй відповідає функція strlen( )):

int len(e)

char e[ ] ;

{

int m;

for (m=0; e[m]!='\0'; m++) ;

return m;

}

Відповідно до ANSI-стандарту і зі стандартом ISO заголовок повинний мати, наприклад, такий вид:

Int len (char e[ ])

У цьому прикладі й у заголовку, і в тілі функції немає навіть згадувань про споріднення масивів і вказівників. Однак компілятор завжди сприймає масив як вказівник на його початок, а індекс як зсув відносно початку масиву. Наступний варіант тієї ж функції (тепер заголовок відповідає стандартам мови) явно реалізує механізм роботи з вказівниками:

Int len (char *s)

{

int m;

for (m=0; *s++! = '\0' ; m++)

return m;

}

Для формального параметра-вказівника s всередині функції виділяється ділянка пам'яті, куди записується значення фактичного параметра. Так як s не константа, то значення цього вказівника може змінюватися. Саме тому припустимо вираз s++

Приклад 2. Функція інвертування рядка-аргументу з параметром-масивом (заголовок відповідає стандарту):

Void invert(char e[ ])

{

char s;

int і, j , m;

/*m - номер позиції символу '\0' у рядку е */

for (m=0; e[m]!='\0'; m++) ;

for (i=0, j=m-l; i<j; i++, j--)

{

s=e[i];

e[i]=e[j];

e[j]=s;

}

}

У визначенні функції invert() за допомогою ключового слова void зазначено, що функція не повертає значення.

В якості вправи можна переписати функцію invert(), замінивши параметр-масив параметром-вказівником типу char*.

При виконанні функції invert() рядок - фактичний параметр, наприклад, "сироп" перетвориться в рядок "порис". При цьому символ '\0' залишається на своєму місці наприкінці рядка. Приклад використання функції invert():

#include <stdio.h>

void main( )

{

char ct[ ]="0123456789";

/* Прототип функції: */

void invert(char [ ]);

/* Виклик функції: */

invert(ct)/

printf ("\n%s",ct) ;

}

Результат виконання програми:

9876543210

Приклад 3. Функція пошуку в рядку найближчого ліворуч входження іншого рядка (у стандартній бібліотеці є подібна функція strstr()):

/*Пошук рядка СТ2 у рядку СТ1 */

int index (char * СТ1, char * CT2)

{

int і, j , ml, m2;

/* Обчислюються m1 і m2 - довжини рядків */

for (m1=0; CT1[m1] !='\0'; m1++);

for (m2=0; CT2[m2] !='\0'; m2++);

if (m2>m1)

return -1;

for (i=0; i<=m1-m2; i++)

{

for (j=0; j<m2; j++) /*Цикл порівняння */

if (СT2[j] !=СT1[i+j])

break;

if (j==m2)

return i;

} /* Кінець циклу по і */

return -1;

}

Функція index() повертає номер позиції, починаючи з якої СТ2 цілком збігається з частиною рядка СТ1. Якщо рядок СТ2 не входить у СТ1, то повертається значення -1.

Приклад звертання до функції index( ):

#include <stdio.h>

Void main( )

{

char C1[ ]="сума мас";

/* Прототип функції: */