- •Алгоритмічні мови та програмування Методичні вказівки
- •Алгоритмічні мови та програмування Методичні вказівки
- •03056, Київ, вул..Політехнічна, 12, корп. 17
- •Порядок виконання роботи
- •Загальні відомості для виконання лабораторної роботи
- •0X число (шістнадцяткове),
- •0 Число(число (вісімкове),
- •Результат виконання
- •Порядок виконання роботи
- •Порядок виконання роботи
- •Порядок виконання роботи
- •Додаток 1
- •Додаток 2
- •Порядок виконання роботи
- •Порядок виконання роботи
- •Доступ до елемента масиву
- •Запис вектора у стовпець (рядок) масиву
- •Зміна стовпців масиву
- •Додаткові засоби
- •Теоретична частина
- •Порядок виконання роботи
- •Теоретична частина
- •Порядок виконання роботи
- •Додаток
- •Порядок виконання роботи
- •Результати виконання програми
- •Результати виконання програми
- •Порядок виконання роботи
- •Добирання формул за дослiдними даними згiдно методу найменших квадратiв
- •Порядок виконання роботи
- •Порядок виконання роботи
- •Додаток 1
- •Додаток 2
- •Додаток 3
- •Порядок виконання роботи
- •//Функція
- •//Динамічні масиви
- •Порядок виконання роботи
- •Порядок виконання роботи
- •Порядок виконання роботи
- •Порядок виконання роботи
Порядок виконання роботи
А. При підготовці:
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
РОБОТА ІЗ ЦІЛИМИ ЧИСЛАМИ
Мета роботи :ознайомлення із методами (алгоритмами) розв’язання задач із цілими числами, створення відповідних комп’ютерних програм для поглиблення алгоритмічного мислення