Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Laboratornyy_praktikum_Programmirovanie_na_C

.pdf
Скачиваний:
42
Добавлен:
02.02.2015
Размер:
1.93 Mб
Скачать

содержит свойства проекта. При разработке консольных приложений полезно использование Аргументов командной строки.

Если проект уже открыт, то из него можно удалять и в него можно добавлять файлы. Выберите ниже в списке файл Program.cs, в его контекстном меню выберите команду Исключить из проекта. В контекстном меню проекта P01_3 выберите команду обавить/Существующий элемент, выберите созданный ранее файл D:\Program\VS\P02_2.cs (если файл находится вне папки проекта, то перед добавлением в проект он туда копируется). Дважды щѐлкните левой кнопкой мыши на строке P02_2.cs в списке элементов проекта, программа будет открыта в окне редактирования кода. Проведите обратные действия – включите кнопкой режим

Показать все файлы окна Обозреватель решений, выполните команду в контекстном меню P02_2.cs Исключить из проекта, у файла Program.cs – Включить в проект,

откройте Program.cs в окне редактирования кода.

Выполните команду Файл/ Закрыть решение.

Если уже есть готовый файл кода, для работы с ним в Visual Studio необходимо создать пустой проект и подключить к нему файл. Выполните команду

Файл/Создать/Проект. Выберите категорию шаблонов Установленные шаблоны/Visual C#/Windows, выберите шаблон Пустой проект, задайте имя (и имя решения) P01_2a, расположение D:\Program\VS. Добавьте в проект файл

D:\Program\VS\P01_2.cs. Закройте решение.

Исследуйте ещѐ один способ добавления файлов в проект, эмулирующий режим, в котором текст кода вставляется в программу посредством буфера обмена, например, копированием из данного руководства. Создайте новый проект P01_2b, в окне Обозреватель решений выполните контекстную команду проекта обавить/Создать элемент… Из открывшегося списка шаблонов выберите Файл с текстом программы. Будет открыто пустое окно редактирования. Переключитесь (Alt+Tab) в FAR (если вы его уже закрыли – откройте ещѐ раз), перейдите к файлу D:\Program\VS\P01_2.cs, откройте его для редактирования (F4), выделите весь текст (Ctrl+A), скопируйте его в буфер обмена (Ctrl+C), переключитесь в Visual Studio, вставьте скопированный текст из буфера обмена (Ctrl+V) в пустое окно редактирования. Если после вставки кода нарушены или отсутствуют отступы в

программе, выполните команду Правка/ ополнительно/Форматировать документ.

Покажите результаты работы преподавателю, закройте Visual Studio, а затем

уд л т с со д нны м о р мя р боты ф йлы п пк в папке

D:\Program\VS.

Вопросы к под ото к :

1.Что такое алгоритм, какими свойствами он обладает?

2.Что такое компьютерная программа?

3.Что такое язык программирования?

4.Что такое блок схема, какие основные элементы схем вы знаете?

5.Чем отличаются компиляторы и интерпретаторы?

6.Что такое .NET Framework?

7.Чем хорош C#?

8.Как из текста программы C# получить исполняемый модуль?

21

9.Что такое Visual Studio?

10.Что такое решение и проект в Visual Studio?

11.Как добавить или изменить файл кода в проекте?

12.Как пользоваться отладкой в Visual Studio, для чего нужна отладка?

13.Как пользоваться справочной системой в Visual Studio? Где ещѐ можно найти информацию о языке?

22

ЛАБОРАТОРНАЯ РАБОТА 2. ТИПЫ ДАННЫХ, ОПЕРАТОРЫ ВВОДА/ВЫВОДА

Цель работы: Ознакомиться с простыми типами языка C#. Научиться использовать операторы консольного вывода для форматированного представления результатов.

2.1. СТРУКТУРА ПРОГРАММЫ

Идентификаторы в C# могут состоять из символов латинского алфавита, цифр и знака подчѐркивания. Первым символом идентификатора не может быть цифра. В некоторых случаях идентификатор может начинаться со знака «@», который игнорируется, но позволяет использовать зарезервированные слова в качестве имѐн.

[1]

