русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Практикум


Дата добавления: 2013-12-23; просмотров: 1996; Нарушение авторских прав


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

Пример:

1. using System;namespace Hello{ class Program { static void Main() { Console.Write("x="); float x = float.Parse(Console.ReadLine()); Console.Write("y="); float y = float.Parse(Console.ReadLine()); if (x * x + y * y < 9 && y > 0) Console.WriteLine("внутри"); else if (x * x + y * y > 9 || y < 0) Console.WriteLine("вне"); else Console.WriteLine("на границе"); } }}

2. Дан порядковый номер дня недели, вывести на экран его название.

Пример:

using System;namespace Hello{ class Program { static void Main() { Console.Write("n="); byte n = byte.Parse(Console.ReadLine()); switch (n) { case 1: Console.WriteLine("понедельник"); break; case 2: Console.WriteLine("вторник"); break; case 3: Console.WriteLine("среда"); break; case 4: Console.WriteLine("четверг"); break; case 5: Console.WriteLine("пятница"); break; case 6: Console.WriteLine("суббота"); break; case 7: Console.WriteLine("воскресенье"); break; default: Console.WriteLine("ВЫ ОШИБЛИСЬ"); break; } } }}

3. Вывести на экран, используя операторы цикла while, do while и for,целые числа 1, 3, 5, …, 21 в строчку через пробел:

Пример:

using System;namespace Hello{ class Program { static void Main() { Console.Write("n="); byte n = byte.Parse(Console.ReadLine()); Console.Write("while: "); int i = 1; while (i <= n) { Console.Write(" " + i); i += 2; } Console.Write("do while: "); i = 1; do{Console.Write(" " + i);i += 2;}while (i <= n); Console.Write("For: ");for (i = 1; i<=n; i+=2) { Console.Write(" " + i); } } }}

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



Пример:

1)
 
 
 
             
using System;namespace Hello{ class Program { static void Main() { for (int i = 1; i<=4; ++i, Console.WriteLine()) { for(int j=1; j<=6; ++j) Console.Write(" " + i); } } }}

Самостоятельная работа

Задача 1.Дана шахматная доска размером n×n клеток. Верхняя левая клетка доски черная и имеет номер (1, 1). Например, для n=4 шахматная таблица выглядит следующим образом:

 
       
       
       
       
  1. для заданного значения n определить количество черных ячеек шахматной доски;
  2. по номеру ячейки (k, m) определить ее цвет;
  3. определить, являются ли ячейки с номерами (k1, m1) и (k2, m2) одного цвета;
  4. определить, находится ли фигура, стоящая в ячейке с номером (k1, m1), под ударом второй фигуры, стоящей в ячейке с номером (k2, m2), при условии, что ход второй фигуры и ей является:
    • пешка;
    • слон;
    • ладья;
    • ферзь;
    • конь.

Задача 2. Задана дата в формате <день>.<месяц>.<год>. Определить:

  1. сколько дней прошло с начала года;
  2. сколько дней осталось до конца года;
  3. дату предыдущего дня;
  4. дату следующего дня.

Задача 3.Натуральное число из n цифр является числом Армстронга, если сумма его цифр, возведенных в n-ную степень, равна самому числу. Например, 153=13+53+33. Найти все трехзначные числа Армстронга.

Задача 4.Стороны прямоугольника заданы натуральными числами n и m. Найти количество квадратов (стороны которых выражены натуральными числами), на которые можно разрезать данный прямоугольник, если от него каждый раз отрезать квадрат: наименьшей площади; наибольшей площади.


Лекция 5. Методы: основные понятия. Перегрузка методов

5.1 Методы: основные понятия

Метод – это функциональный элемент класса, который реализует вычисления или другие действия, выполняемые классом или его экземпляром (объектом). Метод представляет собой законченный фрагмент кода, к которому можно обратиться по имени. Он описывается один раз, а вызываться может многократно. Совокупность методов класса определяет, что конкретно может делать класс. Например, стандартный класс Math содержит методы, которые позволяют вычислять значения математический функций.

Синтаксис метода:

[атрибуты] [спецификторы] тип_возвращаемого_результаты имя_метода ([список_параметров]){тело_метода;return значение}

где:

  1. Атрибуты и спецификторы являются необязательными элементами синтаксиса описания метода. На данном этапе атрибуты нами использоваться не будут, а из всех спецификаторов мы в обязательном порядке будем использовать спецификатор static, который позволит обращаться к методу класса без создания его экземпляра.

Замечание.Остальные спецификаторы мы рассмотрим в разделе "классы".

  1. Тип_возвращаемого_результата определяет тип значения, возвращаемого методом. Это может быть любой тип, включая типы классов, создаваемые программистом. Если метод не возвращает никакого значения, необходимо указать тип void (в этом случае в теле метода отсутсвует оператор return).
  2. Имя_метода – идентификатор, заданный программистом с учетом требований, накладываемыми на идентификаторы в С#, отличный от тех, которые уже использованы для других элементов программы в пределах текущей области видимости.
  3. Список_параметров представляет собой последовательность пар, состоящих из типа данных и идентификатора, разделенных запятыми. Параметры — это переменные или константы, которые получают значения, передаваемые методу при вызове. Если метод не имеет параметров, то список_параметров остается пустым.
  4. Значение определяет значение, возвращаемое методом. Тип значения должен соответствовать типу_возвращаемого_результата или приводится к нему.

Рассмотрим простейший пример метода:

class Program { static void Func() //дополнительный метод { Console.Write("x= "); double x=double.Parse(Console.ReadLine()); double y = 1 / x; Console.WriteLine("y({0})={1}", x,y ); } static void Main() //точка входа в программу { Func(); //первый вызов метода Func Func(); //второй вызов метода Func } }

В даном примере в метод Func не передаются никакие значения, поэтому список параметров пуст. Кроме того метод ничего не возвращает, поэтому тип возвращаемого значения void. В основном методе Main мы вызвали метод Func два раза. Если будет необходимо, то данный метод можно будет вызвать еще столько раз, сколько потребуется для решения задачи.

Задания.

  1. Добавьте в метод Main третий вызов метода Func.
  2. 2. Преобразуйте программу так, чтобы метод Func вызывался n раз.

Изменим исходный пример так, чтобы в него передавалось значение х, а сам метод возвращал значение y.

class Program { static double Func( double x) //дополнительный метод { return 1 / x; //Возвращаемое значение } static void Main() //точка входа в программу { Console.Write("a="); double a=double.Parse(Console.ReadLine()); Console.Write("b="); double b=double.Parse(Console.ReadLine()); for (double x = a; x <= b; x += 0.5) { double y = Func(x); //вызов метода Func Console.WriteLine("y({0:f1})={1:f2}", x, y); } }

В данном примере метод Func содержит параметр х, тип которого double. Для того, чтобы метод Func возвращал в вызывающий его метод Main значение выражения 1/x (тип которого double), перед именем метода указывается тип возвращаемого значения – double, а в теле метода используется оператор передачи управления – return. Оператор return завершает выполнение метода и передает управление в точку его вызова.

Задания. Преобразуйте программу так, чтобы метод Func возвращал значение выражения:

