МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет “Львівська політехніка”
МАСИВИ СИМВОЛІВ (РЯДКИ) В МОВІ ПРОГРАМУВАННЯ С
Інструкція
до Лабораторної роботи № 5
з курсу “Проблемно-орієнтовані мови програмування”
для студентів базового напрямку 6.08.04
"Комп’ютерні науки"
ЗАТВЕРДЖЕНО
на засіданні кафедри
Системи автоматизованого проектування
Протокол № 1 від 31 серпня 2009 р.
ЛЬВІВ 2009
Масиви символів (рядки) в мові програмування С
Інструкції до лабораторної роботи № 5 з курсу “Проблемно-орієнтовані мови програмування” для студентів базового напрямку 6.08.04 "Комп’ютерні науки“
Укл. М. І. Андрійчук, І. І. Чура. -Львів: НУ “ЛП”, 2009 р. - 13 с.
Укладачі М. І. Андрійчук, доц., к. ф.-м. н.
І. І. Чура, доц., к.т.н.
Відповідальний за випуск С. П. Ткаченко, канд. техн. наук, доц.
Рецензенти М. В. Лобур, доктор техн. наук,
В. І. Каркульовський, канд. техн. наук
1. МЕТА РОБОТИ
Мета роботи - навчитися використовувати символьні масиви для розв’язання задач роботи зі стрічками.
2. ТЕОРЕТИЧНІ ВІДОМОСТІ
Рядки символів і дії з ними
На відміну від інших мов програмування у C не визначено спеціального типу для опрацювання рядків. Масив символів (чи рядок або стрічка) розглядається як масив елементів типу char, який закінчується символом '\0' (нуль-символ) що є ознакою кінця рядка. Такі рядки називають ASCII-рядками. Сталі типу рядок записують у лапках, наприклад, "Львівська політехніка", "студенти", “ “ - рядок, що містить один символ-пропуск. У сталих рядках нуль-символ дописується автоматично
Зауваження 1. Більшості компіляторів мови C додає нуль-символ у кінець рядка, тому зазначати його не обов'язково.
Масиви символів оголошують так:
char <назва рядка>[довжина рядка];
Під час оголошення символьного масиву необхідно до фактичної довжини рядка додати одиницю для нульового символу (але не у всіх компіляторах). Якщо масив символів оголошують й ініціалізують одночасно, то довжину можна не зазначати, компілятор визначить її. Оскільки рядки є масивами символів, то назва рядка є вказівником на його перший елемент (на перший символ).
Приклад 1. Розглянемо оголошення та ініціалізацію рядків
const char text1[] = "Ми вивчаємо програмування";
char slovo[] = "University";
char fraza1[11], fraza2[40];
Тут оголошено сталу textl, яка має значення "Мови програмування", символьні масиви: slovo (без зазначення розміру), frazal (може містити до 10 символів) та fraza2 (до 39 символів).
Символьний масив slovo ще можна оголосити так:
char slovo[11] = "University"; або так
char slovo[ ] = {'U’, 'n’, ‘i’ , ‘v’, ‘e’, ‘r’, ‘s’, 'і', ‘t’, ‘у’, ‘\0’};
Тут потрібно вручну записати нуль-символ, інакше компілятор трактуватиме змінну slovo не як рядок, а як масив.
Рядки можна опрацьовувати посимвольно за допомогою або назви масиву, наприклад, так:
for (int n = 0; n < 11; n++) *(fraza1+n) = *(slovo+n);
cout << frazal;
Змінній fraza1 надається значення "University" і ця фраза виводиться на екран. Інакше це можна зробити так:
for (int n = 0; n < 11; n++)
fraza1 [n] = slovo[n]; cout << fraza1;
Ввести весь масив символів можна за допомогою команди
сіn >> <назва масиву>;
Якщо рядок даних містить символ пропуску, то сіn >> зчитає дані лише до першого пропуску. Щоб весь рядок до символу вводу, необхідно застосувати
cin.get(<назва рядка>, <максимальна довжина рядка>);
Наприклад, cin.get (fraza2, 40). Зчитати символ вводу можна cin.get ( ). Зчитати рядок разом із символом вводу із способів:
cin.get(fraza2,40);
cin.get ();
cin.get(fraza2, 40).get ( );
cin.getline(fraza2,40);
Вивести значення рядка на екран можна за допомогою команди
cout << <назва рядка>;
Посимвольно вводити чи виводити елементи рядка можна за допомогою команд циклу for або while.
Наприклад,
for (int n = 0; n < 11; n++) сіп >> *(fraza1 + n);
В кінці рядка необхідно поставити нуль-символ, тобто
*(fraza1+n+1)=’\0’;
У бібліотеці conio.h визначені стандартні функції введення-виведення рядків. Наприклад, getc ( ), getchar ( ) зчитують по одному символу рядка, введеного з клавіатури, putc ( ) та putchar ( ) виводять окремі символи рядка тощо. У бібліотеці stdio.h описані функції для введення gets ( ) та виведення puts ( ) усього рядка. Детальніше про ці та інші функції написано у довідниках.
Функції для опрацювання рядків
Для опрацювання масивів символів у мові C є стандартні функції, які описані у модулі string.h. Розглянемо деякі з них.
strlen(<рядок>) - визначає фактичну кількість символів у рядку, застосовується у виразах;
strcat(r1, r2) - команда з'єднання рядків ґі, г2 в один рядок, результат присвоює змінній r1;
strncat(r1, r2, п) - до змінної г1 додає перших n символів рядка г2,
strcpy(r1, r2) - копіює символи з рядка г2 в рядок г1,
strncpy(r1, r2, n) - копіює перших n символів рядка г2 в рядок г1,
strchr(r1, <символ>) - визначає перше входження деякого символу у рядок г1 так: повертає рядок, який починається від першого входження заданого символу до кінця рядка М, застосовується у виразах;
strrchr(r1, <символ>) - визначає останнє входження заданого символу у рядок, застосовується у виразах;
strspn(r1, r2) - визначає номер першого символу, який входить у рядок г1, але не входить у рядок г2, застосовується у виразах;
strstr(r1, r2) - визначає в рядку г1 підрядок, що починається з першого входження рядка г2 у рядок ґі, застосовується у виразах;
strtok(r1, r2) - визначає частину рядка г1, яка закінчується перед першим однаковим символом рядків r1 та г2;
strnset(r1, <символ>, n) - вставляє n разів заданий символ перед рядком г1, застосовується у виразах;
strupr(r1) - перетворює усі малі літери рядка у великі;
strlwr(rl) - перетворює усі великі літери рядка у малі;
strrev(rl) - записує рядок у зворотному порядку.
Приклад 2. Розглянемо результати застосування функцій до таких змінних:
char Lviv[ ] = "Львівська політехніка",
Un [З0] = "НУ ",
r1 [30] = “ ";
char *p; int n;
Застосування функцій
Результат
n = strlen(Lviv)
n = 21
strcat(Un, Lviv)
Un = "НУ Львівська політехніка"
strncat(Un, Lviv, 10)
r1 = "НУ Львівська"
strcpy(r1, Lviv)
r1 = "Львівська Політехніка"
strncpy(r1, Lviv, 10)
r1 = "Львівська"
p = strchr(Lviv, 'П')
p = "політехніка"
p = strrchr(Lviv, Ї)
p = "іка" .
n = strspn(Lviv, "Львів")
n = 5
j> = strstr(Lviv, "тех")
p = "техніка"
p = strtok(Lviv, "кс")
p = "Львів"
p = strnset(Lviv, 'x', 10)
p = "ххххххххххполітехніка"
p = strupr("l Love You")
p = "і love you"
p = strlwr("l Love You")
p = "I LOVE YOU"
p = strrev(“тexнiкa")
p = "акінхет"
Зауваження 2. Функції перетворення літер strlwr і strupr діють лише для латинського алфавіту. Крім того, у деяких версіях мови C ці функції можуть записуватись інакше: _strlwr, _strupr.
У бібліотеці stdlib.h є стандартні функції перетворення типів даних. Зокрема, функція atoi(r1) перетворює рядок символів г1 у дане цілого типу int, а функція itoa(<числове дане>, г1, <система числення>) - дане цілого типу int у рядок г1. Для перетворення даних типу double у рядок символів визначена функція gcvt(<числове дане>, <кількість знаків у числі>, г1), а обернену дію виконує функція strtod.
Приклад 3. Розглянемо результати дії цих функцій для оголошених нижче змінних.
int n;
double f;
char r1[5], *p;
Застосування функції
Результат
n = atoi("12")
n = 12
itoa(12, r1, 10)
r1 ="12"
gcvt(-3.14, 4, r1)
r1 =-3.14
f = strtod("-3.1415", &p);
f = -3.1415
Рядки символів можна порівнювати між собою. Два рядки порівнюють зліва направо посимвольно, причому 'А’ < 'В', 'В' < ‘С’ тощо. "Більшим" вважається символ, який розміщений в алфавіті далі (він має більший номер у таблиці кодів ASCII). Для порівняння рядків у модулі string.h надані такі функції:
strcmp(r1, r2) - порівнює рядки символів г1 і г2 з урахуванням регістра для латинського алфавіту;
stricmp(r1, r2) - порівнює рядки г1 і г2, не розрізняючи великих і малих літер латинського алфавіту.
Результатом виконання цих функцій є від'ємне число (якщо рядок г1 менший від рядка г2), 0 (якщо рядки однакові) або додатне число (рядок г1 більший за рядок г2). Приклад 4. Розглянемо результат дії функцій
Функція
Результат
n = strcmp("Becнa", "весна")
n = -32
n = strcmp(вecнa", "Весна")
n = 32
n = strcmp("Becнa", "Весна")
n = 0
n = stricmp("Весна", "весна")
n = -32
n = stricmpO'Vesna", "vesna")
n = 0
Задача 1 (про довжину фрази). Ввести рядок символів та визначити його довжину.
Зробимо це двома способами:
1) за допомогою вказівника типу char і виділення динамічної пам'яті:
#include <iostream.h> // Довжина рядка символів
void main ( )
{
char *s; // Оголошуємо вказівник на рядок
s = new char[50]; // Виділяємо пам'ять для введення рядка
cin >> s;
int d = 0;
while (*s++) d++;
cout << d;
}
2) визначивши різницю адрес першого й останнього символів:
#include <iostream.h> II Довжина рядка символів
void main ( )
{
char *s, *p; // Оголошуємо вказівники
s = new char[50]; // Виділяємо пам'ять для введення рядка
cin >> s;
р = s; // Вказівник р вказує на перший символ рядка
II Вказівник s тепер вказуватимеwhile (*s++); // на останній символ рядка
Int d;
// Визначаємо довжину рядка як різницю адрес
d = s – p + 1;
cout << d;
}
Задача 2 (про пошук слова у фразі). Нехай задано рядок "Скоро будуть канікули". Визначити довжину рядка. Вивести на екран друге слово цього рядка.
#include <iostream.h> // Пошук другого слова за допомогою функцій
#include <string.h>
void main ( )
{
char r1[ ] = "Скоро будуть канікули";
char *p;
cout << r1 << “\n";
cout << "Довжина рядка r1 =" << strten(rl) << "\n";
// Встановлюємо вказівник р на перший пропуск
р = strchr(r1, “ "); II у рядку r1
II 3 рядка р вилучаємо всі символи після його
strtok(p, " "); // першого пропуску
cout << р;
}
Подамо ще один спосіб розв'язання задачі 2, в якому рядок розглядається як масив символів і функції для роботи з рядками не використовуються.
#include <iostream.h> // Рядок як масив символів
#include <conio.h>
#include <string.h>
void main ( )
{
clrscr();
char r1[] = "Скоро будуть канікули";
char *p;
int n1, n2, k, m;
m = 0;
k = strlen(r1);
cout << "Довжина рядка г1 = " << k << "\n";
for (int i= 0; і < k; i++) // Переглядаємо всі символи рядка
If (r1 [і] == ' ') // Шукаємо пропуск
{
m++; // Визначаємо номери першого
if (m == 1) n1 = і; // та другого
if (m == 2) n2 = і; // пропусків
}
II Виводимо слово між двома пропусками
for (і = n1 + 1; і < n2 - 1; i++) cout << r1[i];
getch ( ); }
Задача 3 (про столиці). Введіть п'ять назв столиць євро-пейських країн. Упорядкуйте їх за алфавітом. Виведіть упорядкований масив на екран.
// Столиці країн
#include <iostream.h>
#inciude <string.h>
#include <conio.h>
#define N 5
void main ( )
{ // Оголошуємо N вказівників на рядки
char p[N][16]; // довжиною до 15 символів
char m[16];
for (int і = 0; і < N; i++)
cin >> *(p +i); // Вводимо рядок і
for(i = 0;i<N-1;i++)
{
for(int j = 0; j<N-i; j++)
{
if (strcmp(p[j], p[]+1]) > 0) // Порівнюємо рядки
{ II і, у разі потреби, міняємо
strcpy(m, p[j]); // їх місцями
strcpy(p[j], р[j+1]);
strcpy(p[j+1], m);
} } }
for (і = 0; і < N; і++) cout << р[і] << "\n"; }
Криптографічні задачі
Текстові функції застосовуються для розв'язування задач кодування даних з метою збереження секретності інформації. Існує наука - криптографія, де вивчаються і створюються різні алгоритми кодування інформації. Основні задачі криптографії - це шифрування тексту, передача його на відстань і дешифрування. Це використовується у банківських справах, у воєнних цілях, у діяльності різних фірм, під час пересилання інформації в локальних чи глобальних мережах тощо.
Давньоримський імператор Цезар кодував свої секретні вказівки так: кожна літера тексту замінювалась на четверту після неї літеру з алфавіту. Такий шифр називається в криптографії шифром зі сталим зміщенням (тут 4), або шифром з одним ключем.
Задача 4 (про шифр Цезаря). Скласти програму для кодування деякого тексту до 50 символів шифром Цезаря, замінивши кожну літеру на k-ту (наприклад, четверту) після неї літеру з алфавіту. Під алфавітом розуміти таблицю кодів ASCII.
// Програма Код Цезаря
#include <iostream.h>
#include <string.h>
void main ( )
{
char a[50];
cout << "Введіть текст: \n";
cin.get(a, 50);
for (int k, n = 0; n < strlen(a); n++)
{ k = *(a+n) + 4; *(a + n) = k;
}
cout << a;
}
Задача 5 (про заміну слів). Скласти програму, яка скрізь у заданому тексті mytext замінить деяке слово іншим словом такої ж довжини (wordl на word2).
#include <iostream.h> // Програма Заміна слів
#include <string.h>
void main ( )
{
char word1[5], word2[5], mytext[50];
char *p;
cout << "Введіть текст \n";
cin.get(mytext, 50);
cout << "Введіть шукане сповo \n";
cin >> word1;
cout << "Введіть інше слово \n";
cin >> word2;
int k = strlen(word1);
// Встановлюємо вказівник р на початок
р = mytext; // рядка mytext
for (int і = 0; і < strlen(mytext) - k; і++) // Опрацьовуємо посимвольно
{ II рядок р
II Знаходимо перше входження word1
р = strstr(p, wordl); II у рядку р
II Якщо такого входження немає, то
if (р == NULL) break; // виходимо з циклу
IIУ рядку р замінюємо word1 на word2
for (int j =0; j < k; j++) *(p + j) = *(word2 + j);
} cout << mytext;
}
Приклади програм з використанням рядків
/* Приклад: ввести текст, визначити, сколько разів в тексті зустрічається кожна буква латинського алфавіту. */
#include <stdio.h>
#inolude <conio.h>
void main (void)
{
float chast[26], total=0.;
char ch; int i;
for (i = 0; i < 26; i++)
chast[i] = 0.;
put*("Введіть текст, завершенння -* ");
while( ( ch = getche() ) != '*' )
{
if( ('a' <= ch ) && ( ch <= 'z' ) ) chast [ch - 'a' ]++;
else if( ( 'A '<= ch ) && ( ch <= 'Z' ) ) chast[ch -'A']++;
total++;
}
puts ("\n Частота повторення букв");
for( i = 0; i < 26; i++)
chast(i) = chast[i] * 100. / total;
printf ( %c - %4.1f; ", i + 'A', chast[i] );
}
}
/* Приклад: програма пропонує ввести стрічку з клавіатури, а потім виводить її на екран разом з її довжиною. */
#include <stdio.h>
void main ()
{
char string[20]; char q;
printf("Введіть стрічку без пробілів: ");
scanf( " %s ", string );
printf(" Стрічка: %s \n ", string );
for ( q = 0; string[q];. q++ ) ;
printf ( "Довжина стрічки: %d сим; \n"., q );
}
/* Наступний приклад демонструє використання функції gets(): ввести стрічку, визначити її довжину і кількість пробілів в ній. */
#include <stdio.h>
void main 0
char string[80];
char q, w = 0;
puts ( "Введіть стрічку: ");
gets ( string );
printf( " Стрічка: %s \n ", string );
for ( q = 0; string[q]; q++ )
if( string[q] = = 32) w++; // Підрахунок числа пробілів
printf ( " Довжина стрічки: %d сим. \n "< q);
printf (" Кількість пробілів: %d ", w);
}
/* Приклад: ввести масив з п’яти стрічк, розсортувати їх і вивести в лексикографічному порядку. */
#include <stdio.h>
#include <conio.h>
#incdude <string. h>
void fun ( char s [] [10] ) // Функція сортування стрічок
{ int i, j; char t[10], *pt, *pl, *p2;
for ( i = 0; i < 4; i++ )
for ( j = i+i; j < 5; j++ )
if ( strcmp ( s[i], s[j]) > 0 )
{
char c;
. / 1-й варіант перестановки стрічок
for ( int k = 0; k < 10; k++ )
{
с = s[i][k] ; s[i] [k] = s[j] [kj; s [j] tk] = c;
}
// 2-й варіант перестановки стрічок
// { strcpy(t, s[i]); strcpy(s[i], s[j]); strcpy (s [ j], t);}
// 3-й варіант перестановки стрічок
/* { pt = t; pl = s[i]; while ( *pt++ = *p1++ );
p1 = s[l]; p2 = s[j]; while ( *pl++ = *p2++ ) ;
p2 = s[j]; pt = t; while ( *p2++ = *pt++ ) ;
} /*
}
}
void main( )
{ char s[5][10]; int i;
for ( i = 0; I < 5; i++ )
gets ( s[i] );
fun ( s );
for ( i = 0; I < 5; i++ )
puts ( s[i] ); puts ( " " ); puts ( " " );
}
/* Приклад: виділення памяті під стрічки; ініціалізація стрічок; довгі стрічки "наповзають" на наступні стрічки. */
#include <conio.h>
#include <stdio.h>
void main ()
{
char c; int i;
/* char s3[5] = "123456"; mistake— too many initializers */
char sl[5] = "gwert", s2[5] = "asdfg", s3[5] = "12345";
/* При ініціалізації помилки немає, але в пам’яті
стрічки "наповзають" одна на одну */
printf("\n &sl=%p &s2=%p &s3=%p \n",sl, s2, s3);
// printf ( n "&c = %p &I = %p \n", &c, &i);
/* Правильність виводу стрічок залежить від довжини машинного коду, наприклад, якщо відкрити printf(...); буде помилка виконання. Слідкуйте за ініціалізуючими выразами. */
puts(s1); puts(s2); puts(s3);
getch ();
}
Для вводу і виводу можна використовувати потоковий ввід/вивід C++. При використанні cin стрічка вводится до першого пробілу, a cin.getline(str, size ); вводить і пробіли, але не більше size знаків.
#include <iostream.h>
void main ()
{
char str[80];
cout << " Input string" << endl;
cin >> str; // cin.g*tlin*(str, 80 );
cout << "\n" << str;
}
На завершення наведемо приклад типової програми для виконання лабораторної роботи.
#include <stdio.h>
#include <conio.h>
#define N 60
main ()
{
clrscr();
char str[N];
char n,s,f;
int i,K,a,b,q,v;
// Vvid ryadka
printf("ENTER surname, name and fathername \n\n");
for (i=0,K=0;str[i-1]!='.';i++,K++)
{
str[i]=getch();
printf("%c",str[i]);
}
K=K-1;
printf("\n\n Dovgyna vvedenoho ryadka: %d", K);
// Obchyslennya kilkosti bukv a
for(i=0,a=0;i<K;i++)
if((str[i]=='a') | (str[i]=='A'))
a++;
printf("\n\n Kil'kist bukv a v ryadku = %d", a);
// Kilkist bukv u prizvishchi
b=0;
for(i=0;str[i-1]!=' ';i++)
b++;
b=b-1;
printf("\n\n Kilk. bukv u prizvishchi= %d \n",b);
// Vyvid tretoho slova
// *******************
// Vyrah kil'k. symvoliv do 2-ho probilu
for(i=0,q=0;str[i-1]!='.';i++)
{
if(str[i]==' ')
q=q+1;
if(q==2)
{
v=i;
break;
}
}
printf("\nTretye slovo (po-batkovi) \n\n");
for(i=v+1;i<K;i++)
printf("%c",str[i]);
getch ();
return 0;
}
При написанні програм звичайно необхідно робити різні маніпуляції з рядками: копіювати їх і переносити з одного місця пам'яті в інше, перевіряти наявність у рядках певної послідовності символів, об’єднувати, зменшувати рядки і т. п. Мова С містить багату колекцію функцій для роботи з рядками. Зробимо кілька загальних зауважень щодо використання функцій бібліотеки.
Якщо у функції виконується перенос символів рядка з одного місця в інше, то для рядка призначення потрібно попередньо зарезервувати місце в пам'яті.
Копіювання рядків з використанням неініціалізованого вказівника - одна з найпоширеніших помилок програмування, навіть у досвідчених програмістів.
Працюючи з рядками, будьте обережні й обов'язково звертайте увагу на попередження системи програмування типу "Підозріле перетворення вказівника " (Suspіcіous poіnter conversіon) або "Використання вказівника до ініціалізації" (Possіble use of...before deffіnіtіon). При виділенні місця для рядка-призначення варто передбачити місце для нуль-термінатора ('\0').
3. КОНТРОЛЬНІ ЗАПИТАННЯ
Яким чином відбувається оголошення та ініціалізація рядків символів (стрічок) ?
Які функції для роботи з стрічками ви знаєте ?
Назвіть операції порівняння стрічок, коротко поясніть результати їх дії.
4. КОНТРОЛЬНЕ ЗАВДАННЯ
Ознайомитись із особливостями використання символьних масивів у мові С.
Навчитися користуватися функціями для роботи з символьними змінними.
Одержати індивідуальне завдання.
Скласти програму на С, що дозволяє із використанням символьних масивів реалізувати розв’язок поставленої задачі.
Виконати обчислення по програмі.
5. ЗМІСТ ЗВІТУ
Мета роботи.
Короткий опис особливостей роботи зі стрічковими змінними та застосування вказівників у С.
Індивідуальне завдання.
Текст програми на С.
Результати обчислень по програмі.
Аналіз результатів, висновки.
6. СПИСОК ЛІТЕРАТУРИ
Керниган Б., Ритчи Д. Язык программирования С. - М. - Финансы и статистика. - 1992. – 272 с.
Уэйт М., Прата С., Мартин Д. Язык С. Руководство для начинающих. - М. - Мир. - 1988. –512 с.
Глинський Я. М., Анохін В. Є., Ряжська В. А. C++ i C++ Builder. – Львів: Деол. – 2003. – 192 с.
Герберт Шилдт. Полный справочник по C++. М. – С.-П.-К., Вильямс. – 2003. – 800 с.
Демидович Е. М. Основы алгоритмизации и программирования. Язык Си. (Учебное пособие). – Санкт-Петербург: “БХВ Петербург”. – 2006. – 439 с.
7. ЗАВДАННЯ ДО ЛАБОРАТОРНОЇ РОБОТИ
Ввести прізвище, ім'я та по батькові як одне текстове дане. Визначити довжину даного і кількість букв "а" у ньому. Розв'язати задачу відповідно до вашого варіанта двома способами:
а) використовуючи функції з бібліотеки string.h;
б) розглядаючи введений текст як масив символів.
1. Вивести ім'я та кількість букв у третьому слові.
2. Визначити скільки букв “а” у прізвищі.
3. Вивести три букви - свої ініціали з крапками.
4. Вивести довжини прізвища та імені.
5. Вивести прізвище та ініціали.
6. Вивести ім'я та кількість букв у прізвищі.
7. Визначити скільки букв “о” є в імені.
8. Вивести найдовше слово.
9. Вилучити усі букви "а" та “о” з прізвища.
10. Вивести ім'я у стовпчик.
11. Чи починається хоч би одне слово з букви “М”?
12. Усі букви “і” в імені продублювати.
13. Вивести прізвище та кількість букв у імені.
14. Вивести ім'я у зворотному порядку.
15. Вивести прізвище у стовпчик.
16. Вивести ім'я та по батькові та кількість букв у імені.
17. Вивести найкоротше слово.
18. Вивести дане без пропусків. Скільки букв є в імені?
19. Вивести довжини трьох слів.
20. Вивести ім'я та кількість букв у прізвищі.
21. Вивести ім'я, прізвище.
22. Кожну букву імені продублювати.
23. Вивести прізвище у зворотному порядку, порахувати кількість символів уньому.
24. Визначити скільки букв “a” та “b” є у прізвищі.
25. Вивести третє слово та кількість букв у прізвищі.
26. Усі букви “а” в імені продублювати, вивести третє слово.
27. Вивести прізвище та ім'я, кількість букв у імені.
28. Вивести довжини слів імені та по-батькові.
29. Вивести довжини першого та третього слів.
30. Вивести кількість букв у імені та прізвищі.