Добавить материал и получить бесплатное свидетельство о публикации в СМИ
Эл. №ФС77-60625 от 20.01.2015
Инфоурок / Информатика / Конспекты / Учебное пособие по разработке приложений "C#" (10-11 класс)

Учебное пособие по разработке приложений "C#" (10-11 класс)


  • Информатика

Поделитесь материалом с коллегами:

Министерство образования и науки Республики Казахстан

Техническое и профессиональное образование


Центральноазиатский технико-экономический колледж





Жаксыбаева Н.Н.






Основы объектно-ориентированного программирования: язык C#.

Часть 1.



Учебное пособие предназначено для учащихся

технического и профессионального образования

















Алматы, 2010

УДК 4857690

ББК длтаодлорлд

Ж.23

Рецензенты:


Ускенбаева Р.К. заведующая кафедрой «Информационных технологий» Каз НТУ, доктор технических наук, доцент

Куандыков А. А. зав.кафедрой «ПО и ВТ» ТЭАКТ , кандидат технических наук

Ж.23

Жаксыбаева Н.Н. Основы объектно- ориентированного программирования:

язык C# : Учебное пособие. Часть 1 - Алматы, 2010 -275 стр.

ISBN hgo;jo;ifj

Пособие содержит теоретические, практические и справочные материалы по системе визуального объектно-ориентированного программирования C# в среде программирования Microsoft Visual Studio 2008. Рассмотрены особенности создания и использования приложений с помощью компонент. Даются примеры разработки прикладных программ, реализующих текстовые, графические возможности C#. В последнем разделе рассмотрена работа с базами данных, построение отчетов, приложений для распределенных приложений, клиентов и серверов на основе языка SQL. Справочная часть пособия содержит сведения об особенностях объектно-ориентированного программирования, тесты и справочные данные о свойствах и параметрах компонент.

Данное пособие составлено в соответствии с типовой программой курса «Основы объектно-ориентированного программирования» и предназначено для обучения студентов колледжа, специальности 1304000 «Вычислительная техника и программное обеспечение», квалификации 1304043 «Техник-программист». В пособии кратко изложен теоретический материал, подробно разобраны решения типовых задач и примеров, а также задания по лабораторным работам.

УДК 4857690

ББК длтаодлорлд


Учебное пособие рассмотрено и утверждено на кафедре «Информационных технологий» Технико-экономической академии кино и телевидения протоколом № 1 от 16.09.2009года. Так же пособие расмотренно и утвержденно на заседании ЦПК «ПО ВТ и АС» протоколом №1 от 1.09.2009 года Центральноазиатского технико-экономического колледжа.


Ж шпрожшщоршп

ISBN hgo;jo;ifj

© Жаксыбаева Н.Н, 2010

Р Е Ц Е Н З И Я

на учебное пособие “ Основы объектно-

ориентированного программирования: язык C#


Жаксыбаева Н.Н.


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

Учебное пособие по курсу «Основы объектно-ориентированного программирования: язык C#» необходимо для изучения, развития и совершенствования знаний и навыков в области объектно-ориентированного программирования на основе Visual Studio 2008.

Учебное пособие разработано Жаксыбаевой Н.Н. и соответствует типовой программе по этому курсу для студентов колледжей специальности 1304000 «Вычислительная техника и программное обеспечение», квалификация 1304043 «Техник-программист».

Учебное пособие состоит из 2 глав, освещающих основные разделы курса. В первой главе рассмотрены основы языка программирования C#, во второй главе изложены основные сведения об объектно-ориентированом программировании (понятие классов, объектов, создание и использование их в приложениях), свойствах, методах и событиях компонент.

Приведенный список литературы полностью отображает содержание пособия.

Учебное пособие Жаксыбаевой Н.Н. написано простым и ясным языком, понятным для студентов изучающих различные языки программирования, при этом имеющих понятие о структурах и методах построения алгоритмов на более низких языках, таких как Turbo Pascal, Delphi и других. Пособие изложено грамотно, методически правильно, содержит не только теоретический материал, но и снабжен множеством примеров и заданий по 15 вариантам.

Основные термины вводятся с помощью строчных определений, а приведенные графические иллюстрации помогают наглядному их восприятию.

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

Современная методика преподавания предусматривает контроль знаний в виде тестов. Варианты тестовых заданий приведены автором в приложении.

Для приобретения практических навыков в разработке приложений на языке программирования C#, автором разработаны лабораторные работы, практически охватывающие все темы разделов курса.

Считаю, что учебное пособие «Основы объектно-ориентированного программирования: язык C#», разработанное Жаксыбаевой Н.Н. для студентов колледжей является одним из самых полных пособий по курсу «Основы объектно-ориентированного программирования», соответствующих типовой программе и может быть рекомендовано к изданию.


Заведующая кафедрой

«Информационных технологий»

Каз НТУ, доктор технических наук,

доцент Ускенбаева Р.К.


Наибольшая польза в обучении языкам программирования является не только зазубривание теоретического материал, но и практическое применение при разработке приложений. Для того чтобы решить эту проблему необходимо не только рассматривать примеры разработок программ, но и предлагать варианты для самостоятельного обучения, при том в уровневом виде. Поэтому пособие по курсу «Основы объектно-ориентированного программирования: язык C#» предложенное Жаксыбаевой Н.Н. является конкурентно способным на рынке книжной продукции. Не многие пособия могут включать в себя столько информационной и практической части, отражающей все разделы языка программирования.

Учебное пособие, разработанное Жаксыбаевой Н.Н., соответствует типовой программе по специальности «Вычислительная техника и программное обеспечение», квалификации 1304043 «Техник-программист».


Разработчик: Жаксыбаева Н.Н.

Рецензенты: Ускенбаева Р.К.,

Куандыков А.А.

Художник: лвшпрвщжак

ВВЕДЕНИЕ


Начало современной эпохи программирования отмечено созданием языка С. Он был разработан Дэнисом Ритчи (Dennis Ritchie) в 1970-х годах для компьютера PDP-11 компании DEC (Digital Equipment Corporation), в котором использовалась опера­ционная система UNIX. Несмотря на то что некоторые известные языки программи­рования, в особенности Pascal, достигли к тому времени значительного развития и признания, именно язык С определил направление сегодняшнего программирования.

Язык С вырос из кризиса программного обеспечения 1960-х годов и революцион­ного перехода к структурному программированию. До структурного программирования многие программисты испытывали трудности при написании больших программ, по­скольку обозначилась тенденция вырождения программной логики и появления так называемого "спагетти-кода" (spaghetti code) с большим размером процедур и интен­сивным использованием оператора перехода goto. Такие программы были весьма трудны для изучения и модификаций. В структурных языках программирования эта проблема решалась посредством добавления точно определенных управляющих кон­струкций, вызова подпрограмм с локальными переменными и других усовершенство­ваний. Структурные языки позволили писать довольно большие программы в прием­лемые сроки.

Хотя в то время уже существовали другие структурные языки, С был первым язы­ком, в котором удачно сочетались мощь, элегантность, гибкость и выразительность. Его лаконичный и к тому же простой в применении синтаксис в совокупности с фи­лософией, подразумевающей возложение ответственности на программиста (а не на язык), быстро завоевал множество сторонников. С точки зрения сегодняшнего дня, этот язык, возможно, несколько трудноват для понимания, но программистам того времени он показался порывом свежего ветра, которого они так долго ждали. В ре­зультате С стал самым популярным структурным языком программирования 1980-х годов.

Но многоуважаемый язык С имел ограничения. Одним из его недостатков была невозможность справиться с большими программами. Если проект достигал опреде­ленного размера, то дальнейшая его поддержка и развитие были связаны с опреде­ленными трудностями. Местоположение этой "точки насыщения" зависело от кон­кретной программы, программиста и используемых им средств, но вероятность ее достижения очень возрастала, когда количество строк в программе приближалось к 5 ООО.

К концу 1970-х размер проектов стал приближаться к критическому, при превы­шении которого методика структурного программирования и язык С "опускали ру­ки". Поэтому стали появляться новые подходы к программированию, позволяющие решить эту проблему. Один из них получил название объектно-ориентированного про­граммирования (ООП). Используя ООП, программист мог справляться с программами гораздо большего размера, чем прежде. Но вся беда состояла в том, что С, самый по­пулярный на то время язык, не поддерживал ООП. Желание работать с объектно-ориентированной версией языка С в конце концов и привело к созданию С++.

Язык С++ был разработан Бьярни Страуструпом (Bjarne Stroustrup) в компании Bell Laboratories (Муррей Хил, Нью-Джерси), и годом создания считается 1979-й. Первоначально создатель нового языка назвал его "С с классами", но в 1983 году это имя было изменено на С++. С++ полностью включает элементы языка С. Таким об­разом, С можно считать фундаментом, на котором построен С++. Большинство до­полнений, которые Страуструп внес в С, были предназначены для поддержки объект­но-ориентированного программирования. По сути, С++ — это объектно-ориентированная версия языка С. Возводя "здание" С++ на фундаменте С, Страуст­руп обеспечил плавный переход многих программистов на "рельсы" ООП. Вместо не­обходимости изучать совершенно новый язык, С-программисту достаточно было ос­воить лишь новые средства, позволяющие использовать преимущества объектно-ориентированной методики.

На протяжении 1980-х годов С++ интенсивно развивался и к началу 1990-х уже был готов для широкого использования. Рост его популярности носил взрывоподоб-ный характер, и к концу этого десятилетия он стал самым широко используемым языком программирования. В наши дни язык С++ по-прежнему имеет неоспоримое превосходство при разработке высокопроизводительных программ системного уровня.

Важно понимать, что создание С++ не было попыткой изобрести совершенно но­вый язык программирования. Это было своего рода усовершенствование и без того очень успешного языка. Такой подход к разработке языков (взять за основу сущест­вующий язык и поднять его на новую ступень развития) дал начало тенденции, кото­рая продолжает жить и сегодня.

Следующей ступенью на лестнице прогресса языков программирования стал язык Java, который первоначально назывался Oak (в переводе с англ. "дуб"). Работа над его созданием началась в 1991 году в компании Sun Microsystems. Основной движущей силой разработки Java был Джеймс Гослинг (James Gosling). В его рабочую группу входили Патрик Нотон (Patrick Naughton), Крис Уортс (Chris Warth), Эд Фрэнк (Ed Frank) и Майк Шеридан (Mike Sheridan).

Java — это структурный объектно-ориентированный язык программирования, син­таксис и основополагающие принципы которого "родом" из С++. Своими новатор­скими аспектами Java обязан не столько прогрессу в искусстве программирования (хотя и это имело место), сколько изменениям в компьютерной среде. Еще до наступ­ления эры Internet большинство программ писалось, компилировалось и предназнача­лось для выполнения с использованием определенного процессора и под управлением конкретной операционной системы. Несмотря на то что программисты всегда стара­лись делать свои программы так, чтобы их можно было применять неоднократно, возможность легко переносить программу из одной среды в другую не была еще дос­тигнута, к тому же проблема переносимости постоянно отодвигалась, решались же более насущные проблемы. Однако с появлением всемирной сети Internet, в которой оказались связанными различные типы процессоров и операционных систем, старая проблема переносимости заявила о себе уже в полный голос. Для ее решения понадо­бился новый язык программирования, и им стал Java,

Разработчики Java успешно решили многие проблемы, связанные с переносимо­стью в среде Internet, но далеко не все. Одна из них — межъязыковая возможность взаимодействия (cross-language interoperability) программных и аппаратных изделий разных поставщиков, или многоязыковое программирование (mixed-language program­ming). В случае решения этой проблемы программы, написанные на разных языках, могли бы успешно работать одна с другой. Такое взаимодействие необходимо для соз­дания больших систем с распределенным программным обеспечением (ПО), а также для программирования компонентов ПО, поскольку самым ценным является компо­нент, который можно использовать в широком диапазоне компьютерных языков и операционных сред.

Windows. Хотя Java-программы могут выполняться в среде Windows (при условии установки вирту­альной машины Java), Java и Windows не являются прочно связанными средами. А по­скольку Windows — это наиболее широко используемая операционная система в мире, то отсутствие прямой поддержки Windows — серьезный недостаток Java.

Чтобы удовлетворить эти потребности, Microsoft разработала язык С#, С# был соз­дан в конце 1990-х годов и стал частью обшей .NET-стратегии Microsoft. Впервые он увидел свет в качестве а-версии в середине 2000 года. Главным архитектором С# был Андерс Хейлсберг (Anders Hejlsberg) — один из ведущих специалистов в области язы­ков программирования, получивший признание во всем мире. Достаточно сказать, что в 1980-х он был автором весьма успешного продукта Turbo Pascal, изящная реализа­ция которого установила стандарт для всех будущих компиляторов.

С# непосредственно связан с С, С++ и Java. И это не случайно. Эти три языка — самые популярные и самые любимые языки программирования в мире. Более того, почти все профессиональные программисты сегодня знают С и С++, и большинство знает Java. Поскольку С# построен на прочном, понятном фундаменте, то переход от этих "фундаментальных" языков к "надстройке" происходит без особых усилий со стороны программистов. Так как Андерс Хейлсберг не собирался изобретать свое "колесо", он сосредоточился на введении усовершенствований и новшеств.

Генеалогическое дерево С# показано на рис. 1.1. "Дедушкой" С# является язык С. От С язык С# унаследовал синтаксис, многие ключевые слова и операторы. Кроме того, С# построен на улучшенной объектной модели, определенной в С++. Если вы знаете С или С++, то с С# вы сразу станете друзьями.

С# и Java связаны между собой несколько сложнее. Как упоминалось выше, Java также является потомком С и С++. У него тоже общий с ними синтаксис и сходная объектная модель. Подобно Java С# предназначен для создания переносимого кода. Однако С# — не потомок Java. Скорее С# и Java можно считать двоюродными брать­ями, имеющими общих предков, но получившими от родителей разные наборы "генов". Если вы знаете язык Java, то вам будут знакомы многие понятия С#. И на­оборот, если в будущем вам придется изучать Java, то, познакомившись с С#, вам не придется осваивать многие средства Java.

hello_html_553ccaa7.gif

С


hello_html_m60a9e078.gif


С++

hello_html_m630f308b.gifhello_html_43f6b9ba.gif

JAVA

C#





Рисунок 1.1- Генеалогическое дерево


С# содержит множество новых средств, которые описаны в этой книге. Самые важные из них связаны со встроенной поддержкой программных компонентов. Именно наличие встроенных средств написания программных компонентов и позво­лило С# называться компонентно-ориентированным языком. Например, С# включает средства, которые напрямую поддерживают составные части компонентов: свойства, методы и события. Все же самым важным качеством компонентно-ориентированного языка является его способность работать в среде многоязыкового программирования.

Глава 1

ОСНОВЫ ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ С#

1.1 Элементы языка C#


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


C# чувствителен к регистру.


Совокупность ключевых слов (таблица 1.1) составляет словарь языка. Все зарезервированные слова содержат только строчные буквы (символы нижнего регистра) и написаны на английском языке (в том числе с сокращениями).


Ключевые слова запрещено использовать в любом качестве.


Таблица 1.1 – Ключевые слова C#

abstract

as

base

bool

break

byte

case

catch

char

checked

class

const

continue

decimal

default

delegate

do

double

else

enum

event

explicit

extern

false

finally

fixed

float

for

forage

goto

if

implicit

in

int

interface

internal

is

lock

long

namespace

new

null

object

operator

out

override

params

private

protected

public

readonly

ref

return

sbyte

sealed

short

sizeof

stackalloc

static

string

struct

switch

this

throw

true

try

typeof

uint

ulong

unchecked

unsafe

ushort

using

volume

virtual

volatile

void

while




Нелатинский алфавит допускается только в коммента­риях, внутри символьных строк между двойными кавыч­ками и для символьных переменных между одинарными кавычками.

Пробел используется не только в качестве разделителя лексем языка в тексте программы, но и как символьный знак. Компилятор не реагирует на дополнительные, «лишние», пробелы в тексте программы, поэтому их мож­но вводить для придания тексту наглядности.



1.2 Переменные

1.2.1 Типы данных


Каждая переменная имеет имя, тип, размер и значение (таблица 1.2).


Таблица 1.2 – Описание переменных

Имя

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

Пример: Error_Int и Div12_TR

Тип

Определяет какие символы и числа записаны в ячейку памяти под этим именем

Размер

Связан с объявлением типа, определяет объем памяти (максимальную величину или точность задания числа)

Значение

Определяет конкретное содержимое ячейки памяти


Переменная должна быть объявлена в программе до первого ее использования. Изменить тип переменной нельзя.

Переменной может присваивается константа (значение) только определенного типа, что фиксируется в объявлении.

Нельзя производить действия с переменной, не имеющей конкретного значения.


В C# реализован набор базовых (стандартных), встроенных в язык типов переменных, представленный в таблице 1.3.


Таблица 1.3 - Встроенные типы С#

Название

Ключе-вое слово

Тип .NET

Диапазон значений

Описание

Размер, битов

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

bool

Boolean

true, false



Целые типы

sbyte

SByte

от -128 до 127

Со знаком

8

byte

Byte

от 0 до 255

Без знака

8

short

Intl6

от -32 768 до 32 767

Со знаком

16

ushort

UIntl6

от 0 до 65 535

Без знака

16

int

Int32

от -2 147 483 648

до 2 147 483 647

Со знаком

32

uint

UInt32

от 0 до 4 294 967 295

Без знака

32

long

Int64

