3666

Клас StringBuilder – будівничий рядків

Лекция

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

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

Украинкский

2012-11-05

125 KB

6 чел.

Клас StringBuilder – будівничий рядків

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

Оголошення рядків. Конструктори класу 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 - ємність об'єкта.

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

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

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

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

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

public void TestStringBuilder()

{

  //Рядка класу 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);

}//TestStringBuilder

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

Основні методи

В класі StringBuilder методів значно менше, ніж у класі String. Це й зрозуміло - клас створювався з метою дати можливість змінювати значення рядка. Із цієї причини в класу є основні методи, що дозволяють виконувати такі операції над рядком як вставка, видалення й заміна підрядків, але немає методів, подібних до пошуку входження, які можна виконувати над звичайними рядками. Технологія роботи звичайно така: конструюється рядок класу StringBuilder; виконуються операції, що вимагають зміну значення; отриманий рядок перетвориться в рядок класу String; над цим рядком виконуються операції, що не вимагають зміни значення рядка. Давайте більш докладно розглянемо основні методи класу 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. Рядок форматів, переданий методу, містить тільки специфікації форматів. Відповідно до цих специфікацій перебувають і форматуються об'єкти. Отримані в результаті форматування рядки приєднуються в кінець вихідного рядка.

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

//Методи Insert, Append, AppendFormat

StringBuilder strbuild = new StringBuilder();

string str = "це  це не ";

strbuild.Append(str); strbuild.Append(true);

strbuild.Insert(4,false); strbuild.Insert(0,"2*2=5 - ");

Console.WriteLine(strbuild);

string txt = "А це пшениця, що у темному прикомірку

  зберігається," +" у будинку, що побудував Джек!";

StringBuilder txtbuild = new StringBuilder();

int num =1;

foreach(string sub in txt.Split(','))

{

  txtbuild.AppendFormat(" {0}: {1} ", num++,sub);

}

str = txtbuild.ToString();

Console.WriteLine(str);

У цьому фрагменті коду конструюються два рядки. Перша з них створюється з рядків і булевих значень true й false. Для конструювання використовуються методи Insert й Append. Другий рядок конструюється в циклі із застосуванням методу AppendFormat. Результатом цього конструювання є рядок, у якому прості пропозиції вихідного тексту пронумеровані.

Зверніть увагу, що сконструйований другий рядок передається у звичайний рядок класу String. Ніяких проблем перетворення рядків одного класу в інший клас не виникає, оскільки всі об'єкти, у тому числі, об'єкти класу StringBuilder, володіють по визначенню методом ToString.

Зверніть увагу, як виглядають результати роботи.


Рис. 16.1.  Операції й методи класу StringBuilder

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

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

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

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

Приведу код, у якому проводяться різні експерименти з ємністю буфера:

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

int curvol1 = txtbuild.Capacity;

int curvol2 = strbuild.Capacity;

int maxvol1 = txtbuild.MaxCapacity;

int maxvol2 = strbuild.MaxCapacity;   

Console.WriteLine("curvol1= {0}",curvol1);

Console.WriteLine("curvol2= {0}",curvol2);

Console.WriteLine("maxvol1= {0}",maxvol1);

Console.WriteLine("maxvol2= {0}",maxvol2);

int sure1 = txtbuild.EnsureCapacity(100);

int sure2 = strbuild.EnsureCapacity(100);

Console.WriteLine("sure1= {0}",sure1);

Console.WriteLine("sure2= {0}",sure2);

curvol2 = strbuild.Capacity;

Console.WriteLine("curvol2= {0}",curvol2);

//помилка! спроба встановити ємність менше довжини рядка

//strbuild.Capacity = 25;

strbuild.Capacity = 256; //так можна!

curvol2 = strbuild.Capacity;

Console.WriteLine("curvol2= {0}",curvol2);

//збільшимо рядок - ємність збільшиться

int len = txtbuild.Length;

txtbuild.Append(txtbuild.ToString());

curvol1 = txtbuild.Capacity;

Console.WriteLine("curvol1= {0}",curvol1);

//зменшимо рядок

txtbuild.Remove(len, len);

curvol1 = txtbuild.Capacity;

Console.WriteLine("curvol1= {0}",curvol1);

У цьому фрагменті коду аналізуються й змінюються ємнісні властивості буфера двох об'єктів. Демонструється, як міняється ємність при збільшенні й зменшенні розміру рядка. Результати роботи цього фрагмента коду показані на мал. 8.

