Обратите внимание, что эти классы лежат в отдельном файле с именем Class 1. cs в пространстве имен namespace WinApMatr
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Кажется, что до сих пор у Нас(Вас) не было примера вложенных циклов, то есть конструкций программирования, в которых один цикл является телом другого цикла. При работе с двумерными массивами такие конструкции встречаются повсеместно. С ними легко и наглядно можно добраться до всех элементов двумерного массива. На рис.9.1 приведена блок-схема формирования (без уточнения, как это делается) прямоугольного двумерного массива из N строк и M столбцов. Такие же вложенные циклы используются и в других методах работы с двумерными массивами.

Рис.9.1.

 

Вернемся к Нашей(Вашей) задаче.

Классclass Form 1 : Formлежит вфайлеForm 1. cs в том же пространстве имен namespace WinApMatr.

 

В примере 9.1 приведены исходные тексты этих файлов.

Файл Class1.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows.Forms;

//using System.Collections;//

 

namespace WinApMatr

{

classCMatr

{

privateintm;//закрытоеполе - количествостроквматрице

publicint M //свойство

   {

get {return m;} set { m = value; }

}

privateint n;//закрытое поле - количество столбцов в матрице

publicint N//свойство

   {

get { return n; }

set { n = value; }

   }

privatedouble[,] matr;//закрытоеполе - двумерныймассив (матрица)

publicdouble[,] Matr//свойство

   {

get { return matr; }

set { matr = value; }

   }

privateint[] maxind;//закрытоеполе - одномерныймассив (вектор)

publicint[] Maxind//свойство

   {

get { return maxind; }

set { maxind = value; }

   }

 

/**/

publicvoid FindIndMax()

// формирует массив из индексов макс.элементов строк матрицы

// метод работает непосредственно с полями класса: c двумерным массивом matr и одномерным массивом maxind

{

       Maxind=newint[M];

for (int i=0; i<M;i++)

       {

double max = Matr[i, 0]; int jmax = 0;

for (int j = 0; j < N; j++)

           {

if (max < Matr[i,j])

               { max = Matr[i, j]; jmax = j; }

           }

           Maxind[i] = jmax;

       }

   }

 

publicdouble[,] ChangeMatr()

//Из матрицы matr формирует локальную матрицу с именем a,

//в которой меняются местами элемент с макс.значением и последний элемент

//метод возвращает не одно значение, а весь массив (матрицу a)

{

double[,] a = newdouble[M, N];

       a = Matr;

double z;

for (int i = 0; i < M; i++)

       {

           z = a[i, N-1];

           a[i, N-1] = a[i, Maxind[i]];

           a[i, Maxind[i]] = z;

}

return a;

   }

/**/

}

 

classMatrIO : CMatr//К методам класса CMatr добавлены методы формирования и вывода матрицы

{

publicvoid InputMatr(bool k)

   {

       Matr = newdouble[,] {{11,2,3},

                             {4,5,6}};

       M = Matr.GetLength(0);

       N = Matr.GetLength(1);

   }

 

publicvoid InputMatr()

//формирует матрицу matr специальным образом

   {

Matr = newdouble[M, N];

for (int i = 0; i < M; i++)

       {

for (int j = 0; j < N; j++)

           {

               Matr[i, j] = i - j;

if (i==j) Matr[i,j]=10+i;

}

       }

   }

 

publicvoid InputMatr(int k) // перегрузкаметода InputMatr

//Формирует матрицу из случайных целых чисел в интервале (-5,5)

{

       Matr = newdouble[M, N];

Random rnd = newRandom();

for (int i = 0; i < M; i++)

       {

for (int j = 0; j < N; j++)

{

               Matr[i, j] = rnd.Next(0,10) - 5;

           }

       }

   }

publicvoid InputMatr(double k) // перегрузкаметода InputMatr

//Формирует матрицу из случайных действительных чисел в интервале (-30,50)

{

       Matr = newdouble[M, N];

Random rnd = newRandom();

for (int i = 0; i < M; i++)

{

for (int j = 0; j < N; j++)

           {

               Matr[i, j] = rnd.NextDouble()*80-30;

}

       }

   }

publicvoid OutPutMatr(ListBox lb)

{

// MessageBox.Show("Общееколичествоэлементов L="+Matr.Length.ToString());

// MessageBox.Show("Количество элементов по 0-вой размерности L0=" + Matr.GetLength(0).ToString());

// MessageBox.Show("Количество элементов по 1-вой размерности L1=" + Matr.GetLength(1).ToString());

// Вообще-то,можно обойтись без полей, отвечающих за размерность матрицы, а каждый раз их измерять

lb.Items.Clear();

int M = Matr.GetLength(0);//локальноеимя

int N = Matr.GetLength(1);//локальноеимя

for (int i = 0; i < M; i++)

       {

string s = "";

for (int j = 0; j < N; j++)

           {

               s = s + Matr[i, j].ToString("F2")+" ";// форматныйвывод

           }

           lb.Items.Add(s);

       }

   }

 

publicvoid OutPutVekt(ListBox lb)

   {

       lb.Items.Clear();

for (int i = 0; i < M; i++)

       {

          lb.Items.Add(Convert.ToString(Maxind[i]));

}

 

   }

}

}

 

 

