
- •Язык c# и структура простой программы
- •Что такое .Net Framework
- •Что такое с#
- •Создание первой программы на с#
- •Пространство имен System
- •С# как язык Объектно-Ориентированного Программирования (ооп)
- •Состав и назначение файлов проекта
- •Структура сборки
- •Элементы языка c#
- •Базовый синтаксис с#
- •Переменные
- •Числа без знака
- •Числа со знаком
- •Числа для финансистов
- •Текстовые символы
- •Логический тип данных
- •Литералы с плавающей точкой
- •Символьные литералы
- •Строковые литералы
- •Выражения и операторы с#
- •Инициализация переменных и оператор присваивания
- •Значение в левой части
- •Ввод данных с консоли
- •Математические операторы
- •Вычисление остатка при целочисленном делении
- •Унарные операторы
- •Унарное логическое отрицание
- •Составные операторы
- •Поразрядные операторы
- •Поразрядное логическое и
- •Поразрядное логическое или
- •Поразрядное логическое исключающее или
- •Унарная поразрядная операция дополнения
- •Поразрядный сдвиг
- •Пример использования поразрядных операторов
- •Логические операторы
- •Операторы отношения
- •Приоритеты операторов
- •Исполнители алгоритмов
- •Исполнитель Чертежник
- •Исполнитель Робот
- •Компьютер как формальный исполнитель алгоритмов
- •Блок-схема
- •Псевдокод
- •Необходимые свойства алгоритма
- •Понятие о временной сложности алгоритма
- •Примеры
- •Правила для определения сложности
- •Тернарный условный оператор
- •Применение логических операций
- •Конструкция выбора
- •Примеры применения оператора выбора
- •Объединение меток case
- •Пропущенный break
- •Пример программы: Простые числа
- •Пример обработки одномерного массива чисел
- •Использование генератора случайных данных
- •Использование оператора foreach
- •Типы задач обработки одномерных числовых массивов
- •Поиск элемента в массиве
- •Многомерные массивы
- •Базовые операции со строками
- •Методы типа string
- •Копирование и клонирование строк
- •Конкатенация строк
- •Извлечение подстроки
- •Вставка подстроки
- •Замена символов и строк
- •Удаление символов из строки
- •Удаление незначащих пробелов
- •Преобразование к верхнему и нижнему регистру
- •Выравнивание по левому и правому краю поля
- •Объединение массива строк
- •Разбор строки
- •Сравнение строк
- •Форматирование текстовых строк
- •Функции
- •Описание и использование функций
- •Возвращаемые значения
- •Передача параметров
- •Выходные параметры
- •Область действия переменных
- •Область действия переменных и управляющие конструкции
- •Рекурсия
- •Параметры функции Main()
- •Перегрузка функций
- •Перечислимый тип
- •Определение перечислимых типов
- •Структуры
- •Описание структур
- •Использование структур в качестве параметров функций
- •Использование структур в качестве возвращаемых значений функций
- •Функции структур
- •Файлы и потоки
- •Основные классы ввода и вывода
- •Классы для работы с потоками
- •Классы для работы с потоками текстовых символов
- •Работа с текстовыми файлами
Пример обработки одномерного массива чисел
Вначале мы рассмотрим самый простой прием циклической обработки одномерного массива, основанный на применении оператора for. Этот прием используется во многих языках программирования, в частности в языках С, C++ и C#.
using System;
namespace ArrayLoop
{
class ArrayLoopApp
{
static void Main(string[] args)
{
int[] Numbers;
Numbers = new int[10];
int i ;
for(i = 0; i < 10; i++)
Numbers[i] = i;
Console.Write("Numbers: [{0}", Numbers[0]);
for(i = 1 ; i < Numbers.Length; i++)
Console.Write(",{0}", Numbers[i]);
Console.WriteLine("]");
Console.ReadLine();
}
}
}
Внутри метода Main мы объявили массив Numbers, содержащий переменные типа int:
int[] Numbers;
Здесь мы не указываем размер массива, так как при объявлении массива память для него не резервируется. В следующей строке мы резервируем память для хранения 10 переменных типа int. Ссылку на эту память мы записываем в переменную Numbers, завершая создание массива:
Numbers = new int[10];
Дополнительно мы объявляем переменную i, которая будет применяться для индексации массива:
int i;
Запись значений в ячейки массива (т. е. инициализация массива) выполняется простым присваиванием в цикле:
for(i = 0; i < 10; i++)
Numbers[i] = i;
После завершения этого процесса программа отображает на консоли значения, хранящиеся в массиве:
Console.Write("Numbers: [{0}", Numbers[0] );
for(i = 1 ; i < Numbers.Length; i++)
Console.Write(",{0}", Numbers[i]) ;
Console.WriteLine("]");
Здесь мы вначале выводим на консоль содержимое первого элемента массива (это делается отдельно перед циклом, потому что перед первым элементом открывается квадратная скобка), а затем и всех остальных (это уже внутри цикла, перед каждым элементом выводится запятая). После завершения цикла закрывается квадратная скобка и переводится строка:
Обратите внимание на то, как мы проверяем условие выхода за пределы массива. Параметр цикла i сравнивается со значением Numbers. Length. Такая возможность обеспечивается тем, что все массивы в С# являются объектами стандартного класса System.Array. Свойство Length этого класса содержит размер массива.
Использование генератора случайных данных
Рассмотрим пример программы. Пусть необходимо подсчитать, сколько раз на курсе из 250 студентов встречается каждая из возможных оценок (от двойки до пятерки). Например, может оказаться, что оценка 3 встретилась среди всех 250 оценок 60 раз. Мы строим массив с индексами от 0 до 3 (что соответствует количеству возможных оценок) и сохраняем в каждом элементе массива суммарное число студентов с соответствующей оценкой. Такой массив может иметь вид:
Оценка |
2 |
3 |
4 |
5 |
Количество студентов |
41 |
60 |
75 |
74 |
Индекс |
0 |
1 |
2 |
3 |
Из трех вышеприведенных строк массивом является только средняя. В нижней строке указаны индексы каждого элемента (для Вашего удобства), а верхняя строка содержит оценки, соответствующие каждому элементу массива. Легко заметить, что для каждого элемента разница между индексом и оценкой одинакова и равна двум. Этот факт можно использовать в программе.
Для упрощения программы, а также для облегчения ее отладки, мы будем генерировать оценки с помощью датчика случайных чисел, а не вводить их с клавиатуры. Для генерации случайных чисел удобно использовать стандартный класс Random, определенный в пространстве имен System. Сначала нужно создать объект этого класса:
Random r = new Random() ;
После этого можно получить необходимое количество целых чисел со случайными значениями в диапазоне от нуля до заданной границы limit:
int number = r.Next(limit) ;
Если задать значение равное пяти, то мы получим шесть значений – от нуля до пяти включительно. Это не совсем то, что нам нужно, поэтому в программе необходимо еще обеспечить, чтобы случайные значения были только от двух до пяти включительно. Текст программы приведен ниже.
using System;
class Ocenki
{
///<summary>
///Программа Ocenki
///====================
///Подсчитывает частоты оценок между 2 и 5.
///Проверка программы выполняется с помощью датчика
///случайных чисел
///Демонстрирует простую обработку массивов
///</summary>
static void Main(string[] args)
{
int limit = 6; // Граница для генератора оценок(не больше 5)
int classSize = 250; // Количество студентов
// Массив для подсчета количества оценок
int[] markCount = new int[limit-2];
int score; // Текущая оценка
Random r = new Random(); // Объект генератора случайных чисел
//Генерируем 250 оценок
for (int i = 0; i < classSize; i++)
{
//генерируем числа от 0 до 3, соответствующие оценкам от 2 до 5
score = r.Next(limit-2) ;
markCount[score]++; // Подсчитываем количество оценок
}
Console.WriteLine("Таблица оценок студентов");
int students = 0;
for (int i = 0; i < limit-2; i++)
{
Console.WriteLine(" {0,4} {1,6}", i+2, markCount[i]);
students += markCount[i];
}
Console.WriteLine("Всего {0} студентов", students);
Console.ReadLine();
}
}
В данном тексте программы обратите внимание на использование средств форматирования вывода в следующем операторе:
Console.WriteLine(" {0,4} {1,6}", i+2, markCount[i]);
Здесь в фигурных скобках для каждого выводимого числа указано два параметра. Первый, как обычно, определяет номер выводимого значения в списке (это 0 и 1), зато второй позволяет указать, сколько позиций на экране будет занимать каждое выводимое число (значения 4 и 6, пишутся после номера через запятую). Это позволяет получить на экране очень приличную таблицу, даже если выводимые значения будут сильно различаться по величине:
Попробуйте выполнить эту программу несколько раз. Вы увидите, что результаты будут различные. Это объясняется тем, что программа использует генератор случайных чисел, поэтому не отвечает требованию определенности, которое рассматривалось при изучении алгоритмов.