  1. x2;

Рассмотрим другой пример:

class Program { static int Func( int x, int y) //строка 1 { return (x>y)? x:y; } static void Main() { Console.Write("a="); int a = int.Parse(Console.ReadLine()); Console.Write("b="); int b = int.Parse(Console.ReadLine()); Console.Write("c="); int c = int.Parse(Console.ReadLine()); int max = Func(Func(a, b), c); //строка 2 - вызовы метода Func Console.WriteLine("max({0}, {1}, {2})={3}", a, b, c, max); } }

В данном примере метод Func имеет два целочисленных параметра – x, y, а в качестве результата метод возвращает наибольшее из них. На этапе описания метода (строка 1) указываются формальные параметры, на этапе вызова (строка 2) в метод передаются фактические параметры, которые по количеству и по типу совпадают с формальными параметрами. Если количество фактических и формальных параметров будет различным, то компилятор выдаст соответствующее сообщение об ошибке. Если параметры будут отличаться типами, то компилятор попытается выполнить неявное преобразование типов. Если неявное преобразование невозможно, то также будет сгенерирована ошибка.

Обратите внимание на то, что при вызове метода Func использовалось вложение одного вызова в другой.

Задание. Преобразуйте программу так, чтобы с помощью метода Func можно было найти наибольшее значение из четырех чисел: a, b, c, d. Метод Func при этом не изменять.

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

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

Замечание. Все примеры, рассмотренные ранее, использовали передачу данных по значению.

Рассмотрим небольшой пример:

class Program { static void Func(int x) { x += 10; // изменили значение параметра Console.WriteLine("In Func: " + x); } static void Main() { int a=10; Console.WriteLine("In Main: "+ a); Func(a); Console.WriteLine("In Main: " + a); } }

Результат работы программы:

In Main: 10 In Func: 20In Main: 10

В данном примере значение формального параметра х было изменено в методе Func, но эти изменения не отразились на фактическом параметре а метода Main.

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

class Program { static void Func(int x, ref int y) { x += 10; y += 10; //изменение параметров Console.WriteLine("In Func: {0}, {1}", x, y); } static void Main() { int a=10, b=10; // строка 1 Console.WriteLine("In Main: {0}, {1}", a, b); Func(a, ref b); Console.WriteLine("In Main: {0}, {1}", a, b); } }

Результат работы программы:

In Main: 10 10 In Func: 20 20In Main: 10 20

В данном примере в методе Func были изменены значения формальных параметров х и y. Эти изменения не отразились на фактическом параметре а, т.к. он передавался по значению, но значение b было изменено, т.к. он передавался по ссылке.

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

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

class Program { static void Func(int x, out int y) { x += 10; y = 10; // определение значения выходного параметра y Console.WriteLine("In Func: {0}, {1}", x, y); } static void Main() { int a=10, b; Console.WriteLine("In Main: {0}", a); Func(a, out b); Console.WriteLine("In Main: {0}, {1}", a, b); } }

Результат работы программы:

In Main: 10 In Func: 20 10In Main: 10 10

В данном примере в методе Func формальный параметр y и соответствующий ему фактический параметр b метода Main были помечены спецификатором out. Поэтому значение b до вызова метода Func можно было не определять, но изменение параметра y отразились на изменении значения параметра b.

Замечание. Параметры-массивы будут рассмотрены позже.

5.2 Перегрузка методов

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

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

class Program { static int max(int a) //первая версия метода max { int b = 0; while (a > 0) { if (a % 10 > b) b = a % 10; a /= 10; } return b; } static int max(int a, int b) //вторая версия метода max { if (a > b) return a; else return b; } static int max(int a, int b, int c) //третья версия метода max { if (a > b && a > c) return a; else if (b > c) return b; else return c; } static void Main() { int a = 1283, b = 45, c = 35740; Console.WriteLine(max(a)); Console.WriteLine(max(a, b)); Console.WriteLine(max(a, b, c)); } }

При вызове метода max компилятор выбирает вариант, соответствующий типу и количеству передаваемых в метод аргументов. Если точного соответствия не найдено, выполняются неявные преобразования типов в соответствии с общими правилами. Если преобразование невозможно, выдается сообщение об ошибке. Если выбор перегруженного метода возможен более чем одним способом, то выбирается "лучший" из вариантов (вариант, содержащий меньшие количество и длину преобразований в соответствии с правилами преобразования типов). Если существует несколько вариантов, из которых невозможно выбрать лучший, выдается сообщение об ошибке.

Перегрузка методов является проявлением полиморфизма, одного из основных свойств ООП. Программисту гораздо удобнее помнить одно имя метода и использовать его для работы с различными типами данных, а решение о том, какой вариант метода вызвать, возложить на компилятор. Этот принцип широко используется в классах библиотеки .NET. Например, в стандартном классе Console метод WriteLine перегружен 19 раз для вывода величин разных типов.



<== предыдущая лекция | следующая лекция ==>
Оператор перехода к следующей итерации цикла continue | Теоретический материал


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.006 сек.