Файл Form1.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WinApMatr

{

publicpartialclassForm1 : Form

{

public Form1()

   {

       InitializeComponent();

   }

 

MatrIO mm;//объявлениепеременой mm - объекткласса MatrIO

 

privatevoid Form1_Load(object sender, EventArgs e)

// событие, возникающее при загрузке формы Form1

   {

       mm = newMatrIO();// инициализация объекта mm класса MatrIO

}

 

privatevoid button1_Click(object sender, EventArgs e)

{ // работа с загруженым объектом mm

       mm.M = int.Parse(textBox1.Text);

mm.N = int.Parse(textBox2.Text);

       mm.InputMatr();

       mm.OutPutMatr(listBox1);

   }

 

privatevoid button2_Click(object sender, EventArgs e)

{// работа с загруженым объектом mm

       mm.M = int.Parse(textBox1.Text);

mm.N = int.Parse(textBox2.Text);

       mm.InputMatr(1.5);

       mm.OutPutMatr(listBox1);

   }

 

privatevoid button3_Click(object sender, EventArgs e)

{// работа с загруженым объектом mm

       mm.M = int.Parse(textBox1.Text);

mm.N = int.Parse(textBox2.Text);

       mm.InputMatr(1);

       mm.OutPutMatr(listBox1);

   }

 

privatevoid button4_Click(object sender, EventArgs e)

{// работа с загруженым объектом mm

       mm.FindIndMax();

mm.OutPutVekt(listBox2);

   }

 

privatevoid button5_Click(object sender, EventArgs e)

{// работа с загруженым объектом mm

       mm.Matr = mm.ChangeMatr();

mm.OutPutMatr(listBox3);

   }

 

privatevoid button6_Click(object sender, EventArgs e)

   {//выходизприложения

       Close();

   }

 

privatevoid button7_Click(object sender, EventArgs e)

   {

       mm.InputMatr(true);

       mm.OutPutMatr(listBox1);

}

}

}

Пример 9.1.

 

На рис.9.1 приведен скриншот работы приложения решения этой задачи.

 

Рис.9.2

В этом приложении нет «защиты от дурака» в виде последовательного открытия кнопочек, которые надо давить на следующем шаге решения задачи.

 

Класс Array.

В лекции 8 уже упоминалось, что все массивы есть объекты класса Array. Кроме поля length в этом классе есть и другие поля и методы. Их использованиеупрощает манипулирование массивом как объектом.:

Свойства

Свойство Описание
public intLength {get} Возвращает количество всех элементов массива
public intRank{get} Возвращает количество измерений массива

 

Методы

Метод Описание
public intGetLength(Dimention) Возвращает количество элементов массива по измерению Dimention
public object GetValue(Index) Возвращает значение элемента с индексом Index одномерного массива. Аналогичные есть для многомерных массивов
public static void Reverse(Array) Изменяет порядок следования элементов одномерного массива Array на обратный
public static void CopyTo(Array,Index) Копирует из текущего одномерного массива все элементы в массив Array, начиная с индекса Index
public static void Sort(Array) Сортирует элементы одномерного массива Array
public static void IndexOf(Array)  
public static void BinarySearch(Array)  

Методы с модификатором staticявляются статическими, поэтому к ним обращаются через имя класса, а не используя имя объекта (экземпляра класса), поэтому имя массива передают в них как параметр. Двоичный поиск можно применять только для упорядоченных массивов.

В примере 9.2 представлен исходный текст приложения, в котором использованы методы класса Array.

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication1

{

publicpartialclassForm1 : Form

{

public Form1()

   {

       InitializeComponent();

   }

 

MyMassiv ms = null;

 

privatevoid button1_Click(object sender, EventArgs e)

   {

int n = Convert.ToInt32(textBox1.Text);

ms = newMyMassiv();

      ms.InPutMass(n);

      button5.Visible = true;

      button2.Visible = true;

   }

 

privatevoid button2_Click(object sender, EventArgs e)

   {

           ms.Mm = newint[ms.Leng];

           ms.RewZad10();

           button3.Visible = true;

           button4.Visible = true;

   }

 

privatevoid button3_Click(object sender, EventArgs e)

   {

       ms.OutPut(ms.Mm, listBox2);

   }

 

privatevoid button4_Click(object sender, EventArgs e)

   {

       ms.Max = ms.MaxMas();

       button4.Text = "MAX="+Convert.ToString(ms.Max);

   }

 

privatevoid button5_Click(object sender, EventArgs e)

   {

       ms.OutPut(ms.Mass, listBox1);

   }

 

privatevoid button6_Click(object sender, EventArgs e)

   {

         ms = newMyMassiv();

       ms.InPutMass();

 

   }

 

privatevoid button7_Click(object sender, EventArgs e)

   {

int z = Array.IndexOf(ms.Mass, 2);

       button7.Text = " index 2="+Convert.ToString(z);

int[] Ar;

       Ar = newint[ms.Mass.Length];

Array.Copy(ms.Mass, Ar, 3);

// ms.CopyMass(out Ar, 3);

       ms.OutPut(Ar, listBox3);

Array.Sort(ms.Mass);

       ms.OutPut(ms.Mass, listBox4);

       ms.Mass.SetValue(111, 2);//ms.Mass[2]=111

       ms.OutPut(ms.Mass, listBox5);

Array.Reverse(ms.Mass);

       ms.OutPut(ms.Mass, listBox6);

   }

}

 

publicclassMassiv

{

privateint leng; //Закрытоеполе-размермассивов mass и mm

publicint Leng //Свойство для изменения закрытого поля

   {

get { return leng; } //Чтение

set { leng = value; } //Возвращаемое значение

   }

 

privateint[] mass; //Закрытое поле массив

publicint[] Mass // Свойство для описания массива !!!

{

get { return mass; }

set { mass = value; }

   }

privateint[] mm;

publicint[] Mm

   {

get { return mm; }

set { mm = value; }

   }

 

publicvoid RewZad10()

   {

   Mm = newint[Leng];

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

       {

           Mm[i] = Mass[i] + 10;           

       }

   }

 

publicint MaxMas()

   {

int max;

       max = Mm[0];

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

       {

if (Mm[i]>max) max=Mm[i];

       }

return max;

   }

privateint max;

publicint Max

   {

get { return max; } //Чтение

set { max = value; } //Возвращаемое значение

   }

 

publicint Search(int k)

{

int i;

       i = Array.IndexOf(Mass, k);

return i;

   }

publicvoid SortMass()

{

Array.Sort(Mass);

   }

 

publicvoid CopyMass(outint[] Ar,int k)

   {

       Ar = newint[Mass.Length];

Array.Copy(Mass,Ar,3);

   }

}

 

publicclassMyMassiv : Massiv

{

publicvoid InPutMass()

   {

       Mass = newint[] { 7, 6, 5, 4, 3, 2, 1 };

   }

publicvoid InPutMass(int length)

   {

     Leng = length;

     Mass = newint[Leng];          

Random rnd = newRandom();

     rnd.NextDouble();

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

     {

           Mass[i] = rnd.Next(1,100)-50;

     }

   }

 

publicvoid OutPut(int[] a, ListBox lb)

   {

if (a != null)

       {

           lb.Items.Clear();

for (int i = 0; i <= a.Length - 1; i++)

           {

               lb.Items.Add(a[i]);

}

       }

   }

}

/* */

}

Пример 9.2

 

Результат работы представлен на Рис.9.3.

Рис.9.3

 

Класс ArrayList .

Недостатком массивов класса Array является то, что их размерность (количество элементов) должно быть известно заранее и после инициализации это значение менять нельзя. Этого недостатка лишены массивы из класса ArrayList. Ниже приведены некоторые методы этого класса, среди которых, конечно, надо выделить метод A dd, с помощью которого к массиву можно добавлять еще один элемент. Элементы массива класса ArrayList объявлены классом o bject, то есть, по сути, могут быть элементами любого класса.

К чему это приводит? Продемонстрируем это на простом примере. Есть массив с элементами типа do u ble или любого другого числового типа. Количество элементов заранее неизвестно, поэтому для хранения используем класс ArrayList. Надо вычислять сумму элементов или какую-нибудь другую агрегатную величину, для получения которой необходимо использовать арифметические операции. Напрямую элементы этого массива использовать не удастся. Почему? Это элементы класса object, а их складывать нет возможности. Придется их конвертировать к типу double, или к другому числовому типу, а потом уже складывать.

Есть ли недостатки у класса ArrayList по сравнению с классом Array?Да, конечно. Во-первых, представителями этого класса могут быть только одномерные массивы, во-вторых, программы, использующие этот класс, работают существенно медленнее, чем с массивами класса Array.

Да, чуть не забыл. Для работы с ArrayList надо подключить пространство имен Collections:usingSystem.Collections;

В таблице 9.1 приведены методы ( не все ) класса ArrayList.

Метод класса ArrayList Описание
int Add(Object Value) Добавляет в конец списка новый объект и возвращает его индекс
void Clean() Удаляет все элементы коллекции
bool Contains(Object Value) Возвращает true, если коллекция содержит элемент Value
int Count{get} Свойство, предназначенное только для чтения, хранит текущую длину коллекции.
intIndexOf(Object Value) Возвращает индекс первого вхождения элемента со значением Value
intLastIndexOf(Object Value) Возвращает индекс последнего вхождения элемента со значением Value
void Insert(int Index; Object Value ) Вставляет элемент Value в нужное место Index коллекции
Object this[index] {get;set} Это свойство позволяет обратиться к элементу по индексу
void Remove(Object Value) Удаляет из коллекции первое вхождение элемента со значением Value.
void RemoveAt(int Index) Удаляет элемент по индексу
void RemoveRange(intIndex; int Count) Удаляет из коллекции ровно Count элементов начиная с индекса Index
void Reverse() Изменяет порядок следования элементов на обратный
void Sort() Сортирует коллекцию
intBinarySearch(Object Value) Отыскивает элемент Value в отсортированном списке и возвращает его индекс или отрицательное число, если он не найден

Таблица 9.1

 

А в примере 9.3 продемонстрировано использованиеметодов класса ArrayList для работы с массивом целых чисел.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Collections; //добавили

 

namespace WinFormArrayList

{

publicpartialclassForm1 : Form

{

public Form1()

   {

       InitializeComponent();

   }

 

privatevoid button1_Click(object sender, EventArgs e)

   {

ArListIO ar= newArListIO();

       ar.InputArray();// заполнили ar.A

       ar.OutPutArray(ar.A, listBox1);// вывели

int s=ar.Summa(); // вычислили сумму элементов

label9.Text = "Суммаэлементов=" + Convert.ToString(s);

ar.A.Add(20);// добавили в конец

ar.A.Add(10);

       ar.OutPutArray(ar.A, listBox2);

       ar.A.Sort();// сортировка

       ar.OutPutArray(ar.A, listBox8);

ar.A.Reverse();// изменяет порядок следования элементов на обратный

ar.OutPutArray(ar.A, listBox9);

ar.A.Remove(3);// удаляет элемент со значение 3

ar.OutPutArray(ar.A, listBox3);

ar.A.RemoveAt(4);// удаляет элемент с индексом 4

ar.OutPutArray(ar.A, listBox4);

ar.A.RemoveRange(1, 3);//удаляет элементы начиная с индекса 1 до индекса 3

// удаляет элементs с индекса 1 до индекса 3

ar.OutPutArray(ar.A, listBox7);

ar.A.Insert(1, 3);//вставили по индексу 1 значение 3

       ar.A[ar.A.Count-1]=3;//изменили последний элемент

ar.OutPutArray(ar.A, listBox5);

int first = ar.A.IndexOf(3);// ищет индекс первого вхождения значения 3

int last=ar.A.LastIndexOf(3);// ищет индекс последнего вхождения значения 3

       label4.Text = "индекс первого вхождения значения 3=" + Convert.ToString(first);

       label5.Text = "индекс последнего вхождения значения 3=" + Convert.ToString(last);

       ar.A.Clear();// очистили массив

       ar.OutPutArray(ar.A, listBox6);

}

}

 

publicclassAr

{

// private ArrayList a;

publicArrayList A { get; set; }

publicint Summa()

   {

int s = 0;

foreach (int x in A)

s = s + (int)x; //явное приведение типа

return s;

   }

}

 

publicclassArListIO : Ar

{

publicvoid InputArray()

   {

       A = newArrayList { 7, 6, 5, 4, 3, 2, 1 };

 

   }

publicvoid OutPutArray(ArrayList x,ListBox lb)

   {

int i;

       lb.Items.Clear();

if (x.Count == 0)

           lb.Items.Add("пусто");

else

       {

for (i = 0; i <= x.Count - 1; i++)

           {

               lb.Items.Add(x[i]);

}

       }

   }

}

}

 

Пример 9.3

 

