Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

Для рядків не визначено операцій присвоювання, додавання, порівняння, оскільки рядок не є основним типом даних. Для роботи з рядками використовуються спеціальні бібліотечні функції, опис яких міститься у файлі < string.h>. Деякі з цих функцій наведено у таблиці 8.1:

 

Таблиця 8.1 Функції стандартної бібліотеки для роботи з рядками – файл < string.h>

Прототип функції Короткий опис та використання Пояснення
unsignedstrlen(const char*s); Обчислює довжину рядка s. strlen(s); Повертає фактичну довжину рядка, не враховуючи нуль-символ
int strcmp(const char*s1, const char *s2); Порівнює рядки s1 і s2. strcmp(s1, s2); Якщо s1<s2, тоді результат від’ємний, якщо s1= =s2, тоді результат рівний 0, якщо s2>s1 – результат додатний.
int strncmp(const char*s1, const char *s2, n); Порівнює перші n символів рядків s1 і s2. strncmp(s1, s2, n); Якщо n(s1)<n(s2), тоді результат від’ємний, якщо s1= =s2, тоді результат рівний 0, якщо s2>s1 – результат додатний.
char*strcpy(char*s1, const char*s2); Копіює символи рядка s2 у рядок s1. strcpy(s1, s2); Нуль-символ при цьому теж включається
char*strncpy(char*s1, const char*s2, int n); Копіює n символів рядка s2 у рядок s1. strncpy(s1,s2,n); Кінець рядка відкидається. Якщо нуль-символ у вихідному рядку зустрінеться раніше, копіювання припиняється, а решта символів рядка доповнюються ‘\0’-ми.
char*strcat(char*s1, const char*s2); Дописує рядок s2 до рядка s1. strcat(s1, s2); Перший символ s2 записується на місце нуль-символу рядка s1. До результуючого s1 додається ‘\0’.
char*strncat(char*s1, const char*s2, size_t n); Дописуються перші n символів рядка s2 до рядка s1. strncat(s1,s2,5); n-символів рядка s2 записується до s1, починаючи з місця нуль-символу s1.
char* strсhr(char*s, int ch) Шукає символ ch у рядку s. strchr(s, ch); Повертає вказівник на перше входження символу в рядок справа. Якщо його немає – повертається NULL
char* strrev(char *s1) Змінює порядок символів у рядку s1 на протилежний. strrev(s1, s2); Дзеркальне відображення рядка s1.
char *strstr(char*s1, char*s2) Шукає підрядок у рядку. strstr(s1, s2); Пошук першого входження s2 у s1. В разі вдалого пошуку повертається вказівник на елемент з s1, з якого починається s2, інакше – NULL.
char *strtok(char*s1, char*s2) Розбиває рядок на лексеми. strtok(s1, s2); Функція повертає вказівник на лексему в s1, відокремлену символом з набору s2 (пробілами або розділовими знаками).

Для роботи з символами у файлі < ctype.h> стандартної бібліотеки визначено функції, наведені в таблиці 8.2:

Таблиця 8.2 Функції стандартної бібліотеки для роботи з символами-файл <ctype.h>

Прототип функції Короткий опис та використання Пояснення
int isalnum(int ch) Перевіряє чи є символ ch буквою або цифрою (A-Z, a-z, 0-9). isalnum(ch); Повертається true, якщо ch є буквою або цифрою, інакше false
int isalpha(int ch) Перевіряє чи є символ ch буквою (A-Z, a-z). isalpha(ch); Повертається true, якщо ch є буквою, інакше false
int isspace(int ch) Перевіряє чи є символ ch пропуском (пробіл, табуляція, символ нового рядка, нової сторінки). isspace(ch); Повертається true, якщо ch є узагальненим пробілом, інакше false
int isdigit(int ch) Перевіряє чи є символ цифрою (0-9). isdigit(ch); Повертається true, якщо ch є цифрою, інакше false
int islower(int ch) Перевіряє чи є символ буквою нижнього регістру (a-z). islower(ch); Повертається true, якщо ch є буквою нижнього регістру, інакше false
int isupper(int ch) Перевіряє чи є символ буквою верхнього регістру (A-Z). isupper(ch); Повертається true, якщо ch є буквою верхнього регістру, інакше false
int ispunct(int ch) Перевіряє чи є символ символом пунктуації (.,:;?! тощо). ispunct(ch); Повертається true, якщо ch є символом пунктуації, інакше false
int tolower (int ch) Повертає символ у нижньому регістрі. tolower (int ch); Одержує символ ch і повертає його у нижньому регістрі
int toupper(int ch) Повертає символ у верхньому регістрі. toupper(int ch); Одержує символ ch і повертає його у верхньому регістрі