Внутри блочных операторов может размещаться один оператор. Для размещения нескольких операторов, они берутся в фигурные скобки, полученная группа воспринимается внешним оператором как единое целое – кодовый блок. После отдельных операторов ставится точка с запятой, она не ставится рядом, снаружи фигурных скобок.

Вложенные блоки принято записывать с отступом относительно внешних. Между операндами может быть произвольное количество пробелов. Для удобства выражения можно писать в несколько строк. Для записи текстовых констант в несколько строк используется оператор конкатенации (сцепления) «+».

Рассмотрите структуру программы на основе пустого шаблона консольного проекта Visual Studio: запустите Visual Studio, создайте проект P02_1 консольной программы C# в D:\Program\VS, как это было описано в предыдущей работе.

using System;

using System.Collections.Generic; using System.Text;

namespace p02_1

{

class Program

{

static void Main(string[] args)

{

}

}

}

Программа начинается с блока директив using, которые разрешают использование типов в пространстве имѐн, поэтому уточнение использования типа в этом пространстве имѐн не требуется. Так как современные проекты и библиотеки

23

имеют большой объѐм, удобно группировать код и типы в пространства имѐн. Разные пространства имѐн могут содержать объекты с совпадающими именами, но при обращении в программе к этим объектам имя объекта пишется с предшествующим именем содержащего его пространства имѐн, связанное точкой. Таким образом, даже при совпадении имѐн объектов, образуются уникальные идентификаторы. При использовании директивы using, предваряющее имя объекта название пространства имѐн можно не писать. Также директиву using можно использовать для создания псевдонимов пространств имѐн или типов (см. справочную систему).

Пространство имѐн создаѐтся ключевым словом namespace. В пространстве имен можно объявить один или несколько из следующих типов: другое пространство имен; class; interface; struct; enum; delegate. В шаблоне, внутри пространства имѐн находится класс Program.

Класс – разновидность абстрактного типа данных в объектно-ориентированном программировании (ООП), характеризуемый способом своего построения. Класс, по сути, является чертежом для пользовательского типа данных. Определив класс, его можно использовать, загрузив в память. Класс, загруженный в память, называется объектом или экземпляром. Класс, согласно концепции ООП, связывает данные и код. Более подробно концепция ООП будет рассмотрена позже. При необходимости можно создать несколько классов. Определение класса начинается с открывающей фигурной скобки и оканчивается закрывающей фигурной скобкой. Класс может содержать объявления следующих членов: конструкторы, деструкторы, константы, поля, методы, свойства, индексаторы, операторы, события, делегаты, классы, интерфейсы, структуры.

Класс Program содержит статический метод (функцию) Main(), являющийся точкой старта программы. Пространство после определения метода, заключѐнное в

фигурные скобки, называется телом метода. Вс

м н н я пр про д н ряд

р бот ы буд т про од ть т л это о м тод .

 

2.2. ТИПЫ ДАННЫХ, КОНСТАНТЫ И ПЕРЕМЕННЫЕ

Для оперирования данными используются переменные.

Переменная – это именованная область памяти, для которой может быть установлено значение. Содержание переменной может изменяться операторами по ходу выполнения программы. Переменные должны быть объявлены до их применения. Для объявления переменной (переменных) сначала указывается тип, а затем имя (имена, разделенные запятой). Завершается определение точкой с запятой, например «int i;».

итералами называются постоянные значения (константы), представленные в удобной для восприятия форме.

Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям и, возможно, способ реализации хранения значений и выполнения операций. Компилятор использует сведения о типе, чтобы убедиться, что все операции, выполняемые в коде, являются типобезопасными.

24

2.2.1.Целые типы

Вследующей таблице представлены размеры и диапазоны целых типов, которые составляют подмножество простых типов.

 

Т п

 

 

Д п он

 

 

Р м р

 

Зн ч н по

 

 

 

 

 

 

 

 

 

 

 

 

умолч н ю

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sbyte;

От –128 до 127

8-разрядное знаковое

0

 

 

 

 

 

 

целое число

 

 

 

 

 

byte

От 0 до 255

8-разрядное целое

0

 

 

 

 

 

 

число без знака

 

 

 

 

 

char

от U+0000 до U+ffff

16-разрядный символ

‘\0’

 

 

 

 

 

 

Юникода

 

 

 

 

 

short

От –32 768 до 32 767

16-разрядное знаковое

0

 

 

 

 

 

 

целое число

 

 

 

 

 

ushort

От 0 до 65 535

16-разрядное целое

0

 

 

 

 

 

 

число без знака

 

 

 

 

 

int

От –2 147 483 648 до 2 147 483 647

32-разрядное знаковое

0

 

 

 

 

 

 

целое число

 

 

 

 

 

uint

От 0 до 4 294 967 295

32-разрядное целое

0

 

 

 

 

 

 

число без знака

 

 

 

 

 

long

От –9,223,372,036,854,775,808 до

64-разрядное целое

0L

 

 

 

9,223,372,036,854,775,807

 

число со знаком

 

 

 

 

 

ulong

От 0 до 18 446 744 073 709 551 615

64-разрядное целое

0

 

 

 

 

 

 

число без знака

 

 

 

 

 

 

 

 

 

 

 

В таблице представлены диапазоны возможных значений типов и значение по умолчанию, которое помещается в переменную типа при еѐ определении. Как видно из таблицы, целые типы делятся на типы со знаком и типы без знака. Они отличаются в интерпретации двоичного представления числа. В типах без знака все биты двоичного представления являются значимыми, у типов со знаком старший (самый левый бит в записи) используется в качестве флага знака. У положительных чисел флаг устанавливается в 0, у отрицательных – в 1. Отрицательные числа практически всегда представляются методом дополнения до двух, в соответствии с которым все двоичные разряды отрицательного числа сначала инвертируются, а затем к этому числу добавляется 1.

Пример двоичного представления целого числа типа со знаком (sbyte), содержащего число 1: 000000012, для операции изменения знака все разряды инвертируются (нули преобразуются в единицы и наоборот: 111111102) и добавляется единица, получаем 111111112. Подобная запись упрощает операции между числами – при двоичном сложении +1 и –1 получается ноль. Младший (правый) разряд двоичного целого числа можно рассматривать как флаг нечѐтности.

25

Тип char имеет размер 16 бит (два байта) и может описывать символы с кодами от 0 до 65535. Эта таблица символов называется юникодом (Unicode) и позволяет одновременно в программе использовать символы различных алфавитов. Символы таблицы ASCII с кодами от 0 до 127 совпадают с таблицей юникода.

2.2.2.Дробные (вещественные) типы

Вследующей таблице представлены приблизительные диапазоны типов с плавающей запятой.

 

Т п

 

 

Пр бл т льный д п он

 

 

Точность

 

Зн ч н по

 

 

 

 

 

 

 

 

 

 

 

 

умолч н ю

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

float

От ±1,5e−45 до ±3,4e38

7 знаков

0,0F

 

 

 

 

double

От ±5,0e−324 до ±1,7e308

15-16 знаков

0,0D

 

 

 

 

decimal

От ±7,9e−28 до ±7,9e28

28-29 знаков

0,0M

 

 

 

 

 

 

 

 

 

 

2.2.3. Логический тип

огический тип, описываемый ключевым словом bool, может хранить значения true (истина) и false (ложь). Значение false используется по умолчанию при определении переменной.

2.2.4. Строковый тип

Строковый тип (string, является ссылочным типом, содержащим ссылку на экземпляр объекта строки) представляет последовательность из нуля или более символов в кодировке Юникод. Так как тип является ссылочным, переменные его типа не инициализируются по умолчанию пустыми строками. Более подробно строковый тип будет рассматриваться позже.

2.2.5. Приведение типов

