Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи № 4
з курсу „ Засоби системного програмування ”
Тема:
Опрацювання рядків символів.
Динамічний розподіл пам’яті.
Виконав:
студент групи КІ-2
Львів – 2004
Мета роботи: Закріпити теоретичні знання та оволодіти практичними навиками опрацювання символьних рядків. Засвоїти методику роботи з символьними рядками за допомогою стандартних функцій бібліотеки Сі.
Завдання на лабораторну роботу
Розробити програмне забезпечення для опрацювання символьних рядків відповідно до заданого варіанту.
Під словом, слід розуміти послідовність алфавітних символів, що належать множині {’А’, ’Б’, …, ’Я’, ’а’, ’б’, …, ’я’, ’A’, ’B’, …, ’Z’, ’a’, ’b’, …, ’z’}. Речення, це послідовність слів розділених пропуском (пробілом). Кожне слово чи речення повинно представлятися в пам’яті машини окремою символьною змінною. При реалізації програм, максимально використати стандартні (бібліотечні) функції обробки символьних рядків. Ці функції описані в заголовковому файлі string.h, а їх імена починаються з префіксу “str…”.
Програма повинна обробляти слова та речення довільної довжини. Для цього використати механізм динамічного розподілу пам’яті. При реалізації механізму динамічного розподілу пам’яті використати стандартні Сі – функції malloc(), calloc() realloc() та free().
При вирішенні задач забезпечити дружній інтерфейс з користувачем.
Варіант 23. Ввести зі стандартного пристрою вводу речення. Замінити в словах буквосполучення ’x…z’ буквосполученням ’s…q’, де ’s’, …, ’z’ – довільні алфавітні символи, а довжини буквосполучень різні, та вивести їх (слова) на стандартний пристрій виводу.
Аналіз завдання та опис алгоритму вирішення задачі
Використовуючи функції порівняння рядків символів шукаємо перше потрібне буквосполучення в реченні, замінюємо його новим, а потім визначаємо початок і кінець слова, в якому знайдене шукане буквосполучення і виводимо змінене слово. Аналогічні дії повторюємо для всіх слів з шуканим буквосполученням.
Текст програми
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <alloc.h>
#include <ctype.h>
int main(void)
{ int i, j, k, left, right=0, words=0;
char *sent, *str, *newstr, *temp;
clrscr();
if ((sent=(char*) malloc(200*sizeof(char)))==NULL) //INPUT BEGIN
printf("No memory for sentence has been allocated!");
if ((str=(char*) malloc(20*sizeof(char)))==NULL)
printf("No memory for string has been allocated!");
if ((newstr=(char*) malloc(20*sizeof(char)))==NULL)
printf("No memory for new string has been allocated!");
if ((temp=(char*) malloc(40*sizeof(char)))==NULL)
printf("No memory for temporary string has been allocated!");
printf("Input a sentence (words may contain only A..Z and a..z):\n ");
gets(sent);
sent=(char *) realloc(sent,strlen(sent)+1);
printf("Input letter sequence to change (case sensitive): ");
gets(str);
str=(char *) realloc(str,strlen(str)+1);
printf("New letter sequence: ");
gets(newstr);
newstr=(char *) realloc(newstr,strlen(newstr)+1); //INPUT END
while (sent[right]!='\0') // perebyrayemo po sumvolu v rechenni
{
temp[0]='\0';
if (strncmp(&sent[right],str,strlen(str))==0)//rech maye taki sumvoly?
{
left=right; //┌ poshyk
while (isalpha(sent[left]) && left!=0) left--; //│ livoji
if (left != 0) left++; //└ mezhi slova
while (isalpha(sent[right++])); //┌ poshuk pravoji
right--; //└ mezhi slova
printf("\n%d>Slovo, v yakomu znajdeno \"%s\": ",words+1,str);
for (i=left;i<=right;i++) putchar(sent[i]); // vyvid slova
j=left; k=0;
while (strncmp(&sent[j],str,strlen(str))!=0)
{ temp[k]=sent[j]; k++; j++; }
temp[k]='\0';
strcat(temp,newstr);
k=k+strlen(newstr);
j=j+strlen(str);
while (j<=right)
{ temp[k]=sent[j]; k++; j++; }
k--;
temp[k]='\0';
printf("\n nove slovo: %s\n",temp);
words++; // zbil'sh. kilkist' sliv na 1
}
right++; // perehid na nastupnyj symvol v rechenni
}
if (words==0) printf("Sliv z \"%s\" ne isnye!",str);
free(sent); free(str); free(newstr); free(temp);
getchar();
return 0;
}
Опис результатів тестування
Для тестування програми було використано речення: “There were three squirrels on the tree.”. Треба було замінити буквосполучення “re” на “XXX”.
Кінцевий вигляд результатів тестування програми:
Input a sentence (words may contain only A..Z and a..z):
There were three squirrels on the tree.
Input letter sequence to change (case sensitive): re
New letter sequence: XXX
1>Slovo, v yakomu znajdeno "re": There
nove slovo: TheXXX
2>Slovo, v yakomu znajdeno "re": were
nove slovo: weXXX
3>Slovo, v yakomu znajdeno "re": three
nove slovo: thXXXe
4>Slovo, v yakomu znajdeno "re": squirrels
nove slovo: squirXXXls
5>Slovo, v yakomu znajdeno "re": tree.
nove slovo: tXXXe
Висновок: Виконуючи дану лабораторну роботу, я закріпив теоретичні знання та оволодів практичними навиками опрацювання символьних рядків. Я розробив програму, в якій використав стандартні Сі – функції для динамічного розподілу пам’яті та для роботи з символьними рядками.