Рис. 16.2.  Аналіз ємнісних властивостей буфера

Розглянемо деякі алгоритми роботи з рядками.

Задача 16.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;

               }

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

           }

               Console.ReadLine();

       }

   }

}

Задача 16.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;

               }

               

               

           }

           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();

       }

   }

}

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

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication6

{

   class Program

   {

       static void Main(string[] args)

       {

           //Задача №1

           int i, j = 0;

           string s, s1, s2, s3;

           Console.WriteLine("Введите строку символов, пожалуйста: ");

           s = (Console.ReadLine()+ "");

           s = s + " *";

           s1 = " ";

           s2 = ",";

           s3 = ".";

           int k = s.Length;

           string[] d = new string[10];

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

           {

               if ((s[i] != s1[0]) && (s[i] != s2[0]) && (s[i] != s3[0]))

               { d[j] = d[j] + s[i]; }

               if (((s[i] == s1[0]) || (s[i] == s2[0]) || (s[i] == s3[0])) && ((s[i + 1] != s1[0]) && (s[i + 1] != s2[0]) && (s[i + 1] != s3[0])))

               { j++; }

           }

           Console.WriteLine("");

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

           { Console.WriteLine(d[i]); }

           Console.WriteLine("");

           Console.WriteLine("Количество слов: " + j);

           int max=0, i1=0;

           int[] g = new int[j];

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

               { g[i] = d[i].Length; }

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

           { if (max < g[i]) { max = g[i]; i1 = i; } }

           Console.WriteLine(i1+1 + "-е слово самое длинное");

       }

   }

}

Задача 16.4. У рядку символів визначити кількість слів, в яких співпадають перший та останній символи. Слова відділяються довільною кількістю пробілів.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication6

{

   class Program

   {

       static void Main(string[] args)

       {

           //Задача №2

           int i, j = 0, p=0;

           int[] h = new int [40];

           string s, s1, s2, s3;

           Console.WriteLine("Введите строку символов, пожалуйста: ");

           String q;

           q = Console.ReadLine();

           q = q + " *";

           s1 = " ";

           s2 = ",";

           s3 = ".";

           int k = q.Length;

           String [] d = new String [40];

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

           {

               if ((q[i] != s1[0]) && (q[i] != s2[0]) && (q[i] != s3[0]))

                   { d[j] = d[j] + q[i]; }

                       if ((q[i] == s1[0]) || (q[i] == s2[0]) || (q[i] == s3[0]))

                           {if ((q[i + 1] != s1[0]) && (q[i + 1] != s2[0]) && (q[i + 1] != s3[0]))

                               {j++;}  

                           }

                   }

           Console.WriteLine("");

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

           { Console.WriteLine(d[i]); }

           Console.WriteLine("");

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

           { h[i] = d[i].Length; Console.WriteLine(i + 1 + "-e слово: " + h[i] + " символов"); StringBuilder r = new StringBuilder(d[i]); if (r[0] == r[h[i]-1]) { p = p + 1; } }

           Console.WriteLine("В строке " + p + " слов(a), у которых совпадают 1 и последный символы... ");

       }

   }

}

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

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication6

{

   class Program

   {

       static void Main(string[] args)

       {

           //Задача №3

           int i, j = 0, i1 = 0;

           string s, s1;

           Console.WriteLine("Введите строку символов, пожалуйста: ");

           s = (Console.ReadLine());

           s = s + " *";

           s1 = " ";

           int t = 0, k = s.Length;

           String[] d = new String[40];

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

           {

               if (s[i] != s1[0])

               { d[j] = d[j] + s[i]; }

               if ((s[i] == s1[0]) && (s[i + 1] != s1[0]))

               { j++; }

           }

          

           StringBuilder n = new StringBuilder();

           n.Append(d[0]);

           n.Append(" ");

           for (i = 1; i <= j - 1; i++)

           {

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

               {

                   if (d[i] == d[v])

                   {

                       d[i] = "";

                   }

               }

           }

           for (i = 0; i <= j - 1; i++)

           {

               if (d[i] != "")

               {

                   t++;

               }

               Console.Write(d[i] + " ");

           }

           Console.WriteLine();

           Console.WriteLine("Количество слов: " + j);

           Console.WriteLine("Количество повторных слов: " + (j - t));

       }

   }

}

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

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication6