Как вы заметили из таблицы, разные типы имеют разный размер. При вычислениях рекомендуется в выражении использовать операнды одного типа. Некоторые типы в выражениях неявно преобразуются, так, например, при операциях между переменной типа double и int, значение типа int будет преобразовано в double перед выполнением операции. При использовании численных констант типов с плавающей запятой рекомендуется явно указывать тип даже в случаях, когда дробная часть отсутствует, добавлением нуля после десятичной точки. В коде программы десятичной является точка, а при функционировании приложения десятичный разделитель определяется из настроек системы, в Европе в качестве десятичного разделителя принято использовать запятую. Довольно часто в вычислениях допускают ошибку, используя в выражениях целочисленные константы вместо вещественных. Так, ожидая получить одну треть в выражении 1 / 3, результатом получают ноль, т.к. оба операнда целые, и результат получается целый (деление нацело). Т.е. в единице содержится ноль целых троек. Для получения вещественного результата, любой из операндов должен быть вещественным 1.0 / 3.0. При использовании численных констант можно, а в некоторых случаях необходимо явно указывать тип константы с помощью суффикса (латинской буквы без учѐта регистра,

26

прикреплѐнной к числу сзади). У целочисленных литералов принимается самый мелкий целочисленный тип, начиная с int (uint, long, ulong), а вещественные литералы по умолчанию относятся к типу double. Также тип литерала можно указать явно, записав его вначале в скобках, например: (double)2. Таким образом, следующие записи (и их комбинации) эквивалентны:

1.0 / 3.0

1D / 3D

(double)1 / (double)3

Как видно из примера, более простой записью будет «1D / 3D» – арифметическая операция с явно заданными типами операндов (double) даст результат двойной точности. Для вычислений с дробной частью предпочтительно использовать тип double, для денежных вычислений – decimal.

Список суффиксов численных литералов (в скобках приведены примеры записи):

Long L (–123L)

Uint U (123U)

Ulong UL (123UL)

Float F (1.5F)

Double D (3D)

Decimal M (10.25M).

Целочисленные литералы (константы), тип которых принят по умолчанию (int, uint, long, ulong) можно присваивать переменным типа byte, sbyte, short, ushort

(которые меньше по размеру), если значение литерала может быть представлено целевым типом (входит в диапазон возможных значений). Целочисленные литералы, начинающиеся с «0x» (ноль икс), воспринимаются в шестнадцатеричной системе счисления, 0xABC = 274810.

2.2.6. Использование текстовых типов

Символьные литералы (константы) записываются в одинарных кавычках, например 'Х', в виде кода с префиксом типа (char)88, в шестнадцатеричной форме

'\x58', юникодом '\u0058'.

Обратите внимание, что символьный литерал описывает один символ, тогда как запись литерала "X" воспринимается как строка.

Строковые литералы могут содержать управляющие последовательности, используемые для форматирования вывода на консоль, которые описаны в таблице ниже.

 

Упр

ляющ я

 

 

 

 

 

 

 

Оп с н

 

 

посл до

т льность

 

 

 

 

 

 

 

 

\a

 

 

 

Звуковой сигнал (звонок)

\b

 

 

 

Возврат на одну позицию

\f

 

 

 

Перевод страницы (переход на новую страницу)

\n

 

 

 

Новая строка (перевод строки)

\r

 

 

 

Возврат каретки

\t

 

 

 

Горизонтальная табуляция

\v

 

 

 

Вертикальная табуляция

 

 

 

27

 

\0

Пустой символ

\'

Одинарная кавычка

\"

Двойная кавычка

\\

Обратная косая черта

\xhhhh

ASCII или юникод символ, заданный в шестнадцатеричном

 

виде

Иногда удобно использовать буквальные строковые литералы, для их записи перед открывающими двойными кавычками вводится знак @. Буквальные строковые литералы воспринимаются «как есть» и символ @ игнорируется. Буквальные строковые литералы могут состоять из нескольких строк, содержать символы табуляции, для вывода двойных кавычек их нужно записать дважды. В буквальных литералах управляющие последовательности не действуют.

Пример идентичных строковых литералов s1 и s2:

string s1 = "Счёт матча:\n\"Шайба\"\t\"Зубило\"\n1:1"; string s2 = @"Счёт матча:

""Шайба"" ""Зубило"" 1:1";

В приведенном примере строка s1 записана с применением управляющих последовательностей, а строка s2 записана буквально. Недостатком использования буквальных строк является то, что теряются отступы записи программы при вводе нескольких строк.

Последовательность «\r» удобно использовать в начале строки при циклическом выводе счѐтчиков выполнения операций методом Console.Write(), например, в архиваторах, тогда каждый последующий вывод переводит курсор в начало строки и заменяет текст новым.

