Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






Кожен екземпляр рядка класу 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();

}

}

}

 

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


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.075 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал