3667

Робота з літерними величинами

Лекция

Информатика, кибернетика и программирование

Робота з літерними величинами Коли говорять про cтрічковий тип, то звичайно розрізняють тип, що представляє: окремі символи - тип char, рядок постійної довжини - масив символів, рядок змінної довжини - тип string. Символьний тип char, що представляє...

Украинкский

2012-11-05

532 KB

18 чел.

Робота з літерними величинами

Коли говорять про cтрічковий тип, то звичайно розрізняють тип, що представляє:

окремі символи - тип char;

рядок постійної довжини - масив символів;

рядок змінної довжини - тип string.

Символьний тип char, що представляє окремий випадок рядків довжиною 1. Основні операції над рядками - це розбір і зборка.

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

Клас char

В C# є символьний клас Char, заснований на класі System.Char і що використовує двохбайтове кодування Unicode подання символів. Константу можна задавати:

  •  символом, укладеним в одинарні ( ‘A’ ) лапки;
  •  escape-послідовністю, що задає код символу;

Escape-послідовність («виключена послідовність») - відповідні послідовності текстових символів, які представляють собою логічне кодування. Необхідність логічного кодування текстових знаків виникла тому, що деякі з текстових знаків у програмах, що працюють із текстом, мають спеціальне (керуюче) значення. Для того, щоб використати ці знаки безпосередньо як текст, їх кодують специфічними для кожної системи (escape-послідовностями,: наприклад у З послідовності - \n (символ перекладу рядка), \t( символ табулювання) і т.д. використаються при форматному виводі.

  •  Unicode-послідовністю, що задає Unicode-код символу.

Приклади оголошення символьних змінних і роботи з ними:

           char ch1 = 'A'; //Символ

           char ch2 = '\x5A';//Шістнацят. код

           char ch3 = '\u0058';//Unicode-код

           char VK = '\n'; //ESCape - послідовність переклад рядка

           char TAB = '\t';// табуляція

           char ch = new Char();

           int code;

           string s;

           ch = ch1;

           //перетворення символьного типу в тип int  

           code = ch;

           ch1 = (char)(code + 1);

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

           s = ch1.ToString()+ ch2.ToString() + ch3.ToString() + VK + TAB;

        Console.WriteLine("s= {0},\t ch= {1}, \t code= {2}", s, ch, code);

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

           {

               ch1 = (char)(code + i);

               Console.WriteLine(TAB + ch1.ToString());

           }

Три символьні змінні ініціалізовані  константи, значення яких задані трьома різними способами. Змінна ch оголошується як об'єкт, використовуючи new і виклик конструктора класу. Тип char, як і всі типи C#, є класом. Цей клас успадковує властивості й методи класу Object і має велику кількість власних методів.

Явні або неявні перетворення між класами char й string відсутні, але, завдяки методу ToString, змінні типу char перетворюються в тип string.

У результаті роботи процедури рядок s, отриманий зчепленням трьох символів, перетворених у рядки, має значення BZX, змінна ch дорівнює A, а її код - змінна code - 65.

Таблиця 17.1. Статичні методи й властивості класу Char

Метод

Опис

GetNumericValue

Повертає чисельне значення символу, якщо він є цифрою, і (-1) у противному випадку

GetUnicodeCategory

Всі символи розділені на категорії. Метод повертає Unicode категорію символу. Нижче наведений приклад

IsControl

Повертає true, якщо символ є керуючим

IsDigit

Повертає true, якщо символ є десятковою цифрою

IsLetter

Повертає true, якщо символ є буквою

IsLetterOrDigit

Повертає true, якщо символ є буквою або цифрою

IsLower

Повертає true, якщо символ заданий у нижньому регістрі

IsNumber

Повертає true, якщо символ є числом (десятковою або шістнадцятирічною  цифрою)

IsPunctuation

Повертає true, якщо символ є розділовим знаком

IsSeparator

Повертає true, якщо символ є роздільником

IsSurrogate

Деякі символи Unicode з кодом в інтервалі [0x1000, 0x10FFF] представляються двома 16-бітними "сурогатними" символами. Метод повертає true, якщо символ є сурогатним

IsUpper

Повертає true, якщо символ заданий у верхньому регістрі

IsWhiteSpace

Повертає true, якщо символ є "білим пробілом". До білих пробілів, крім пробілу, ставляться й інші символи, наприклад, символ кінця рядка й символ перекладу каретки

Parse

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

ToLower

Приводить символ до нижнього регістру

ToUpper

Приводить символ до верхнього регістру

MaxValue, MinValue

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

Більшість статичних методів перевантажені. Вони можуть застосовуватися як до окремого символу, так і до рядка, для якого вказується номер символу для застосування методу. Основну групу становлять методи Is…,використовувані при розборі рядків.

Крім статичних методів, у класі Char є й динамічні. Більшість із них - це методи батьківського класу Object, успадковані в класі Char. Із власних динамічних методів варто відзначити метод CompareTo, що дозволяє проводити порівняння символів. Він відрізняється від методу Equal тим, що для незбіжних символів видає "відстань" між символами відповідно до їх упорядкованості в кодуванні Unicode.

Приклад:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace String2

{

   class Program

   {

       static void Main(string[] args)

       {

           char ch1, ch2;

  int dif;

  Console.WriteLine("Метод CompareTo");

  ch1='A'; ch2= 'Z';

  dif = ch1.CompareTo(ch2);

  Console.WriteLine("Відстань між символами {0},{1} = {2}", ch1, ch2, dif);

  ch1='а'; ch2= 'А';

  dif = ch1.CompareTo(ch2);

  Console.WriteLine("Відстань між символами {0},{1} = {2}", ch1, ch2, dif);

  ch1='Я'; ch2= 'А';

  dif = ch1.CompareTo(ch2);

  Console.WriteLine("Відстань між символами {0},{1} = {2}", ch1, ch2, dif);

  ch1='A'; ch2= 'A';

  dif = ch1.CompareTo(ch2);

  Console.WriteLine("Відстань між символами {0},{1} = {2}", ch1, ch2, dif);

  ch1='А'; ch2= 'A';

  dif = ch1.CompareTo(ch2);

  Console.WriteLine("Відстань між символами {0},{1} = {2}", ch1, ch2, dif);

  ch1='Ё'; ch2= 'А';

  dif = ch1.CompareTo(ch2);

  Console.WriteLine("Відстань між символами {0},{1} = {2}", ch1, ch2, dif);

       }

   }

}

Результати порівняння зображені на рис 17.1

Рис. 17.1.  Порівняння символів

Аналізуючи ці результати, можна зрозуміти, що в кодуванні Unicode як латиниця, так і кирилиця щільно впаковані. Виключення становить буква Е - заголовна й мала - вони випадають із щільного кодування. Малі букви в кодуванні безпосередньо випливають за заголовними буквами. Відстань між алфавітами в кодуванні досить велике - російська буква А на 975 символів правіше в кодуванні, чим відповідна буква в латинському алфавіті.

Клас char[] - масив символів

У мові C# визначений клас Char[], і його можна використати для подання рядків постійної довжини. Крім того, оскільки масиви в C# динамічні, то можна використати масиви символів для подання рядків.

Масив char[] - це звичайний масив, його не можна ініцілізувати рядком символів. Константа, що задає рядок символів, належить класу String, а в C# не визначені взаємні перетворення між класами String й Char[]. У класу String є, динамічний метод ToCharArray, що задає перетворення рядка символів у масив.

Клас Char[] є спадкоємцем не тільки класу Object, але й класу Array, і, отже, має всі методи батьківських класів. Деякі перевантажені методи класу Array можна розглядати як операції над рядками. Методи IndexOf, LastIndexOf дозволяють визначити індекси першого й останнього входження в рядок деякого символу. На жаль, їх не можна використати для знаходження індексу входження підрядки в рядок.

Клас String

Основним типом при роботі з рядками є тип string, що задає рядку змінної довжини. Клас String у мові C# відноситься до посилальних типів. Над рядками - об'єктами цього класу - визначений широкий набір операцій.

Об'єкти класу String оголошуються з явною або відкладеною ініціалізацією, з явним або неявним викликом конструктора класу. Найчастіше, при оголошенні строкової змінної конструктор явно не викликається, а ініціалізація задається стрічковою константою. У класу String багато конструкторів. Вони дозволяють сконструювати рядок з:

  •  символу, повтореного задане число раз;
  •  масиву символів char[];
  •  частини масиву символів.

Приклади оголошення рядків:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace String3

{

   class Program

   {

       static void Main(string[] args)

       {

//конструктори

           string world = "Мир";

           //string s1 = new string("s1"); - не припустимо

           //string s2 = new string(); - не припустимо

           string sssss = new string('s', 5);

           char[] yes = "Yes".ToCharArray();

           string stryes = new string(yes);

           string strye = new string(yes, 0, 2);

           Console.WriteLine("world = {0}; sssss={1}; stryes={2};" +

           " strye= {3}", world, sssss, stryes, strye);

           string stry = new string(yes, 1, 2);

           Console.WriteLine("world = {0}; sssss={1}; stryes={2};" +

             " strye= {3}", world, sssss, stryes, stry);        }

   }

}

Об'єкт world створений без явного виклику конструктора, а об'єкти sssss, stryes, strye створені різними конструкторами класу String.

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

Над рядками визначені наступні операції:

  •  присвоювання (=);
  •  дві операції перевірки еквівалентності (==) і (!=);
  •  конкатенація або зчеплення рядків (+);
  •  узяття індексу ([]).

Бінарна операція "+" зчіплює два рядки, приписуючи другий рядок до хвоста першої.

Можливість узяття індексу при роботі з рядками відбиває той факт, що рядок можна розглядати як масив й одержувати без праці кожен її символ. Кожен символ рядка має тип char, доступний тільки для читання, але не для запису.

Приклад, у якому над рядками виконуються дані операції:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace String3

{

   class Program

   {

       static void Main(string[] args)

       {

           //операції над рядками

           string s1 = "ABC", s2 = "CDE";

           string s3 = s1 + s2;

           bool b1 = (s1 == s2);

           char ch1 = s1[0], ch2 = s2[0];

           Console.WriteLine("s1={0}, s2={1}, b1={2}," +

              "ch1={3}, ch2={4}", s1, s2, b1, ch1, ch2);

           s2 = s1;

           b1 = (s1 != s2);

           ch2 = s2[0];

           Console.WriteLine("s1={0}, s2={1}, b1={2}," +

              "ch1={3}, ch2={4}", s1, s2, b1, ch1, ch2);

          }

   }

}

В C# існують два види стрічкових констант:

  •  звичайні константи, які представляють рядок символів, укладені в лапки;
  •  @-константи, задані звичайною константою c попереднім знаком @.

У звичайних константах деякі символи можуть задаватися у вигляді escape-послідовностей. Для всіх цих цілей використовується комбінація символів, що починається символом "\" - зворотна коса риска. Так, пари символів: "\n", "\t", "\\", "\"" задають відповідно символ переходу на новий рядок, символ табуляції, сам символ зворотної косої риски, символ лапок, що вставляє в рядок, але не сигналізує про її закінчення. Комбінація "\xNNNN" задає символ, обумовлений шістьнадцятерічним  кодом NNNN. Іноді виникають незручності: наприклад, при завданні констант, що визначають шлях до файлу, доводиться щораз подвоювати символ зворотної косої риски. Це одна із причин, по якій з'явилися @-константи.

В @-константах всі символи трактуються в повній відповідності з їхнім зображенням. Тому шлях до файлу краще задавати @-константою.

Таблиця 17.2 Статичні методи й властивості класу String

Метод

Опис

Empty

Повертається порожній рядок. Властивість зі статусом read only

Compare

Порівняння двох рядків. Метод перевантажений. Реалізації методу дозволяють порівнювати як рядки, так і підрядки.  При цьому можна враховувати або не враховувати регістр, особливості національного форматування дат, чисел і т.д.

CompareOrdinal

Порівняння двох рядків. Метод перевантажений. Реалізації методу дозволяють порівнювати як рядки, так і підрядки. Рівняються коди символів

Concat

Конкатенація(зчеплення) рядків. Метод перевантажений, допускає зчеплення довільного числа рядків

Copy

Створюється копія рядка

Format

Виконує форматування відповідно до заданих специфікацій формату.

Join

Конкатенація масиву рядків у єдиний рядок. При конкатенації між елементами масиву уставляються роздільники. Операція, задана методом Join, є зворотною до операції, заданої методом Split. Останній є динамічним методом й, використовуючи роздільники, здійснює поділ рядка на елементи

Динамічні методи класу String

Методи класу String дозволяють виконувати вставку, видалення, заміну, пошук входження підрядки в рядок. Клас String успадковує методи класу Object, частково їх перевизначаючи.

Методи, наведені в таблиці, дають досить повну картину можливостей, наявних при роботі з рядками в C#. Варто пам'ятати, що клас String є незмінним. Тому Replace, Insert й інші методи являють собою функції, що повертають новий рядок як результат і не змінюють рядок, що викликав метод.

Таблиця 17.3. Динамічні методи й властивості класу String

Метод

Опис

Insert

Вставляє підрядок в задану позицію

Remove

Видаляє підрядок в заданій позиції

Replace

Заміняє підрядок в заданій позиції на новий підрядок

Substring

Виділяє підрядок в заданій позиції

IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny

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

StartsWith, EndsWith

Повертається true або false, залежно від того, починається або закінчується рядок заданим підрядком

PadLeft, PadRight

Виконує набивання потрібним числом пробілів на початку й наприкінці рядка

Trim, TrimStart, TrimEnd

Зворотні операції до методів Pad. Віддаляються пробіли на початку й наприкінці рядка, або тільки з одного її кінця

ToCharArray

Перетворення рядка в масив символів

Клас StringBuilder

Клас StringBuilder – побудуви  рядків. Клас string не дозволяє змінювати існуючі об'єкти. Стрічковий клас StringBuilder дозволяє компенсувати цей недолік. Цей клас належить до змінюваних класів і його можна знайти в просторі імен System.Text.

Оголошення рядків. Конструктори класу StringBuilder

Об'єкти цього класу оголошуються з явним викликом конструктора класу. Оскільки спеціальних констант цього типу не існує, то виклик конструктора для ініціалізації об'єкта просто необхідний. Конструктор класу перевантажений, і поряд з конструктором без параметрів, що створюють порожній рядок, є набір конструкторів, яким можна передати дві групи параметрів. Перша група дозволяє задати рядок або підрядок, значенням якої буде ініцілізувати створюваний об'єкт класу StringBuilder. Друга група параметрів дозволяє задати ємність об'єкта - обсяг пам'яті, що відводить даному екземпляру класу StringBuilder. Кожна із цих груп не є обов'язковою й може бути опущена. Прикладом може служити конструктор без параметрів, що створює об'єкт, ініцілізувати  порожнім рядком, і з деякою ємністю, заданої за замовчуванням, значення якої залежить від реалізації. Приклад синтаксису трьох конструкторів:

  •  public StringBuilder (string str, int cap). Параметр str задає рядок ініціалізації, cap - ємність об'єкта;
  •  public StringBuilder (int curcap, int maxcap). Параметри curcap й maxcap задають початкову й максимальну ємність об'єкта;
  •  public StringBuilder (string str, int start, int len, int cap). Параметри str, start, len задають рядок ініціалізації, cap - ємність об'єкта.

Зверніть увагу, що для цього класу не можна використати просте присвоювання:

   StringBuilder s="abc"; //Неправильно!

У цьому випадку необхідно записати так:

   StringBuilder s=new StringBuilder("abc"); //Правильно

Операції над рядками

Над рядками цього класу визначені практично ті ж операції з тією же семантикою, що й над рядками класу String, однак, операція конкатенації (+) не визначена над рядками класу StringBuilder, її роль грає метод Append, що дописує новий рядок у хвіст уже існуючої.

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

Приклад:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace String3

{

   class Program

   {

       static void Main(string[] args)

       {

           //Рядка класу StringBuilder

           //операції над рядками

           StringBuilder s1 = new StringBuilder("ABC"),

              s2 = new StringBuilder("CDE");

           StringBuilder s3 = new StringBuilder();

           //s3= s1+s2;

           s3 = s1.Append(s2);

           bool b1 = (s1 == s3);

           char ch1 = s1[0], ch2 = s2[0];

           Console.WriteLine("s1={0}, s2={1}, b1={2}," +

              "ch1={3}, ch2={4}", s1, s2, b1, ch1, ch2);

           s2 = s1;

           b1 = (s1 != s2);

           ch2 = s2[0];

           Console.WriteLine("s1={0}, s2={1}, b1={2}," +

              "ch1={3}, ch2={4}", s1, s2, b1, ch1, ch2);

           StringBuilder s = new StringBuilder("Zenon");

           s[0] = 'L';

           Console.WriteLine(s);

          }

   }

}

Цей приклад демонструє можливість виконання над рядками класу StringBuilder тих же операцій, що й над рядками класу String. У результаті присвоювання створюється додаткове посилання на об'єкт, операції перевірки на еквівалентність працюють зі значеннями рядків, а не з посиланнями на них. Конкатенацію можна замінити викликом методу Append. З'являється нова можливість - змінювати окремі символи рядка. Для того щоб ім'я класу StringBuilder стало доступним, у проект додана пропозиція using System.Text, що посилається на відповідний простір імен. Результати роботи представлені на рис.17.2.

Рис.17. 2. Результати роботи програми

Основні методи й властивості

У класу є основні методи, що дозволяють виконувати такі операції над рядком як вставка, видалення й заміна підрядків, але немає методів, подібних до пошуку входження, які можна виконувати над звичайними рядками. Технологія роботи звичайно така: конструюється рядок класу StringBuilder; виконуються операції, що вимагають зміну значення; отриманий рядок перетвориться в рядок класу String; над цим рядком виконуються операції, що не вимагають зміни значення рядка. У класу StringBuilder немає статичних методів. Всі його методи - динамічні.

Основні методи класу StringBuilder:

public StringBuilder Append (<об'єкт>). До рядка, що викликала метод, приєднується рядок, отриманий з об'єкта, що переданий методу як параметр. Метод перевантажений і може приймати на вході об'єкти всіх простих типів, починаючи від char й bool до string й long. Оскільки об'єкти всіх цих типів мають метод ToString, завжди є можливість перетворити об'єкт у рядок, що і приєднується до вихідного рядка. Як результат повертається посилання на об'єкт, що викликав метод. Оскільки повертає ссилку, що, нічому привласнювати не потрібно, те вірніше вважати, що метод змінює значення рядка;

public StringBuilder Insert (int location,<об'єкт>). Метод вставляє рядок, отриманий з об'єкта, у позицію, зазначену параметром location. Метод Append є окремим випадком методу Insert;

public StringBuilder Remove (int start, int len). Метод видаляє підрядок довжини len, що починається з позиції start;

public StringBuilder Replace (string str1,string str2). Всі входження підрядка str1 заміняються на рядок str2;

public StringBuilder AppendFormat (<рядок форматів>, <об'єкти>). Метод є комбінацією методу Format класу String і методу Append. Рядок форматів, переданий методу, містить тільки специфікації форматів. Відповідно до цих специфікацій перебувають і форматуються об'єкти. Отримані в результаті форматування рядки приєднуються в кінець вихідного рядка.

Приклади використання основних властивостей і методів класу StringBuilder:

Властивість Length. Повертає довжину рядка:

   int k=s.Length;

Метод Append. Додає рядок до існуючій:

StringBuilder s1=new StringBuilder("Cogito ");

StringBuilder s2=new StringBuilder("ergo ");

s1.Append(s2);

s1.Append("sum");

System.Console.WriteLine(s1); //Надрукується "Cogito ergo sum"

         //Я мислю, значить я існую

Метод Equals. Служить для порівняння двох рядків. Повертає true або false. Приклад використання:

 if(s1.Equals(s2)) System.Console.WriteLine("Рядки рівні");

 else

System.Console.WriteLine("Рядки не рівні");

Метод Insert. Вставляє символи в задану позицію (нумерація йде з нуля):

StringBuilder s1=new StringBuilder("abcde");

s1.Insert(2, "xyz");

System.Console.WriteLine(s1); //Надрукується "abxyzcde"

Метод Remove. Видаляє символи з рядка:

StringBuilder s1=new StringBuilder("abcde");

s1.Remove(1, 2);

System.Console.WriteLine(s1); //Надрукується "ade"

Певый параметр в Remove - це з якої позиції видаляємо (нумерація з нуля), другий - скільки символів видаляємо.

Метод Replace. Заміняє символи:

StringBuilder s=new StringBuilder("abcdeabcde");

s.Replace("abc", "ZZZ");

System.Console.WriteLine(s); //Надрукується "ZZZdeZZZde"

За винятком методу Remove, всі розглянуті методи є перевантаженими

Ємність буфера

Кожен екземпляр рядка класу StringBuilder має буфер, у якому зберігається рядок. Обсяг буфера - його ємність - може мінятися в процесі роботи з рядком. Об'єкти класу мають дві характеристики ємності - поточну й максимальну. У процесі роботи поточна ємність змінюється в межах максимальної ємності. Якщо розмір рядка збільшується, то відповідно автоматично росте й поточна ємність. Якщо ж розмір рядка зменшується, то ємність буфера залишається на тім же рівні. Із цієї причини іноді правильно зменшувати ємність. Варто пам'ятати, що спроба зменшити ємність до величини, меншої довжини рядка, приведе до помилки.

У класу StringBuilder є 2 властивості й один метод, що дозволяють аналізувати й управляти ємнісними властивостями буфера. Цими характеристиками можна управляти також ще на етапі створення об'єкта, - для цього є відповідний конструктор. Розглянемо властивості й метод класу, пов'язані з ємністю буфера:

  •  властивість Capacity - повертає або встановлює поточну ємність буфера;
  •  властивість MaxCapacity - повертає максимальну ємність буфера (максимальна кількість символів, які можна записати в об'єкт типу StringBuilder).

   System.Console.WriteLine(s.MaxCapacity);

Метод int EnsureCapacity (int capacity) - дозволяє зменшити ємність буфера. Метод намагається спочатку встановити ємність, задану параметром capacity; якщо це значення менше розміру збереженого рядка, то ємність установлюється такий, щоб гарантувати розміщення рядка. Це число й повертається як результат роботи методу.

Варіанти індивідуальних завдань.

Завдання 17.1.

Ввести ваше прізвище, ім'я та по батькові як рядок символів. Визначити довжину рядка й кількість букв співпадаючих із другою буквою прізвища. Використовуючи методи класу StringBuilder вставити між кожною буквою прізвища й імені знак " - ". У по батькові замінити голосні малі літери на прописні. Вивести отриманий результат, додавши до нього коментарі - студент якої спеціальності й групи це виконав. Виконати завдання у відповідності зі своїм варіантом.

  1.  Вивести ім'я й кількість букв у третім слові.
  2.  Визначити кількість букв «а» у прізвищі.
  3.  Вивести перші букви прізвища, імені та по батькові із крапками.
  4.  Вивести довжину прізвища й імені.
  5.  Вивести прізвище й ініціали.
  6.  Вивести ім'я й кількість букв у прізвищі.
  7.  Визначити кількість букв «а» в імені.
  8.  Вивести саме довге слово.
  9.  Видалити всі букви «а» й «про» із прізвища.
  10.  Вивести ім'я в стовпець.
  11.  Перевірити чи починається хоча б одне зі слів з букви «В»
  12.  Всі букви «й» імені продублювати.
  13.  Вивести прізвище й кількість букв імені.
  14.  Вивести ім'я у зворотному порядку.
  15.  Вивести прізвище в стовпець.
  16.  Вивести ім'я, по батькові й кількості букв імені.
  17.  Вивести слово, що має найменшу кількість букв.
  18.  Вивести прізвище, ім'я, по батькові без пробілів. Скільки букв має ім'я.
  19.  Вивести довжини трьох слів.
  20.  Вивести ім'я й кількість букв прізвища.
  21.  Вивести ім'я, прізвище й сумарну довжину слів.
  22.  Кожну букву імені продублювати.
  23.  Вивести прізвище у зворотному порядку.
  24.  Визначити кількість букв «а» й «про» в імені.
  25.  Вивести третє слово й кількість букв у прізвищі.

Завдання 17.2.

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

Приклад програми: Дано рядок, роздільниками між словами є пробіли. Виділити слова і занести їх в одновимірний масив.

using System;

using System.Collections.Generic;

using System.Text;

namespace ConsoleApplication1

{

   class Program

   {

       static void Main(string[] args)

       {

           string[] h = new string[20];

           String s, b;

           String s1 = " ";

           s = Console.ReadLine()+" ";

           int r = s.Length;

           Console.WriteLine(r);

           int l = 0;

           String d = "";

           for (int i = 0; i <= r-1; i++)

           {

               if ((s[i] != s1[0])) d = d + s[i];

               if ((s[i] == s1[0]) && (d != null)) {

                   l = l + 1; h[l] = d; d = null;

               }

               

               Console.WriteLine(" "+ s[i]);

           }

               Console.ReadLine();

       }

   }

}

Приклад 17.1: Дано рядок, роздільниками між словами є пробіли. Знайти мінімальне слово.

using System;

using System.Collections.Generic;

using System.Text;

namespace ConsoleApplication1

{

   class Program

   {

       static void Main(string[] args)

       {

           string[] h = new string[20];

           String s, b;

           String s1 = " ";

           s = Console.ReadLine()+"  ";

           int r = s.Length;

           Console.WriteLine(r);

           int l = 0;

           String d = "";

           for (int i = 0; i <= r-1; i++)

           {

               if ((s[i] != s1[0])) d = d + s[i];

               if ((s[i] == s1[0]) && (d != null))

               {

                   l = l + 1; h[l] = d; d = null;

               }

               

               

           }

           int min = h[1].Length;

           int i1 = 1;

           for (int i = 2; i <= l; i++)

           {

               if (min < h[i].Length)

               {

                   min = h[i].Length; i1 = i;

               }

           }

           Console.WriteLine(h[i1]);

               Console.ReadLine();

       }

   }

}

Проаналізуйте наведені задачі, перевірте їх працездатність в середовищі програмування.  

Бажаю успіху.