Для упрощения записи задания типов возможно использование неявного типа var, в том случае, когда компилятор может явно определить тип присваиваемого значения из правой части. Так, следующие строки записи программы равноценны:

int i = 10; double x = 1.0; string s = "Text"; var i = 10; var x = 1.0; var s = "Text";

Заметьте, что var мож т оп с ть только одну п р м нную, следующая запись неверна:

var i = 10, x = 1.0, s = "Text";

Подробнее описание простых типов смотрите в справочной системе.

Программу рекомендуется писать так, чтобы исключить лишние изменения кода и компиляцию, вводя изменяющиеся значения. С другой стороны, нет необходимости ввода тех значений, которые постоянны в любом варианте вычисления. Наличие вводимых значений переменных позволит программе быть автономной, не зависеть от компилятора, и производить расчѐты для любых вводимых данных допустимого диапазона. Наличие констант позволяет исключить ввод тех данных, которые заведомо постоянны, что уменьшает затраты времени на ввод.

28

2.3. АРИФМЕТИЧЕСКИЕ ОПЕРАТОРЫ, ПРИОРИТЕТ

Оператор назначения (присвоения) «=» сохраняет значение своего правого операнда в месте хранения, свойстве или индексаторе, обозначенном в левом операнде, и в результате возвращает значение. Операнды должны быть одного типа, или правый операнд должен допускать явное преобразование в тип левого операнда. В примерах для присвоения значения переменной указывается имя переменной, затем знак равно и выражение, значение которого будет помещено в переменную.

В представленной ниже таблице представлен список операторов C# [3], сгруппированных в порядке приоритета. Операторы в каждой группе имеют одинаковый приоритет. Некоторые операторы могут быть перегружены (переопределены) пользователем для некоторых типов данных (например, вместо сложения, оператор «+» будет выполнять другое действие). Описание перегрузки операторов выходит за рамки лабораторной работы, но вы можете найти информацию в справке и других источниках.

Так как в ходе изучения вы будете писать простые программы, можно кратко сформулировать правило приоритета выполнения так: Сначала выполняются функции, затем унарные (с одним операндом, например изменение знака) операторы, затем операторы умножения/ деления, затем сложения/вычитания, сдвига, сравнения (причем операторы равно/не равно имеют меньший приоритет), логические. Оператор присвоения (и все его модификации) выполняется последним.

Порядок вычисления по умолчанию можно изменить с помощью круглых скобок.

 

К т ор я оп р тор

 

Оп р торы

 

 

 

 

 

 

Основные

 

x.y – доступ к методу или свойству

 

 

 

f(x) – вызов функции

 

 

 

a[x] – элемент массива

 

 

 

x++ увеличение на 1

 

 

 

x-- – уменьшение на 1

 

 

 

new – создание объекта

 

 

 

typeof

 

 

 

checked

 

 

 

unchecked

 

 

->

 

 

Унарный

+

 

 

-

 

 

!

 

 

~

 

 

 

++x

 

 

 

--x

 

 

 

(T)x – приведение типа

 

 

 

true

 

 

 

false

 

 

 

 

 

29

 

&

 

sizeof

 

 

Мультипликативные

*

 

/

 

% – остаток от деления

 

 

Аддитивные

+

 

-

 

 

Сдвиг

<<

 

>>

 

 

Относительные и тестирующие

<

тип

>

 

<=

 

>=

 

is – совместимость с типом

 

as – преобразование совместимых

 

ссылочных типов

 

 

Равенство

==

 

!=

 

 

Логическое И

&

 

 

Логическое исключающее XOR

^

 

 

Логическое ИЛИ

|

 

 

Условное AND

&&

 

 

Условное OR

||

 

 

Поддержка значения NULL

??

 

 

Условная

?:

 

 

Присвоение и лямбда-выражение

=

 

+=

 

-=

 

*=

 

/=

 

%=

 

&=

 

|=

 

^=

 

<<=

 

>>=

 

=> Лямбда-оператор

 

 

Двойные операторы «++» и «– –» обозначают увеличение или уменьшение значения переменной на единицу. Запись «i++» эквивалентна выражению «i = i + 1». При использовании в выражениях, эти операторы могут быть записаны в префиксной

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]