
- •Язык c# и структура простой программы
- •Что такое .Net Framework
- •Что такое с#
- •Создание первой программы на с#
- •Пространство имен System
- •С# как язык Объектно-Ориентированного Программирования (ооп)
- •Состав и назначение файлов проекта
- •Структура сборки
- •Элементы языка c#
- •Базовый синтаксис с#
- •Переменные
- •Числа без знака
- •Числа со знаком
- •Числа для финансистов
- •Текстовые символы
- •Логический тип данных
- •Литералы с плавающей точкой
- •Символьные литералы
- •Строковые литералы
- •Выражения и операторы с#
- •Инициализация переменных и оператор присваивания
- •Значение в левой части
- •Ввод данных с консоли
- •Математические операторы
- •Вычисление остатка при целочисленном делении
- •Унарные операторы
- •Унарное логическое отрицание
- •Составные операторы
- •Поразрядные операторы
- •Поразрядное логическое и
- •Поразрядное логическое или
- •Поразрядное логическое исключающее или
- •Унарная поразрядная операция дополнения
- •Поразрядный сдвиг
- •Пример использования поразрядных операторов
- •Логические операторы
- •Операторы отношения
- •Приоритеты операторов
- •Исполнители алгоритмов
- •Исполнитель Чертежник
- •Исполнитель Робот
- •Компьютер как формальный исполнитель алгоритмов
- •Блок-схема
- •Псевдокод
- •Необходимые свойства алгоритма
- •Понятие о временной сложности алгоритма
- •Примеры
- •Правила для определения сложности
- •Тернарный условный оператор
- •Применение логических операций
- •Конструкция выбора
- •Примеры применения оператора выбора
- •Объединение меток case
- •Пропущенный break
- •Пример программы: Простые числа
- •Пример обработки одномерного массива чисел
- •Использование генератора случайных данных
- •Использование оператора foreach
- •Типы задач обработки одномерных числовых массивов
- •Поиск элемента в массиве
- •Многомерные массивы
- •Базовые операции со строками
- •Методы типа string
- •Копирование и клонирование строк
- •Конкатенация строк
- •Извлечение подстроки
- •Вставка подстроки
- •Замена символов и строк
- •Удаление символов из строки
- •Удаление незначащих пробелов
- •Преобразование к верхнему и нижнему регистру
- •Выравнивание по левому и правому краю поля
- •Объединение массива строк
- •Разбор строки
- •Сравнение строк
- •Форматирование текстовых строк
- •Функции
- •Описание и использование функций
- •Возвращаемые значения
- •Передача параметров
- •Выходные параметры
- •Область действия переменных
- •Область действия переменных и управляющие конструкции
- •Рекурсия
- •Параметры функции Main()
- •Перегрузка функций
- •Перечислимый тип
- •Определение перечислимых типов
- •Структуры
- •Описание структур
- •Использование структур в качестве параметров функций
- •Использование структур в качестве возвращаемых значений функций
- •Функции структур
- •Файлы и потоки
- •Основные классы ввода и вывода
- •Классы для работы с потоками
- •Классы для работы с потоками текстовых символов
- •Работа с текстовыми файлами
Использование структур в качестве параметров функций
При разработке функций программист имеет право использовать в качестве параметров функций переменные любого типа, причем это могут быть как стандартные типы, так и типы, определяемые самим программистом, т.е. перечислимые типы и структуры.
Использование переменных, имеющих перечислимый тип, в качестве параметра достаточно удобно и наглядно, но не несет в себе никаких новых возможностей для программиста. Использование структур, напротив, позволяет сократить (иногда очень существенно) число параметров функции, так как сам структура является сложным типом.
Рассмотрим пример структуры, определяющей положение точки на плоскости в прямоугольной системе координат:
struct point
{
public double x;
public double y;
}
Если в программе необходима функция, определяющая расстояние между двумя точками, то естественно передавать этой функции два параметра, имеющих определенный выше тип point:
static double distanceBetween(point p1, point p2)
{
return Math.Sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
Для вызова этой функции определим в функции Main() две переменных типа point, введем значения их полей, вызовем функцию, рассчитывающую расстояние и напечатаем результат:
static void Main(string[] args)
{
point p1, p2;
Console.Write("x1 = ");
p1.x = Convert.ToDouble(Console.ReadLine());
Console.Write("y1 = ");
p1.y = Convert.ToDouble(Console.ReadLine());
Console.Write("x2 = ");
p2.x = Convert.ToDouble(Console.ReadLine());
Console.Write("y2 = ");
p2.y = Convert.ToDouble(Console.ReadLine());
double dist = distanceBetween(p1, p2);
Console.WriteLine("Расстояние между точками равно {0:f4}", dist);
Console.ReadLine();
}
В результате работы программы на консоль будет выведено:
Обратите внимание на форматирование вывода на консоль значения с плавающей точкой. Использование формата {0:f4} обеспечивает вывод четырех знаков после запятой.
Использование структур в качестве возвращаемых значений функций
Не менее удобно использовать структуры в качестве значений, возвращаемых функциями. Эта возможность позволяет отказаться от передачи в функцию параметров по ссылке (модификатор ref), и передавать их только по значению, а также от использования выходных параметров функции (модификатор out).
Если функция формирует несколько новых значений, то достаточно часто они оказываются логически связаны между собой и могут быть объединены в одно целое – в качестве полей структурного типа данных. Возможны также случаи, когда соответствующий структурный тип уже описан в программе, а может быть, даже передается функции в качестве параметра.
В качестве примера рассмотрим использование описанного ранее типа для хранения положение точки на плоскости. Если известны координаты двух точек, определяющих концы отрезка прямой, и необходимо определить координаты середины этого отрезка, то без использования структур описание соответствующей функции может выглядеть следующим образом:
static void middle(int x1, int y1, int x2, int y2, out int xCenter, out int yCenter)
{
// Определение значений хCenter и yCenter
}
Эта функция имеет шесть параметров, из которых первые четыре являются входными и передаются значением, а последние два – выходными и передаются по ссылке. Использование структурных переменных в качестве параметров функции и возвращаемого значения позволяет сократить число параметров до двух:
static point middle(point p1, point p2)
{
point center;
// Определение значений center.x и center.y
return center;
}
Полный текст программы, использующей эту функцию, может выглядеть так:
using System;
namespace CenterPoint
{
class Program
{
struct point
{
public double x;
public double y;
}
static void Main(string[] args)
{
point p1, p2;
Console.Write("x1 = ");
p1.x = Convert.ToDouble(Console.ReadLine());
Console.Write("y1 = ");
p1.y = Convert.ToDouble(Console.ReadLine());
Console.Write("x2 = ");
p2.x = Convert.ToDouble(Console.ReadLine());
Console.Write("y2 = ");
p2.y = Convert.ToDouble(Console.ReadLine());
point center = middle(p1, p2);
Console.WriteLine("Координаты центра: х={0}; у={1}",
center.x, center.y);
Console.ReadLine();
}
static point middle(point p1, point p2)
{
point center;
center.x = (p1.x + p2.y) / 2;
center.y = (p1.y + p2.y) / 2;
return center;
}
}
}
Результат работы такой программы выглядит следующим образом: