
- •Язык c# и структура простой программы
- •Что такое .Net Framework
- •Что такое с#
- •Создание первой программы на с#
- •Пространство имен System
- •С# как язык Объектно-Ориентированного Программирования (ооп)
- •Состав и назначение файлов проекта
- •Структура сборки
- •Элементы языка c#
- •Базовый синтаксис с#
- •Переменные
- •Числа без знака
- •Числа со знаком
- •Числа для финансистов
- •Текстовые символы
- •Логический тип данных
- •Литералы с плавающей точкой
- •Символьные литералы
- •Строковые литералы
- •Выражения и операторы с#
- •Инициализация переменных и оператор присваивания
- •Значение в левой части
- •Ввод данных с консоли
- •Математические операторы
- •Вычисление остатка при целочисленном делении
- •Унарные операторы
- •Унарное логическое отрицание
- •Составные операторы
- •Поразрядные операторы
- •Поразрядное логическое и
- •Поразрядное логическое или
- •Поразрядное логическое исключающее или
- •Унарная поразрядная операция дополнения
- •Поразрядный сдвиг
- •Пример использования поразрядных операторов
- •Логические операторы
- •Операторы отношения
- •Приоритеты операторов
- •Исполнители алгоритмов
- •Исполнитель Чертежник
- •Исполнитель Робот
- •Компьютер как формальный исполнитель алгоритмов
- •Блок-схема
- •Псевдокод
- •Необходимые свойства алгоритма
- •Понятие о временной сложности алгоритма
- •Примеры
- •Правила для определения сложности
- •Тернарный условный оператор
- •Применение логических операций
- •Конструкция выбора
- •Примеры применения оператора выбора
- •Объединение меток case
- •Пропущенный break
- •Пример программы: Простые числа
- •Пример обработки одномерного массива чисел
- •Использование генератора случайных данных
- •Использование оператора foreach
- •Типы задач обработки одномерных числовых массивов
- •Поиск элемента в массиве
- •Многомерные массивы
- •Базовые операции со строками
- •Методы типа string
- •Копирование и клонирование строк
- •Конкатенация строк
- •Извлечение подстроки
- •Вставка подстроки
- •Замена символов и строк
- •Удаление символов из строки
- •Удаление незначащих пробелов
- •Преобразование к верхнему и нижнему регистру
- •Выравнивание по левому и правому краю поля
- •Объединение массива строк
- •Разбор строки
- •Сравнение строк
- •Форматирование текстовых строк
- •Функции
- •Описание и использование функций
- •Возвращаемые значения
- •Передача параметров
- •Выходные параметры
- •Область действия переменных
- •Область действия переменных и управляющие конструкции
- •Рекурсия
- •Параметры функции Main()
- •Перегрузка функций
- •Перечислимый тип
- •Определение перечислимых типов
- •Структуры
- •Описание структур
- •Использование структур в качестве параметров функций
- •Использование структур в качестве возвращаемых значений функций
- •Функции структур
- •Файлы и потоки
- •Основные классы ввода и вывода
- •Классы для работы с потоками
- •Классы для работы с потоками текстовых символов
- •Работа с текстовыми файлами
Пример программы: Простые числа
Приведем пример программы, иллюстрирующей использование вложенных циклов и циклов с неоднозначным выходом. Программа вычисляет (и выводит) простые числа от 0 до 100 посредством проверки, делится ли каждое число на какое-либо положительное целое, отличное от 1 и самого себя. Очевидно, что это числа 2, 3, 5, 7, 11 и т.д.
С целью оптимизации работы программы в нее введены два усовершенствования:
она проверяет только нечетные числа (после 2);
она проверяет делители до полвины числа, которое претендует на роль простого. Этот момент также можно улучшить, проверяя делители до квадратного корня из числа, но для этого необходимо использовать стандартную функцию класса Math (см. далее).
(Замечание: если вам нужна программа, генерирующая большое количество простых чисел, то для этого существует гораздо более быстрый алгоритм.)
Во внешнем цикле переменная i проходит последовательность значений 3, 5, 7, ..., 99. Это сформулировано следующим образом:
for (int i = 3; i <= max; i += 2)
Внутренний цикл реализует собственно проверку условия, является ли число i простым, приводящую к завершению цикла, как только мы обнаруживаем, что i не есть простое число, или когда мы перебрали все делители вплоть до половины i. Этот цикл выглядит следующим образом:
bool prime = true;
for (int divisor = 3; prime == true && divisor <= i / 2;
divisor +=2)
{
prime = (i % divisor != 0); // Проверка - простое иди нет
}
if(prime == true)
Console.Write(" {0}" ,i); // Печать найденного числа
Когда цикл прекращается, мы должны проверить, почему он завершился — потому что мы нашли или, наоборот, не нашли простое число. Обнаруженные простые числа выводятся на консоль, и программа переходит к рассмотрению следующего претендента. Полный текст программы Primes.cs приведен ниже.
using System;
namespace Primes
{
class Program
{
///<summary>
///Программа Primes - Н.А.Борисов, 2009
///=======================================
///Выводит все простые числа между 1 и 100
///Демонстрирует использование вложенных циклов
///и циклов с альтернативным выходом
///</summary>
static void Main(string[] args)
{
int max = 100;
Console.Write (" 2"); //Выведем первое простое число
for (int i = 3; i <= max; i +=2)
{
//Предположим, что число простое
bool prime = true;
for (int divisor = 3; prime == true && divisor <= i / 2;
divisor +=2)
{
prime = (i % divisor != 0); // Проверка - простое иди нет
}
if(prime == true)
Console.Write(" {0}" ,i); // Печать найденного числа
}
Console.WriteLine();
Console.ReadLine();
}
}
}
Результат работы этой программы:
Сложные типы данных – массивы чисел и символов
Объявление одномерного массива
Массив содержит в себе множество значений данных (в данном случае – чисел или символов), обращение к которым осуществляется соответственно их позиции в списке. Каждая позиция соответствует определенному значению индекса. Индекс первой позиции, т. е. индекс первого элемента в массиве, всегда равен 0. Второй элемент имеет индекс 1 и т.д.
Одномерный массив может быть объявлен следующим образом:
<тип_элементов>[] идентификатор_массива = new <тип_элементов>[размер];
Примеры массивов:
int[] markCounts = new int [101];
double[] rainfall = new double[13];
char[] monthName = new char[13];
Во всех этих примерах, прежде всего, указывается тип элементов, затем этот тип снова упоминается, когда мы конструируем массив с помощью оператора new. Пара символов [ ] в этом контексте обозначает массив. В объявлении указывается также размер массива. Размер может быть представлен константой, а также выражением, вычисление которого дает целое число.
Заметьте, что размер, представляющий собой число элементов в массиве, всегда на 1 больше последнего допустимого индекса из-за того, что индекс первого элемента равен 0. Это очевидное несоответствие часто бывает источником ошибок в программах.
Прежде чем получить доступ к массиву, его необходимо инициализировать. Массивы могут быть инициализированы двумя способами. Мы можем либо задать полное содержимое массива в литеральной форме (то есть в виде списка констант), либо указать размер массива и использовать для инициализации всех его элементов ключевое слово new (НОВЫЙ).
Определение значений элементов массива в литеральной форме предполагает задание списка значений, разделенных запятыми и заключенных в фигурные скобки. Например:
int[] myIntArray = {5, 9, 10, 2, 99};
В данном случае описывается массив, состоящий их пяти элементов, и всем им присваивается целое значение.
Второй способ предполагает использование следующего синтаксиса:
int[] myIntArray = new int [5];
Здесь используется ключевое слово new для явной инициализации массива и константа для определения его размера. При этом методе всем вхождениям массива будет присвоено значение по умолчанию, которое для численных типов равно 0. Для указания размера массивов вместо констант с тем же успехом можно использовать переменные, например:
int arraySize = Convert.ToInt32(Console.ReadLine());
int[] myIntArray = new int [arraySize];
Значение переменной, используемой для указания размера массива, может быть введено с консоли, как в приведенном примере, или вычислено. Можно легко объявить несколько массивов одинакового размера или сделать так, чтобы размеры массивов были кратны друг другу:
int arraySize = 5;
int[] myArray1 = new int [arraySize];
int[] myArray2 = new int [arraySize]; // Два массив одинакового размера
int[] myArray3 = new int [arraySize * 2]; // Этот массив в два раза больше