Обратите внимание на метод Summa() класса Ar. В нем вычисляется сумма элементов массива и здесь приходится использовать явное приведение типадля того, чтобы c элементами массива, являющиеся объектами класса object можно было работать как с числами.

Рис.9.4

Лекция 10

Строки

Обработка текстовой информации является одной из самых распространенных задач современного программировании. С# предоставляет для ее решения широкий набор средств: символы char, неизменяемые строки string, изменяемые строки StringBuider и регулярные выражения Regex. В данном разделе мы рассмотрим работу с символами, неизменяемыми и изменяемыми строками.

 

Символы c har

Начнем с символов. Символьный тип char предназначен для хранения символа в кодировке Unicode. Символьный тип относится к встроенным типам данных С# и соответствует стандартному классу Сhar библиотеки .Net из пространства имен System. В этом классе определены статические методы, позволяющие задавать вид и категорию символа, а также преобразовывать символ в верхний или нижний регистр, в число. Рассмотрим основные методы:

 

Метод Описание
GetNumericValue Возвращает числовое значение символа, если он является цифрой, и -1 в противном случае.
GetUnicodeCategory Возвращаеткатегорию Unicode-символа. В Unicode символыразделенынакатегории, напримерцифры (DecimalDigitNumber), римскиецифры (LetterNumber), разделителистрок (LineSeparator), буквывнижнемрегистре (LowercaseLetter) ит.д.
IsControl Возвращает true, если символ является управляющим.
IsDigit Возвращает true, если символ является десятичной цифрой.
IsLetter Возвращает true, если символ является буквой.
IsLetterOrDigit Возвращает true, если символ является буквой или десятичной цифрой.
IsLower Возвращает true, если символ задан в нижнем регистре.
IsNumber Возвращает true, если символ является числом (десятичным или шестнадцатеричным).
IsPunctuation Возвращает true, если символ является знаком препинания.
IsSeparator Возвращает true, если символ является разделителем.
IsUpper Возвращает true, если символ задан в нижнем регистре.
IsWhiteSpace Возвращает true, если символ является пробельным (пробел, перевод строки, возврат каретки).
Parse Преобразует строку в символ (строка должна состоять из одного символа).
ToLower Преобразует символ в нижний регистр
ToUpper Преобразует символ в верхний регистр

Таблица 10.1

 

Нужен пример работы с символами. Вспомните, пожалуйста, консольный режим. Для экономии места и усилий работу с символами и со строками Мы(Вы) будем демонстрировать в теле метода Main.

 

static void Main()

{

char b = 'B', c = '\x64', d = '\uffff';

Console.WriteLine("{0}, {1}, {2}", b, c, d);

Console.WriteLine("{0}, {1}, {2}", char.ToLower(b), char.ToUpper(c), char.GetNumericValue(d));

chara;

do//цикл выполнятеся до тех пор, пока не ввели символ e

{

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

      a = char.Parse(Console.ReadLine());

      Console.WriteLine("Введенсимвол {0}, егокод {1}, егокатегория {2}", a, (int)a, char.GetUnicodeCategory(a));

      if (char.IsLetter(a)) Console.WriteLine("Буква");

      if (char.IsUpper(a)) Console.WriteLine("Верхнийрегистр");

      if (char.IsLower(a)) Console.WriteLine("Нижнийрегистр");

      if (char.IsControl(a)) Console.WriteLine("Управляющийсимвол");

      if (char.IsNumber(a)) Console.WriteLine("Число");

      if (char.IsPunctuation(a)) Console.WriteLine("Разделитель");

}

while (a != 'e');

}

Пример 10.1

Рис.10.1

Используя символьный тип можно организовать массив символов и работать с ним на основе базового класса Array. Есть пример, но сомнения по объему.

 

Неизменяемые строки string

Тип string, предназначенный для работы со строками символов в кодировке Unicode, является встроенным типом С#. Каждый объект string - это неизменяемая последовательность символов Unicode, т.е. методы, предназначенные для изменения строк, возвращают измененные копиистроки, исходные же строки остаются неизменными.Оказывается, что благодаря этому ограничению строки в C# реализуются более эффективно. Хотя, на первый взгляд, такое ограничение кажется препятствием, на самом деле это не так. Когда требуется получить строку, отличающуюся от первоначальной, достаточно создать новую строку и «отказаться» от исходной. А поскольку ненужные объекты автоматически утилизируются средствами «сборщика мусора», то беспокоиться о дальнейшей судьбе «отвергнутых» строк не приходится.И ещё, надо подчеркнуть, что в C# строки это объекты, значит Мы(Вы) имеем дело со ссылочным типом и экземпляры типа stringследует инициировать (создать).Создать строку можно несколькими способами:

