Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сука лаби.docx
Скачиваний:
17
Добавлен:
12.05.2015
Размер:
848.39 Кб
Скачать

Порядок виконання роботи

А. При підготовці:

1. Ознайомитися із додатком А, де наведені основні функції бібліотеки string.h та приклади реалізації цих функцій: порівняння рядків, копіювання рядків, поєднання рядків, пошук символа у рядках, розклад рядків на слова та визначення довжини рядків.

2. Ознайомитися з програмами RJADOC_1.CPP та KALENDAP.CPP

(додатки В,С), у яких наведені приклади роботи з символами та рядками .

3. Розробити алгоритми та написати програми для виконання завдання у нижченаведеній таблиці . Підготувати тести для налагоджування та перевірки програм.

4. Підготувати шаблон звіту.

В. У лабораторii:

1.Виконати підготовлені програми .

2.Оцінити результати виконання програм та зробити висновки.

3.Заповнити звіт.

Змiст звiту:

1.Алгоритми розрахунків та програми. Результати виконання.

2.Оцінка результатів та відповідні висновки.

3.Пропозиції по роботі.

Варіант

Завдання

1

Визначити у заданому тексті відносну кількість слів, які починаються з букви м.

Обчислити кількість п'ятниць на 13 число у 20 столітті.

2

Визначити у заданому тексті відносну кількість слів з подвійною голосною.

Визначити кількість понеділків, які припадають на 2 число у період з 1.05.1980 року по 1.05.2000 року.

3

Скільки у заданому тексті голосних, приголосних, ком та крапок? (Інших символів у тексті немає)

Визначити кількість років та днів між двома датами, які вводяться з клавіатури.

4

Розташувати слова у заданому тексті у порядку зменшення їх довжини.

Визначити кількість серед, які приходяться на 5 число у році, який вводиться з клавіатури.

5

Визначити у заданому тексті найбільшу довжину слова та кількість голосних у цьому слові.

День Вчителя - перша неділя жовтня. Визначити день (число) у році, значення якого вводиться з клавіатури.

6

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

Визначити кількість неділь, які припадають на 5 число у період з 1.01.2000 року по 1.05.2008 року.

7

Визначити кількість повторень слів у заданому тексті.

Визначити кількість днів між 1.01. та датою дня народження у році, значення якого вводиться з клавіатури.

8

Визначити кількість 4-буквених слів у заданому тексті.

Обчислити кількість серед на 14 число у 20 столітті.

9

У заданому буквеному тексті знайти слово з найбільшою долею букв а,б.

Визначити кількість днів між датою вступу до університету та сьогоднішньою датою, які вводяться з клавіатури.

10

У заданому буквеному тексті знайти усі слова з двома буквами а.

Визначити кількість місяців та днів між 1 січня 2000 року та датою, яка вводиться з клавіатури.

11

Знайти у заданому буквеному тексті всі слова з другою буквою о.

Визначити кількість субот, які припадають на 1 число у період з 1.05.1980 року по 1.05.2007 рік.

12

Визначити кількість входжень букви і у всі слова заданого тексту.

Обчислити кількість серед на 10 число у 21 столітті.

13

Знайти у заданому тексті слово найбільшої довжини, друга буква якого а.

Обчислити кількість п'ятниць на 7 число у 20 столітті.

14

Задані два символьні рядки. Викреслити із першого рядка усі символи, які входять до другого рядка.

Визначити кількість місяців та днів між двома датами, які вводяться з клавіатури.

15

Знайти у заданому тексті найкоротше слово, яке закінчується на букву а. Якщо таких слів немає, то дати відповідне повідомлення.

День Києва - остання неділя травня. Визначити день (число) у році, значення якого вводиться з клавіатури.

16

Визначити відносну кількість у заданому тексті слів з подвійною приголосною.

Обчислити кількість четвергів на 1 число у 20 столітті.

17

Заданий буквений текст. Визначити, чи є у ньому усі букви, що входять до слова ЗАЛІК.

Визначити кількість днів між 1 січня 1950 року та датою, яка вводиться з клавіатури.

18

Заданий рядок буквено-цифрових символів. Розмістити спочатку усі букви, потім цифри.

Обчислити кількість неділь на 1 число у 20 столітті.

19

Заданий рядок із буквено-цифрових символів. Яка цифра зустрічається у тексті найчастіше? Яка голосна буква зустрічається у тексті менше за всі інші букви?

Визначити кількість днів між датою вступу до університету та датою можливого закінчення, які вводяться з клавіатури.

20

Виписати із тексту к-те слово (значення к вводиться із клавіатури).

Визначити кількість років та днів між датою дня народження та датою, яка вводяться з клавіатури.

21

У заданому тексті визначити кількість двоскладових слів.

Визначити кількість неділь, які припадають на 10 число у період з 1.05.1900 року по день, який вводиться з клавіатури.

22

Визначити відсоток слів у заданому тексті, які починаються з букви к. Слова у тексті розділені двома пробілами.

Визначити кількість серед, які припадають на 7 число у період з 1.05.1950 року по 1.05.2000 року.

23

Визначити, який є відсоток слів у заданому тексті, що містять у собі подвоєну приголосну.

Обчислити кількість неділь на 5 число у 21 столітті.

24

У заданому тексті буквосполучення кон замінити на ит ка. Наскільки зменшилась довжина тексту?

Обчислити кількість вівторків на 10 число у 20 столітті.

25

Визначити кількість 6-буквених слів у заданому тексті.

Визначити кількість днів між датою дня народження та першим 8 березня, яке припадає на неділю.

26

Визначити кількість входжень буквосполучення на у всі слова заданого тексту.

Визначити кількість днів між 1 січня 2000 року та датою, яка вводиться з клавіатури.

27

Задані два символьні рядки. Викреслити із першого рядка усі голосні, які входять до другого рядка.

Визначити кількість днів між датою початку навчання у школі та датою отримання атестату, які вводяться з клавіатури.

28

Розташувати слова у заданому тексті у порядку збільшення їх довжини.

Обчислити кількість неділь на 5 число у 20 столітті.

29

Знайти у заданому тексті слово найменшої довжини, друга буква якого а.

Визначити кількість днів між 1.01.1950 року та датою дня народження у році, значення якого вводиться з клавіатури.

30

У заданому тексті визначити кількість трьохскладових слів.

Визначити кількість вівторків, які припадають на 10 число у період з 1.01.1970 року по 1.01.2007 року.

ДОДАТОК А

Введення рядків :

cin >> str[i] ; cin .get (str[i]); // для введення рядка str у циклі по і

cin >> str; cin.read (str,n); cin.get (str,n); //з клавіатури

gets (str); // із б-ки stdio.h

Виведення рядків :

cout >> str; cout.write (str,n);

Визначення довжини і розміру рядка

Для визначення довжини рядка (кількості символів до нуль-символу ) використовується функція strien

size_t strlen(const char *str);

Приклади :

char str[10] = "123";

cout <<”l= ”<< strlen(str); // l = 3

cout <<” d = “<< sizeof str; // d = 10

Порівняння рядків

Порівняння рядків виконується функціями strcmp (цілі рядки)

та strncmp ( n перших символів рядків) :

int strcmp(const char *strl, const char *str2);

int strncmp(const char *strl, const char *str2, size_t n);

Функції повертають нульове значення, якщо рядки або перші n символів рядків ідентичні (це основне призначення цих функцій) або ненульове ,якщо є розбіжності у рядках.Рядки не змінюються під час порівняння . Функції використовуються для синтаксичного контролю текстів.

Приклади :

char strl[4] = "cda",str2[4]=”cab”;

cout <<”l=”<<strcmp(strl,str2); // l=3, ‘d’-‘a’=68-85

cout <<”l=”<<strncmp(strl,str2,1);// l=0

Поєднання рядків

Для поєднання двох рядків в один рядок або додавання частини рядка використовуються функції strcat та strncat :

char* strcat(char *strDst, const char *strSrc);

char* strncat(char *strDst, const char *strSrc, size_t n);

Особливості функцій :

  • функції повертають вказівник на поєднаний рядок , доступ до нього зберігається і за іменем рядка – приймача strDst ;

  • розмір рядка – приймача strDst не змінюється;

  • довжина отриманого рядка дорівнює сумі довжин рядків, які поєднуються , якщо ця сума не перевищує розміру рядка-приймача ;

  • рядок-джерело strSrc не змінюється (const char *strSrc) ,зворотної дії немає;

  • попередній вміст рядка – приймача strDst теж не змінюється .

  • size_t n –тип unsigned ,визначає кількість символів рядка-джерела strSrc , які приєднуються до рядка – приймача strDst.

Приклади :

char strl[10] = "1234";//1 2 3 4 \0 \0 \0 \0 \0 \0

char str2[4] = "567"; //5 6 7 \0

char *str3 ;

str3 = strcat(str1, str2);//1 2 3 4 5 6 7 \0 \0 \0 \0

cout <<”S1=”<<str1<<” “<<str3;//s1=1234567 1234567

str3 = strncat(str3, str1,2); //1 2 3 4 5 6 7 1 2 \0

cout<<”S1=”<<str1<<” “<<str3;//s1=123456712 123456712

Копіювання рядків

На відміну від функцій поєднання при виконанні функцій копіювання рядків знищується вміст рядка-приймача. Функції strcpy i strncpy :

char *strcpy(char *strDst, const char *strSrc);

char *stpcpy(char *strDst, const char *strSrc);

char *strncpy(char *strDst, const char *strSrc, size_t n );

повертають вказівник на отриману копію рядка ,а функція stpcpy на кінець копії.Розмір рядка-приймача strDst повинен бути рівним або перевищувати розмір рядка-джерела strSrc . Якщо рядок-приймач strDst був порошній , тобто заповнений нуль-символами ,то якщо розмір рядка-джерела strSrc менший за розмір рядка-приймача strDst , то решта нуль-символи. Вміст рядка-джерела strSrc не змінюється , тип const char .Копіювання у непорожній рядок-приймач strDst приводить до заміни символів на символи рядка-джерела strSrc .Можливо копіювання у середину рядка із заданої адреси для заміни деяких символів.

Приклади :

char strl[8]; //\0 \0 \0 \0 \0 \0 \0 \0

char str2[5] = "tape "; //t a p e \0

char *str3;

str3 = strcpy(str1,str2);// копіювання у порожній рядок

cout<<”\nstr1=”<<str1<<”“<<str3; //str1=tape tape

l=strlen(str1); // l = 4

strcpy(str1+l,”123”); // копіювання у кінець рядка

cout << ”\n str1=” << str1 << ” “ << str3;

//str1=tape123 tape123

strncpy(strl, “abcdef”,2); //зміна двох символів на початку

cout << ”\n str1=” << str1 << ” “ << str3;

//str1 = abpe123 abpe123

strncpy(strl+4, “56789”,2); //зміна двох символів у середині

cout << ”\n str1=” << str1 << ” “ << str3;

//str1 = abpe563 abpe563

char str4[6] = ”diskt”; // копіювання нове

strcpy(str1,str4);

cout << ”\n str1=” << str1 << ” “ << str3;

//str1 = diskt diskt

Пошук у рядку

Для пошуку позиції символу у рядку використовуються функції :

strchr (перше входження), strrchr (останнє входження )

char* strchr(const char *str, int c);

char* strrchr(const char *str, int c);

Якщо символ існує , функція повертає вказівник на знайдений символ, а у випадку його відсутності - NULL.

Приклад :

(лічба кількості символів a у рядку )

char str[] = "сar раssa tam",*ptr;

ptr = str; int k = 0;

