
- •Язык c# и структура простой программы
- •Что такое .Net Framework
- •Что такое с#
- •Создание первой программы на с#
- •Пространство имен System
- •С# как язык Объектно-Ориентированного Программирования (ооп)
- •Состав и назначение файлов проекта
- •Структура сборки
- •Элементы языка c#
- •Базовый синтаксис с#
- •Переменные
- •Числа без знака
- •Числа со знаком
- •Числа для финансистов
- •Текстовые символы
- •Логический тип данных
- •Литералы с плавающей точкой
- •Символьные литералы
- •Строковые литералы
- •Выражения и операторы с#
- •Инициализация переменных и оператор присваивания
- •Значение в левой части
- •Ввод данных с консоли
- •Математические операторы
- •Вычисление остатка при целочисленном делении
- •Унарные операторы
- •Унарное логическое отрицание
- •Составные операторы
- •Поразрядные операторы
- •Поразрядное логическое и
- •Поразрядное логическое или
- •Поразрядное логическое исключающее или
- •Унарная поразрядная операция дополнения
- •Поразрядный сдвиг
- •Пример использования поразрядных операторов
- •Логические операторы
- •Операторы отношения
- •Приоритеты операторов
- •Исполнители алгоритмов
- •Исполнитель Чертежник
- •Исполнитель Робот
- •Компьютер как формальный исполнитель алгоритмов
- •Блок-схема
- •Псевдокод
- •Необходимые свойства алгоритма
- •Понятие о временной сложности алгоритма
- •Примеры
- •Правила для определения сложности
- •Тернарный условный оператор
- •Применение логических операций
- •Конструкция выбора
- •Примеры применения оператора выбора
- •Объединение меток case
- •Пропущенный break
- •Пример программы: Простые числа
- •Пример обработки одномерного массива чисел
- •Использование генератора случайных данных
- •Использование оператора foreach
- •Типы задач обработки одномерных числовых массивов
- •Поиск элемента в массиве
- •Многомерные массивы
- •Базовые операции со строками
- •Методы типа string
- •Копирование и клонирование строк
- •Конкатенация строк
- •Извлечение подстроки
- •Вставка подстроки
- •Замена символов и строк
- •Удаление символов из строки
- •Удаление незначащих пробелов
- •Преобразование к верхнему и нижнему регистру
- •Выравнивание по левому и правому краю поля
- •Объединение массива строк
- •Разбор строки
- •Сравнение строк
- •Форматирование текстовых строк
- •Функции
- •Описание и использование функций
- •Возвращаемые значения
- •Передача параметров
- •Выходные параметры
- •Область действия переменных
- •Область действия переменных и управляющие конструкции
- •Рекурсия
- •Параметры функции Main()
- •Перегрузка функций
- •Перечислимый тип
- •Определение перечислимых типов
- •Структуры
- •Описание структур
- •Использование структур в качестве параметров функций
- •Использование структур в качестве возвращаемых значений функций
- •Функции структур
- •Файлы и потоки
- •Основные классы ввода и вывода
- •Классы для работы с потоками
- •Классы для работы с потоками текстовых символов
- •Работа с текстовыми файлами
Многомерные массивы
Многомерный массив — это объект, в котором для осуществления доступа к его элементам используется несколько индексов.
В качестве примера представим себе случай, когда требуется отразить высоту возвышенности по измеряемым точкам на местности. Мы можем определить такие точки двумя координатами х и у и использовать эти координаты в качестве индексов так, чтобы в массиве с названием hillHeight хранилась высота холма, соответствующая точке с данной парой координат. Для этого потребуется использовать многомерный массив.
Двумерный массив такого вида объявляется следующим образом:
<базовыйТип>[,] <имя>;
Описания массивов с большим числом размерностей требуют больше запятых. Например:
<базовыйТип>[,,,] <имя>;
Так объявляется четырехмерный массив.
Для присваивания значений используется аналогичный синтаксис, причем размерности отделяются одна от другой запятыми. Для того чтобы объявить и инициализировать обсуждавшийся выше двумерный массив hillHeight с базовым типом double, размерностью х, равной 3, и размерностью у, равной 4, необходима следующая строка:
double[,] hillHeight = new double [3,4];
В качестве альтернативы при начальном присваивании значений могут использоваться литеральные значения. Для этого необходимо использовать вложенные блоки, взятыми в фигурные скобки и разделенными запятыми. Например:
double[,] hillHeight = new {{1, 2, 3, 4 }, {2, 3, 4, 5 }, {3, 4, 5, 6}};
Этот массив имеет точно такие же описания размерностей, что и предыдущий, однако в данном случае значения элементов массива задаются явно.
Для того чтобы получить доступ к отдельным элементам многомерного массива, следует указать индексы этого элемента, разделенные запятыми. Например:
hillHeight[2, 1]
Теперь над этим элементом можно выполнять действия так же, как и над другими переменными.
Цикл foreach позволяет осуществлять доступ ко всем элементам многомерных массивов так же, как и в случае одномерных. Например:
double[,] hillHeight = new {{1, 2, 3, 4 }, {2, 3, 4, 5 }, {3, 4, 5, 6}};
foreach(double height in hillHeight)
{
Console.WriteLine(("{0}", height);
}
Элементы этого массива будут выводиться в том же порядке, в котором происходило присваивание им литеральных значений, т.е. первой будет выведена единица, последней – шестерка.
Типы задач обработки двумерных числовых массивов
Обработка двумерных массивов по строкам
Дана матрица А[M,N]. Определить номер первой ее строки, в которой сумма четных элементов совпадает с суммой нечетных.
Начало
Ввод размеров матрицы M и N
Ввод элементов матрицы А[M,N]
Флаг = нет
Для i от 0 До M
CуммаЧетных = 0
CуммаНечетных = 0
Для j от 0 До N
Если– четный, То
CуммаЧетных = CуммаЧетных + A[i,j]
Иначе
CуммаНечетных = CуммаНечетных + A[i,j]
Все-Если
Все-Для-j
Если CуммаЧетных = CуммаНечетных, То
Флаг = Да
Прервать Цикл
Все-Если
Все-Для-i
Если Флаг = Нет, То
Печать «Такой строки в матрице нет»
Иначе
Печать «Суммы совпадают в строке» + i
Все-Если
Конец
Обработка двумерных массивов по столбцам
Дана матрица А[M,N]. Поменять местами столбцы этой матрицы, которые имеют максимальное и минимальное произведение отрицательных элементов.
Начало
Ввод размеров матрицы M и N
Ввод элементов матрицы А[M,N]
МинПроизв = МаксимальноеЧисло
МаксПроизв = МинимальноеЧисло
СтолбМин = -1
СтолбМакс = -1
Для j от 0 До N
Произведение = 1
Для i от 0 До M
Если A[i,j] < 0, То
Произведение = Произведение * A[i,j]
Все-Если
Все-Для-i
Если Произведение < МинПроизв, То
МинПроизв = Произведение
СтолбМакс = j
Все-Если
Если Произведение > МаксПроизв, То
МаксПроизв = Произведение
СтолбМин = j
Все-Если
Все-Для-j
Если СтолбМакс = -1 И СтолбМин = -1, То
Печать «Отрицательных элементов в матрице нет»
Иначе Если СтолбМакс = СтолбМин, То
Печать «Отрицательные элементы только в одном столбце»
Иначе
Для i от 0 До M
Х = A[i, СтолбМакс]
A[i, СтолбМакс] = A[i, СтолбМин]
A[i, СтолбМин] = Х
Все-Для-i
Печать матрицы А[M,N]
Все-Если
Конец
Удаление строк или столбцов двумерного массива
Вставка строк или столбцов в двумерный массив
Квадратные матрицы и их обработка
Дана матрица А[N, N]. Заменить все нечетные элементы этой матрицы, лежащие ниже главной диагонали, на произведение четных элементов, расположенных выше главной диагонали.
Начало
Ввод размера матрицы N
Ввод элементов матрицы А[N,N]
Произведение = 1
Флаг = Нет
Для i от 0 До N
Для j от 0 До N
Если i < j И A[i,j] - четный, То
Произведение = Произведение * A[i,j]
Флаг = Да
Все-Если
Все-Для-j
Все-Для-i
Если Флаг = Нет, То
Печать «Четных выше диагонали в матрице нет»
Выход Из Программы
Все-Если
Флаг = Нет
Для i от 0 До M
Для j от 0 До N
Если A[i,j] - нечетный, То
A[i,j] = Произведение
Флаг = Да
Все-Если
Все-Для-j
Все-Для-i
Если Флаг = Нет, То
Печать «Нечетных ниже диагонали в матрице нет»
Иначе
Печать матрицы А[M,N]
Все-Если
Конец
Работа с текстовыми строками
Практически в любом языке программирования предусмотрен набор стандартных функций, предназначенных для работы с текстовыми строками. Эти функции позволяют объединять строки, выделять из строк фрагменты, менять строчные буквы на прописные и обратно, искать в строках другие строки и произвольные символы и т. д.
В языках С и C++ стандартные функции, обрабатывающие символы и строки, являются частью библиотеки транслятора. Фактически они уже стали частью этих языков и потому описываются во всех учебниках, посвященных С и C++.
Что же касается языка программирования С#, то для представления текстовых строк в библиотеке классов Microsoft .NET Framework имеется класс System.String. Вместе с набором операций, методов и индексаторов этот класс представляет собой мощное средство обработки строк.
Прежде чем приступить к изучению способов работы с текстовыми строками в С#, уточним, чем строки С# отличаются от строк, с которыми имеют дело программисты С и C++. Прежде всего, программы, составленные а языках С и C++, имеют непосредственный доступ к представлению текстовых строк, хранящихся в оперативной памяти компьютера. Такие программы могут, например, перезаписывать или изменять содержимое строк по месту их расположения.
Что же касается программ С#, то все операции с текстовыми строками выполняются только при помощи методов, предусмотренных в соответствующих классах библиотеки Microsoft .NET Framework.
Далее, программы С и C++ могут работать с различными представлениями текстовых строк, такими, как, например ASCII и UNICODE. В зависимости от представления (или, как еще говорят, кодировки) для хранения каждого символа строки может использоваться 1, 2 или несколько байт памяти. В языке С# текстовые строки представлены только в кодировке UNICODE, предполагающей представление одного текстового символа 2 байтами памяти.
Строка схожа с массивом элементов, которые мы можем читать, но не изменять. Предположим, что мы объявляем и инициализируем строку следующим образом:
string s = "abcdefghij";
Мы можем получить доступ к каждому символу строки и напечатать его с помощью такого цикла:
for(int i = 0; i < s.Length; i++)
{
Console.WriteLine("Element {0} = {1}", i, s[i]);
}
Этот цикл выводит 10 строк текста вроде следующих:
Element 0 = а
Element 1 = b
. . .
Element 9 = j
Однако строки не считаются массивами и присваивание
s[3] = 'х'; //Неверная попытка заменить букву d на букву х
является неверным, потому что переменные строкового типа являются неизменяемыми — их нельзя модифицировать. Для того чтобы создать новое строковое значение, необходимо создавать новый экземпляр строкового типа.