strings;                          // инициализация отложена

strings=”кол около колокола”;   //инициализация строковым литералом

strings=newstring (' ', 20);    //конструктор создает строку из 20 пробелов

intx = 12344556;                   //инициализировали целочисленную переменную

strings = x.ToString();     //преобразовали ее к типу string

char [] a={'a', 'b', 'c', 'd', 'e'}; //создали массив символов

stringv=newstring (a);       // создание строки из массива символов

stringv=newstring (a, 0, 2) //создание строки из частимассива символов,  при этом: 0 показывает с какого символа, 2 – сколько символов

//использовать для инициализации

 

Операции над строками

Над строками определены следующие операции:

· присваивание (=),

· две операции проверки эквивалентности (= =) и (!=),

· конкатенация или сцепление строк (+),

· взятие индекса ([]).

Обратите внимание, что в C# нет операций сравнения строк  типа« > », « < », которые широко используются в других языках программирования. Здесь для сравнения строк используются методы Compare.

 

Методы класса string

Класс string обладает богатым набором методов для сравнения строк, поиска в строке и других действий со строками. Рассмотрим эти методы.

 

Таблица 10.1

Название Вид Описание
static Compare Статический метод Сравнение двух строк в лексикографическом (алфавитном) порядке. Разные реализации метода позволяют сравнивать строки с учетом или без учета регистра.
CompareTo Экземплярныйметод Сравнение текущего экземпляра строки с другой строкой.
static Concat Статическийметод Слияние произвольного числа строк.
static Copy Статический метод Создание копии строки
static Empty Статическое поле Открытое статическое поле, представляющее пустую строку
static Format Статический метод Форматирование строки в соответствии с заданным форматом
IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny Экземплярные методы Определение индексов первого и последнего вхождения заданной подстроки или любого символа из заданного набора в данную строку.
Insert Экземплярный метод Вставка подстроки в заданную позицию
static Join Статический метод Слияние массива строк в единую строку. Между элементами массива вставляются разделители.
Length Свойство Возвращает длину строки
PadLeft, PadRigth Экземплярные методы Выравнивают строки по левому или правому краю путем вставки нужного числа пробелов в начале или в конце строки.
Remove Экземплярный метод Удаление подстроки из заданной позиции
Replace Экземплярный метод Замена всех вхождений заданной подстроки или символа новыми подстрокой или символом.
Split Экземплярный метод Разделяет строку на элементы, используя разные разделители. Результаты помещаются в массив строк.
StartWith, EndWith Экземплярные методы Возвращают true или false в зависимости от того, начинается или заканчивается строка заданной подстрокой.
Substring Экземплярный метод Выделение подстроки, начиная с заданной позиции
ToCharArray Экземплярный метод Преобразует строку в массив символов
ToLower, ToUpper Экземплярные методы Преобразование строки к нижнему или верхнему регистру
Trim, TrimStart, TrimEnd Экземплярные методы Удаление пробелов в начале и конце строки или только с одного ее конца.

 

Как говорилось выше, для сравнения строк в C# используется метод Compare, у которого есть несколько параметров, отвечающих за условия сравнения. Compare. Сравниваемые строки передаются этому методу в качестве параметров. Дополнительно методу Compare можно указывать, каким именно образом выполнять сравнение.

Если строки равны, метод Compare возвращает нулевое значение. Если первая строка меньше второй (используется лексикографическое сравнение), возвращается отрицательное значение, а если больше — положительное. А что значит одна строка больше другой? Как это понимать? Что значит сравнивать строки в лексикографическом порядке? При таком способе сравнения строки сравниваются посимвольно, поочередно, с начального до получения результата. А как сравниваются символы – по их кодам или номерам в таблице кодировок. Можно сказать проще – в соответствующем алфавите. Тот символ, у которого номер больше, тот и больше. Почему выбран именно такой способ сравнения? При таком способе отсортированные слова выстроятся в таком же порядке, как и во всех словарях, работающих с текстами.

Класс String содержит несколько перегруженных методов Compare. Прототип такого метода, предназначенного для лексикографического сравнения текстовых строк с учетом особенностей национального алфавита имеет вид:

public static int Compare(

Stringstringl,

Int32indexl,

String string2,

Int32 index2,

Int32 length,

BooleanignoreCase,

Culturelnfo culture);

 

Параметры stringl и indexl задают соответственно первую сравниваемую строку и позицию внутри ее с которой надо начинать сравнение.

Параметры string2 и index2 имеют то же назначение, относятся ко второй сравниваемой строке. Заметим, что параметры indexlи index2 можно не указывать. В этом случае происходит сравнение полных строк.