while ((ptr = strchr(ptr,’a’) != NULL)

{ k++; ptr++;

}

cout << ”\n k = “ << k; // k = 4

Наступні функції визначають і повертають : strсspn - довжину першого сегменту першого рядка , у якому немає символів другого рядка ; strspn – довжину сегменту із символів другого рядка

size_t strсspn(const char *str1, const char *str2);

size_t strspn(const char *str1, const char *str2);

Функції також використовуються для пошуку першого входження символу із другого рядка у перший (strсspn) , або пошуку символу першого рядка ,якого немає у другому рядку (strspn) .

Приклад :

char str[8] = "123 abc";

cout <<”\n n=“<<strspn(str,"321"); // n = 3

cout <<”\n n=”<< strcspn(str, "cba"); // n = 4

Функція strpbrk

char* strpbrk(const char *strl, const char *str2);

виконує пошук у рядку str1 першого символу, який дорівнює одному із символів рядка str2. У випадку успіху функ­ція повертає вказівник на цей символ, а у випадку невдачі - NULL.

Приклад :

char str[8] = "123 abc";

cout << strpbrk(str, "bca"); // abc

Пошук слів у рядку

Для пошуку слова (рядка) у рядку використовується функція strstr

char* strstr(const char *strl, const char *str2);

яка шукає і повертає вказівник на перше входження рядка str2 без кінцевого нульового байта у рядок str1.

char str[12] = "123 abc 456";

cout << strstr(str, "abc"); // abc 456

Розклад рядка на слова

Для розкладу рядка на слова використовується функція strtok

char* strtok(char *str1, const char *str2);

яка повертає вказівник на поточне слово у рядку str1, у якому роздільниками слів є символи із рядка str2. У випадку ,коли слова закінчилися, функція strtok повертає значення NULL. При першому виклику функції strtok параметр str1 повинен вказувати на рядок, який разби­рається на слова, а при наступних викликах цей параметр повинен бути встановлений у NULL або 0. Функция strtok записує у рядок strl після знайденого слова на місце роздільника нульовий байт.

Приклад :

char str[] = "12 34 ab cd";

char *p;

p = strtok(str, " ");

while (p)

{

cout << p << ” “; // 12 34 ab cd

p = strtok(NULL, " ");

}

ДОДАТОК B

( файл RJADOC_1.CPP )

//введення тексту із клавіатури ,виведення спочатку слів з однаковими

//першою та останньою буквами ,потім решти слів

#include<stdio.h>

#include<string.h>

#include<conio.h>

#include<iostream.h>

#define DL_STR 80 //довжина рядка

#define KL_SL 40 //кількість слів

void main ()

{

int i, l, k;

char *sl[KL_SL], *p, *razd=",. ?!;:", str[DL_STR];

clrscr();

cout << "Введіть рядок , довжиною не більш за" << DL_STR-1\

<< " символів\n";

gets (str); // читання рядка із клавіатури

k = 0;

cout << "\n Слова у заданому порядку\n";

p = strtok(str, razd);

while(p)

{

l = strlen(p);

if (*p == *(p +l - 1))

cout << p << "\n";

else

sl[k++] = p;

p = strtok(NULL, razd);

}

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

cout << sl[i] << "\n";

getch();

ДОДАТОК С

( файл KALENDAP.CPP )

// При введенні дати у вигляді: рік, місяць, день програма визначає день //тижня цієї дати. Відомо, що 1.01.1900 приходиться на понеділок.

#include<conio.h>

#include<iostream.h>

char* d[] = {"Ponedilok", "Vivtorok", "Cereda", "Chetverg", "Pjatnuzja","Subota", "Nedilja"};

int GetDay(int day, int month, int year)

{

year -= 1900;

unsigned int yd = 0,a;

int y = year;

int m[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int md = 0;

int k = 0;

for (int i = 1; i < month; i++)

{

md += m[k];

k++;

}

int sum = 0;

if (year < 0)

{

y = - y;

yd = 365 * y + y / 4;

if (month > 2 & year % 4 == 0) {yd--;}

sum = 6 - (yd - md - day) % 7;

}

if (year == 0)

{

sum = (md + day) % 7;

if (month < 3) {sum--;}

if (sum == -1) {sum=6;}

if (sum == -2) {sum=5;}

}

if (year > 0)

{

y--;

yd = 365*y + y / 4;

if (month > 2 & year % 4 == 0) yd++;

sum = (yd + md + day) % 7;

}

cout << sum;

return (sum);

}

void main()

{

int day;

int month;

int year;

clrscr();

cout << "Enter year:";

cin >> year;

cout << "Enter month:";

cin >> month;

cout << "Enter day:";

cin >> day;

cout << "Day=" << d[GetDay(day,month,year)];

getch();

}

Приклад :

Enter year:2008

Enter month:05

Enter day:16

Day = Pjatnbtzja

Лабораторна робота №19

РОБОТА ІЗ ЦІЛИМИ ЧИСЛАМИ

Мета роботи :ознайомлення із методами (алгоритмами) розв’язання задач із цілими числами, створення відповідних комп’ютерних програм для поглиблення алгоритмічного мислення