{

   class Program

   {

       static void Main(string[] args)

       {

           //Задача №4

           int i, j = 0;

           string s, s1, m;

           Console.WriteLine("Введите строку символов, пожалуйста: ");

           s = (Console.ReadLine());

           s = s + " *";

           s1 = " ";

           int k = s.Length;

           string[] d = new string[100];

           string[] p = new string[100];

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

           {

               if (s[i] != s1[0])

               { d[j] = d[j] + s[i]; }

               if ((s[i] == s1[0])&& (s[i + 1] != s1[0]))

               { j++; }

           }

           /*for (i = 0; i <= j - 1; i++)

           {

               Console.WriteLine(d[i]);

           }*/

           int y = 0, l = 0;

           for (i = 1; i <= j - 1; i = i + 2)

               {

                   p[y] = d[i];

                   //Console.WriteLine(p[y]);

                   y++;

               }

           StringBuilder g = new StringBuilder();

           for (i = 0; i <= y - 1; i++)

           {

               l = p[i].Length;

               m = p[i];

               for (int v = l - 1; v >= 0; v--)

               {

                   g.Append(m[v]);

               }

               g.Append(" ");

           }

           Console.WriteLine(g);

       }

   }

}

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

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication6

{

   class Program

   {

       static void Main(string[] args)

       {

           //Задача №5

           int i, j = 0, j1=0, i1 = 0;

           string e, s, s1;

           Console.WriteLine("Введите 1 строку, пожалуйста: ");

           s = (Console.ReadLine());

           s = s + " *";

           Console.WriteLine("Введите 2 строку, пожалуйста: ");

           e = (Console.ReadLine());

           e = e + " *";

           s1 = " ";

           int k = s.Length, k1=e.Length;

           String[] d = new String[40];

           String[] d1 = new String[40];

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

           {

               if (s[i] != s1[0])

               { d[j] = d[j] + s[i]; }

               if ((s[i] == s1[0]) && (s[i + 1] != s1[0]))

               { j++; }

           }

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

           {

               if (e[i] != s1[0])

               { d1[j1] = d1[j1] + e[i]; }

               if ((e[i] == s1[0]) && (e[i + 1] != s1[0]))

               { j1++; }

           }

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

           {

               for (i1 = 0; i1 < j1; i1++)

               {

                   if (d[i] == d1[i1])

                       { d[i] = ""; }

                   }

               }

           Console.WriteLine("новая первая строка: ");

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

               { Console.Write( d[i] + " "); }

           Console.WriteLine();

           Console.WriteLine("новая вторая строка: ");

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

           { Console.Write(d1[i1] + " "); }

           Console.WriteLine();

           

       }

   }

}

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

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace _6

{

   class Program

   {

       static void Main(string[] args)

       {

           int i,k=0;

           string st=null;

           Console.Write("Введіть рядок: ");

           string s = Console.ReadLine();

           for (i = 0; i < s.Length; i++)

           {

               if ((s[i]==' ') && (s[i-1]==' ')) k++;

               else

               {

                   st += s[i];

               }

           }

           Console.WriteLine("Кількість лишніх пробілів: {0}", k);

           Console.WriteLine(st);

       }

   }

}

Задача 16.9. У рядку символів визначити кількість кожного з символів. Вилучити повторні символи.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace _7

{

   class Program

   {

       static void Main(string[] args)

       {

           char[] ch = new char[50];

           int i, j,l=1;

           bool b;

           Console.Write("Введіть рядок: ");

           string s = Console.ReadLine();

           ch[0] = s[0];

           Console.Write(ch[0] + " ");

           for (i = 0; i < s.Length; i++)

           {

               b=true;

               for (j = 0; j < l; j++)

               {

                if (s[i] == ch[j]) b=false;

               }

               if (b) {

                        ch[l] = s[i]; l++;

                        Console.Write(ch[l-1]+" ");

                      }

           }

       }

   }

}

Задача 16.10.У рядку символів визначити символи, які зустрічаються по одному разу і надрукувати номери їх позицій.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace _8

