
- •Язык c# и структура простой программы
- •Что такое .Net Framework
- •Что такое с#
- •Создание первой программы на с#
- •Пространство имен System
- •С# как язык Объектно-Ориентированного Программирования (ооп)
- •Состав и назначение файлов проекта
- •Структура сборки
- •Элементы языка c#
- •Базовый синтаксис с#
- •Переменные
- •Числа без знака
- •Числа со знаком
- •Числа для финансистов
- •Текстовые символы
- •Логический тип данных
- •Литералы с плавающей точкой
- •Символьные литералы
- •Строковые литералы
- •Выражения и операторы с#
- •Инициализация переменных и оператор присваивания
- •Значение в левой части
- •Ввод данных с консоли
- •Математические операторы
- •Вычисление остатка при целочисленном делении
- •Унарные операторы
- •Унарное логическое отрицание
- •Составные операторы
- •Поразрядные операторы
- •Поразрядное логическое и
- •Поразрядное логическое или
- •Поразрядное логическое исключающее или
- •Унарная поразрядная операция дополнения
- •Поразрядный сдвиг
- •Пример использования поразрядных операторов
- •Логические операторы
- •Операторы отношения
- •Приоритеты операторов
- •Исполнители алгоритмов
- •Исполнитель Чертежник
- •Исполнитель Робот
- •Компьютер как формальный исполнитель алгоритмов
- •Блок-схема
- •Псевдокод
- •Необходимые свойства алгоритма
- •Понятие о временной сложности алгоритма
- •Примеры
- •Правила для определения сложности
- •Тернарный условный оператор
- •Применение логических операций
- •Конструкция выбора
- •Примеры применения оператора выбора
- •Объединение меток case
- •Пропущенный break
- •Пример программы: Простые числа
- •Пример обработки одномерного массива чисел
- •Использование генератора случайных данных
- •Использование оператора foreach
- •Типы задач обработки одномерных числовых массивов
- •Поиск элемента в массиве
- •Многомерные массивы
- •Базовые операции со строками
- •Методы типа string
- •Копирование и клонирование строк
- •Конкатенация строк
- •Извлечение подстроки
- •Вставка подстроки
- •Замена символов и строк
- •Удаление символов из строки
- •Удаление незначащих пробелов
- •Преобразование к верхнему и нижнему регистру
- •Выравнивание по левому и правому краю поля
- •Объединение массива строк
- •Разбор строки
- •Сравнение строк
- •Форматирование текстовых строк
- •Функции
- •Описание и использование функций
- •Возвращаемые значения
- •Передача параметров
- •Выходные параметры
- •Область действия переменных
- •Область действия переменных и управляющие конструкции
- •Рекурсия
- •Параметры функции Main()
- •Перегрузка функций
- •Перечислимый тип
- •Определение перечислимых типов
- •Структуры
- •Описание структур
- •Использование структур в качестве параметров функций
- •Использование структур в качестве возвращаемых значений функций
- •Функции структур
- •Файлы и потоки
- •Основные классы ввода и вывода
- •Классы для работы с потоками
- •Классы для работы с потоками текстовых символов
- •Работа с текстовыми файлами
- •Запись двоичных данных
- •Пример программы для работы с двоичным файлом
- •Просмотр содержимого каталога
- •Получение информации о каталоге
Использование оператора foreach
Хотя для циклической обработки массивов можно использовать любые циклические операторы, удобнее всего применять специализированный оператор foreach.
К программе, описанной в предыдущем разделе и предназначенной для вывода на консоль содержимого массива, добавим цикл подсчета суммы элементов этого массива:
int sum = 0;
foreach(int number in Numbers)
{
sum += number;
}
WriteLine("Summa = {0}", sum);
На блок-схеме оператор foreach изображается так же, как обычный цикл с параметром с шагом, равным единице. В псевдокоде допускается запись данного цикла в виде:
Для-Каждого number В Numbers
sum += number
Все-Для-Каждого
Обратите внимание, что для вычисления суммы достаточно знать только идентификатор массива Numbers, но нет необходимости знать его длину. К сожалению, оператор foreach не позволяет изменять содержимое элементов массива, но для просмотра массива (и, как вы узнаете позже, для просмотра содержимого контейнеров объектов других типов) он очень удобен. Как только вы попытаетесь изменить элемент массива в цикле foreach:
foreach(int number in Numbers)
{
number++;
}
Вы получите сообщение компилятора от ошибке:
error CS1656: Cannot assign to 'number' because it is
a 'foreach iteration variable'
Данное сообщение переводится как «Невозможно присвоить значение number, потому что это итерационная переменная цикла foreach».
Типы задач обработки одномерных числовых массивов
Задачи, связанные с обработкой одномерных массивов чисел, чрезвычайно разнообразны. В курсах, посвященных изучению основ программирования, этим задачам уделяется достаточно много внимания, так как считается, что знания, получаемые при изучении данного раздела и навыки разработки и отладки соответствующих программ многократно используются в дальнейшем при изучении прочих разделов.
Попытаемся выделить основные типы задач, решаемых в рамках данного раздела. Рассмотрим алгоритмы решения элементарных задач, из которых, как правило, состоит решение реальных задач, встречающихся на практике. Для записи алгоритмов будем использовать псевдокод.
Подсчет суммы или произведения элементов
Данная задача является одной из простейших, но часто встречающихся на практике. Необходимо использовать переменную того же типа, что и элементы массива, начальное значение которой определяется типом задачи: для суммы это ноль, для произведения – единица. Далее в цикле определяем требуемую величину. Приведем полный алгоритм для случая нахождения суммы, включая ввод исходных данных и вывод результата:
Начало
Ввод N (размер массива)
Ввод массива A(N)
Summa = 0
Для i = 0 До N-1
Summa = Summa + A(i)
Все-Для-i
Вывод: «Сумма равна», Summa
Конец
Данный алгоритм легко преобразуется в функцию Main(), которая может иметь следующий вид:
using System;
namespace Summa
{
class Program
{
static void Main(string[] args)
{
int N; // Размер массива
Console.Write("Введите N: ");
N = Convert.ToInt32(Console.ReadLine());
int[] A = new int[N];
Console.WriteLine("Введите массив А(N): ");
for (int i = 0; i < N; i++)
{
A[i] = Convert.ToInt32(Console.ReadLine());
}
int Summa = 0;
for (int i = 0; i < N; i++)
{
Summa += A[i];
}
Console.WriteLine("Сумма равна {0}", Summa);
Console.ReadLine();
}
}
}
Сравнив псевдокод алгоритма с текстом программы, легко заметить основные отличия. В псевдокоде отсутствуют описания переменных: алгоритм суммирования не зависит от типа элементов массива. Операции ввода и вывода записываются в псевдокоде одной строкой, так как являются типовыми и выполняются практически всегда одинаково для любой задачи обработки массивов. При выводе результата работы в псевдокоде не указывается способ форматирования выходной строки, а лишь перечисляются значения, которые должны быть выведены на консоль. Для обращения к элементам массива допускается использование круглых скобок, так как не все языки программирования используют для этого квадратные скобки.
В дальнейшем при описании последующих алгоритмов обработки одномерных массивов ввод исходных данных будет опускаться, а основное внимание будет уделяться их обработке.
Подсчет количества элементов, отвечающих заданному условию
Задачи данного типа решаются с использованием целочисленных переменных-счетчиков, вне зависимости от типа элементов массива. Начальным значением счетчика является ноль. Рассмотрим алгоритм подсчета количества четных элементов в целочисленном массиве.
Count = 0
Для i = 0 До N-1
Если A(i) – четный, То
Count = Count + 1
Все-Если
Все-Для-i
Если Count = 0, То
Вывод: «Четных элементов нет»
Иначе
Вывод: «В массиве », Count, « четных элементов»
Все-Если
В приведенном алгоритме прокомментируем два момента. При проверке четности элемента массива не конкретизируется, каким именно способом это будет сделано в программе (можно использовать остаток от деления на два, побитовую операцию И, есть и другие варианты). После завершения цикла, где определяется значение счетчика, производится проверка полученного значения и предусмотрено два варианта вывода результата на консоль.
На последнем пункте следует остановиться особо. В случаях, когда задача не является элементарной, или результат зависит от введенных пользователем данных, всегда существует вероятность невозможности получения требуемого решения. В данной задаче это связано с возможным отсутствием четных элементов в массиве. В таких случаях необходимо наличие проверки перед выводом результата и выдача осмысленного сообщения о причинах, почему результат не может быть получен.