С помощью необязательного параметра length можно задать максимальную длину сравниваемых строк.

Если значение параметра ignoreCase равно true, то метод Compare не будет учитывать регистр сравниваемых строк.

Однако самый интересный параметр— culture. С его помощью можно указать функции национальный алфавит, который должен применяться для лексикографического сравнения строк.

Чтобы лексикографическое сравнение строк выполнялось правильно, необходимо учитывать особенности национальных алфавитов, использованных для представления строк.

Библиотека классов .NetFramework содержит специальный класс System.Globalization.CultureInfo, позволяющий задать национальный язык,или, в терминологии Microsoft.NETFramework, культуру (culture).

В табл. 10.2приведены имена и коды некоторых культур.

Таблица 10.2

Национальный язык Имя культуры
неучитывается "" (пустаястрока)
Английский en
Арабский ar
Белорусский be
Испанский es
Итальянский it
Немецкий de
Польский pl
Русский ru
Татарский tt
Узбекский yz
Узбекский (Узбекистан, кириллица) Cy-uz-UZ
Узбекский (Узбекистан, латиница) Lt-uz-UZ
Украинский uk
Французский fr

 

В примере 10.1 приведены варианты использования методов класса string.

namespace ConsoleApplication1

{

classProgram

{

 

staticvoidDelDubli(refstring s)

{// убирает лишние пробелы

// int i;

while (s.IndexOf(" ") >= 0)

       {//если находит два подряд идущие пробелы, то первый удаляет

s = s.Remove(s.IndexOf(" "), 1);

       }

   }

 

staticvoid Main(string[] args)

   {

string str1 = "Перваястрока";

string str2 = string.Copy(str1);

string str3 = "Вторая строка";

string str4 = "ВТОРАЯ строка";

stringstrUp, strLow;

int result, idx;

Console.WriteLine("str1: " + str1);

Console.WriteLine("Длинастроки str1: " + str1.Length);

Console.WriteLine("str2: " + str2);

Console.WriteLine("str3: " + str3);

Console.WriteLine("str4: " + str4);

/**/

// Создаем прописную и строчную версии строки str1.

strLow = str1.ToLower();

strUp = str1.ToUpper();

Console.WriteLine("Строчнаяверсиястроки str1: " + strLow);

Console.WriteLine("Прописнаяверсиястроки str1: " + strUp);

Console.WriteLine();

 

// Сравниваем две строки str1 с str3 НЕ ПОЛУЧАЕТСЯ !!!!!

//if (str1 > str3)

// Console.WriteLine(str1 + " > " + str3);

//else

// Console.WriteLine(str1 + " < " + str3);

       result = String.Compare(str1, str3);

Console.WriteLine("String.Compare(str1,str3):");

if (result == 0) Console.WriteLine("str1 и str3 равны.");

elseif (result < 0) Console.WriteLine("str1 меньше, чем str3");

elseConsole.WriteLine("str1 больше, чем str3");

Console.WriteLine();

 

 

// Сравниваем текущую строку str1 с str3,

result = str1.CompareTo(str3);

Console.WriteLine("str1.CompareTo(str3):");

if (result == 0) Console.WriteLine("str1 и str3 равны.");

elseif (result < 0) Console.WriteLine("str1 меньше, чем str3");

elseConsole.WriteLine("str1 больше, чем str3");

Console.WriteLine();

 

//сравниваемстрокибезучетарегистра

result = String.Compare(str3, str4, true);

Console.WriteLine("String.Compare(str3, str4, true):");

if (result == 0) Console.WriteLine("str3 и str4 равныбезучетарегистра.");

elseConsole.WriteLine("str3 и str4 неравныбезучетарегистра.");

Console.WriteLine();

 

//сравниваемчастистрок

       result = String.Compare(str1, 4, str2, 4, 2);//"ая" и "ая"

if (result == 0) Console.WriteLine("часть str1 и str2 равны");

elseConsole.WriteLine("часть str1 и str2 неравны");

Console.WriteLine();

//сравнение строк с учетом национальных особенностей (культуры)

str1="Вас";//кириллица

str2="Bac";//латиница

Console.WriteLine("Culture: " + str1 + " " + str2);

Console.WriteLine(String.Compare(str1, str2, true, newSystem.Globalization.CultureInfo("ru")));

Console.WriteLine(String.Compare(str1, str2, true, newSystem.Globalization.CultureInfo("en")));

// Поиск строк.

idx = str2.IndexOf("строка");

Console.WriteLine("Индекс первого вхождения подстроки строка: " + idx);

int idx1 = str2.IndexOf("строка",idx+1);

Console.WriteLine("Индекс вхождения подстроки строка после индекса "+idx+" = " + idx1);

idx = str2.LastIndexOf("о");

Console.WriteLine("Индекс последнего вхождения символа о: " + idx);

/**/

//конкатенация

stringstr = String.Concat(str1, str2, str3, str4);

Console.WriteLine("конкатенация "+str);

//удаление подстроки

str = str.Remove(0, str1.Length);

Console.WriteLine(str);

 

//замена подстроки "строка" на пустую подстроку

str = str.Replace("строка", "");

Console.WriteLine("замена:"+str);

 

charch = str[1];//читать из строку можно!!!

Console.WriteLine("символ строки:" + ch);

// str[1]='Ы';// в строке менять нельзя !!!

/**/

Console.ReadLine();

/**/

       {

stringpoems = "тучки небесные вечные     странники";

Console.WriteLine("Исходная строка для разбиения: " + poems);

// char[] div = { ' ' }; //создаем массив разделителей

// poems = poems.Replace(" ", " ");

DelDubli(ref poems);

// stringpoems = "тучки небесные, вечные странники...";

char[] div = { ' ', ',', '.'}; //создаем массив разделителей

Console.WriteLine("Подготовленная строка для разбиения: "+poems);

// Разбиваем строку на части,

string[] parts = poems.Split(div);

Console.WriteLine("Результат разбиения строки на части: ");

for (inti = 0; i<parts.Length; i++)

Console.WriteLine(parts[i]);

// Теперь собираем эти части в одну строку, в качестве разделителя используем символ |

string whole = String.Join(" | ", parts);

Console.WriteLine("Результатсборки: ");

Console.WriteLine(whole);

Console.ReadLine();

                   }

/*   */

   }

}

}