{

   class Program

   {

       static void Main(string[] args)

       {

           int i, j;

           bool b;

           

           Console.Write("Введіть рядок: ");

           string s = Console.ReadLine();

           char[] ch = new char[s.Length];

           for (i = 0; i < s.Length; i++) ch[i]=s[i];

           for (i = 0; i < s.Length; i++)

           {

               if (ch[i] == ' ') continue;

               b=true;

               for (j = i+1; j < s.Length; j++)

               {

                   if (ch[i] == ' ') continue;

                   if (ch[i] == ch[j]) { b = false; ch[j] = ' '; }

               }

               if (b) Console.WriteLine((i+1)+"-й символ: "+ch[i]);  

               ch[i] = ' ';

           }

       }

   }

}

Задача 16.11. У рядку символів визначити слова, які можуть бути отримані перевертанням іншого слова, що визначається як зразок.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Z9

{

   class Program

   {

       static void Main(string[] args)

       {

           Console.WriteLine("Введите строку: ");

           string s = Console.ReadLine()+" ";

           string d=null;

           int i = 0,l=0,f=0, h;

           string[] w = new string[50];

           h = s.Length;

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

           {

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

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

               {

                   w[l] = d; l++; d = null;

               }

           }

           

           Console.WriteLine("Введите слово: ");

           string wr = Console.ReadLine();

           string word = null;

           int j;

           j = wr.Length;

           for (i = (j - 1); i >= 0; i--) word += wr[i];

           foreach (string st in w)

          {

              if (st == word) { Console.WriteLine(st); f = 1; }

          }

           if (f==0) Console.WriteLine("***Error*** Таких слов нет...");

       }

   }

}

Задача 16.12. Ввести рядок символів. Впорядкувати слова в рядку за алфавітом. Кількість пробілів довільна.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace _16

{

   class Program

   {

       static void Main(string[] args)

       {

           Console.WriteLine("Введіть стрічку: ");

           string s = Console.ReadLine() + ' ';

           string d = null;

           string[] w = new string[50];

           int i, l = 0;

           for (i = 0; i < s.Length; i++)

           {

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

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

               {

                   w[l] = d; l++; d = null;

               }

           }

           //---------------------------------

           int f = 1;string d1;

           for (i=1;i<l;i++)

           {

               d = w[i-1];

               d1= w[i];

               if ((int)d[0] > (int)d1[0])

               {

                   w[i - 1] = w[i];

                   w[i] = d; f = 1;

               }

               if ((i == l - 1) && (f == 1)) { i = 0; f = 0; }

           }

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

           {

               Console.Write(w[i] + " ");

           }

       }

   }

}

Задача 16.13. У рядку символів визначити слово з максимальною кількістю голосних.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace _14

{

   class Program

   {

       static void Main(string[] args)

       {

           Console.WriteLine("Введіть стрічку: ");

           string s = Console.ReadLine() + ' ';

           string d = null;

           string[] w = new string[50];

           char[] h={'а','е','и','і','ї','о','у','ю','я','a','e','i','o','u','y'};

           char[] H = { 'А', 'Е', 'И', 'І', 'Ї', 'О', 'У', 'Ю', 'Я', 'A', 'E', 'I', 'O', 'U', 'Y' };

           int i, l = 0,j=0;

           for (i = 0; i < s.Length; i++)

           {

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

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

               {

                   w[l] = d; l++; d = null;

               }

           }

           //-------------------------------------

           int[] dv = new int[l];

           string st;

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

           {

               st=w[i];

               for (j = 0; j < st.Length; j++)

               {

                   for (int c=0; c<15; c++)

                   {

                       if ((st[j] == h[c]) || (st[j] == H[c]))

                       {

                           dv[i]++;

                       }

                   }

               }

           }

           int max = dv[0],i1=0;

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

           {

               if (max < dv[i]) { max = dv[i]; i1 = i; }

           }

           Console.WriteLine("Найбільше голосних у слові " + w[i1] + " -" + dv[i1]);

       }

   }

}

Задача 16.14. У рядку символів визначити групи цифрових символів. Перетворити їх в числа та знайти їх суму.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace _20

{

   class Program

   {

       static void Main(string[] args)

       {

           Console.WriteLine("Введить строку: ");

           string s = Console.ReadLine() + " ";

           string d = null;

           int i = 0, l = 0;

           string[] w = new string[50];

           for (i = 0; i < s.Length; i++)

           {

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

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

               {

                   w[l] = d; l++; d = null;

               }

           }

           int suma=0;

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

           {

               suma += Int32.Parse(w[i]);

           }

           Console.Write(suma);

           Console.ReadKey();

       }

   }

}

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