от -9•1018до 9• 1018


Со знаком

64

ulong

UInt64

От 0 до 18 • 1018

Без знака

64

Символьный тип

char

Char

От U+0000до U+ffff

Unicode- 16

символ

Веществен-ные

float

Single

01

7 цифр

32

double

Double

От - 5.0 • 10-324 до 1.7 • 10308

15-16 цифр

64

Финансовый тип

decimal

Decimal

От 1.0 • 10-28 до 7.9 • 1028

28-29 цифр

128

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

string

String

Длина ограничена объемом доступной из Unicode- памяти

Строка символов


Тип object

object

Object

Можно хранить все что угодно

Всеобщий предок



Например: описание переменных целого типа

int k, Kol_Per=23; sbyte Diam=-34; uint=124585, i=0;

описание переменных вещественного типа

double a=453.0, Treyg = -0.765;

(префиксы f и F необходимы при описании переменных float)

float w=6575.0f, ww=0.56F;

(префиксы m и M необходимы при описании переменных decimal)

decimal cost=1467.98m, col=2564M;

bool b=true, b2=false; (описание переменных логического типа)

Добавление к описанию переменной атрибута const (постоянный) означает, что значение переменной нельзя изменить после ее объявления (с обязательной инициализацией). При попытке в тексте программы изменить значение константы компилятор фиксирует ошибку.

Например: const double f=5.456;

Приоритет выполнения операций: умножение, деление и вычисление остатка, потом вложение и вычитание.

Например: d=а = r * у / s % a-1;


Оператор присваивания

Оператор присваивания обозначается одинарным знаком равенства (=). Его роль в языке С# во многом такая же, как и в других языках программирования. Общая форма записи оператора присваивания име­ет следующий вид:


Тип переменная = выражение;


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

int х, у, z; х = у = z = 100;

// Устанавливаем переменные х, у / и z равными 100.


Составные операторы присваивания

В С# предусмотрены специальные составные операторы присваивания, которые упрощают программирование определенных инструкций присваивания. Лучше всего начать с примера.

Рассмотрим следующую инструкцию: | х = х + 10;

Используя составной оператор присваивания, ее можно переписать в таком виде: | х += 10;

Пара операторов += служит указанием компилятору присвоить переменной х сум­му текущего значения переменной х и числа 10. А вот еще один пример. Инструкция

| х = х - 100; аналогична такой: х -= 100;

Обе эти инструкции присваивают переменной х ее прежнее значение, уменьшен­ное на 100.


Составные версии операторов присваивания существуют для всех бинарных опера­торов (т.е. для всех операторов, которые работают с двумя операндами). Общая форма их записи такова:


переменная ор = выражение;


Здесь элемент ор означает конкретный арифметический или логический оператор, объединяемый с оператором присваивания.

Возможны следующие варианты объединения операторов.

+= -= *= /=

%= &= |=

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

Составные операторы присваивания обладают двумя заметными достоинствами. Во-первых, они компактнее своих "длинных" эквивалентов. Во-вторых, их наличие приводит к созданию более эффективного кода (поскольку операнд в этом случае вы­числяется только один раз). Поэтому в профессионально написанных сопрограммах вы часто встретите именно составные операторы присваивания.


Операторы ввода и вывода

Существуют 2 операторов ввода и вывода в консольном приложении на языке C#. Они относятся к классу Console.

Операторы ввода:

Read – считывание символа или числа

ReadLine – считывание строки

Операторы вывода:

Write – вывод строки без переноса курсора на следующую строку

WriteLine - вывод строки c переносом курсора на следующую строку

Для ввода числа необходимо знать функции преобразования строки в число (класс Convert) в таблице 1.4.


Таблица 1.4 – Функции преобразования

Название

Назначение


ToDouble

Преобразование строки в вещественное число типа double


ToInt16

Преобразование строки в целое число


ToInt32

Преобразование строки в целое число


ToFloat

Преобразование строки в вещественное число типа float


Примеры:

int k = Convert.ToInt32 (Console.Read()) ;

string s= Console.ReadLine();

Console.Write(“Введите число”);

Console.WriteLine(k +”тенге”);

double m = Convert.ToDouble (Console.ReadLine()) ;



1.2.2 Арифметические операции


С# использует операторы, то есть знаки арифметиче­ских и логических операций, а также дру­гие знаки (см. табл. 1.5).


Таблица 1.5 - Операции

Операция

Знак

Операция

Знак

Арифметическое сложение

+

Проверка на равенство:


Унарный плюс

+

равно

= =

Арифметическое вычитание

-

не равно

!=

Унарный минус

-

Проверка отношения:


Умножение

*

больше меньше

>

Деление

/

больше или равно

>=

Вычисление остатка

%

меньше или равно

<=

Присваивание

=

Отрицание (не) not

!

Декремент

- -k (то же что и k=k- 1)

- -

Тернарная

? :

Инкремент

k++ (то же что и k=k+1)

++

Проверка условия

И (AND)

ИЛИ (OR)


&&

||


Операция, определяемая оператором % (вычисление остатка, целочисленное деление, деление по модулю), вычисляет целый остаток от деления двух чисел.

Например:

13/3 = 4 (дробная часть отбрасывается), но 13%3 = 1

13.0 / 3.0 = 4.333333, но 13.0 % 3.0 = 1


Операторы инкремента и декремента

Операторы инкремента (++) и декремента (- -) увеличивают и уменьшают значение операнда на единицу, соответственно. Как будет показано ниже, эти операторы обла­дают специальными свойствами, которые делают их весьма интересными для рас­смотрения.

Итак, оператор инкремента выполняет сложение операнда с числом 1, а оператор декремента вычитает 1 из своего операнда. Это значит, что инструкция

| х =х + 1; аналогична такой инструкции: | x++;

Точно так же инструкция

| х= х - 1;аналогична такой инструкции: |х- -;

Операторы инкремента и декремента могут стоять как перед своим операндом, так и после него.

Например, инструкцию | х = х + 1;

можно переписать в виде префиксной формы

++х; // Префиксная форма оператора инкремента, или в виде постфиксной формы:

х++; // Постфиксная форма оператора инкремента.

В предыдущем примере не имело значения, в какой форме был применен опера­тор инкремента: префиксной или постфиксной. Но если оператор инкремента или декремента используется как часть большего выражения, то форма его применения имеет важное значение. Если такой оператор применен в префиксной форме, то С# сначала выполнит эту операцию, чтобы операнд получил новое значение, которое за­тем будет использовано остальной частью выражения. Если же оператор применен в постфиксной форме, то С# использует в выражении его старое значение, а затем вы­полнит операцию, в результате которой операнд обретет новое значение.

Рассмотрим следующий фрагмент кода: х = 10; у - ++х;

В этом случае переменная у будет установлена равной 11. Но если в этом коде префиксную форму записи заменить постфиксной, переменная у будет установлена равной 10, обоих случаях переменная х получит значение 11. Разница состоит лишь в том, в какой момент она станет равной 11 (до присвоения ее значения переменной у или после).



1.2.3 Логические операции


Операции отношения (сравнения) и логические предпо­лагают проверку некоторого условия с последующим дей­ствием, выполнение которого зависит от результата про­верки.

B C# на равенство (==) и неравенство (!=) можно прове­рять все переменные, но операторы сравнения можно при­менять только к переменным числовых типов и типа char.

Решение может приниматься в результате анализа не обязательно одного условия. Условия связываются знака­ми логического сложения && (И) или логического умно­жения | | (ИЛИ).

Например: если i равно j И k не равно 5

if (i==j && k!=5)

если i меньше j ИЛИ k больше или равно 5

if (i<j || k>=5)



1.2.4 Математические операции


В таблице 1.6 представлены функции для расчета математических операций.

Таблица 1.6 – Математические функции

Имя функции, константы

Назначение

Вызов

Abs

Возвращение абсолютной величины числа x, может принимать как вещественное, так и целое значение

double х=-5,у;

y=Math.Abs(x); // y=5


int х1,у1;

у1= Math.Abs(x1);

Acos

Возвращение арккосинуса числа х

(в диапазоне от-1 до 1)

double х,у;

у= Math.Acos(x);

Asin

Возвращение арксинуса

числа х

(в диапазоне от -1 до 1)

double х,у;

у= Math.Asin(x);

Atan

Возвращение арктангенса числа х

double х,у;

у= Math.Atan(x);

Atan2

Возвращение частного у/х

double x,y,z;

z= Math.Atan(y,x);

Celling

Возвращение ближайшего целого (у), большего, чем значение аргумента (х) Например: х=1.04; у=2;

х= -1.04;у=-1;

double x,y;

y= Math.Ceiling(x);

Cos

Возвращение косинуса числа х

double x,y; y= Math.Cos(x);

Е — константа

Основание натурального логарифма е=2.71828128459

double e= Math.E;

Exp

Возвращение основания натур, логарифма Е, возведенное в степень х

double x,y; y=Exp(x);

Floor

Возвращение ближайшего целого (у), меньшего, чем значение аргумента (х). Например: х=1.04;у=1;

х= -1.04; у= -2;

double x,y;

y= Math.Floor(x);

Log



Возвращение натурального логарифма х

double x,y; y= Math.Log(x);

Возвращение логарифма х по основанию а

double x,y,a; y= Math.Log(x,a);

Log 10

Возвращение десятичного логарифма х

double x,y; y=Math.Log10(x);

Max

Возвращает большего из значений х и у

double х,у;

у= Math.Max(x,y);



char x,y;

ys(char) Math.Max(x1,y1);

Min

Возвращение меньшего из значений х и у

double х,у;

у= Math.Min(x,y);



char х,у;

yss(char) Math.Min(x,y);

PI — константа

Число pi =3.1415926535898

double pi= Math.PI;

Pow

Возвращение значения а в степени ехр

double a,exp,y;

y= Math.Pow(a,exp);

Round

Возвращение значения а, округленного до ближайшего целого (арифметич. округление)

double a,b;

b= Math.Round(a);

Sign

Определение знака числа. Возвращает: - 1, если значение аргумента отрицательное, 1, если значение аргумента положительное, 0, если значение аргумента равно нолю

double x,y;

y= Math.Sign(x);

Sin

Возвращение синуса х

double x,y;

y= Math.Sin(x);

Sqrt

Возвращение квадратного корня х

double x.y;

y= Math.Sqrt(x);

Tan

Возвращение значения тангенса числа х

double x,y;

y= Math.Tan(x);


Пример: Найти значение у=cos(x).


class Program

{

static void Main(string[] args)

{

string s = Console.ReadLine(); // ввод строки

// преобразование строки s в вещественное число x

double x = Convert.ToDouble(s);

double y; // описание переменной у

y = Math.Cos(x); // расчет значения у

Console.Write("Значение у=" + y); // вывод результата

Console.ReadKey(); // задержка экрана

}

}

Задания:

Вариант 1. Даны два ненулевых числа. Найти их сумму, разность, произведение и частное. 


Вариант 2. Даны два числа. Найти среднее арифметическое их квадратов и среднее арифметическое их модулей. 


Вариант 3. Скорость лодки в стоячей воде V км/ч, скорость течения реки U км/ч (U < V). Время движения лодки по озеру T1 ч, а по реке (против течения) — T2 ч. Определить путь S, пройденный лодкой. 


Вариант 4. Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить расстояние между ними через T часов, если автомобили удаляются друг от друга. 


Вариант 5. Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить расстояние между ними через T часов, если автомобили первоначально движутся навстречу друг другу. 


Вариант 6. Найти периметр и площадь прямоугольного треугольника, если даны длины его катетов a и b. 


Вариант 7. Дана длина ребра куба. Найти площадь грани, площадь полной поверхности и объем этого куба. 


Вариант 8. Найти длину окружности и площадь круга заданного радиуса R. В качестве значения Pi использовать 3.14.


 Вариант 9. Найти площадь кольца, внутренний радиус которого равен R1, а внешний радиус равен R2 (R1 < R2). В качестве значения Pi использовать 3.14. 


Вариант 10. Дана сторона равностороннего треугольника. Найти площадь этого треугольника и радиусы вписанной и описанной окружностей. 


Вариант 11. Дана длина окружности. Найти площадь круга, ограниченного этой окружностью. В качестве значения Pi использовать 3.14. 


Вариант 12. Дана площадь круга. Найти длину окружности, ограничивающей этот круг. В качестве значения Pi использовать 3.14. 


Вариант 13. Найти периметр и площадь равнобедренной трапеции с основаниями a и b (a > b) и углом alpha при большем основании (угол дан в радианах). 


Вариант 14. Найти периметр и площадь прямоугольной трапеции с основаниями a и b (a > b) и острым углом alpha (угол дан в радианах).


 Вариант 15. Найти расстояние между двумя точками с заданными координатами (x1, y1) и (x2, y2).


Вариант 16. Даны координаты трех вершин треугольника (x1, y1), (x2, y2), (x3, y3). Найти его периметр и площадь. 


Вариант 17. Найти корни квадратного уравнения A·x2 + B·x + C = 0, заданного своими коэффициентами A, B, C (коэффициент A не равен 0), если известно, что дискриминант уравнения неотрицателен.


Вариант 18. Найти решение системы уравнений вида A1·x + B1·y = C1, A2·x + B2·y = C2, заданной своими коэффициентами A1, B1, C1, A2, B2, C2, если известно, что данная система имеет единственное решение.


 Вариант 19. Дано целое четырехзначное число. Используя операции div и mod, найти сумму его цифр.


Вариант 20. Дано целое четырехзначное число. Используя операции div и mod, найти произведение его цифр.



1.3 Управляющие структуры языка C#


1.3.1 Структура выбора if/else


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

Структура следования вписана в C#. Пока не указано иное, компьютер выполняет операции одну за другой в той последовательности, в какой они записаны.

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

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

C# содержит три типа структур выбора и три типа структур повторения.


Условный оператор

Инструкция if. Полный формат ее записи такой:

if (условие) инструкция;

else инструкция;

Здесь под элементом инструкция понимается одна инструкция языка С#. Часть else необязательна. Вместо элемента инструкция может быть использован блок ин­струкций. В этом случае формат записи if-инструкции принимает такой вид:


if (условие)

{

последовательность инструкций

}

else

{

последовательность инструкций

}


Если элемент условие, который представляет собой условное выражение, при вы­числении даст значение ИСТИНА, будет выполнена if-инструкция; в противном случае — else-инструкция (если таковая существует). Обе инструкции никогда не выполняются. Условное выражение, управляющее выполнением if-инструкции, должно иметь тип bool.


Вложенные if-инструкции

Вложенные if-инструкции образуются в том случае, если в качестве элемента ин­струкция (см. полный формат записи) используется другая if-инструкция. Вложен­ные if-инструкции очень популярны в программировании. Главное здесь — помнить, что else-инструкция всегда относится к ближайшей if-инструкции, которая нахо­дится внутри того же программного блока, но еще не связана ни с какой другой else-инструкцией. Например:


if (i == 10)

{

if (j < 20) a = b; if (k > 100) с =d;

else a = с; // Эта else-инструкция относится к if(k > 100)

}

else a =d; // Эта else-инструкция относится к if(i == 10)


Как утверждается в комментариях, последняя else-инструкция не связана с инст­рукцией if (j < 20), поскольку они не находятся в одном блоке (несмотря на то что эта if-инструкция — ближайшая, которая не имеет при себе "else-пары"). Внутрен­няя else-инструкция связана с инструкцией if (к > 100), поскольку она — ближай­шая и находится внутри того же блока.


Конструкция if-else-if

Очень распространенной в программировании конструкцией, в основе которой лежит вложенная if-инструкция, является "лестница" if-else-if. Ее можно пред­ставить в следующем виде:


if(условие)

инструкция; else if{условие}

инструкция; else if{условие)

инструкция;


else

инструкция;


Здесь под элементом условие понимается условное выражение. Условные выра­жения вычисляются сверху вниз. Как только в какой-нибудь ветви обнаружится ис­тинный результат, будет выполнена инструкция, связанная с этой ветвью, а вся ос­тальная "лестница" опускается. Если окажется, что ни одно из условий не является истинным, будет выполнена последняя else-инструкция (можно считать, что она вы­полняет роль условия, которое действует по умолчанию). Если последняя else-инструкция не задана, а все остальные оказались ложными, то вообще никакое дейст­вие не будет выполнено.


Пример: Дан прямоугольный треугольник со сторонами а и b. Найти гипотенузу. Проверить треугольник равносторонний или равнобедренный.

Разработка приложения:

  1. Запустите: Пуск -> Программы -> Microsoft Visual Studio 2008 (рисунок 1.1).


hello_html_5749b44c.png


Рисунок 1.1 – Среда Microsoft Visual Studio 2008


  1. Выполнить команду: Файл-> Создать->Проект (рисунок 1.2), в диалоговом окне выбрать Visual C#, в установленных шаблонах –> «Консольное приложение» и нажать кпонку «Ok».

hello_html_2382d9cb.png


Рисунок 1.2 – Диалоговое окно


  1. На экране появится среда для консольной разработки приложений (рисунок 1.3).

hello_html_27bdebe6.png


Рисунок 1.3 – Консольное приложение


  1. В среде программирования необходимо ввести код программы в разделе: static void Main (string[] args):


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

Console.Write("Введите значение 1 стороны -");

string s = Console.ReadLine();

double a = Convert.ToDouble(s); // ввод числа а

Console.Write("Введите значение 2 стороны -");

double b = Convert.ToDouble(Console.ReadLine()); // ввод числа b

double c;

c = Math.Sqrt(Math.Pow(a, 2) + Math.Pow(b, 2)); // расчет стороны с

if ((a == b) && (b == c))

Console.Write("Равносторонний треугольник");

if ((a == b) || (b == c) || (c == a))

Console.Write("Равнобедренный треугольник");

Console.ReadKey();

}

}


  1. Для запуска приложения на выполнение необходимо выполнить команду: Отладка - > Начать отладку или горячую клавишу F5.


hello_html_m40989025.png


Задания:


Вариант 1.

Даны три целых числа. Возвести в квадрат отрицательные числа и в третью степень — положительные (число 0 не изменять).


Вариант 2.

Из трех данных чисел выбрать наименьшее.


Вариант 3.

Из трех данных чисел выбрать наибольшее. 


Вариант 4.

Из трех данных чисел выбрать наименьшее и наибольшее.


Вариант 5.

Перераспределить значения переменных X и Y так, чтобы в X оказалось меньшее из этих значений, а в Y — большее. 


Вариант 6.

Значения переменных X, Y, Z поменять местами так, чтобы они оказались упорядоченными по возрастанию. 


Вариант 7.

Значения переменных X, Y, Z поменять местами так, чтобы они оказались упорядоченными по убыванию. 


Вариант 8.

Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной сумму этих значений, а если равны, то присвоить переменным нулевые значения. 


Вариант 9.

Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной максимальное из этих значений, а если равны, то присвоить переменным нулевые значения. 


Вариант 10.

Даны три переменные: X, Y, Z. Если их значения упорядочены по убыванию, то удвоить их; в противном случае заменить значение каждой переменной на противоположное. 


Вариант 11.

Даны три переменные: X, Y, Z. Если их значения упорядочены по возрастанию или убыванию, то удвоить их; в противном случае заменить значение каждой переменной на противоположное. 


Вариант 12.

Даны целочисленные координаты точки на плоскости. Если точка не лежит на координатных осях, то вывести 0. Если точка совпадает с началом координат, то вывести 1. Если точка не совпадает с началом координат, но лежит на оси OX или OY, то вывести соответственно 2 или 3. 


Вариант 13.

Даны вещественные координаты точки, не лежащей на координатных осях OX и OY. Вывести номер координатной четверти, в которой находится данная точка. 


Вариант 14.

На числовой оси расположены три точки: A, B, C. Определить, какая из двух последних точек (B или C) расположена ближе к A, и вывести эту точку и ее расстояние от точки A. 


Вариант 15.

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


Вариант 16.

Дан номер некоторого года (положительное целое число). Вывести соответствующий ему номер столетия, учитывая, что, к примеру, началом 20 столетия был 1901 год. 


Вариант 17.

Дан номер некоторого года (положительное целое число). Вывести число дней в этом году, учитывая, что обычный год насчитывает 365 дней, а високосный — 366 дней. Високосным считается год, делящийся на 4, за исключением тех годов, которые делятся на 100 и не делятся на 400 (например, годы 300, 1300 и 1900 не являются високосными, а 1200 и 2000 — являются). 


Вариант 18.

Для данного x вычислить значение следующей функции f,  вещественные значения: –1 если x <= , 0, f(x x· если 0 < x )= x, < 2, 4, если x >= 2. 


Вариант 19.

Для данного x вычислить значение следующей функции f, принимающей значения целого типа: 0, если x < 0, f(x 1, если x принадлежит [0,1), )= [2,3), ... , –1 если x принадлежит [1,2), , [3,4), ... . 


Вариант 20.

Дано целое число, лежащее в диапазоне от –999 до 999. Вывести строку — словесное описание данного числа вида "отрицательное двузначное число", "нулевое число", "положительное однозначное число" и т.д. 


1.3.2 Тернарная структура выбора


C# имеет тернарную условную операцию (? :), близкую по структуре, к if/else. Например,

int i=11;

Console.WriteLine (i>9 ? "многозначное число" : "однозначное число");

Первый операнд i>9 является условием, второй «мно­гозначное число» содержит значение условного выраже­ния, если условие истинно, третий «однозначное чис­ло» — значение условного выражения, если условие лож­но.

Недостатком тернарной операции по сравнению с if/else является то, что второй и третий операнды могут быть представлены только одним выражением, но не не­сколькими в фигурных скобках.

B операцию может входить один операнд (унарная опе­рация, например, i++;) или два операнда (бинарная операция, например, a=b+c;). Условная операция (? :) содержит три операнда и является единственной тер­нарной операцией в C#.

Пример: Проверить число положительное или отрицательное.

Console.WriteLine (m>0 ? “положительное число” : “отрицательное число”);


1.3.3 Оператор выбора



Переключатель switch

Сложную структуру вложенных условных операторов можно выполнить с помощью структуры мно­жественного выбора switch (переключатель). Рассмотрим общую форму такой структуры.


switch (переменная) //заголовок

{ //тело переключателя

case значение 1 :

{ . . . } break;

case значение 2 :

{ . . . } break;

case значение N :

{ . . . } break;

default: { . . . } break;

} //конец переключателя


Переключатель начинается с заголовка, определяюще­го имя метки. Тело переключателя заключено в фигурные скоб­ки. Текст тела переключателя разделен метками case. Двоеточие в данном случае — признак метки.

Действие структуры switch начинается с операции, стоящей за меткой, значение которой совпадает с ранее определенным, и продолжается до ближайшего операто­ра break (прерывать), который осуществляет выход из тела переключателя.

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

Если заданная перед переключателем метка не совпада­ет ни с одной из предусмотренных в нем, выполняется операция после метки default (умолчание).


Пример: По введенному номеру дня недели вывести - выходной или рабочий день (суббота и воскресенье – выходные).

Разработка приложения:

  1. Запустите среду разработки Microsoft Visual Studio 2008 в консольном режиме для C#.

  2. Внесите следующий код программы в раздел static void Main(string[] args):


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class Program

static void Main(string[] args)

{

Console.Write("Введите номер дня недели: ");

string s = Console.ReadLine();

int a = Convert.ToInt16(s);

int x=0;

if ((a>=1)&&(a<=5)) x=1;

if ((a>=6)&&(a<=7)) x=2;

switch(x)

{

case 1: Console.Write("Рабочий день"); break;

case 2: Console.Write("Выходной день"); break;

default:

Console.Write("Не верный ввод данных"); break;

}

}

}

  1. После запуска на выполнение (F5) на экране появится окно приложения:


hello_html_67ab4389.png


Задания:


Вариант 1.

Дан номер месяца (1 — январь, 2 — февраль, ...). Вывести название соответствующего времени года ("зима", "весна" и т.д.). 


Вариант 2.

Дан номер месяца (1 — январь, 2 — февраль, ...). Вывести число дней в этом месяце для невисокосного года. 


Вариант 3.

Дано целое число в диапазоне 0 – 9. Вывести строку — название соответствующей цифры на русском языке (0 — "ноль", 1 — "один", 2 — "два", ...). 


Вариант 4.

Дано целое число в диапазоне 1 – 5. Вывести строку — словесное описание соответствующей оценки (1 — "плохо", 2 — "неудовлетворительно", 3 — "удовлетворительно", 4 — "хорошо", 5 — "отлично"). 


Вариант 5.

Арифметические действия над числами пронумерованы следующим образом: 1 — сложение, 2 — вычитание, 3 — умножение, 4 — деление. Дан номер действия и два числа A и B (В не равно нулю). Выполнить над числами указанное действие и вывести результат. 


Вариант 6.

Единицы длины пронумерованы следующим образом: 1 — дециметр, 2 — километр, 3 — метр, 4 — миллиметр, 5 — сантиметр. Дан номер единицы длины и длина отрезка L в этих единицах (вещественное число). Вывести длину данного отрезка в метрах. 


Вариант 7.

Единицы массы пронумерованы следующим образом: 1 — килограмм, 2 — миллиграмм, 3 — грамм, 4 — тонна, 5 — центнер. Дан номер единицы массы и масса тела M в этих единицах (вещественное число). Вывести массу данного тела в килограммах. 


Вариант 8.

Робот может перемещаться в четырех направлениях ("С" — север, "З" — запад, "Ю" — юг, "В" — восток) и принимать три цифровые команды: 0 — продолжать движение, 1 — поворот налево, –1 — поворот направо. Дан символ C — исходное направление робота и число N — посланная ему команда. Вывести направление робота после выполнения полученной команды. 


Вариант 9.

Локатор ориентирован на одну из сторон света ("С" — север, "З" — запад, "Ю" — юг, "В" — восток) и может принимать три цифровые команды: 1 — поворот налево, –1 — поворот направо, 2 — поворот на 180 градусов. Дан символ C — исходная ориентация локатора и числа N1 и N2 — две посланные ему команды. Вывести ориентацию локатора после выполнения данных команд. 


Вариант 10.

Элементы окружности пронумерованы следующим образом: 1 — радиус (R), 2 — диаметр (D), 3 — длина (L), 4 — площадь круга (S). Дан номер одного из этих элементов и его значение. Вывести значения остальных элементов данной окружности (в том же порядке). В качестве значения Pi использовать 3.14. 


Вариант 11.

Элементы равнобедренного прямоугольного треугольника пронумерованы следующим образом: 1 — катет (a), 2 — гипотенуза (c), 3 — высота, опущенная на гипотенузу (h), 4 — площадь (S). Дан номер одного из этих элементов и его значение. Вывести значения остальных элементов данного треугольника (в том же порядке). 


Вариант 12.

Элементы равностороннего треугольника пронумерованы следующим образом: 1 — сторона (a), 2 — радиус вписанной njpsfmnqrh (R1), 3 — радиус описанной окружности (R2), 4 — площадь (S). Дан номер одного из этих элементов и его значение. Вывести значения остальных элементов данного треугольника (в том же порядке). 


Вариант 13.

Даны два целых числа: D (день) и M (месяц), определяющие правильную дату невисокосного года. Вывести значения D и M для даты, предшествующей указанной. 


Вариант 14.

Даны два целых числа: D (день) и M (месяц), определяющие правильную дату невисокосного года. Вывести значения D и M для даты, следующей за указанной. 


Вариант 15.

Дано целое число в диапазоне 20 – 69, определяющее возраст (в годах). Вывести строку — словесное описание указанного возраста, обеспечив правильное согласование числа со словом "год", например: 20 — "двадцать лет", 32 — "тридцать два года", 41 — "сорок один год".


Вариант 16.

Дано целое число в диапазоне 100 – 999. Вывести строку — словесное описание данного числа, например: 256 — "двести пятьдесят шесть", 814 — "восемьсот четырнадцать".


Вариант 17.

В восточном календаре принят 60-летний цикл, состоящий из 12- летних подциклов, обозначаемых названиями цвета: зеленый, красный, желтый, белый и черный. В каждом подцикле годы носят названия животных: крысы, коровы, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, курицы, собаки и свиньи. По номеру года вывести его название, если 1984 год был началом цикла — годом зеленой крысы.



1.3.4 Операторы повторений


Существует 3 оператора повторений: цикл с параметром, с предусловием и постусловием.


Оператор с параметром.

Оператор с параметром for представляет собой удобную конструкцию, позволяющую выполнить некоторое действие заданное количество раз. Он имеет следующий синтаксис:


for(<Инициализация счетчиков>; <Условие >;<Изменение счетчиков>)

<оператор >


Здесь for – зарезервированное слово; <Инициализация счетчиков> - присваивание счетчикам цикла начальных значений; <Условие > - условное выражение, определяющее продолжительность выполнения цикла; <Изменение счетчиков> - выражения, определяющие изменение счетчиков цикла после каждой итерации; <оператор > - тело цикла.

Цикл имеет одну или несколько целочисленных переменных, которые называются счетчиками цикла. Перед началом цикла им присваиваются некоторые начальные значения, затем проверяется ис­тинность условия <Условие>: если условие истинно, выполняется тело цикла, после чего счетчики изменяют свои значения. Если усло­вие ложно, оператор завершает свою работу.

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

Например,

int i; double a=5;

for (i=l;i<5;i++)

{ Console.WriteLine(a);a+=2.0;}


Выполнение происходит следующим образом: управ­ляющей переменной i присваивается начальное значение (1), производится проверка условия (i<5) и, если оно ис­тинно, выполняется тело цикла (на экран выводится значе­ние а, равное 5, переменная а увеличивается на 2.0); значе­ние управляющей переменной i изменяется (увеличивается на 1), производится проверка условия (i<5) и, если оно как в нашем случае истинно (i=2), выполняется тело цикла (на экран выводится число 7); значение i снова изменяется (увеличивается на 1) и т.д. Процесс продолжается до тех пор, пока выполняется условие (i<5). Когда условие стано­вится ложным (при i=5) процесс заканчивается. Последнее выведенное число в нашем случае равно 11 (для i=4).

Если заданное условие всегда ложно, например,

(i=l; i

тело цикла не исполняется ни разу. Если заданное усло­вие всегда истинно, например,

(i=l ;i>0; 1++)

тело цикла будет повторяться бесконечно (зацикливание).


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


Пример 1: Найти сумму N целых чисел.


Разработка приложения:

  1. Запустите среду разработки Microsoft Visual Studio 2008 в консольном режиме для C#.

  2. Внесите следующий код программы в раздел static void Main(string[] args):


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

Console.Write("Введите последную цифру: ");

int N = Convert.ToInt16(Console.ReadLine());

double Sum = 0.0;

for (int i = 1; i <= N; ++i) // цикл выполнится пока i меньше N

{

Sum += i;

}

Console.WriteLine("Сумма " + N + " чисел = " + Sum);

Console.ReadKey();

}

}

}


  1. На экране после запуска на выполнение (F5) появится следующая информация:


hello_html_m446dca6d.png


Операторы с предусловием и постусловием.

Оператор while используется, когда количество итераций за­ранее неизвестно. Существуют две формы оператора: префиксная и постфиксная. В префиксной форме его синтаксис таков:


while (<Условие>) <Тело_цикла>


Здесь — зарезервированное слово; <Условие> — вы­ражение типа bool; <Тело_цикла> — произвольный оператор или блок операторов.

Постфиксная форма:


do

<Тело_цикла>

while (<Условие>)

Таким образом, в префиксной форме сначала проверяется истин­ность условия и только после этого выполняется тело цикла, а в пост­фиксной сначала выполняется тело цикла и лишь потом проверяется условие: если оно истинно, тело цикла выполняется заново. В пре­фиксной форме тело цикла может не выполниться ни разу, в то время как в постфиксной оно будет выполнено хотя бы один раз.

Очевидно, что в операторе while проверяемое условие должно изменяться в теле цикла, в противном случае цикл никогда не завер­шится естественным образом, и программа «зациклится».


Пример 1: Найти сумму N целых четных чисел (оператор цикла while).


Разработка приложения:

  1. Запустите среду разработки Microsoft Visual Studio 2008 в консольном режиме для C#.

  2. Внесите следующий код программы в раздел static void Main(string[] args):


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

Console.Write("Введите последную цифру: ");

string s = Console.ReadLine();

int N = Convert.ToInt16(s);

double Sum = 0.0;int i = 2;


while (i<= N)

{

Sum += i;

i += 2;

}


Console.WriteLine("Сумма " + N + " четных чисел = " + Sum);

Console.ReadKey();

}

}

}


  1. На экране после запуска на выполнение (F5) появится следующая информация:


hello_html_49b562e9.png


Пример 2: Ввести N чисел и найти количество положительных и сумму отрицательных (оператор цикла do ..while).

Разработка приложения:

  1. Запустите среду разработки Microsoft Visual Studio 2008 в консольном режиме для C#.

  2. Внесите следующий код программы в раздел static void Main(string[] args):


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

Console.Write("Введите количество цифр: ");

string s = Console.ReadLine();

int N = Convert.ToInt16(s);

double Sum = 0.0;

int i = 1,k=0,a;

do

{

Console.Write("Введите" + i + "число - ");

a = Convert.ToInt16(Console.ReadLine());

if (a > 0)

k++;

if (a < 0)

Sum += a;

++i;

}

while (i <= N);

Console.WriteLine("Сумма отрицательных чисел = " + Sum);

Console.WriteLine("Количество положительных чисел = " + k);

Console.ReadKey();

}

}


  1. На экране после запуска на выполнение (F5) появится следующая информация:


hello_html_m39336d24.png


Цикл foreach.

Цикл foreach предназначен для обработки массивов, коллекций и других контейнеров, рассчитанных на хранение множества данных. Контейнер должен исполнять интерфейсы System.Collections. IEnumerable и System.Collections . IEnumerator .

Оператор имеет следующий синтаксис:


foreach (<Элемент> in <Контейнер>) <Тело_цикла>;


Здесь foreach и in — зарезервированные слова; <Элемент> — очередной элемент данных; <Контейнер> — хранилище данных; <Тело_цикла> — произвольный оператор или блок операторов. Разумеется, тип элемента должен совпадать с типом данных в кон­тейнере. Оператор осуществляет последовательный перебор данных в контейнере и на каждой итерации возвращает очередной элемент в переменной <Элемент>. Замечу, что эта переменная в теле цикла доступна только для чтения, то есть с помощью цикла нельзя напол­нить хранилище данных.

Использование инструкции break для выхода из цикла.

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

Использование инструкции continue.

Помимо средства "досрочного" выхода из цикла, существует средство "досрочного" выхода из текущей его итерации. Этим средством является инструкция continue. Она принудительно выполняет переход к следующей итерации, опуская выполнение оставшегося кода в текущей. Инструкцию continue можно расценивать как дополнение к более "радикальной" инструкции break.


Задания:

Вариант 1.

Даны два целых числа A и B (A < B). Вывести все целые числа, расположенные между данными числами (включая сами эти числа), в порядке их возрастания, а также количество N этих чисел. 


Вариант 2.

Даны два целых числа A и B (A < B). Вывести все целые числа, расположенные между данными числами (не включая сами эти числа), в порядке их убывания, а также количество N этих чисел. 


Вариант 3.

Дано вещественное число A и целое число N (> 0). Вывести A в степени N: AN = A·A·...·A (числа A перемножаются N раз). 


Вариант 4.

Дано вещественное число A и целое число N (> 0). Вывести все целые степени числа A от 1 до N. 


Вариант 5.

Дано вещественное число A и целое число N (> 0). Вывести 1 + A + A2 + A3 + ... + AN.


Вариант 6.

Дано вещественное число A и целое число N (> 0). Вывести 1 – A + A2 – A3 + ... + (–1)NAN. 


Вариант 7.

Дано целое число N (> 1). Вывести наименьшее целое K, при котором выполняется неравенство 3K > N, и само значение 3K. 


Вариант 8.

Дано целое число N (> 1). Вывести наибольшее целое K, при котором выполняется неравенство 3K < N, и само значение 3K. 


Вариант 9.

Дано вещественное число A (> 1). Вывести наименьшее из целых чисел N, для которых сумма 1 + 1/2 + ... + 1/N будет больше A, и саму эту сумму. 


Вариант 10.

Дано вещественное число A (> 1). Вывести наибольшее из целых чисел N, для которых сумма 1 + 1/2 + ... + 1/N будет меньше A, и саму эту сумму. 


Вариант 11.

Дано целое число N (> 0). Вывести произведение 1·2·...·N. Чтобы избежать целочисленного переполнения, вычислять это произведение с помощью вещественной переменной и выводить его как вещественное число. 


Вариант 12.

Дано целое число N (> 0). Если N — нечетное, то вывести произведение 1·3·...·N; если N — четное, то вывести произведение 2·4·...·N. Чтобы избежать целочисленного переполнения, вычислять это opnhgbedemhe с помощью вещественной переменной и выводить его как вещественное число. 


Вариант 13.

Дано целое число N (> 0). Вывести сумму 2 + 1/(2!) + 1/(3!) + ... + 1/(N!) (выражение N! — "N факториал" — обозначает произведение всех целых чисел от 1 до N: N! = 1·2·...·N). Полученное число является приближенным значением константы e = exp(1) (= 2.71828183...). 


Вариант 14.

Дано вещественное число X и целое число N (> 0). Вывести 1 + X + X2/2! + ... + XN/N! (N! = 1·2·...·N). Полученное число является приближенным значением функции exp в точке X. 


Вариант 15.

Дано вещественное число X и целое число N (> 0). Вывести X – X3/3! + X5/5! – ... + (–1)NX2N+1/(2N+1)! (N! = 1·2·...·N). Полученное число является приближенным значением функции sin в точке X. 


Вариант 16.

Дано вещественное число X и целое число N (> 0). Вывести 1 – X2/2! + X4/4! – ... + (–1)NX2N/(2N)! (N! = 1·2·...·N). Полученное число является приближенным значением функции cos в точке X. 


Вариант 17.

Дано вещественное число X (|X| < 1) и целое число N (> 0). Вывести X – X2/2 + X3/3 – ... + (–1)N–1XN/N. Полученное число является приближенным значением функции ln в точке 1+X. 


Вариант 18.

Дано вещественное число X (|X| < 1) и целое число N (> 0). Вывести X – X3/3 + X5/5 – ... + (–1)NX2N+1/(2N+1). Полученное число является приближенным значением функции arctg в точке X. 


Вариант 19.

Дано целое число N (> 2) и две вещественные точки на числовой оси: A, B (A < B). Отрезок [A, B] разбит на равные отрезки длины H с концами в N точках вида A, A + H, A + 2H, A + 3H, ..., B. Вывести значение H и набор из N точек, образующий разбиение отрезка [A, B]. 


Вариант 20.

Дано целое число N (> 2) и две вещественные точки на числовой оси: A, B (A < B). Функция F(X) задана формулой F(X) = 1 – sin(X). Вывести значения функции F в N равноотстоящих точках, образующих разбиение отрезка [A, B]: F(A), F(A + H), F(A + 2H), ..., F(B). 


1.4 Массивы


1.4.1 Одномерные массивы


Массивы представляют собой упорядоченные структуры, содер­жащие множество данных одного и того же типа. Упорядоченность массива позволяет обращаться к отдельному его элементу с помощью индекса — целочисленного выражения, определяющего положение элемента в массиве. Как и в других С-подобных языках, в С# самый первый элемент массива имеет индекс 0.

Массивы относятся к ссылочным типам, поэтому должны ини­циализироваться при помощи оператора new.

Одномерные массивы используются в программах чаще всего. Варианты описа­ния массива:

тип[] имя:

тип[] имя = new тип [ размерность ]:

тип[] имя = { список инициализаторов }:

тип[] имя = new тип [] { список инициализаторов };

тип[] имя = new тип [ размерность ] { список инициализаторов };


Для описания массива нужно указать квадратные скобки за име­нем типа данных. При этом он определяет тип хранящихся в массиве данных:


int[] arrlnt; // Целочисленный массив

char[] arrChar; // Массив символов

float[] arrFloat; // Массив вещественных чисел


Объявление массива еще не создает объект, который можно ис­пользовать в программе. Для инициализации массива следует ука­зать количество его элементов:


arrlnt = new int[25]; // Массив содержит 25 целых чисел

errChar = new char[3]; // Массив содержит 3 символа

errFloat = new float[10]; // Массив из 10 вещественных чисел


При инициализации массива ему выделяется нужная память в куче, а элементы получают значение 0, которое трактуется в зависи­мости от их типа: для числовых массивов это число 0, для строко­вых — пустая строка, для символьных — отсутствие символа и т.д.

После инициализации массив готов к работе. Разумеется, можно объявлять массив и одновременно инициали­зировать его:

int[] arrlnt = new int[9]

Более того, можно одновременно с созданием массива наполнить его нужными значениями. Например, так:

int[] arrlnt = {1, 2, 3, 23}

Или так:

int[] arrlnt = new int[4] {1, 2, 3, 23}


Пример: Ввести массив А из 6 элементов, найти сумму и количество отрицательных, а так же максимальный элемент.


class Program

{

static void Main(string[] args)

{

const int n = 6;

int[] a = new int[n];

Console.WriteLine("Исходный массив:");

for (int i = 0; i < n; ++i)

{

a[i] = Convert.ToInt16(Console.ReadLine());

}

long sum = 0; // сумма отрицательных элементов

int num =0; // количество отрицательных элементов

for ( int i =0; i < n; ++i )

if ( a[i] < 0 )

sum += a[i]; ++num;

Console.WriteLine( "Сумма отрицательных = " + sum );

Console.WriteLine( "Кол-во отрицательных = " + num );

int max = a[0]; // максимальный элемент

for ( int i = 1; i < n; ++i )

if ( a[i] > max ) max = a[i];

Console.WriteLine( "Максимальный элемент = " + max );

Console.ReadKey();

Вариант 1. Дан массив размера N. Вывести его элементы в обратном порядке. 


Вариант 2. Дан массив размера N. Вывести вначале его элементы с четными1|нечетными2 индексами, а затем — с нечетными1|четными2. 


Вариант 3. Дан целочисленный массив A размера 10. Вывести номер первого1|последнего2 из тех его элементов A[i], которые удовлетворяют двойному неравенству: A[1] < A[i] < A[10]. Если таких элементов нет, то вывести 0. 


Вариант 4. Дан целочисленный массив размера N. Вывести вначале все его четные1|нечетные2 элементы, а затем — нечетные1|четные2. 


Вариант 5. Поменять местами минимальный и максимальный элементы массива размера 10. 


Вариант 6. Заменить все положительные1|отрицательные2 элементы целочисленного массива размера 10 на значение минимального3|максимального4. 


Вариант 7. Дан массив размера 10. Переставить в обратном порядке элементы массива, расположенные между его минимальным и максимальным элементами. 


Вариант 8. Дан массив размера N. Осуществить циклический сдвиг элементов массива влево1|вправо2 на одну позицию. 


Вариант 9. Дан массив размера N и число k (0 < k < 5, k < N). Осуществить циклический сдвиг элементов массива влево1|вправо2 на k позиций. 


Вариант 10. Проверить, образуют ли элементы целочисленного массива размера N арифметическую1|геометрическую2 прогрессию. Если да, то вывести разность1|знаменатель2 прогрессии, если нет — вывести 0. 


Вариант 11. Дан массив ненулевых целых чисел размера N. Проверить, чередуются ли в нем [четные и нечетные]1|[положительные и отрицательные]2 числа. Если чередуются, то вывести 0, если нет, то вывести номер первого элемента, нарушающего закономерность. 


Вариант 12. Дан массив размера N. Найти количество его локальных минимумов1|максимумов2. 


Вариант 13. Дан массив размера N. Найти максимальный1|минимальный2 из его локальных минимумов1|максимумов2. 


Вариант 14. Дан массив размера N. Определить количество участков, на которых его элементы монотонно возрастают1|убывают2. 


Вариант 15. Дан массив размера N. Определить количество его промежутков монотонности (то есть участков, на которых его элементы возрастают или убывают). 


Вариант 16. Дано вещественное число R и массив размера N. Найти элемент массива, который наиболее1|наименее2 близок к данному числу. 


Вариант 17. Дано вещественное число R и массив размера N. Найти два элемента массива, сумма которых наиболее1|наименее2 близка к данному числу. 


Вариант 18. Дан массив размера N. Найти номера двух ближайших чисел из этого массива. 


Вариант 19. Дан целочисленный массив размера N. Определить максимальное количество его одинаковых элементов. 


Вариант 20. Дан целочисленный массив размера N. Удалить из массива все элементы, встречающиеся [менее двух раз]1|[более двух раз]2|[ровно два раза]3|[ровно три раза]4. 


1.4.2 Многомерные массивы


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

тип[,] имя = new тип [ разм_1. разм_2 ]:

тип[,] иия = { список инициализаторов };

тип[,] имя = new тип [,] { список инициализаторов }:

тип[,] имя = new тип [ разм_1, разм_2 ] { список инициализаторов };


Примеры описаний (один пример для каждого варианта описания):

int[,] a; //элементов нет

int[,] b = new int[2, 3]; //элементы равны О

int[,] с = {{1. 2, 3}, {4,5,6}}; // new подразумевается

int[,] с = new int[,] {{1, 2, 3}, {4, 5, 6}}; // размерность вычисляется

int[,] d = new int[2,3] {{1, 2,3}, {4, 5,6}}; // избыточное описание

Если список инициализации не задан, размерности могут быть не только кон­стантами, но и выражениями типа, приводимого к целому. К элементу двумерно­го массива обращаются, указывая номера строки и столбца, на пересечении кото­рых он расположен, например:

а[1, 4] b[I, j] b[j, i]

Каждая запятая в объявлении многомерного массива соответст­вует очередной его размерности, то есть добавлению к массиву но­вого элемента-массива.

Класс System.Array

Все массивы в CLR и, следовательно, в С# являются наследни­ками базового класса System.Array. Этот класс имеет статические свойства и методы, упрощающие манипулирование массивом как объектом.

Некоторые свойства класса System. Array показаны в табл.


Таблица 9.2. Свойства System.Array

Свойство

Описание

public int Length(get:};

Возвращает количество всех элементов массива

public int Rank{get:};

Возвращает количество измерений массива


Некоторые методы класса System.Array описаны в табл. 9.2.


Таблица 9.2. Методы класса System.Array

Метод

Описание

static intBinarySearch

(Array, object, IComparer) ;

Ищет в одномерном отсортированном массиве Array элемент object с по­мощью интерфейса IComparer и воз­вращает индекс элемента или отрица­тельное число, если элемент не найден

public static void Clear

(Array, Index, Length);

Помещает в Length элементов одно­мерного массива Array, начиная с эле­мента Index, значения 0, false или null в зависимости от типа элементов

public static voidCopyTo

(Array, Index);

Копирует из текущего одномерного массива все элементы в массив Array, начиная с индекса Index

public static Array Createlnstance

(Type ElementsType, int[] Lengths, int [] LowerBounds);

Создает многомерный массив из эле­ментов типа ElementsType с количе­ством Lengths элементов по каждому измерению и нижними границами ин­дексов LowerBounds. Перегруженные методы позволяют создавать одно- и многомерные массивы с индексами, на­чинающимися с 0

public virtual IEnumerator GetEnumerator();

Возвращает итератор интерфейса IEnumerator для текущего массива

public intGetLenght (Dimension);

Возвращает количество элементов мас­сива по измерению Dimension

public int GetLowerBound (Dimension);

Возвращает минимальное значение ин­декса по измерению Dimension

public intGetUpperBound (Dimension);

Возвращает максимальное значение индекса по измерению Dimension

X public object GetValue | (Index) ;

Возвращает значение элемента Index текущего одномерного массива. Перекрытые методы приспособлены для работы с многомерными массивами

public static void Reverse

(Array);

Изменяет порядок следования элемен­тов одномерного массива Array на обратный

public void

SetValue(Value, Index);

Устанавливает значение Value эле­мента Index текущего одномерного массива. Перекрытые методы приспо­соблены для работы с многомерными массивами

public static void Sort

(Array);

Сортирует элементы одномерного мас­сива Array


Пример: Ввести массив А(3,4). Найти количество положительных в каждой строке и среднее арифметическое.


class Program

{

static void Main(string[] args)

{

const int m = 3, n = 4;

int[,] a = new int[m, n];

Console.WriteLine( "Исходный массив:" );

for ( int i = 0; i < m; ++i )

{

for ( int j = 0; j

a[i,j] = Convert.ToInt16(Console.ReadLine());

}

double sum =0; int P;

for ( int i = 0; i < m; ++i )

{

P = 0;

for (int j = 0; j < n; ++j)

{

sum += a[i, j];

if (a[i, j] > 0) ++P;

}

Console.WriteLine("В строке{0}{1}положит-х элементов",i,P);

}

Console.WriteLine("Среднее арифметическое: " + sum /m /n );

Console.ReadKey();

}


Вариант 1. Дана матрица размера 5 x 9. Найти суммы элементов всех ее четных1|нечетных2 строк3|столбцов4. 


Вариант 2. Дана матрица размера 5 x 10. Найти минимальное1|максимальное2 значение в каждой строке3|столбце4. 


Вариант 3. Дана матрица размера 5 x 10. В каждой строке1|столбце2 найти количество элементов, больших3|меньших4 среднего арифметического всех элементов этой строки1|столбца2. 


Вариант 4. Дана матрица размера 5 x 10. Преобразовать матрицу, поменяв местами минимальный и максимальный элемент в каждой строке1|столбце2. 


Вариант 5. Дана матрица размера 5 x 10. Найти минимальное1|максимальное2 значение среди сумм элементов всех ее строк3|столбцов4 и номер строки3|столбца4 с этим минимальным1|максимальным2 значением. 


Вариант 6. Дана матрица размера 5 x 10. Найти минимальный1|максимальный2 среди максимальных1|минимальных2 элементов каждой строки3|столбца4. 


Вариант 7. Дана целочисленная матрица размера 5 x 10. Вывести номер ее oepbni1|последней2 строки3|столбца4, содержащего равное количество положительных и отрицательных элементов (нулевые элементы не учитываются). Если таких строк3|столбцов4 нет, то вывести 0. 


Вариант 8. Дана матрица размера 5 x 10. Вывести номер ее первой1|последней2 строки3|столбца4, содержащего только положительные элементы. Если таких строк3|столбцов4 нет, то вывести 0. 


Вариант 9. Дана целочисленная матрица размера M x N. Различные строки (столбцы) матрицы назовем похожими, если совпадают множества чисел, встречающихся в этих строках (столбцах). Найти количество строк1|столбцов2, похожих на первую3|последнюю4 строку1|столбец2. 


Вариант 10. Дана целочисленная матрица размера M x N. Найти количество ее строк1|столбцов2, все элементы которых различны. 


Вариант 11. Дана целочисленная матрица размера M x N. Вывести номер ее первой1|последней2 строки3|столбца4, содержащего максимальное количество одинаковых элементов. 


Вариант 12. Дана квадратная матрица порядка M. Найти сумму элементов ее главной1|побочной2 диагонали. 


Вариант 13. Дана квадратная матрица порядка M. Найти суммы элементов ее диагоналей, параллельных главной1|побочной2 (начиная с одноэлементной диагонали A[1,M]1|A[1,1]2). 


Вариант 14. Дана квадратная матрица порядка M. Вывести минимальные1|максимальные2 из элементов каждой ее диагонали, параллельной главной3|побочной4 (начиная с одноэлементной диагонали A[1,M]3|A[1,1]4).


Вариант 15. Дана квадратная матрица порядка M. Заменить нулями элементы, лежащие одновременно выше1|ниже2 главной диагонали (включая эту диагональ) и выше3|ниже4 побочной диагонали (также включая эту диагональ). 


Вариант 16. Дана квадратная матрица порядка M. Зеркально отразить ее элементы относительно [горизонтальной оси симметрии]1|[вертикальноc оси симметрии]2|[главной диагонали]3|[побочной диагонали]4 матрицы. 


Вариант 17. Дана квадратная матрица порядка M. Повернуть ее на 901|1802|2703 градусов в положительном направлении. 


Вариант 18. Дана матрица размера 5 x 10. Вывести количество строк1|столбцов2, элементы которых монотонно возрастают3|убывают4. 


Вариант 19. Дана матрица размера 5 x 10. Найти минимальный1|максимальный2 среди элементов тех строк3|столбцов4, которые упорядочены либо по возрастанию, либо по убыванию. Если такие строки3|столбцы4 отсутствуют, то вывести 0. 


Вариант 20. Даны два числа k1 и k2 и матрица размера 4 x 10. Поменять местами строки1|столбцы2 матрицы с номерами k1 и k2. 



1.5 Функции


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

Структурирование программ необходимо по двум причинам. Во-первых, невозможно написать более-менее сложную программу как единое целое, не расчленяя ее на относительно самостоятель­ные части — подпрограммы. Во-вторых, подпрограммы открывают возможность повторного использования однажды созданного кода и способствуют появлению библиотек подпрограмм. В языке С# под­программы не имеют самостоятельного значения — они могут быть только методами класса.


Описание подпрограмм

В С# нет специальных зарезервированных слов procedure и function для описания подпрограмм. Поскольку они являются ме­тодами класса, эти слова избыточны. Синтаксис описания таков:


[модификаторы] <Тип> <Имя> ([<Формальные_параметры>])

{<Тело>}


В квадратных скобках указаны необязательные элементы. Модификаторы определяют область видимости подпрограммы. Сейчас лишь поясню два мо­дификатора — private и public. Любые члены класса (в том числе методы-подпрограммы), объявленные с модификатором private, доступны только в методах данного класса. Модификатор public - делает метод (подпрограмму) доступным в любом месте программы. Если модификатор не указан, считается, что данный член класса по­мечен как закрытый (с модификатором private).

Формальные параметры могут отсутствовать, но и в этом случае круглые скобки за именем подпрограммы обязательны.

Тип подпрограммы может быть любым типом данных. В этом слу­чае подпрограмма представляет собой функцию, которая возвращает результат указанного типа. В теле функции обязательно указывается оператор return, который присваивает функции нужное значение. В качестве типа можно указать зарезервированное слово void, ко­торое означает отсутствие типа. В этом случае подпрограмма пред­ставляет собой процедуру, и использование в ней оператора return означает принудительное завершение ее работы.

Имя подпрограммы должно быть уникальным в текущей области видимости идентификатором.

Тело подпрограммы обязательно реализуется в виде блока опера­торов, поэтому за закрывающей круглой скобкой должна следовать открывающая фигурная, даже если тело подпрограммы отсутствует Или содержит единственный оператор.

Примеры описаний:

int A() {...}

void в (...) {...}

public string С () { . . . }

Здесь А и В — закрытые члены класса, которые доступны только в методах этого же класса, причем А — целочисленная функция, а В — процедура. С — открытая функция строкового типа, доступная в лю­бой точке программы.


Описание функции

Комментарий

private int fun(int i,double a)

{int k=15; . . .

return k;}

Функция с двумя

параметрами, с именем fun


void fun2 (int i,double a )

{...;}


Процедура fun2

C 2 параметрами

Тип не определен (void)

public double fun3 ()

{..double b=a; . . .

return b; }

Открытая функция fun3

Без параметра

public void fun4 ( )

{double b=a; . . .;}

Открытая процедура

без параметров

void fun5( )

(double b=a; . . .;

Ошибка



Формальные параметры

Формальные параметры являются средством настройки подпро­граммы на выполнение нужной работы. Например, обычная матема­тическая функция sin(х) имеет формальный параметр х, трактуемый в теле функции как угол, для которого следует вычислить значение синуса.

В С# различают три разновидности (статуса) формальных пара­метров: входные, выходные и ссылочные. С помощью входных па­раметров программа передает данные в тело подпрограммы. Однако фактически в подпрограмму передаются не данные, а их копии, по­этому изменение входных параметров в подпрограмме никак не пере­дается вызывающей программе. Выходные параметры объявляются с зарезервированным словом out. Они предназначены для передачи данных из подпрограммы в вызывающую программу. В теле подпрограммы обязательно должен присутствовать оператор присваивания параметрам нового значения — за этим следит компилятор. Ссылочные параметры передаются подпрограмме по ссылке, то в тело подпрограммы передается адрес параметра в памяти компьютера. Такие параметры помечаются зарезервированным словом ref. Они позволяют как передать данные в подпрограмму, так и получить из нее новые данные.

В подпрограмме можно объявить не один, а несколько параметров. В этом случае соседние параметры разделяются запятыми используя список параметров. Последним (или единственным) параметром списка может объявляться массив любого типа с зарезервированным словом params. В этом случае на месте такого параметра при вызове подпрограммы может стоять сколько угодно параметров данного типа.


Вызов подпрограмм

Для вызова подпрограммы нужно указать ее имя и список факти­ческих параметров (если в описании есть непустой список формаль­ных параметров). Такой список должен по типу, количеству, порядку следования и статусу соответствовать списку формальных парамет­ров.

Если в списке п формальных параметров, то фактических па­раметров должно быть не меньше п (соответствие по количеству). Каждому i-му формальному параметру ставится в соответствие i-й фактический параметр. Последнему формальному параметру при условии, что он объявлен с зарезервированным словом params, ста­вятся в соответствие все оставшиеся фактические параметры (соот­ветствие по порядку).


Пример: Написать функцию Koren для расчета корней квадратного уравнения.

class Program

{

static void Koren (double a,double b,double d)

{

double x1,x2;

x1=(-b+Math.Sqrt(d))/(2*a);

x2=(-b-Math.Sqrt(d))/(2*a);

Console.Write("1 корень -"+x1+"2 корень - "+x2);


}

static void Main(string[] args)

{

double a,b,c,d;

a=Convert.ToDouble(Console.ReadLine());

b =Convert.ToDouble(Console.ReadLine());

c=Convert.ToDouble(Console.ReadLine());

d=Math.Pow(b,2)-4*a*c;

if (d>0)

Koren(a,b,d);

else

Console.Write ("Корней нет");

Console.ReadKey();

}


В заданиях данной подгруппы требуется реализовать процедуры или функции с числовыми параметрами типа int и double. Входные параметры этих типов обычно описываются как параметры-значения. 


Вариант 1. Описать функцию Min2(A,B)1|Max2(A,B)2 вещественного типа, находящую минимальное1|максимальное2 из двух вещественных чисел A и B. С помощью этой функции найти минимальные1|максимальные2 из пар чисел A и B, A и C, A и D, если даны числа A, B, C, D. 


Вариант 2. Описать процедуру Minmax(A,B), записывающую в переменную A минимальное из значений A и B, а в переменную B — максимальное из этих значений (A и B — вещественные параметры, являющиеся одновременно входными и выходными). Используя четыре вызова этой процедуры, найти минимальное и максимальное из ·исел A, B, C, D. 


Вариант 3. Используя процедуру Minmax из задания Proc2, описать функцию Min3(A,B,C)1|Max3(A,B,C)2 вещественного типа, находящую минимальное1|максимальное2 из трех вещественных чисел A, B и C. С помощью этой функции найти минимальные1|максимальные2 из наборов (A,B,C), (A,B,D), (A,C,D), если даны числа A, B, C, D. 


Вариант 4. Используя функцию Min21|Max22 из задания Proc1, описать функцию Min4(A,B,C,D)1|Max4(A,B,C,D)2 вещественного типа, находящую минимальное1|максимальное2 из четырех вещественных чисел A, B, C и D. С помощью этой функции найти минимальные1|максимальные2 из наборов (A,B,C,D), (A,B,C,E), (A,C,D,E), если даны числа A, B, C, D, E. 


Вариант 5. Описать функцию Fact(N) целого типа, вычисляющую значение факториала N! = 1·2·...·N (N > 0 — параметр целого типа). С помощью этой функции вычислить факториалы 10 данных чисел. 


Вариант 6. Описать функцию FactR(N) вещественного типа, позволяющую вычислять приближенное значение факториала N! = 1·2·...·N для целых N (> 0). С помощью этой функции вычислить факториалы пяти данных чисел. 


Вариант 7. Описать функцию Fact2(N) целого типа, вычисляющую значение "двойного факториала": N!! = 1·3·5·...·N, если N — нечетное, N!! = 2·4·6·...·N, если N — четное (N > 0 — параметр целого типа). С помощью этой функции вычислить двойные факториалы десяти данных чисел. 


Вариант 8. Описать нерекурсивную функцию Fib(N) целого типа, вычисляющую N-е число Фибоначчи F(N) по формуле: F(1) = F(2) = 1, F(k) = F(k–2) + F(k–1), k = 3, 4, ... . С помощью этой функции вычислить 10 чисел Фибоначчи с указанными номерами. 


Вариант 9. Описать процедуру SumDigit(N,S), находящую сумму цифр S целого числа N (N — входной, S — выходной параметр). Используя эту процедуру, найти суммы цифр пяти данных чисел. 


Вариант 10. Описать нерекурсивную функцию NOD2(A,B) целого типа, находящую наибольший общий делитель (НОД) двух натуральных чисел A и B, используя алгоритм Евклида: НОД(A,B) = НОД(B mod A,A), если A <> 0; НОД(0,B) = B. С помощью этой функции найти наибольшие общие делители пар A и B, A и C, A и D, если даны числа A, B, C, D. 


Вариант 11. Используя функцию NOD2 из задания Proc10, описать процедуру Frac(a,b,p,q), преобразующую дробь a/b к несократимому виду p/q (все параметры процедуры — целого типа). Знак результирующей дроби p/q приписывается числителю (т.е. q > 0). С помощью этой процедуры найти несократимые дроби, равные a/b + c/d, a/b + e/f, a/b + g/h (числа a, b, c, d, e, f, g, h даны). 


Вариант 12. Описать функцию Exp1(x,eps) вещественного типа (параметры x, eps — вещественные, eps > 0), находящую приближенное значение функции exp(x): exp(x) = 1 + x + x2 / 2! + x3 / 3! + ... + xn / n! + ... . В сумме учитывать все слагаемые, большие eps. С помощью Exp1 найти приближенное значение экспоненты для данного x при шести данных eps. 


Вариант 13. Описать функцию Sin1(x,eps)1|Cos1(x,eps)2 вещественного типа (параметры x, eps — вещественные, eps > 0), находящую приближенное значение функции sin(x)1|cos(x)2: [sin(x) = x – x3 / 3! + x5 / 5! – ... + (–1)n x2n+1 / (2n+1)! + ...]1| [cos(x) = 1 – x2 / 2! + x4 / 4! – ... + (–1)n x2n / (2n)! + ...]2. В сумме учитывать все слагаемые, большие по модулю eps. С помощью Sin11|Cos12 найти приближенное значение синуса1|косинуса2 для данного x при шести данных значениях eps. 


Вариант 14. Описать функцию Ln1(x,n)1|Arctg1(x,n)2 вещественного типа (параметры x, eps — вещественные, |x| < 1, eps > 0), находящую приближенное значение функции ln(1+x)1|arctg(x)2: [ln(1+x) = x – x2 / 2 + x3 / 3 – ... + (–1)n xn+1 / (n+1) + ...]1| [arctg(x) = x – x3 / 3 + x5 / 5 – ... + (–1)n x2n+1 / (2n+1) + ...]2. В сумме учитывать все слагаемые, большие по модулю eps. С помощью Ln11|Arctg12 найти приближенное значение ln(1+x)1|arctg(x)2 для данного x при шести данных значениях eps. 


Вариант 15. Описать функцию PowerA(x,a,eps) вещественного типа (параметры x, a, eps — вещественные, |x| < 1, a > 0, eps > 0), находящую приближенное значение функции (1+x)a: (1+x)a = 1 + a·x + a·(a–1)·x2 / 2! + ... + a·(a–1)·...·(a–n+1)·xn / n! + ... . В сумме учитывать все слагаемые, большие по модулю eps. С помощью PowerA найти приближенное значение (1+x)a для данных x и a при шести различных значениях eps. 


Вариант 16. Описать функцию Otr(Ax,Ay,Bx,By) вещественного типа, находящую длину отрезка AB на плоскости по координатам его концов: |AB| = sqrt((Ax-Bx)2 + (Ay-By)2) (Ax, Ay, Bx, By — вещественные параметры). С помощью этой функции найти длины отрезков AB, AC, AD, если даны координаты точек A, B, C, D. 


Вариант 17. Используя функцию Otr из задания Proc16, описать функцию Perim(Ax,Ay,Bx,By,Cx,Cy) вещественного типа, находящую периметр треугольника ABC по координатам его вершин (Ax, Ay, Bx, By, Cx, Cy — вещественные параметры). С помощью этой функции найти периметры треугольников ABC, ABD, ACD, если даны координаты точек A, B, C, D. 


Вариант 18. Используя функции Otr и Perim из заданий Proc16 и Proc17, описать функцию Area(Ax,Ay,Bx,By,Cx,Cy) вещественного типа, находящую okny`d| треугольника ABC по формуле Герона: SABC = sqrt(p·(p–|AB|)·(p–|AC|)·(p–|BC|)), где p — полупериметр. С помощью этой функции найти площади треугольников ABC, ABD, ACD, если даны координаты точек A, B, C, D. 


Вариант 19. Используя функции Otr и Area из заданий Proc16 и Proc18, описать процедуру Dist(Px,Py,Ax,Ay,Bx,By,D), находящую расстояние D от точки P до прямой AB по формуле D = 2SPAB / |AB|, где SPAB — площадь треугольника PAB. С помощью этой процедуры найти расстояния от точки P до прямых AB, AC, BC, если даны координаты точек P, A, B, C. 


Вариант 20. Используя процедуру Dist из задания Proc19, описать процедуру Heights(Ax,Ay,Bx,By,Cx,Cy,hA,hB,hC), находящую высоты hA, hB, hC треугольника ABC, проведенные соответственно из вершин A, B, C. С помощью этой процедуры найти высоты треугольников ABC, ABD, ACD, если даны координаты точек A, B, C, D.




1.6 Строки


Как и остальные типы С#, строковый тип String является клас­сом, то есть относится к ссылочным типам. Он предназначен для хранения строк переменной длины. Последнее обстоятельство оп­ределяет особенность значений типа: как и у всех других ссылочных типов, эти значения хранятся в куче, но при изменении значения строки в куче создается ее новый экземпляр, что не влияет на значе­ния других переменных, содержащих прежнюю строку.

Для совместимости с С (С++) в С# определен псевдоним string типа String.

Класс String имеет свойства и методы, представленные в табл.1 и 2.


Таблица 1. Свойства класса String


Свойство

Описание

public char this [ int Index] {get:};

Это свойство позволяет получить нужный сим­вол из строки, рассматривая ее как 0-базированный массив символов (только для чтения)

public int Length() {get:};

Возвращает длину строки (только для чтения)

Пример:

S= “Текст программы”;

int k = s.Length;

Таблица 2. Методы класса String


Метод

Описание

public static int Compare

(string SI, string S2) ;

Сравнивает 2 строки

если SI < S2, то отрицательное число

если SI = S2, то ноль

если SI > S2 ,то положительное число,

Пример:

if (String.Compare(s,s2)==0)

Console.WriteLine("Строки одинаковые");

public static int

CompareOrdinal

(string SI, string S2) ;

Сравнивает две строки путем сравнения чи­словых значений их символов

public static string Concat (params object[]);

Объединяет строки

Пример:

s2 = String.Concat(s,s2);

public void CopyTo

(int Sourcelnd, char[] Dest, intDestlnd, int Count) ;

Копирует не более Count символов строки, начиная с символа Sourcelnd, в массив Dest Unicode-символов, начиная с символа Destlnd

Пример:

s.CopyTo(0,4,s,1);

public bool EndsWith

(string S) ;

Возвращает true, если строка заканчива­ется подстрокой S

Пример:

bool b=s.EndsWith(“catec”);

public bool StartsWith

(string S) ;

Возвращает true, если текущая строка на­чинается подстрокой S

public static string

Format

(strings, params object[]);

Форматирует строку S

public int IndexOf

(string S) ;

Возвращает индекс первого вхождения подстроки или символа S в текущую строку или отрицательное число, если S в строке не найден

Пример:

s=’подлесок в лесу’;

int k = s.IndexOf("лес"); {k=3}

public static int

LastlndexOf

(strings);

Возвращает индекс последнего вхождения подстроки или символа S в текущую строку или отрицательное число, если S в строке не найден

Пример:

s=’подлесок в лесу’;

int k = s.LastIndexOf("лес"); {k=11}

public string Insert

(int Ind. string S);

Вставляет в текущую строку подстроку S, начиная с индекса Ind

Пример:

s=s.Insert(0, "привет");

public static string Join

(strings, params string[] ss) ;

Объединяет разделителем S подстроки ss в одну длинную строку

Пример:

s = String.Join(" ", s, s1);

public string PaddLeft (int TotalWidth, char C) ;

Дополняет текущую строку слева симво­лами С до тех пор, пока длина строки не ста­нет равной TotalWidth

public static string Remove

(int Startlndex, int count) ;

Удаляет из текущей строки не более Count символов, начиная с символа Startlndex

Пример:

s=s.Remove(0, 4); // удаление 4 букв с начала

public string Replace

(strings, string ss);

Изменяет в текущей строке подстроку S на

Ss

Пример:

s=s.Replace("f", "r"); // замена букв f на r

public string[] Split

(params char [ ] delimiters);

Расщепляет текущую строку на лек­семы в соответствии с ограничителями delimiters

public string Substring

(int Beglnd, int Endlnt) ;

Возвращает из текущей строки подстроку, ограниченную символами Beglnd и Endlnd

public string

ToLower () ;

Возвращает текущую строку с символами в виде строчных букв

Пример: s=’ПАПА’;

s=s.ToLower(); {s=’папа’}

public string

ToUpper () ;

Возвращает текущую строку с символами в виде прописных букв

Пример: Пример: s=’папа’;

s=s.ToUpper(); {s=’ПАПА’}

public string Trim();

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

Пример:

s=s.Trim();

public string

TrimEnd () ;

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

Пример:

s=s.TrimEnd();

public string

TrimStart();

Возвращает исходную строку, в которой уда­лены ведущие пробелы

Пример:

s=s.TrimStart();


class Program

{

static void Main(string[] args)

{

string s = Console.ReadLine();

int k = s.Length;

Console.WriteLine("Количество символов - "+ k);

string s2 = Console.ReadLine();

if (String.Compare(s,s2)==0)

Console.WriteLine("Строки одинаковые");

s2 = String.Concat(s,s2);

Console.WriteLine("Объединение строк - " + s2);

int l=0;

for (int i = 0; i < k; ++i)

{

if (s[i]=='A')

++l;

}

Console.WriteLine("Количество букв А = " + l);

s.Replace("f", "r"); // замена букв f на r

s.Remove(0, 4); // удаление 4 букв с начала

k = s.LastIndexOf("catec");

s.Insert(0, "привет");

s = String.Join(" ", s, s1);

s.ToLower(); // преобразование в строчные буквы

}

}

Вариант 1. Вывести строку длины N (N — четное), которая состоит из чередующихся символов C1 и C2, начиная с C1. 


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


Вариант 3. Дана строка. Вывести коды ее первого и последнего символа. 


Вариант 4. Дана строка. Подсчитать количество содержащихся в ней цифр1|[прописных букв]2|[строчных букв]3. 


Вариант 5. Дана строка. Преобразовать все строчные1|прописные2 латинские3|русские4 буквы в прописные1|строчные2. 


Вариант 6. Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2; если строку нельзя преобразовать в число, то вывести 0. 


Вариант 7. Дано целое число. Вывести набор символов, содержащий цифры этого числа в исходном1|обратном2 порядке. 


Вариант 8. Дана строка S, изображающая вещественное число в формате с плавающей точкой, и целое число N (> 0). Вывести набор символов, изображающих первые N цифр дробной части этого вещественного числа (без округления). 


Вариант 9. Дана строка, изображающая двоичную1|десятичную2 запись целого числа. Вывести строку, изображающую десятичную1|двоичную2 запись этого же числа. 


Вариант 10. Дана строка, изображающая целое число. Вывести сумму цифр этого числа. 


Вариант 11. Дана строка S и число N. Преобразовать строку S в строку длины N следующим образом: если длина строки S больше N, то отбросить первые символы, если длина строки S меньше N, то в ее начало добавить символы "." (точка). 


Вариант 12. Даны два числа: N1 и N2, и две строки: S1 и S2. Получить из этих строк новую строку, объединив N1 первых символов строки S1 и N2 последних символов строки S2. 


Вариант 13. Даны две строки: S1 и S2. Проверить, содержится ли строка S2 в строке S1. Если да, то вывести номер позиции, начиная с которой S2 содержится в S1, если нет, то вывести 0. 


Вариант 14. Даны две строки: S1 и S2. Определить количество вхождений строки S2 в строку S1. 


Вариант 15. Дана строка S и символ C. Удвоить каждое вхождение qhlbnk` C в строку S. 


Вариант 16. Даны строки S1, S2 и символ C. Перед1|после2 каждого вхождения символа C в строку S1 вставить строку S2. 


Вариант 17. Даны две строки: S1 и S2. Удалить из строки S1 первую1|последнюю2|все3 подстроки, совпадающие с S2. Если таких подстрок нет, то вывести S1 без изменений. 


Вариант 18. Даны три строки: S1, S2, S3. Заменить в строке S1 первое1|последнее2|все3 вхождения строки S2 на S3. 


Вариант 19. Дана строка. Вывести подстроку, расположенную между первой и второй1|последней2 точками исходной строки. Если в строке менее двух точек, то вывести всю исходную строку. 


Вариант 20. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить количество слов в строке. 



Тема 1.7 Препроцессорные средства


Главное, что следует помнить о препроцессоре C# — то, что он практически не существует. Препроцессорные средства C/C++ либо полностью отсутствуют в C#, либо реализуются в ограниченном виде. В частности, исчезли возможности включения файлов (директива #include) и макрозамены текста (#define). Директива #ifdef и сопутствующие директивы сохранились, они управляют условной компиляцией программы.

Избавление от макросов #define позволяет программисту лучше понять, что же происходит в программе. Любое незнакомое имя должно относиться к одному из пространств имен, и вам уже не придется устраивать длительные поиски во всех включаемых файлах.

Одна из основных причин подобного изменения состоит в том, что избавление от препроцессорной обработки и #include упрощает логику компиляции, и таким образом, заметно ускоряет компиляцию. Кроме того, программисту не приходится создавать отдельный заголовочный файл и обеспечивать его синхронизацию с файлом реализации.

При компиляции файлов с исходными текстами C# порядок компиляции отдельных файлов не важен. Результат будет точно таким же, как если бы все файлы были объединены в один большой файл. Вам не придется создавать опережающие объявления или следить за порядком размещения директив #include.


Препроцессорные директивы


Препроцессорные директивы C# перечислены в следующей таблице.

Директива

Описание

#define идентификатор

Определяет идентификатор. Обратите внимание: идентификатору нельзя присвоить значение, можно лишь определить его. Идентификаторы также могут определяться в командной строке

#undef идентификатор

Отменяет определение идентификатора

#if выражение

Код следующей секции компилируется, если выражение истинно

#elif выражение

Конструкция else-if. Если условие предыдущей директивы не было выполнено и выражение истинно, компилируется код следующей секции

#else

Если условие предыдущей директивы не было выполнено, компилируется код следующей секции

#endif

Отмечает конец секции


Ниже приведен пример использования препроцессорных директив:

#define DEBUGLOG

using System;

class Test

{

public static void Main()

{

#if DEBUGLOG

Console.WriteLine("In Main - Debug Enabled");

#else

Console.WriteLine("In Main - No Debug");

#endif

}

}

Директивы #define и #undef должны предшествовать «полноценному» программному коду в файле, или произойдет ошибка. Предыдущий пример нельзя записать в следующем виде:

// Ошибка

using System;

class Test

{

#define DEBUGLOG

public static void Main()

{

#if DEBUGLOG

Console.WriteLine("In Main - Debug Enabled");

#else

Console.WriteLine("In Main - No Debug");

#endif

}

}

Препроцессорные выражения


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

Оператор

Описание

! операнд

Выражение истинно, если операнд ложен

операнд == значение

Выражение истинно, если операнд равен указанному значению

операнд != значение

Выражение истинно, если операнд не равен указанному значению

операнд1 && операнд2

Выражение истинно, если оба операнда истинны

операнд1 || операнд2

Выражение истинно, если истинен хотя бы один из операндов

Выражения группируются при помощи круглых скобок:

#if !(DEBUGLOG && (TESTLOG || USERLOG))

Выражение во внешних скобках истинно, если определен один из идентификаторов TESTLOG или USERLOG, а также определен идентификатор DEBUGLOG. Затем значение этого выражения инвертируется оператором !.


Дополнительные препроцессорные директивы


Помимо директив #if и #define, существуют и другие препроцессорные директивы.

#warning и #error

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

Например, в программе может присутствовать следующая директива:

#warning Check algorithm with John

При компиляции этой строки будет выведен текст «Check algorithm with John».

#line

В директиве #line программист указывает имя исходного файла и номер строки, используемые компилятором при выводе сообщений об ошибках. Обычно эта директива применяется в автоматически сгенерированном коде для синхронизации выводимых номеров с другой системой нумерации или формирования имен.

Раздел 2. Объектно-ориентированное программирование


2.1 Введение в объектно-ориентированное программирование


2.1.1 Классы и объекты


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

Методы и переменные, составляющие класс, называются членами класса.

Общая форма определения класса

Определяя класс, вы определяете данные, которые он содержит, и код, манипули­рующий этими данными. Несмотря на то что очень простые классы могут включать только код или только данные, большинство реальных классов содержат и то, и другое.

Данные содержатся в переменных экземпляров, определяемых классом, а код — в методах. Однако важно с самого начала отметить, что класс определяет также ряд специальных членов данных и методов-членов, например статические переменные, константы, конструкторы, деструкторы, индексаторы, события, операторы и свойства. Пока мы ограничимся рассмотрением переменных экземпляров и методов класса, а к концу главы познакомимся с конструкторами и деструкторами. Остальные типы чле­нов класса описаны в последующих главах.

Класс создается с помощью ключевого слова class. Общая форма определения класса, который содержит только переменные экземпляров и методы, имеет следую­щий вид:

class имя_класса {

// Объявление переменных экземпляров.

доступ тип переменная1;

доступ тип переменная2; //.. .

доступ тип переменная N;

// Объявление методов.

доступ тип_возврата метод1 {параметры)

{ // тело метода }

доступ тип_возврата метод2(параметры)

{ // тело метода }

//..­доступ тип_возврата методN(параметры)

{ // тело метода}

}

Обратите внимание на то, что объявление каждой переменной и каждого метода предваряется элементом доступ. Здесь элемент доступ означает спецификатор досту­па (например, public), который определяет, как к этому члену можно получить дос­туп. Члены класса могут быть закрытыми в рамках класса или более доступными. Спецификатор доступа определяет, какой именно разрешен тип доступа. Спецификатор доступа необязателен, и, если он не указан, подразумева­ется, что этот член закрыт (private). Члены с закрытым доступом (закрытые члены) могут использоваться только другими членами своего класса. В примерах этой главы все члены классов определяются как public-члены, а это значит, что их могут ис­пользовать все остальные составные части программного кода, даже те, которые опре­делены вне класса. К рассмотрению спецификаторов доступа мы вернемся в главе 8.

Несмотря на отсутствие специального синтаксического правила определения клас­са (его качественного и количественного состава), все же считается, что класс должен определять только одну логическую сущность. Например, класс, в котором хранятся имена лиц и их телефонные номера, не должен (по общепринятым меркам) также со­держать информацию не связанную с конкретными лицами информацию. Другими сло­вами, правильно определенный класс должен содержать логически связанные данные. И наоборот, помещая в один класс логически несвязанные данные, вы рискуете деструктурировать свой код.

Классы, которые мы использовали в этой книге до сих пор, содержали только один метод — Main (). Вскоре мы узнаем, как создавать и другие методы. Однако за­метьте, что в общей форме определения класса метод Main() не задан. Он нужен только в том случае, если определяемый класс является отправной точкой программы.

Определение класса

Для иллюстрации мы создадим класс, который инкапсулирует информацию о зда­ниях (домах, складских помещениях, офисах и пр.). В этом классе (назовем его Building) будут храниться три элемента информации о зданиях (количество этажей, общая площадь и количество жильцов).

Ниже представлена первая версия класса Building. В нем определены три пере­менные экземпляра: floors, area и occupants. Обратите внимание на то, что класс Building не содержит ни одного метода. Поэтому пока его можно считать классом данных. (В следующих разделах мы дополним его методами.) class Building {

public int floors; // количество этажей

public int area; // общая площадь основания здания

public int occupants; // количество жильцов

}

Переменные экземпляра, определенные в классе Building, иллюстрируют общий способ их объявления. Формат объявления переменной экземпляра такой:

доступ тип имя_переменной;

Здесь элемент доступ представляет спецификатор доступа, элемент тип — тип пе­ременной экземпляра, а элемент имя_переменной — имя этой переменной. Таким образом, если не считать спецификатор доступа, то переменная экземпляра объявля­ется так же, как локальная переменная. В классе Building все переменные экземп­ляра объявлены с использованием модификатора доступа public, который, как упо­миналось выше, позволяет получать к ним доступ со стороны кода, расположенного даже вне класса Building.

Определение class создает новый тип данных. В данном случае этот новый тип данных называется Building. Это имя можно использовать для объявления объектов типа Building. Помните, что объявление class — это лишь описание типа; оно не создает реальных объектов. Таким образом, предыдущий код не означает существова­ния объектов типа Building.

Чтобы реально создать объект класса Building, используйте, например, такую ин­струкцию:

Building house = new Building(}; // Создаем объект // типа Building.

После выполнения этой инструкции house станет экземпляром класса Building, т.е. обретет "физическую" реальность. Подробно эту инструкцию мы рассмотрим ниже.

При каждом создании экземпляра класса создается объект, который содержит соб­ственную копию каждой переменной экземпляра, определенной этим классом. Таким образом, каждый объект класса Building будет содержать собственные копии пере­менных экземпляра floors, area и occupants. Для доступа к этим переменным ис­пользуется оператор "точка" (.). Оператор "точка" связывает имя объекта с именем его члена. Общий формат этого оператора имеет такой вид: объект.член

Как видите, объект указывается слева от оператора "точка", а его член — справа. Например, чтобы присвоить переменной floors значение 2, используйте следующую инструкцию. | house.floors = 2;

В общем случае оператор "точка" можно использовать для доступа как к перемен­ным экземпляров, так и методам.

Рассмотрим полную программу, в которой используется класс Building. // Программа, в которой используется класс Building.

using System;

class Building {

public int floors; // количество этажей

public int area; // общая площадь основания здания

public int occupants; // количество жильцов

}

// Этот класс объявляет объект типа Building, class BuildingDemo {

public static void MainO {

Building house = new Building О; // Создание объекта

// типа Building, int areaPP; // Площадь, приходящаяся на одного жильца.

// Присваиваем значения полям в объекте house, house.occupants = 4; house.area = 2500; house.floors = 2;

// Вычисляем площадь, приходящуюся на одного жильца дома. areaPP » house.area / house.occupants;

Console.WriteLine(

"Дом имеет;\n " + house.floors + " этажа\п " + house.occupants + " жильцаХп " + house.area +

" квадратных футов общей площади, из них\п " + areaPP + " приходится на одного человека");

Эта программа состоит из двух классов: Building и BuildingDemo. Внутри класса BuildingDerao метод MainO сначала создает экземпляр класса Building с именем house, а затем получает доступ к переменным этого экземпляра house, присваивая им конкретные значения и используя эти значения в вычислениях. Важно понимать, что Building и BuildingDemo — это два отдельных класса. Единственная связь меж­ду ними состоит в том, что один класс создает экземпляр другого. Хотя это отдельные классы, код класса BuildingDemo может получать доступ к членам класса Building, поскольку они объявлены открытыми, т.е. public-членами. Если бы в их объявлении не было спецификатора доступа public, доступ к ним ограничивался бы рамками класса Building, а класс BuildingDemo не имел бы возможности использовать их.

Если предыдущую программу назвать UseBuilding.cs, то в результате ее компи­ляции будет создан файл UseBuilding.exe. Классы Building и BuildingDemo авто­матически становятся составными частями этого исполняемого файла. При его вы­полнении получим такие результаты: Дом имеет: 2 этажа 4 жильца

2500 квадратных футов общей площади, из них 625 приходится на одного человека

В действительности совсем не обязательно классам Building и BuildingDemo на­ходиться в одном исходном файле. Можно поместить каждый класс в отдельный файл и назвать эти файлы Building, cs и BuildingDemo. cs, соответственно. После этого необходимо дать компилятору

99 страница ШИЛД

2.1.2 Конструкторы и деструкторы


2.1.2 Наследование


2.1.3 Полиморфизм


2.2 Файловый ввод-вывод


2.3 Обработка исключительных ситуаций


Приложение А. Контрольные работы







ПРИЛОЖЕНИЕ Б

Тесты


1 Оператор ввода:

A) WriteLn

B) Read

C) ReadLn

D) Write

E) Array

2 Оператор вывода:

A) WriteLn

B) Read

C) ReadLn

D) Write

E) Array

3 Оператор конца программы:

A) End

B){

C) Begin

D) END

E) }

4 // используется для :

A) написание комментариев

B) вычисления выражений

C) ввода переменных

D) вывода результатов

E) ввода на печать

5 Оператор != используется для:

A) равно

B) не равно

C) not

D) присваивания

E) ввода на печать

6 Оператор = используется для:

A) написание комментариев

B) вычисления выражений

C) ввода переменных

D) вывода результатов

E) оператор присваивания

7 Для написания новой программы выполняется команда:

A) FILE –RUN PROGRAM

B) FILE –LIST PROGRAM

C) FILE – NEW- PROJECT

D) FILE –STOP PROGRAM

E) FILE-QUIT

8 Оператор выбора :

A) Switch

B) switch

C) Case

D) SWITCH

E) CASE

9 Оператор безусловного перехода:

A) IF – THEN - ELSE

B) FOR -TO-DO

C) GOTO

D) Writeln

E) Readln

10 Оператор цикла с параметрами:

A) do … while

B) for

C) while

D) repeat … until

E) while do

11 Оператор объявления одномерного массива:

A) int[] a = new int[n,m];

B) int[,] a = new int[n];

C) const int n = 6;

int[] a = new int[n];

D) int[] a = new int[6];

E) int[,] a = new int[n];

12 Оператор for (int i = 0; i < n; ++i)-

A) безусловный переход

B) условный переход

C) цикл с параметрами

D) цикл с предусловием

E) цикл с постусловием

13 Каким знаком обозначаются символьные переменные

A) ' ' (апостроф)

B) $

C) “” (кавычки)

D) %

E) ^

14 Оператор dowhile выполняет функцию:

A) безусловного перехода

B) условного перехода

C) цикл с параметрами

D) цикл с предусловием

E) цикл с постусловием

15 Оператор ifelse выполняет функцию:

A) безусловного перехода

B) условного перехода

C) цикл с параметрами

D) цикл с предусловием

E) цикл с постусловием


16 Оператор GOTO выполняет функцию:

A) безусловного перехода

B) условного перехода

C) возврат с подпрограммы

D) оператор цикла

E) оператор ввода

17 Можно ли писать оператор } в конце подпрограммы

A) обязательно

B) нельзя

C) без разницы

D) обязательно

E) в конце оператора

18 После выполнения оператора найти значение переменной S.

S=0; i=0;

while (i<5) ++i;

S+=1/i;

A) 0,25

B) 21/12

C) 0,2

D) 2 ,1

E) 217/60


19 К какому циклическому оператору относится while :

A) цикл - «до»

B) ветвление

C) повторение

D) цикл –«пока»

E) условие

20 К какому циклическому оператору относится for:

A) ветвление

B) цикл – «до»

C) цикл – “с параметрами ”

D) цикл – «пока»

E) условий

21 К какому циклическому оператору относится do while:

A) Цикл – “до”

B) цикл – “FOR”

C) цикл – “пока”

D) ветвление

E) условие

22 if else операторы:

A) ветвление

B) цикл – “до”

C) цикл – “FOR”

D) цикл - “пока”

E) ввода

23 hello_html_m32fd3062.gif на языке C# пишется:

A) Math.Sqrt(2,x);

B) Math.Sqrt(x);

C) Math.Sqrt(x,2);

D) Math.Sqr(x);

E) Math.Pow(x,2);

24 Как описывается двухмерный массив:

A) int [5,5] a=new int[5,5];

B) int [,] a=new int[5,5];

C) int [5,5] a=new int[,];

D) int [] a=new int[5,5];

E) new int [5,5] a= int[5,5];


25 Как описывается одномерный массив из целых чисел:

A) int [] a=new int[5];

B) int [,] a=new int[5];

C) int [5] a=new int[5];

D) int [5] a=new int[];

E) new int [] a=int[5];

26 ||, && в операторе if означает:

A) || – если выполняется одно из условий, то выполняется оператор после условия; && – если выполняются оба условия, то выполняется оператор после условия

B) && – если выполняется одно из условий, то выполняется оператор после условия; || – если выполняются оба условия, то выполняется оператор после условия

C) || – если выполняется оба условия, то выполняется оператор после условия; && – если оба условия не выполняются, то выполняется оператор после условия

D) || – пишется одно условие, && – обязательно пишется две условии

E) &&- пишется одно условие, ||- обязательно пишется два условия

27 В конце подпрограммы обязательно пишется оператор:

A) end

B) }

C) END

D) End

E) ;


28 С использованием условного оператора, найти значение функции.


hello_html_m7100705a.gif

A) if (x>0 && x<2) y=Math.Sqr(cos(x));

else y=1-Math.Sin(sqr(x))

B) if (x>0)&& (x<2) y=Math.Pow(Math.Cos(x),2)

else y=1-Math.Sin(Math.Pow(x,2));

C) if (x>0)&&(x<2) then y:=sqr(cos(x))

else y:=1-sin(sqr(x))

D) if (x>0 && x<2) y=Math.Sqr(cos(x));

else y=1-Sin(sqr(x))

E) if (x>0)&& (x<2) y:=Math.Pow(Math.Cos(x),2)

else y:=1-Math.Sin(Math.Pow(x,2));

29 Найдите правильную запись выражения hello_html_2695a00e.gif на языке C#:

A) abs(x+1)-sqr(x)-1/2*x

B) (Abs(x+1)-Math.Sqrt(x) -1)/2*x

C) (abs(x+1)-sqr(x-1))/2*x

D) (Math.Abs(x+1)- Sqrt(x) -1)/2-x

E) (Math.Abs(x+1)-Math.Sqrt(x) -1)/2*x

30 Написать на языке C# оператора присваивания

y=x5+COS(x2+1)

A) y=Math.Pow(x,5)+Math.Cos(x*x+1)

B) y:= Math.Pow(x,5)+Math.Cos(x*x+1)

C) y:=sqr(sqr(x)*x+cos*sqr(x)+1

D) y:= Pow(x,5)+ Cos(x*x+1)

E) y=Math.Pow(5,x)+Math.Cos(sqr(x)+1)

31 Укажите действительное число Х:

A) X: float;

B) X: double;

C) X: int;

D) double X;

E) int X;


32 Укажите правильное описание матрицы À(4,4) целых чисел:

A) const int n = 4;

int[,] a = new int[n];

B) int[,] a = new int[4];

C) const int n = 4;

int[,] a = new int[n, n];

D) int[] a = new int[n, n];

E) const int n = 4;

int[] a = new int[n, n];

33 Даны переменные A=14, B=12,3 Укажите их правильное описание:

A) char A=14; double B=12.3;

B) int A=14; int B=12.3;

C) int a=14; double b=12.3;

D) int A=14; double B=12.3;

E) int A=14; double B=12,3;

34 Как описывается действительный тип:

A) integer

B) double

C) int

D) char

E) string

35 Как описывается целый тип:

A) integer

B) double

C) int

D) char

E) string

36 Как описывается одномерный массив целых чисел:

A) int[] a = new int[4,4];

B) int[,] a = new int[n];

C) const int n = 6;

int[] a = new int[n];

D) int[] a = new int[6];

E) int[,] a = new int[n];

37 Как описывается символьный тип:

A) char

B) byte

C) real

D) string

E) bool

38 Как описывается одномерный массив из действительных чисел:

A) int[] a = new int[4,4];

B) int[,] a = new int[n];

C) const int n = 6;

double[] a = new double[n];

D) int[] a = new int[6];

E) int[,] a = new int[n];

39 c=a+b Если а,b – целый тип , тогда с какой тип:

A) int

B) float

C) bool

D) double

E) real

40 b=3/a. Если а-целый тип (a3, a1). Тогда b какой тип?

A) int

B) byte

C) bool

D) double

E) real

41 После выполнения оператора найти значение переменной D.

D=0; I=1;

while (I<25)

I+=2;

D=D+1/(2*I+1);

A) 0.02

B) 1/47

C) 1/51

D) 1/49

E) 0.03

42 Какому типу цикла относится следующая запись

for (<переменная>=< начальное значение; <условие>; <итерация> ) <оператор>

A) цикл с предусловием

B) цикл с постусловием

C) цикл до

D) цикл с параметрами

E) цикл пока

43 Укажите какому оператору относится следующая запись?

<переменная>= <выражение>;

A) оператор перехода

B) присваевания значения

C) условный оператор

D) оператор выбора

E) оператор цикла

44 Укажите запись к какому оператору относится следующий формат?

if <логическое выражение> <оператор> [ELSE <оператор>;]

A) оператор перехода

B) оператор присваевания

C) условный оператор

D) оператор выбора

E) оператор цикла

45 Укажите запись к какому оператору относится следующая запись

while <логическое выражение> { <оператор>}

A) оператор перехода

B) оператор присваевания

C) оператор цикла с предусловием

D) оператор выбора

E) оператор цикла с параметром

46 Oператор switch

A) оператор перехода

B) оператор присваевания

C) условный оператор

D) оператор выбора

E) оператор цикла

47 Укажите результат

1) Truncate (5.61) 2) Truncate (-5.61)

A) 1) 5 и 2) - 6

B) 1) 6 и 2) - 5

C) 1) 6 и 2) -6

D) 1) 5 и 2) – 5

E) 1) 4 и 2) 6

48 Укажите результат

1. Math.Round (17.96) 2. Math.Round (-17.16)

A) 17 и -17

B) 17 и -18

C) 18 и -18

D) 18 и -17

E) 4 и 6

49 Найти правильное из следующих записей

1. À значение ( 0,3 ) промежутке не подлежит:

( A<= 0) || (A>= 3)

1. A значение ( -2,0 ) промежутке подлежит:

( A>=-2 ) && (A>=0)

A) 1

B) 1 и 2

C) 2

D) 1 и -2

E) 1 3

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

A) switch(x)

{ case 1: Console.Write("Рабочий день");

case 2: Console.Write("Выходной день");

default: Console.Write("Не верный ввод данных"); }

B) switch

{ case 1: Console.Write("Рабочий день"); break;

case 2: Console.Write("Выходной день"); break; }

C) switch(x)

{ case1: Console.Write("Рабочий день"); break;

case2: Console.Write("Выходной день"); break;

default: Console.Write("Не верный ввод данных"); break;}

D) case(x)

{ switch 1: Console.Write("Рабочий день"); break;

switch 2: Console.Write("Выходной день"); break;

default: Console.Write("Не верный ввод данных"); break;}

E) switch(x)

{ case 1: Console.Write("Рабочий день"); break;

case 2: Console.Write("Выходной день"); break; }

51 После выполнения оператора цикла найти значение переменной S

int s,i ; char sim;

1)s =0; for ( i=5; i<7; ++i) ++s;

2)s =0; for (i=10; i>6; --i) ++s;

3) s = 0; for (sim = 'A'; sim < 'D'; ++sim) ++s;

A) 1) 6 2) 5 3) 4

B) 1) 3 2) 4 3) 4

C) 1) 2 2) 4 3) 3

D) 1) 2 2) 5 3) 3

E) 1) 4 2) 2 3) 4

52 Укажите оператор ввода переменной “b” : .

A) b=Console.Read ();

B) Console.Writeln (b);

C) Console.WriteLine (b);

D) b=Console.ReadLn ();

E) Console.WriteLn (b);

53 Найти неправильные условные операторы

1. if (a < b) a = a*a; else b=b * b;

2. if (x and y) s=s+1; else s = s - 1 ;

3. if (k != m) k = m;

4. if 5 then s = s+5;

  1. if ( a == b ) && p then p= p+10.5

A) 3,4,5

B) 1,2 и 3

C) 4 и 5

D) 2, 4 и 5

E) 4,2 и 3

54 Какой из операторов удовлетворяет следующую запись

int x,y;

A) x=3.0 ; y=4;

B) x=’3’; y=’4’;

C) x= not y;

D) x= y+ Math.Pow(3,2);

E) x=y % 3;



55 Укажите правильную запись, после выполнения оператора цикла

int k=0;

while (k<=8)

{ k+=2;

Console.Write (k);}

A) 10 8 6 4 2

B) 2 4 6 8

C) 2 4 6 8 10

D) 10 8 6 4 2

E) 10 5 4 8 2

56 Укажите правильный результат:

double x=0.1,y=-0.2,mm;

if (x > y) mm=y; else mm = x;

Console.Write ( mm);.

A) 0.2

B) 0.1,-0.2

C) -0.1

D) 0.1

E) –0.2

Правильный ответ= E


57 Укажите правильный результат

int n=1000;

Console.Write ( n / 10 );

A) 100

B) 10.00

C) 10

D) 0

E) 1000

58 Укажите правильный результат

char x='c';

Console.Write ('x');

A) c

B) C

C) ‘x

D) x

E) X

59 Укажите правильный результат

string s= "bcbccckk"; int mI,k=0,k1=0;

for( mI=1;mI<8; ++mI)

{

if (s[mI]=='c') ++k;

if (s[mI] =='b') ++k1; }

Console.Write (k+" "+k1);

A) 1 и 3

B) 2 и 2

C) 4 и 1

D) 10 и 8

E) 2 и 4

60 Укажите правильный результат

double x=2.0,y=4.0,z=-0.1;

if ((x >= y) && (y >= z)) x = 2 * x; else y = Math.Abs(y);

Console.Write ("x="+x+"y="+y+"z="+z);

A) x=2, y=4, z=-0.1

B) x=2, y=8, z=-0.1

C) x=4, y=16, z=0.2

D) x=2, y=16, z=-0.4

E) х=5, у=6,z=7

61 Укажите правильный результат

int n= 1000; Console.WriteLine ( n % 23 );

A) 2

B) 11

C) 23

D) 100

E) 10.0

62 Найти неправильно записанное вещественное число

1) 1,81 2) 2.600 3) 0.56 4) 7,77

A) 1 и 4

B) 1 и 2

C) 2 и 4

D) 2 и 4

E) 2 и 1


63 Покажите оператор цикла

A) goto

B) case

C) if

D) while .. do

E) repeat until

64 В каком месте объявляется постоянные

A) до объявления всех переменных программы

B) после объявления переменных программы

C) в строке объявлении переменных процедуры функции

D) в той части программы где постоянная необходима

E) после тела программы

65 Как определяются формальные параметры процедуры

A) введенные в тело процедуры идентификаторы

B) процедура в части объявления операторов

C) переменные объявленные в части программы

D) постоянные в части программы

E) в конце программы

66 Укажите правильную запись оператора присваивания

Если A,I,J,K : целый; X, Y, Z : вещественный; B : логический;

1. X = Y + Math.Sin(z);

2. A = ( XK));

3. X = I + J - B;

4. I = I + K / J;

A) 1 и 3

B) 2 и 4

C) 1 и 2

D) 3 и 4

E) 4 и 1

67 Единица измерения информации

A) бод

B) 1 бар

C) 1 байт

D) 1 литр

E) 1 бит

68 Укажите результат выполнения программы

{ int x=0,y=5;

while (x< 6)

{ y+= x; x+= 2; }

A) 5

B) 6

C) 11

D) 9

E) 10

69 Вычислить и найти значение выражения

a = Math.Truncate(5.67) + Math.Round(6.9);

A) 0

B) 11

C) 12

D) -1

E) –2

70 Описание строковых переменных:

A) string

B) int

C) char

D) double

E) integer

71 Чему равен результат Math.Truncate (5,61)

A) 5

B) 61

C) 6

D) -5

E) 10

72 Чему равен результат? Math.Truncate (-5,61)

A) 5

B) 61

C) 6

D) -5

E) 11

73 Чему равен результат Math.Round (17,96)

A) 17

B) 96

C) 18

D) –18

E) 12

74 int s=0, i=1;

do { s += 1 / i; ++i; } while (i <= 1);

После выполнения оператора найти значение переменной s

A) 1

B) 0

C) -1

D) 2

E) 3

75

После ввода 1, 2, 3 каким будет результат этой программы

int a, b;

a=Convert.ToInt32(Console.ReadLine());

b=Convert.ToInt32(Console.ReadLine());

a=Convert.ToInt32(Console.ReadLine());

Console.Write(a,b,a);

A) 1 2 3

B) 2 3 2

C) 3 2 1

D) 3 2 3

E) 3 3 3

76 Какие результаты выводит данная программа?

int x=2; Console.WriteLine(“x+1”)

A) x+1

B) 2

C) 3

D) 0

E) 1

77

const d=5;

d=Math.Sgr(d);

Console.Writeln(‘d**2=’+d)

В данной программе в каком фрагменте есть ошибки?

A) 3, 4

B) 2, 4

C) 1, 3

D) 1, 2, 3

E) 2,3

78 После выполнения оператора найти значение переменной S.

double s=0.0; int n=1,i;

for ( i=2; is+=1/i;

A) 0

B) 0.5

C) 1.0

D) 0.1

E) 2.8

79 Вычислить и найти значение выражение

0/11 + 36/13 - 4%11

A) 4

B) 2

C) –2

D) –1

E) -3



80 Что получите в результате выполнения следующей программы, если с экрана введут - 16,17 и 26

int P,Q;

P=Convert.ToInt32(Console.ReadLine());

Q=Convert.ToInt32(Console.ReadLine());

P=Convert.ToInt32(Console.ReadLine());

Console. Write (“P+Q=”+( P+Q)+”P =”+ P);

A) 43 16

B) P+Q=43 P=26

C) 33 16

D) P+Q=33 P=17

E) P+Q=43 P=16

81 С использованием условного оператора найти значение функции.hello_html_m7715f01f.gif

A) if (X==0) Y=5*Math.Pow(X,2)+6; else

if ((X>0) && (X<6)) Y=Math.Pow(X,2)-35; else Y=7.1*x-7;

B) if (X<0) Y=5* Pow(X,2)+6; else

if ((X>0) && (X<6)) Y= Pow(X,2)-35; else Y=7.1*x-7;

C) if (X<0) Y=5*Math.Pow(X,2)+6; else

if ((X>0) && (X<6)) Y=Math.Pow(X,2)-35; else Y=7.1*x-7;

D) if (X<0) Y=5 Math.Pow(X,2)+6; else

if ((X>0) && (X<6)) Y= Pow(X,2)-35; else Y=7.1 x-7;

E) if (X<0) then Y=5*Math.Pow(X,2)+6; else

if ((X>0) && (X<6)) Y=Math.Pow(X,2)-35; else Y=7.1*x-7;

82 b=a. Если а-целый тип, тогда b какой тип:

A) bool

B) int

C) string

D) char

E) integer

83 Укажите правильный вариант условного операторa:

A) if условие

Операторы

else

{Операторы};

B) if условие then {

Операторы

Else

операторы

};

C) if условие {

Операторы

Else { Операторы};

D) if (условие )

Оператор;

else { Операторы};

E) if условие then {

Операторы

Else { }

84 Как описывается постоянное число:

A) const int n=5;

B) const n=5;

C) const n=5 int;

D) const n=5;

E) const n=7;

85 Какое условие верно для элементов главной диагонали матрицы A[n,n]={hello_html_m4acb5764.gif}:

A) i+j= =n+1

B) i

C) i= =j

D) i>j

E) j>i

86 Какое условие верно для элементов побочной диагонали матрицы A[n,n]={hello_html_m4acb5764.gif}:

A) i+j==n+1

B) i

C) i==j

D) i>j

E) j>i

87 Какое условие верно для элементов матрицы расположенных выше главной диагонали A[n,n]={hello_html_m4acb5764.gif}:

A) i+j==n+1

B) i

C) i==j

D) i>j

E) j>i



88 Какое условие верно для элементов матрицы расположенных ниже главной диагонали A[n,n]={hello_html_m4acb5764.gif}:

A) i+j==n+1

B) i

C) i==j

D) i>j

E) j<i

89 Укажите фрагмент программы для F=N!.

A)

F=1;

for (int i=1; i

. . .

B)

F=0;

for (int i=1; i

. . .

C)

F=1;

for (int i=1; i

. . .

D)

F=1;

for (int i=1; i


E) F=F*(N+1)

90 Укажите фрагмент программы для S=hello_html_m2ee1f54a.gif:

A)

S=1;

for (int i=1; i

. . .

B)

S=0;

for (int i=1; i

. . .

C)

S=1;

for (int i=1; i

. . .

D)

S=1;

for (int i=1; i


E) F=F*(N+1)

91Укажите фрагмент программы для вывода чисел от 1 до 10:

A)


for (int i=1; i<10; ++i){

K=i;

Console.WriteLine( K );

}

. . .

B)

for (int i=0; i<10; ++i){

K=i;

Console.WriteLine( K );

}

. . .

C)

for (int i=1; i<11; ++i){

K=i;

Console.WriteLine( K );

}

. . .

D) Console.WriteLine( 2*i );

E) :

for (int i=1; i>11; ++i){

K=i;

Console.WriteLine( K );

}

92 Укажите фрагмент программы для вывода четных чисел от 2 до 20:

A)

for (int i=0; i<20; ++i){

K=2*i;

Console.WriteLine( K );

}

. . .

B)

for (int i=1; i<11; ++i){

K=2*i;

Console.WriteLine( K );

}

. . .

C)

for (int i=1; i<11; ++i){

K=i;

Console.WriteLine( K );

}

. . .

D) for (int i=1; i<11; i+=2){

K=i;

Console.WriteLine( K );

}

93 Укажите фрагмент программы для вывода нечетных чисел от 1 до 21:

A)

for (int i=0; i<21; ++i){

K=2*i-1;

Console.WriteLine( K );

}

. . .

B)

for (int i=1; i<11; ++i){

K=2*i-1;

Console.WriteLine( K );

}

. . .

C)

for (int i=1; i<11; ++i){

K=i;

Console.WriteLine( K );

}

. . .

D)

K=2*i-1;

Console.WriteLine( K );

E) :

for (int i=1; i<11; i+=2){

K=i-1;

Console.WriteLine( K );

}

94 Укажите фрагмент программы для вывода квадратов чисел от 1 до 10

A)

for (int i=1; i<11;++i) {

K=Math.Pow(i,2);

Console.WriteLine(K);

}

. . .

B)

for (int i=0; i<10;++i) {

K=Math.Pow(i,2);

Console.WriteLine(K);

}

. . .

C)


for (int i=1; i<11;++i) {

K=SQR(i);

Console.WriteLine(K);

}

. . .

D)

for (int i=1; i>11;++i) {

K=Math.Pow(2,i);

Console.WriteLine(K);

}

. . .


95 Укажите правильную запись на C#hello_html_m723ab425.gif.

A) a+2*x-a+b*x/3

B) a+x*x-(a+b*x)/3

C) (a+x*2)-a+bx/3

D) a+SQR(x)-a+b*x/3

E) a+2*x-a+b*x/3

96 Если X=7, Y=15, Z=11, R=450,08 Укажите результат работы оператора

Console.Write (X+””+Y);

A) 7 11

B) X =7

C) 7_,_15

D) 7 15

E) 7^11

97 Если X=7, Y=15, Z=11, R=450,08 Укажите результат работы оператора Console.Write (X+”_,_”+Y);

A) 7 11

B) X =7

C) 7_,_15

D) 715

E) 7,15



98 Если X=7, Y=15, Z=11, R=450,08 Укажите результат работы оператора Console.Write (“X=”+X);

A) 7 11

B) X =7

C) 7_,_15

D) 715

E) 455

99 Если X=7, Y=15, Z=11, R=450,08 Укажите результат работы оператора Console.Write (“X+Y=”+(X+Y));

A) 11- результат

B) X+Y =22

C) end

D) 450,08

E) 555

100 Если X=7, Y=15, Z=11, R=450,08 Укажите результат работы оператора Console.Write (Z+”- результат”);

A) 11- результат

B) X+Y =22

C) end

D) 450,08

E) 666

101 Если X=7, Y=15, Z=11, R=450,08 Укажите результат работы оператора Console.Write (“end “);

A) 11- результат

B) X+Y =22

C) end

D) 450,08

E) 45

102 Если X=7, Y=15, Z=11, R=450,08 Укажите результат работы оператора Console.Write (R);

A) 11- результат

B) X+Y =22

C) end

D) 450,08

E) 33

103 Укажите результат 20 % 7 + 5 / 4*2

A) 0

B) 11

C) 2

D) 8

E) 33

104 Укажите результат 48 % (2+3) / 4

A) 0

B) 11

C) 2

D) 8

E) 10

105 Укажите результат ((24 % 7+5) / 4)*2:

A) 4

B) 11

C) 2

D) 8

E) 10

106 Укажите результат 16 % (7+9) / 3*2

A) 0

B) 11

C) 2

D) 8

E) 10

107 Укажите результат Х : (x целое число)

x / 5 = x %5

A) 30

B) 45

C) 43

D) 12

E) 10

108 Укажите результат Х: (x целое число)

20 / x = 20 % x

A) 0

B) 10

C) 19

D) 12

E) 11

109 Укажите результат Х: (x целое число)

x / 5 = 8

A) 30

B) 75

C) 53

D) 42

E) 12

110 Укажите результат Х:

50 % x = 7

A) 3

B) 7

C) 43

D) 1

E) 13


111 Каковы значения Х и У после выполнения:

int x=15 / (8 % 3);

int y=17 % x*5-19 % 6*2;

A) x=7; y=13

B) x=7; y=4

C) x=12; y=7

D) x=1; y-7

E) x=5

112 Каковы значения Х и У после выполнения:

int x=2*5 / 3 % 2;

int y=2*5 /(3 % 2);

x*=y; y=y*y ;

A) x=10; y=10

B) x=7; y=49

C) x=12; y=144

D) x=10; y=100

E) x=11


113

После выполнения фрагмента программы , чему будет равно число Х

int x=5;

if (x>=5) x*=2; else if (x<=10) x*=-1;

x*=5;

A) x= 5

B) x=10

C) x=-5

D) x=50

E) x=8

114 После выполнения фрагмента программы , X будет равно числу

int x=5;

if (x>=5) x*=2; else if (x<=10) x*=-1;

A) x= 5

B) x=10

C) x=-5

D) x=-10

E) x=22

115 После выполнения фрагмента программы , чему будет равно число А и В

int a=1, b=2;

if (a

a+=2;

else if (a>b)

b+=2;

A) a= 2; b=5

B) a=10; b=2

C) a=-2; b=4

D) a=2; b=2

E) a=6

116 После выполнения фрагмента программы , будет равно числу Аи В?

int a=1, b=2;

if (a>b) a+=1; else a=b;

A) a= 2; b=2

B) a=2; b=1

C) a=2; b=4

D) a=1; b=2

E) a=7

117 После выполнения фрагмента программы , А и В будет равно числу

int a=12, b=2;

if (a

A) a=12; b=2

B) a=22; b=12

C) a=12; b=4

D) a=24; b=2

E) a=8

118 После выполнения фрагмента программы , А и В равна

int a=2, b=4;

if (a

a+=2;

else if (a>b)

b+=2

A) a=2; b=5

B) a=10; b=2

C) a=-2; b=4

D) a=4; b=4

E) a=7

119 Вычислите значение S.

int S=0, I=1;

while (I<10){

S+=(2*I+1);

I+=2};

A) 52

B) 55

C) 75

D) 65

E) 33

120 Сколько раз выполнится тело цикла

int N=0;

for (int I=1;I<3*N+4;++I)

N+=2;

A) 2

B) 5

C) 4

D) 3

E) 11

121 Укажите правильный вариант записи.

A) int[10] b=new int[];

B) int[] b=new int[10];

C) int[] b=new int[0..10];

D) integer[] b=new integer[10];

E) new int[] b=int[10];

122 Дана матрица A[10,10]. Построить массив B[10]по следующему правилу: элементы B[0]- сумма элементов 0-ой строки, B[1]-сумма элементов 1-ой строки.

A) for (int I=0; I<10; ++I) {

for (int J=0; J<10; ++J) {

B[I]+=A[I,J];

}

Console.WriteLine(B[I]);

}

B) for (int i=0; i<10; ++i) {

for (int j=0; j<10; ++j) {

B[I]+=A[I,J];

}

Console.WriteLine(B[J]);

}

C) for (int I=0; I<10; ++I) {

for (int J=0; J<10; ++J) {

B[I]=A[I,J];

}

Console.WriteLine(B[I]);

}

D) for (int I=0; I<10; ++I) {

for (int J=0; J<10; ++J) {

B[i]+=A[i,j];

}

Console.WriteLine(B[i]);

}

E) for (int J=1; J<10; ++J) {

for (int I=1; I<10; ++I) {

B[I]+=A[I,J];

}

Console.WriteLine(B[I]);

}

123 Дана матрица A [12,12]. Найти максимальный элемент матрицы.

A) int MAX=A[1,1];

for (int I=0; I<13; ++I)

for (int J=0; J<13; ++J)

if (A[I,J]

B) int MAX=A[1,1];

for (int I=1; I<12; ++I)

for (int J=1; J<12; ++J)

if (A[I,J]>MAX) MAX=A[I,J];

C) int MAX=A[1,1];

for (int I=0; I<13; ++I)

for (int J=0; J<13; ++J)

if (A[I,J]>MAX) MAX=A[I,J];

D) int MAX=A[1,1];

for (int I=1; I<12; ++I)

for (int J=1; J<12; ++J)

if (A[I,J]

E) int MAX=A[1,1];

for (int I=1; I<13; ++I)

if (A[I,J]>MAX) MAX=A[I,J];


124 Дана матрица A[12,12]. Присвоить нечетным столбцам отрицательные значения.

A) for (int i=1; i<13; ++i )

for (int j=1; j<13; ++j )

A[i,2*j]*=-1;

B) for (int i=1; i<12; ++i )

for (int j=1; j<12; ++j )

A[i,2*j]*=-1;

C) for (int i=1; i<12; ++i )

for (int j=1; j<6; ++j )

A[i,2*j-1]*=-1;

D) for (int i=0; i<13; ++i )

for (int j=0; j<7; ++j )

A[i,2*j-1]*=-1;

E) for (int i=1; i<13; ++i )

for (int i=1; i<7; ++i )

A[i,2*j+1]*=-1;

125 Что выведет данный фрагмент

public int Q( int X; int Y)

{

return X+Y ;


}

Основная программа

int C = 2, D = 0; int P=Q(C,D) ; Console.Write(P);

A) 2

B) 0

C) 5

D) 10

E) 11

126 Если L-целый, S-постоянный, P-действительный тип, тогда как описываются эти переменные

A) int p: double l; const int s=2;

B) int const s=2; int L; double P;

C) const s=2; int L; double P;

D) const int s=2; int L; double P;

E) s=2 const; int L; double P;

127 Укажите правильный оператор цикла:

A) while условие do

{Операторы};

B) while (условие)

{Операторы }

C) while условие do

Операторы

end;

D) while условие do

Операторы

end;

E) while условие do

Операторы

128 Укажите правильный оператор цикла:

A) do

{Операторы}

while (условие);

B) while

Операторы

do условие;

C) repeat

{Операторы

until условие;

}

D) do

Операторы

while условие;

E) while условие do

{операторы}

129 Укажите оператор ввода переменной “a”:

A) Read (a)

B) Write (a)

C) Input a

D) Print a

E) Label a

130 Укажите оператор вывода переменной “a”:

A) Read (a)

B) Write (a)

C) Input a

D) Print a

E) Label a

131 Укажите правильное описание функции hello_html_73587bda.gif

A) Tan(X)

B) TGx

C) Atan(x)

D) Math.Sin(x)/Math.Cos(x)

E) Math.Artan(x)

132 Модуль числа X:

A) Sqr(x)

B) Sqrt(x)

C) Mod(x)

D) Abs(x)

E) Sin(x)/Cos(x)

133 Квадрат числа X:

A) Math.Pow (x,2)

B) Sqr(x)

C) Mod(x)

D) Abs(x)

E) Sin(x)/cos(x)

134 Корень квадратный числа X:

A) Sqr(x)

B) Sqrt(x)

C) Mod(x)

D) Abs(x)

E) Sin(x)/cos(x)

135 Остаток от деления числа x на b:

A) x%b

B) x div b

C) x/b

D) abs(x,b)

E) x mod b

136 Укажите правильное описание возведение х в степень а:

A) sqrt(x,a)

B) Pow(x,a)

C) asqrt(a,x)

D) exp(x,a)

E) Pow(a,x)

137 Какой знак ставится в конце каждого оператора:

A) :

B) ;

C) /

D) \

E) *

138 Возведение числа в квадрат:

A) **

B) ^

C)pow(x,2)

D) sqrt

E) *


139 Целочисленное деление числа A на B:

A) A / B

B) A % B

C) A chr B

D) A and B

E) A orx B

140 Остаток от деления числа A на B:

A) A / B

B) A % B

C) A chr B

D) A || B

E) A && B

141 Если À=5 , Console.Write (“BC =”+A) ; Тогда что выйдет на экран:

A) A=5

B) B=A+C

C) B – C=5

D) B – C=A

E) A and B

142 j=10, A[10]=45 , Console.Write (“A(“+j+”)=”+A[10]); Что выйдет на экран монитора:

A) A[j]=45

B) 45

C) 10

D) А(10)=45

E) 15

143 Что выйдет на экран в результате выполнения программы:

A=5; B=19;

C=A+B;

Console.Write (C)

A) 5

B) 19

C) 24

D) 0

E) 15

144 Что выйдет на экран в результате выполнения программы:

A=15; B=30; C=0;

Console.Write (C)

C=A+B;

A) 15

B) 45

C) 0

D) 30

E) 20


145 Что выйдет на экран в результате выполнения программы:

A=5; B=19; C=3;

C*=A;

Write (C)

A) 19

B) 5

C) 24

D) 15

E) 20

146 Что выйдет на экран в результате выполнения программы:

S=0;

For (int j=1; i<5; ++i) S+=j;

Console.Write (S);

A) 0

B) 5

C) 15

D) 6

E) 20

147 Выберите вариант при котором X будет четным:

A) X=2*a-1

B) X=2*a

C) X=2*a+1

D) X=3*a

E) X=(3*a)

148 Выберите вариант при котором X будет нечетным(а=1:N):

A) X=2*a-1

B) X=2*a

C) X=2*a+1

D) X=3*a

E) X=3*a)

149 Выберите вариант при котором остаток от деления будет равен 0,если Х=51:

A) Х % 3=0

B) abs(x/3)=0

C) sqrt(x/3)=0

D) X/3=0

E) X=3*a

150 Выберите вариант при котором X будет положительным:

A) X=sqrt(x)-1

B) X=len(x)

C) X=abs(x)

D) X=pow(x,3)

E) X=3*a




СОДЕРЖАНИЕ




ВВЕДЕНИЕ


Глава 1.

Основы программирования на языке С#


1.1 Элементы языка C#.....................................................................


1.2 Переменные.................................................................................


1.2.1 Типы данных……………………………………………….


1.2.2 Арифметические операции……………………………….


1.2.3 Логические операции…………………………………….


1.2.4 Математические операции……………………………….


1.3 Управляющие структуры языка C#…………………………….


1.3.1 Структура выбора if/else………………………………….


1.3.2 Тернарная структура выбора…………………………….


1.3.3 Оператор выбора………………………………………….


1.3.4 Операторы повторений……………………………………


1.4 Массивы.....................................................................................


1.4.1 Одномерные массивы......................................................


1.4.2 Многомерные массивы......................................................


1.5 Функции.....................................................................................


1.6 Строки...............................................................................................


Глава 2.

Объектно-ориентированное программирование


2.1 Введение в объектно-ориентированное программирование.......


2.1.1 Классы и объекты.................................................................


2.1.2 Конструкторы и деструкторы..............................................


2.1.2 Наследование......................................................................


2.1.3 Полиморфизм........................................................................


2.2 Файловый ввод-вывод....................................................................


2.3 Обработка исключительных ситуаций..........................................


Приложение А. Задачник


Приложение Б. Тесты















1

95



Автор
Дата добавления 27.11.2015
Раздел Информатика
Подраздел Конспекты
Просмотров419
Номер материала ДВ-200378
Получить свидетельство о публикации

Похожие материалы

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