Приклад 1:

Дано рядок символів, що складається зі слів, слова відокремлені пропусками. Видалити з рядка всі слова, що починаються з цифри.

#include <iostream.h>

#include <string.h>

#include <ctype.h>

void main()

{const int n=250;// розмірність рядкового масиву

char s[n], // вихідний рядок

w[25], // проміжний масив для збереження слова з рядка

*mas[10];// масив вказівників для збереження слів з рядка

cout<<“\nBведiть рядок:\n”;

cin.getline(s, n);

int k=0, t=0, i, len, j;

len=strlen(s);

while(t<len)

{ for(j=0,i=t; isspace(s[i])==0; i++,j++)

w[j]=s[i]; // виокремлюємо слово до пробілу

w[j]=’\0’;// формуємо кінець слова

strcpy(mas[k],w);// копіюємо слово у масив

k++;// збільшуємо лічильник слів у рядку

t=i+1;// перехід через пробіл до наступного слова у

// вихідному рядку s

}

strcpy(s,” ”);// очищуємо вихідний рядок

for(t=0; t<k; t++)// заповнюємо рядок

if(isalpha(mas[t][0])!=0){// якщо перший символ не цифра

{strcat(s,mas[t]);// дописуємо слово в оновлений рядок

strcat(s,” “);// додаємо пробіл після слова

}

cout<<”\nНовий рядок:\n”<< s;// виводимо результат

}

Приклад 2:

Програма яка підраховує скільки разів задане слово зустрічається у тексті файлу. Наприклад, у англійській поговірці “Don’t trouble trouble until trouble troubles you” слово “trouble” у чистому вигляді зустрічається 3 рази.

#include <fstream.h>

#include <string.h>

# include<ctype.h>

void main()

{const int len=81;

char word[len], line [len];// масиви для слова і рядка

cout<< “Введiть слово для пошуку:”; cin>> word;

int_lword=strlen(word);// визначення довжини слова

ifstream fin (“text.txt”, ios:: in | ios:: nocreate);

if(!fin) {cout<< “Помилка відкриття файлу.”<<endl;return 1;}

int count=0;

// поки не досягнуто нуль-символу

while(fin.getline(line, len))

{char *p=line;// вказівникові присвоєно адресу рядка

while(p=strstr(p,word))/* якщо слово знайдено

вказівник стає на позицію

початку слова у рядку*/

{ // адреса початку входження слова передається с

char * c=p;

p+=l_word;// перехід вказівника р через слово

// слово не на початку рядка

if(c!=line)

/* Чи є символ перед словом розділювачем? Інакше –

перейти до наступної ітерації */

if(!ispunct(*(c-2))&& isspace(*(c-1))) continue;

// Чи є символ після слова розділювачем?

if (ispunct(*p)|| isspace(*p)|| (*p==’\0’)) count ++;

}

}

cout << “Слово зустрічається в тексті ”<< count;

<<” разів”<<endl;

}

Приклад виконання завдання.

Дано текст, який складається з букв і пропусків. На друк вивести слова, які містяться в ньому, і їх кількість. Словом вважати послідовність букв, розділених пропусками.


Блок-схема

 
 

 

 

Програма мовою Pascal

program lab_Text;

var s,p: string;

i,k: integer;

Begin

s:=´поздововляю з новим роком´;

p:=‘ ’; k:=0;

writeln (s);

writeln (´слова:´);

for i:=1 to length (s) do

if s [i]= ‘ ’

Then

begin if length (p)>0 then

Begin

writeln (p);

p:=‘ ’;

k:=k+1

End

End

else p:=p+s [i];

if length (p) >0 then

Begin

writeln (p);

k:=k+1

end;

writeln (¢кількість слів:’, k:4)

End.

Програма мовою С

 

#include <stdio.h>

#define SIZE 255

Main()

{

int k=0, i=0;

char text[SIZE]=”Поздововляю з новим роком”;

char *word=text; //адресу початку масиву – у word

printf(“слова:\n”);

while (*word) //поки не нульовий байт

{

if (*word!= ‘ ‘) //якщо пропуск

{

printf(“%c”,*word); //друкувати символ

if (!i) {i++; k++;} //якщо i=0

}

Else

{

if (i) printf(“\n”); //якщо i не =0

i=0;

}

word++; //збільшити адресу

}

printf(“\n Кількість слів: %d\n”,k);

}

Контрольні запитання.

1. Як оголошують символьні змінні?

2. Як визначити символьні змінні у тексті?

3. Яким програмним засобом виконується перегляд тексту по одному чи N символів?

4. Як здійснити доступ до окремого символу рядка?

5. Які стандартні функції і процедури для роботи з рядками ви знаєте?

 

Завдання.

1. В заданому тексті знайти і вивести на друк цифри, які містяться в ньому, і їх кількість.

 

2. В заданому тексті знайти і вивести на друк кількість і номери позицій букви “А”, які містяться в ньому.

 

3. В заданому тексті знайти і вивести на друк кількість цифр і кількість букв, які містяться в ньому.

 

4. Дано текст. Підрахувати кількість малих латинських букв, які містяться в ньому до 10-го символа включно. На друк вивести ці букви і обчислену кількість.

5. Дано текст. Вияснити, чи є від ідентифікатором. Ідентифікатор – це послідовність букв і цифр, яка починається з букви.

 

6. Дано текст. Вияснити, чи є він числом. Від’ємні числа містять на початку знак мінус.

 

7. Якщо в заданому тексті немає символа “*”, то залишити його без зміни. В противному випадку кожну латинську букву, яка знаходиться перед першим символом “*”, замінити на крапку.

 

8. Дано текст. Якщо він не містить символа “+”, то залишити його без зміни. В противному випадку кожну цифру, яка знаходиться перед першим символом “+”, замінити на кому.

 

9. Дано текст, який містить букви і пропуски. Якщо в ньому немає слова “весна”, то залишити його без зміни. В противному випадку замінити всі слова “весна” на “зима”. Словом вважати послідовність букв, розділених пропусками.

 

10. Дано текст, який містить букви і пропуски. Знайти і надрукувати слова і їх кількість, довжина яких перевищує 5 символів. Словом вважати послідовність букв, розділених пропусками.

 

11. Дано текст, який містить букви і пропуски. Знайти і надрукувати слова і їх кількість, які містять по 2 букви “А”. Словом вважати послідовність букв, розділених пропусками.

 

12. Дано текст, який містить букви і пропуски. Знайти і надрукувати слова і їх кількість, які закінчуються буквосполученням “ати”. Словом вважати послідовність букв, розділених пропусками.

 

13. Дано текст, який містить букви і пропуски. Знайти слова, які закінчуються буквосполученням “ати”, і замінити це буквосполучення на “али”. Словом вважати послідовність букв, розділених пропусками.

 

14. Дано текст, який містить букви і 2 символи “%”. Знайти кількість букв, які знаходяться між першим і другим символами “%”.

 

15. Дано текст, який містить букви і пропуски. Знайти і надрукувати слово, в якому міститься найбільше символів “А”. Словом вважати послідовність букв, розділених пропусками.

16. Слова в тексті розділені пропусками. Після кожного слова поставити знак оклику.

17. Визначити яка відповідь надійшла з клавіатури: так або ні (чи є у відповіді окремі символи ‘y, ‘Y’, ‘n’,’N’).

18. Визначити яка відповідь надійшла з клавіатури: так або ні (чи є у відповіді окремі слова ‘так’, ‘Так’,’ні’,’Ні’-?).

19. З двох текстів рівної довжини створити новий текст чергуванням.

20. З двох текстів різної довжини зформувати новий текст чергуванням.

21. У вхідному тексті слово ‘товариш’ замінити на слово ‘пан’.

22. У всіх словах ‘кит’ тексту замінити ‘и’ на ‘і’.

23. У тексті вирізати літеру ‘ь’ з слів ’моль’.

24. Підрахувати кількість входжень тексту ‘тобто’ у вхідний текст.

25. Підрахувати кількість входжень тексту ‘бо’ у вхідний текст (як слово і як фрагмент).

26. Відсортувати слово (слово складається з літер) у алфавітному порядку.

27. Вивести число зі зворотнім порядком цифр.

28. Визначити суму цифр числа.

29. Вивести цифри вхідного числа з назвою розрядів (до мільйона). Для збереження назв створити текстовий масив.

30. Скласти усі цифри, що є в тексті.


Лабораторна робота № 9.



Поделиться:


Последнее изменение этой страницы: 2016-09-05; просмотров: 1088; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.147.193 (0.011 с.)