- •Содержание
- •Глава 1. Основные принципы разработки алгоритмов и программ 8
- •Глава 2. Знакомство с технологией .Nет 30
- •Глава 3. Установка visual studio. Консольные приложения 42
- •Глава 4. Введение в язык c# 52
- •Глава 5. Операции и выражения. Программы линейной структуры 67
- •Глава 6. Программирование ветвящихся процессов 85
- •Глава 7. Программирование циклических процессов 92
- •Предисловие
- •Введение
- •Глава 1. Основные принципы разработки алгоритмов и программ
- •1.1 Этапы решения задач на эвм
- •1.1.1 Постановка задачи
- •1.1.2 Формализация или математическая постановка задачи
- •1.1.3 Выбор или разработка метода решения
- •1.1.4 Разработка алгоритма
- •1.1.5 Программирование
- •1.1.6 Отладка
- •1.1.7 Вычисление и обработка результатов
- •1.2 Формы записи алгоритмов
- •1.2.1 Словесное описание
- •1.2.2 Запись алгоритма с помощью схем
- •1.2.3 Псевдокоды
- •1.2.4 Способ записи на языке программирования
- •1.3 Свойства, которыми должны обладать алгоритмы
- •1.4 Характеристики качества программного продукта
- •1.5 Технология программирования хороших программ
- •1.5.1 Способы проектирования алгоритмов и программ
- •1.5.2 Основные идеи структурного программирования
- •При разработке алгоритма нужно руководствоваться следующими рекомендациями:
- •1.5.3 Дополнительные рекомендации
- •1.6 Контрольные вопросы
- •Глава 2. Знакомство с технологией .Nет
- •2. 1 Причины появления новой платформы и нового языка
- •2.2 Платформа .Nет Framework
- •2.3 Интегрированная среда разработки Visual Studio
- •2.3.1Общеязыковая среда выполнения clr
- •2.3.2 Новации Visual Studio 2010
- •2.4 Основные понятия объектно-ориентированной технологии
- •2.4.1 Инкапсуляция
- •2.4.2 Полиморфизм
- •2.4.3 Наследование
- •2.4.4 Классы
- •Контрольные вопросы
- •Глава 3. Установка visual studio. Консольные приложения
- •3.1 Установка Visual Studio
- •3.2 Разработка приложений
- •3.2.1 Консольные приложения
- •3.2.1.1 Создание проекта. Основные окна среды
- •Контрольные вопросы
- •Глава 4. Введение в язык c#
- •4.1 Историческая справка
- •4.2 Основы языка с#
- •4.2.1 Алфавит языка
- •4.2.2 Лексемы языка, директивы препроцессора и комментарии
- •4.3 Типы данных
- •4.3.1 Классификация типов данных
- •4.3.2 Встроенные типы данных
- •4.3.2.1 Целые типы
- •4.3.2.2 Вещественные типы
- •4.3.2.3 Логический тип
- •4.3.2.4 Символьный тип
- •4.3.2.5 Финансовый тип
- •4.3.3 Литералы
- •4.4 Переменные
- •4.4.1 Объявления переменных
- •4.4.2 Инициализация переменных
- •4.4.3 Область видимости переменных
- •4.5 Именованные константы
- •Контрольные вопросы
- •Глава 5. Операции и выражения. Программы линейной структуры
- •5.1 Выражения
- •5.1.1 Операции
- •5.1.1.1 Арифметические операции
- •5.1.1.2 Операции отношения, сдвига с#
- •5.1.1.3 Поразрядные и логические операции с#
- •5.1.1.4 Операции присваивания
- •5.1.1.5 Условная операция
- •5.2 Преобразование и приведение типов
- •5.2.1 Присвоение переменной одного типа значения другого типа
- •5.2.2 Явное преобразование типа
- •5.2.3 Преобразование типов в выражениях
- •5.3 Класс Math
- •Математические функции можно использовать только с величинами числовых типов. Углы тригонометрических функций должны быть представлены в радианах.
- •5.4 Линейные алгоритмы и программы
- •5.4.1 Простейшие способы вывода
- •5.4.2 Простейшие способы ввода с клавиатуры
- •5.5 Примеры
- •Контрольные вопросы
- •Варианты заданий для самостоятельной работы
- •Глава 6. Программирование ветвящихся процессов
- •6.1 Условные операторы
- •6.2 Алгоритмы и программы разветвленной структуры
- •Контрольные вопросы
- •Варианты заданий для самостоятельной работы
- •Глава 7. Программирование циклических процессов
- •7.1 Понятие цикла
- •7.2 Операторы управления
- •7.2.1 Оператор goto
- •7.2.2 Специальные операторы управления
- •7.2.3 Операторы циклов
- •7.3 Программирование вычислительных процессов усложненной структуры
- •7.3.1 Итерационные циклы
- •7.3.2 Вложенные циклы
- •Контрольные вопросы
- •Варианты заданий для самостоятельной работы
5.2 Преобразование и приведение типов
Большинство программ на любом языке высокого уровня содержат различные арифметические выражения, значения которых подлежат вычислению. А поскольку язык C# строго типизирован, то программист должен следить за возможностью вычисления этого значения и правильно предугадать и объявить его тип, учитывая явные и неявные преобразования типов языка.
К наиболее простой ситуации относится такая, когда операнды, входящие в выражение, одного типа и операция для этого типа определена, то результат выражения будет иметь тот же тип.
Рассмотрим более сложные ситуации.
5.2.1 Присвоение переменной одного типа значения другого типа
При этом будет выполнено автоматическое неявное преобразование типа переменной, стоящей справа от знака присваивания, в тип переменной, стоящей слева от знака присваивания, если тип левой части имеет больший диапазон значений, чем тип правой части. Такое преобразование, называемое расширяющим неявным преобразованием, осуществляет приведение более коротких типов к более длинным типам без потери значимости и точности. Для расширяющих преобразований числовые типы (целые типы, типы с плавающей точкой) совместимы друг с другом.
Например: long h; double z; …..z=h;…. // допустимое преобразование, но может вызвать потерю точности, но не потерю значимости.
Обратное же автоматическое преобразование из double в long недопустимо, потому что оно не является расширяющим.
Невозможны также автоматические преобразования:
-
между decimal и float или double;
-
числовых типов в char или bool;
-
между char и bool.
Преобразование из типов int, uint и long в тип float также может вызвать потерю точности, но не потерю значимости. В процессе других вариантов неявного преобразования никакая информация не теряется.
5.2.2 Явное преобразование типа
Если неявного преобразования из одного типа в другой не существует, программист может задать явное преобразование типа. Явное преобразование типа это инструкция компилятору преобразовать один тип в другой.
При преобразовании из более длинного типа в более короткий возможна потеря информации, если исходное значение выходит за пределы диапазона результирующего типа.
Формат операции:
( тип ) выражение
Здесь тип – это имя того типа, в который осуществляется преобразование, а выражение в простейшем случае представляет собой имя переменной, например:
long t = 300;
-
int z = (int) t; // данные не теряются
-
byte s = (byte) z; // данные теряются
-
double z, x; ……int n=(int) (z/x); //теряется дробная часть
При подобных ссужающих преобразованиях типов возможна потеря информации, если преобразуемое значение выходит за границы диапазона целевого типа, так как старшие разряды будут удалены (случай 2, но не случай 1). При приведении типа с плавающей точкой к целому типу будет удалена дробная часть (случай 3).
5.2.3 Преобразование типов в выражениях
Преобразование типов происходит не только при присваивании, но и в выражениях, где можно использовать несколько совместимых типов. Данные различных типов в одном выражении преобразуются к одному типу по мере выполнения операций. Преобразование типов выполняется по правилам расширяющего изменения типов.
Правила возможных преобразований представлены на схеме (рис. 5.1), приведенной в своей книге Т.А. Павловской. По схеме легко понять, например, что если один операнд имеет тип decimal,то второй операнд приводится к этому типу. Однако, если второй операнд типа double, это приведет к ошибке, потому что пути пребразования из double в decimal нет. Преобразование выполняется не последовательно по схеме, а непосредственно из исходного типа более низкого уровня в результирующий тип.
Рисунок 5.1 Неявные арифметические преобразования типов
Следует помнить, что арифметические операции не определены для более коротких, чем int, типов. Это означает, что если в выражении участвуют только величины типов sbyte, byte, short и ushort, перед выполнением операции они будут преобразованы в int. Таким образом, результат любой арифметической операции имеет тип не менее int.