Пример 10.1

На Рис. 10.1 приведен результат работы программы из Примера 10.1

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

Демонстрация работы методов класса String.

 

Изменяемые строкиStringBuilder

Чтобы создать строку, которую можно изменять, в С# предусмотрен класс StringBuilder, определенный в пространстве имен System.Text.  Этот тип более эффективно использует память, поэтому он применяется для работы со строками большого размера.

Объекты этого класса всегда объявляются с явным вызовом конструктора класса (через операцию new) . Примеры создания изменяемых строк:

StringBuilder a =newStringBuilder(); //создание пустой строки, размер по умолчанию 16 символов

 

//инициализация строки и выделение необходимой памяти

StringBuilderb = newStringBuilder("abcd");

 

//создание пустой строки и выделение памяти под 100 символов

StringBuilder с = newStringBuilder(100);

 

//инициализация строки и выделение памяти под 100 символов

StringBuilder d = new StringBuilder("abcd", 100);

 

//инициализация подстрокой "bcd", и выделение памяти под 100 символов        

StringBuilder d = new StringBuilder("abcd", 1, 3,100); 

 

Основные элементы класса приведены в таблице:

Название Вид Описание
Append Экземплярныйметод Добавление данных в конец строки. Разные варианты метода позволяют добавлять в строку величины любых встроенных типов, массивы символов, строки и подстроки string.
AppendFormat Экземплярный метод Добавление форматированной строки в конец строки
Capacity свойство Получение и установка емкости буфера. Если устанавливаемое значение меньше текущей длины строки или больше максимального, то генерируется исключение ArgumentOutOfRangeException
Insert Экземплярный метод Вставка подстроки в заданную позицию
Length изменяемое свойство Возвращает длину строки. Присвоение ему значения 0 сбрасывает содержимое и очищает строку
MaxCapacity неизменное свойство Возвращает наибольшее количество символов, которое может быть размещено в строке
Remove Экземплярныйметод Удаление подстроки из заданной позиции
Replace Экземплярный метод Замена всех вхождений заданной подстроки или символа новой подстрокой или символом
ToString Экземплярныйметод Преобразование в строку типа string
Chars изменяемоесвойство Возвращает из массива или устанавливает в массиве символ с заданным индексом. Вместо него можно пользоваться квадратными скобками []
Equals Экземплярныйметод Возвращает true, только если объекты имеют одну и ту же длину и состоят из одних и тех же символов
CopyTo Экземплярныйметод Копирует подмножество символов строки в массив char
Как видно, методы класса StringBuilder менее развиты, чем методы класса String, но они позволяют более эффективно использовать память за счет работы с изменяемыми строками. Рассмотрим примеры использования данных методов.

Лекция 11

Дата: 2019-11-01, просмотров: 176.