Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемТарас Чернов
1 1 ©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
2 2 ©Павловская Т.А. (СПбГУ ИТМО) Лекция 6. Массивы, символы и строки Одномерные и прямоугольные массивы, базовый класс Array. Оператор foreach. Массивы объектов. Работа с символами и строками. Класс String. Форматирование строк.
3 ©Павловская Т.А. (СПбГУ ИТМО) 3 Описание типа данных вид_типа имя_типа описание_типа; имя_типа имя_переменной; class Monster {… }; Monster Vasia;
4 ©Павловская Т.А. (СПбГУ ИТМО) 4 Перечисляемый тип данных enum имя_перечисления [ : базовый_тип ] тело_перечисления [ ; ] enum Menu { Read, Write, Edit, Quit }; enum Nums { two = 2, three, ten = 10, eleven, fifty = ten + 40 }; Menu m, n; … m = Menu.Read; n = m; n++; if (n > m ) Console.WriteLine(n); Базовый класс - System.Enum Операции: арифметические (+, –, ++, ––) логические поразрядные (^, &, |, ~) отношения (, >=, ==, !=)
5 5 ©Павловская Т.А. (СПбГУ ИТМО) Массивы Массив ограниченная совокупность однотипных величин Элементы массива имеют одно и то же имя, а различаются по порядковому номеру (индексу) abcde a[0]a[1]a[2]a[3]a[4] Пять простых переменных (в стеке): Массив из пяти элементов значимого типа (в хипе): a
6 ©Павловская Т.А. (СПбГУ ИТМО) 6 Создание массива Массив относится к ссылочным типам данных (располагается в хипе), поэтому создание массива начинается с выделения памяти под его элементы. Элементами массива могут быть величины как значимых, так и ссылочных типов (в том числе массивы), например: int[] w = new int[10]; // массив из 10 целых чисел string[] z = new string[100]; // массив из 100 строк Массив значимых типов хранит значения, массив ссылочных типов ссылки на элементы. Всем элементам при создании массива присваиваются значения по умолчанию: нули для значимых типов и null для ссылочных.
7 ©Павловская Т.А. (СПбГУ ИТМО) 7 Размещение массивов в памяти abcde a[0]a[1]a[2]a[3]a[4] Пять простых переменных (в стеке): Массив из пяти элементов значимого типа (в хипе): a a[0]a[1]a[2]a[3]a[4] Массив из пяти элементов ссылочного типа (в хипе): a Значение
8 ©Павловская Т.А. (СПбГУ ИТМО) 8 Размерность массива Количество элементов в массиве (размерность) задается при выделении памяти и не может быть изменена впоследствии. Она может задаваться выражением: short n =...; string[] z = new string[2*n + 1]; Размерность не является частью типа массива. Элементы массива нумеруются с нуля. Для обращения к элементу массива после имени массива указывается номер элемента в квадратных скобках, например: w[4] z[i] С элементом массива можно делать все, что допустимо для переменных того же типа. При работе с массивом автоматически выполняется контроль выхода за его границы: если значение индекса выходит за границы массива, генерируется исключение IndexOutOfRangeException.
9 ©Павловская Т.А. (СПбГУ ИТМО) 9 Действия с массивами Массивы одного типа можно присваивать друг другу. При этом происходит присваивание ссылок, а не элементов: int[] a = new int[10]; int[] b = a; // b и a указывают на один и тот же массив Все массивы в C# имеют общий базовый класс Array, определенный в пространстве имен System. Некоторые элементы класса Array: Length (Свойство) - Количество элементов массива (по всем размерностям) BinarySearch (Статический метод) - Двоичный поиск в отсортированном массиве IndexOf – (Статический метод) - Поиск первого вхождения элемента в одномерный массив Sort (Статический метод) - Упорядочивание элементов одномерного массива
10 ©Павловская Т.А. (СПбГУ ИТМО) 10 Одномерные массивы Варианты описания массива: тип[] имя; тип[] имя = new тип [ размерность ]; тип[] имя = { список_инициализаторов }; тип[] имя = new тип [] { список_инициализаторов }; тип[] имя = new тип [ размерность ] { список_инициализаторов }; Примеры описаний (один пример на каждый вариант описания, соответственно): int[] a; // элементов нет int[] b = new int[4]; // элементы равны 0 int[] c = { 61, 2, 5, -9 }; // new подразумевается int[] d = new int[] { 61, 2, 5, -9 }; // размерность вычисляется int[] e = new int[4] { 61, 2, 5, -9 }; // избыточное описание
11 ©Павловская Т.А. (СПбГУ ИТМО) 11 Пример (не лучший способ) Для массива, состоящего из 6 целочисленных элементов, программа определяет: сумму и количество отрицательных элементов; максимальный элемент.
12 ©Павловская Т.А. (СПбГУ ИТМО) 12 Программа const int n = 6; int[] a = new int[n] { 3, 12, 5, -9, 8, -4 }; Console.WriteLine( "Исходный массив:" ); for ( int i = 0; i < n; ++i ) Console.Write( "\t" + a[i] ); Console.WriteLine(); long sum = 0; // cумма отрицательных элементов int num = 0; // количество отрицательных элементов for ( int i = 0; i < n; ++i ) if ( a[i] < 0 ) { sum += a[i]; ++num; } Console.WriteLine( "Сумма отрицательных = " + sum ); Console.WriteLine( "Кол-во отрицательных = " + num ); int max = a[0]; // максимальный элемент for ( int i = 0; i < n; ++i ) if ( a[i] > max ) max = a[i]; Console.WriteLine( "Максимальный элемент = " + max ); max ) max = a[i]; Console.WriteLine( "Максимальный элемент = " + max );">
13 ©Павловская Т.А. (СПбГУ ИТМО) 13 Оператор foreach (упрощенно) Применяется для перебора элементов массива. Синтаксис: foreach ( тип имя in имя_массива ) тело_цикла Имя задает локальную по отношению к циклу переменную, которая будет по очереди принимать все значения из массива, например: int[] massiv = { 24, 50, 18, 3, 16, -7, 9, -1 }; foreach ( int x in massiv ) Console.WriteLine( x );
14 ©Павловская Т.А. (СПбГУ ИТМО) 14 Программа с использованием foreach int[] a = { 3, 12, 5, -9, 8, -4 }; Console.WriteLine( "Исходный массив:" ); foreach ( int elem in a ) Console.Write( "\t" + elem ); Console.WriteLine(); long sum = 0; // cумма отрицательных элементов int num = 0; // количество отрицательных элементов foreach ( int elem in a ) if ( elem < 0 ) { sum += elem; ++num; } Console.WriteLine( "sum = " + sum ); Console.WriteLine( "num = " + num ); int max = a[0]; // максимальный элемент foreach ( int elem in a ) if ( elem > max ) max = elem; Console.WriteLine( "max = " + max ); for ( int i = 0; i < n; ++i ) if ( a[i] < 0 ) { sum += a[i]; ++num; } max ) max = elem; Console.WriteLine( "max = " + max ); for ( int i = 0; i < n; ++i ) if ( a[i] < 0 ) { sum += a[i]; ++num; }">
15 ©Павловская Т.А. (СПбГУ ИТМО) й просмотр: j=2..5 nmin i= й просмотр: j=4..5 nmin i= й просмотр: j=5 i=4 Сортировка выбором й просмотр: j=3..5 nmin i=2
16 ©Павловская Т.А. (СПбГУ ИТМО) 16 Алгоритм сортировки Найти, где расположен минимальный элемент массива Поменять его местами с 1-м элементом. Первый элемент теперь на нужном месте. Среди элементов, начиная со 2-го, найти, где расположен минимальный элемент массива Поменять его местами со 2-м элементом. Второй элемент теперь на нужном месте. Среди элементов, начиная с 3-го, найти, где расположен минимальный элемент массива Поменять его местами с 3-м элементом. Третий элемент теперь на нужном месте.... Среди элементов, начиная с предпоследнего (n-1), найти, где расположен минимальный элемент массива Поменять его местами с (n-1)-м элементом. Повторить (n-1) раз (i := 1 to n-1): Среди элементов, начиная с i-го, найти, где расположен минимальный элемент массива Поменять его местами с i-м элементом. i-й элемент теперь на нужном месте.
17 ©Павловская Т.А. (СПбГУ ИТМО) 17 Обмен значений двух переменных
18 ©Павловская Т.А. (СПбГУ ИТМО) 18 Использование методов класса Array static void Main() { int[] a = { 24, 50, 18, 3, 16, -7, 9, -1 }; PrintArray( "Исходный массив:", a ); Console.WriteLine( Array.IndexOf( a, 18 ) ); Array.Sort(a); // Array.Sort(a, 1, 5); PrintArray( "Упорядоченный массив:", a ); Console.WriteLine( Array.BinarySearch( a, 18) ); Array.Reverse(a); // Array.Reverse(a, 2, 4); } public static void PrintArray( string header, int[] a ) { Console.WriteLine( header ); for ( int i = 0; i < a.Length; ++i ) Console.Write( "\t" + a[i] ); Console.WriteLine(); }
19 ©Павловская Т.А. (СПбГУ ИТМО) 19 Прямоугольные массивы Прямоугольный массив имеет более одного измерения. Чаще всего в программах используются двумерные массивы. Варианты описания двумерного массива: тип[,] имя; тип[,] имя = new тип [ разм_1, разм_2 ]; тип[,] имя = { список_инициализаторов }; тип[,] имя = new тип [,] { список_инициализаторов }; тип[,] имя = new тип [ разм_1, разм_2 ] { список_инициализаторов }; Примеры описаний (один пример на каждый вариант описания): int[,] a; // элементов нет int[,] b = new int[2, 3]; // элементы равны 0 int[,] c = {{1, 2, 3}, {4, 5, 6}}; // new подразумевается int[,] c = new int[,] {{1, 2, 3}, {4, 5, 6}}; // разм-сть вычисляется int[,] d = new int[2,3] {{1, 2, 3}, {4, 5, 6}}; // избыточное описание
20 ©Павловская Т.А. (СПбГУ ИТМО) 20 К элементу двумерного массива обращаются, указывая номера строки и столбца, на пересечении которых он расположен: a[1, 4] b[i, j] b[j, i] Компилятор воспринимает как номер строки первый индекс, как бы он ни был обозначен в программе.
21 ©Павловская Т.А. (СПбГУ ИТМО) 21 Пример Начало Ввод массива sred = 0 i = 1, m j = 1, n n_pos_el = 0 sred = sred + a ij a ij > 0 inc(n_pos_el) Конец да Вывод n_pos_el Вывод sred sred = sred / m / n Программа, которая для целочисленной матрицы размером 3 х 4 определяет: среднее арифметическое ее элементов; количество положительных элементов в каждой строке.
22 ©Павловская Т.А. (СПбГУ ИТМО) 22 const int m = 3, n = 4; int[,] a = new int[m, n] { { 2,-2, 8, 9 }, {-4,-5, 6,-2 }, { 7, 0, 1, 1 } }; Console.WriteLine( "Исходный массив:" ); for ( int i = 0; i < m; ++i ) { for ( int j = 0; j < n; ++j ) Console.Write( "\t" + a[i, j] ); Console.WriteLine(); } n m a 00 a 01 a 02 a 03 a 10 a 11 a 12 a 13 a 20 a21a21 a 22 a 23 0 m-1 n
23 ©Павловская Т.А. (СПбГУ ИТМО) 23 double sum = 0; int nPosEl; for ( int i = 0; i < m; ++i ) { nPosEl = 0; for ( int j = 0; j < n; ++j ) { sum += a[i, j]; if ( a[i, j] > 0 ) ++nPosEl; } Console.WriteLine( "В строке {0} {1} положит-х эл-в", i, nPosEl); } Console.WriteLine( "Среднее арифметическое всех элементов: " + sum / m / n ); double sum = 0; foreach ( int x in a ) sum += x; // все элементы двумерного массива! Console.WriteLine( "Среднее арифметическое всех элементов: " + sum / m / n );
24 ©Павловская Т.А. (СПбГУ ИТМО) 24 Ступенчатые массивы В ступенчатых массивах количество элементов в разных строках может различаться. В памяти ступенчатый массив хранится иначе, чем прямоугольный: в виде нескольких внутренних массивов, каждый из которых имеет свой размер. Кроме того, выделяется отдельная область памяти для хранения ссылок на каждый из внутренних массивов.
25 ©Павловская Т.А. (СПбГУ ИТМО) 25 Описание ступенчатого массива тип[][] имя; Под каждый из массивов, составляющих ступенчатый массив, память требуется выделять явным образом: int[][] a = new int[3][]; // память под ссылки на 3 строки a[0] = new int[5]; // память под 0-ю строку (5 эл-в) a[1] = new int[3]; // память под 1-ю строку (3 эл-та) a[2] = new int[4]; // память под 2-ю строку (4 эл-та) Или: int[][] a = { new int[5], new int[3], new int[4] }; Обращение к элементу ступенчатого массива: a[1][2] a[i][j] a[j][i]
26 ©Павловская Т.А. (СПбГУ ИТМО) 26 Пример int[][] a = new int[3][]; a[0] = new int [5] { 24, 50, 18, 3, 16 }; a[1] = new int [3] { 7, 9, -1 }; a[2] = new int [4] { 6, 15, 3, 1 }; Console.WriteLine( "Исходный массив:" ); for ( int i = 0; i < a.Length; ++i ) { for ( int j=0; j < a[i].Length; ++j) Console.Write( "\t" + a[i][j] ); Console.WriteLine(); } // поиск числа 18 в нулевой строке: Console.WriteLine( Array.IndexOf( a[0], 18 ) ); foreach ( int [] mas1 in a ) { foreach ( int x in mas1 ) Console.Write( "\t" + x ); Console.WriteLine(); }
27 ©Павловская Т.А. (СПбГУ ИТМО) 27 Эффективность работы с двумерными массивами
28 28 ©Павловская Т.А. (СПбГУ ИТМО) Строки в C# string StringBuilder символы (тип char) - самостоятельно
29 ©Павловская Т.А. (СПбГУ ИТМО) 29 Строки типа string Тип string предназначен для работы со строками символов в кодировке Unicode. Ему соответствует базовый класс System.String библиотеки.NET. Создание строки: 1. string s; // инициализация отложена 2. string t = "qqq"; // инициализация строковым литералом 3. string u = new string(' ', 20); // с пом. конструктора 4. string v = new string( a ); // создание из массива символов // создание массива символов: char[] a = { '0', '0', '0' };
30 ©Павловская Т.А. (СПбГУ ИТМО) 30 Операции для строк присваивание (=); проверка на равенство (==); проверка на неравенство (!=); обращение по индексу ([]); сцепление (конкатенация) строк (+). Строки равны, если имеют одинаковое количество символов и совпадают посимвольно. Обращаться к отдельному элементу строки по индексу можно только для получения значения, но не для его изменения. Это связано с тем, что строки типа string относятся к неизменяемым типам данных. Методы, изменяющие содержимое строки, на самом деле создают новую копию строки. Неиспользуемые «старые» копии автоматически удаляются сборщиком мусора.
31 ©Павловская Т.А. (СПбГУ ИТМО) 31 Некоторые элементы класса System.String НазваниеОписание Compare Сравнение двух строк в лексикографическом (алфавитном) порядке. Разные реализации метода позволяют сравнивать строки и подстроки с учетом и без учета регистра и особенностей национального представления дат и т. д. CompareOrdinal Сравнение двух строк по кодам символов. Разные реализации метода позволяют сравнивать строки и подстроки CompareTo Сравнение текущего экземпляра строки с другой строкой Concat Конкатенация строк. Метод допускает сцепление произвольного числа строк Copy Создание копии строки
32 ©Павловская Т.А. (СПбГУ ИТМО) 32 Format Форматирование в соответствии с заданными спецификаторами формата IndexOf, LastIndexOf, … Определение индексов первого и последнего вхождения заданной подстроки или любого символа из заданного набора Insert Вставка подстроки в заданную позицию Join Слияние массива строк в единую строку. Между элементами массива вставляются разделители (см. далее) Length Длина строки (количество символов) Remove Удаление подстроки из заданной позиции Replace Замена всех вхождений заданной подстроки или символа новой подстрокой или символом Split Разделение строки на элементы, используя заданные разделители. Результаты помещаются в массив строк Substring Выделение подстроки, начиная с заданной позиции
33 ©Павловская Т.А. (СПбГУ ИТМО) 33 Пример string s = "прекрасная королева Изольда"; Console.WriteLine( s ); string sub = s.Substring( 3 ).Remove( 12, 2 ); // 1 Console.WriteLine( sub ); string[] mas = s.Split(' '); // 2 string joined = string.Join( "! ", mas ); Console.WriteLine( joined ); прекрасная королева Изольда красная корова Изольда прекрасная! королева! Изольда
34 ©Павловская Т.А. (СПбГУ ИТМО) 34 Пример double a = ; int b = 29; Console.WriteLine( " a = {0,6:C} b = {1,2:X}", a, b ); Console.WriteLine( " a = {0,6:0.##} b = {1,5:0.# ' руб. '}", a, b); Console.WriteLine(" a = {0:F3} b = {1:D3}", a, b); a = 12,23p. b = 1D a = 12,23 b = 29 руб. a = 12,234 b = 029 {n[,m][:спецификатор_формата[число]]}
35 ©Павловская Т.А. (СПбГУ ИТМО) 35 Спецификаторы формата для строк C или c Вывод значений в денежном (currency) формате. D или d Вывод целых значений. E или e Вывод значений в экспоненциальном формате, то есть в виде d.ddd…E+ddd или d.ddd…e+ddd. F или f Вывод значений с фиксированной точностью. G или g Формат общего вида. Вывод значений с фиксированной точностью или в экспоненциальном формате, в зависимости от того, какой формат требует меньшего количества позиций. N или n Вывод значений в формате d,ddd,ddd.ddd. После спецификации можно задать целое число, определяющее длину дробной части P или p Вывод числа в процентном формате R или r Отмена округления числа при преобразовании в строку. Гарантирует, что при обратном преобразовании в значение того же типа получится то же самое X или x Вывод значений в шестнадцатеричном формате.
36 ©Павловская Т.А. (СПбГУ ИТМО) 36 Примеры пользовательских шаблонов ЧислоШаблонВид 1, ,24 1,243#.##1,24 0, ,10 0,1#.##,1
37 ©Павловская Т.А. (СПбГУ ИТМО) 37 Строки типа StringBuilder Класс StringBuilder определен в пространстве имен System.Text. Позволяет изменять значение своих экземпляров. При создании экземпляра обязательно использовать операцию new и конструктор, например: StringBuilder a = new StringBuilder(); // 1 StringBuilder b = new StringBuilder( "qwerty" ); // 2 StringBuilder c = new StringBuilder( 100 ); // 3 StringBuilder d = new StringBuilder( "qwerty", 100 ); // 4 StringBuilder e = new StringBuilder( "qwerty", 1, 3, 100 );// 5
38 ©Павловская Т.А. (СПбГУ ИТМО) 38 Основные элементы класса System.Text.StringBuilder Append Добавление в конец строки. Разные варианты метода позволяют добавлять в строку величины любых встроенных типов, массивы символов, строки и подстроки типа string AppendFormat Добавление форматированной строки в конец строки Capacity Получение или установка емкости буфера. Если устанавливаемое значение меньше текущей длины строки или больше максимального, генерируется исключение ArgumentOutOfRangeException Insert Вставка подстроки в заданную позицию Length Длина строки (количество символов) MaxCapacity Максимальный размер буфера Remove Удаление подстроки из заданной позиции Replace Замена всех вхождений заданной подстроки или символа новой подстрокой или символом ToString Преобразование в строку типа string
39 ©Павловская Т.А. (СПбГУ ИТМО) 39 Пример Console.Write( "Введите зарплату: " ); double salary = double.Parse( Console.ReadLine() ); StringBuilder a = new StringBuilder(); a.Append( "зарплата " ); a.AppendFormat( "{0, 6:C} - в год {1, 6:C}", salary, salary * 12 ); Console.WriteLine( a ); a.Replace( "р.", "тыс.$" ); Console.WriteLine( "А лучше было бы: " + a ); Введите зарплату: 3500 зарплата 3 500,00р. - в год ,00р. А лучше было бы: зарплата 3 500,00тыс.$ - в год ,00тыс.$
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.