Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа 12 МЕТОДЫ 1 Цель и порядок работы Цель работы ' познакомиться с правилами организац

Работа добавлена на сайт samzan.net:


Лабораторная работа № 12

МЕТОДЫ

1 Цель и порядок работы

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

Порядок выполнения работы:

  •  ознакомиться с описанием лабораторной работы;
  •  получить задание у преподавателя по вариантам;
  •  написать программу, использующую в соответствии с заданием методы пользовательского класса;
  •  ввести программу, отладить и выполнить ее на ЭВМ;
  •  оформить отчет.

2 Общие сведения

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

2.1 Описание метода

Ниже представлено синтаксическое описание метода, где определены основные его элементы:

[ атрибуты ] [ спецификаторы ] тип имя_метода ( [ параметры ] )

   тело_метода

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

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

Тело метода, как правило, представляет собой блок — последовательность операторов в фигурных скобках.

Обязательными элементами описания метода являются имя метода, его тип, а также тело метода.

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

Тип вычисляемого методом значения указывается явно перед именем метода. Работа метода завершается выполнением оператора return, расположенного в теле метода и порождающего возврат в то место вызывающего блока, откуда он был вызван. При этом в точку возврата передается вычисленное в процессе выполнения метода значение.

Если метод не возвращает никакого значения, в его заголовке должен присутствовать тип void, а оператор return в теле метода - отсутствовать.

Спецификаторы, используемые при описании методов, и их смысл совпадают с уже рассмотренными в предыдущей теме спецификаторами для полей. В эту совокупность добавлены спецификаторы virtual, sealed, override, abstract и extern.

Поскольку методы – это те члены класса, которые ориентированы на применение пользователями, их спецификатор доступа, как правило, задается public. 

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

public double Gety()           

  {

      return y;

  }

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

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

Вызов метода осуществляется следующим образом:

имя_метода ( [ аргументы ] )

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

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

public static double Sin( double a );

Конструкция:

имя_метода ( [ параметры ] )

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

Например, чтобы вычислить значение синуса для вещественной величины х, она передается в метод Sin класса Math в качестве аргумента:

double х = 0.1;

double у = Маth.Sin(х);

При этом метод Sin возвращает в точку своего вызова вещественное значение синуса, которое присваивается переменной у.

В листинге 1 в класс Demо добавлены методы установки и получения значения поля у (на самом деле для подобных целей используются не методы, а свойства, которые рассматриваются чуть позже). Кроме того, статическое поле s закрыто, то есть определено по умолчанию как privatе, а для его получения описан метод Gets, являющий собою пример статического метода.

Листинг 1- Простейшие методы 

using System;

namespace ConsoleApplication1

{    

         class Demo

          {       

               рublic int a= 1;          

               рublic const double с = 1.66;       

              static string s = "Demо";        

              double у;

               рublic double Getу( )                      / / метод получения поля у

               {

                     return у;

               }

              рublic void Sety( double у_ )               / / метод установки поля у

              {

                   y = y_;

               }

               рublic static string Gets( )                / / метод получения поля s

               {

                     return s;

               }

          }

    class Class1      {   static void Main( )

        {

            Demo x = new Demo( );

            x.Sety(0.12);                                  / / вызов метода установки поля у

            Соnsole.WriteLine( х.Getу( ) );            / / вызов метода получения поля у     

            Соnsole.WriteLinе( Demo.Gets( ) );   / / вызов метода получения поля s 

            Соnsole.WriteLine( Gets( ) );      / / при вызове из др. метода этого объекта

           }

       }

 }

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

При вызове метода из другого метода того же класса имя класса/экземпляра можно не указывать.

2.2 Параметры методов

При вызове метода выполняются следующие действия:

  1.  Вычисляются выражения, стоящие на месте аргументов.
  2.  Выделяется память под параметры метода в соответствии с их типом.
  3.  Каждому из параметров сопоставляется соответствующий аргумент.
  4.  Выполняется тело метода.
  5.  Если метод возвращает значение, оно передается в точку вызова; если метод имеет тип void, управление передается на оператор, следующий после вызова.

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

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

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

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

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

  •  параметры-значения;
  •  параметры-ссылки — описываются с помощью ключевого слова ref;
  •  выходные параметры — описываются с помощью ключевого слова оut;
  •  параметры-массивы — описываются с помощью ключевого слова рarams.

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

Листинг 2- Передача параметров методу

using System;

namespace ConsoleApplication1

{        class Class1

         {

               static int Max( int a, out int b )  / / метод выбора максимального значения

                {

                      if ( а > b ) return а;                   

                     еlse            return b;

                }

                static void Main( )

                {

                      int a = 2, b = 4;

                      int x =  Мах( а, b );              / / вызов метода Мах

                      Соnsole.WriteLine( х );            / / результат: 4

                      short t1 =  3, t2 = 4;

                      int у = Мах( t1,  t2 );            / / вызов метода Мах

                      Соnsole.WriteLinе( у );            / / результат: 4

                      int z = Мах( а + t1,  t1 / 2 * b );   / / вызов метода Мах    

                     Соnsole.WriteLine( z );                / / результат: 5

                   }

             }

      }

В классе описан метод Мах, который выбирает наибольшее из двух переданных ему значений. Параметры описаны как а и b. В методе Main выполняются три вызова Мах. В результате первого вызова методу Мах передаются два аргумента того же типа, что и параметры, во втором вызове — аргументы совместимого типа, в третьем — выражения.

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

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

Параметры-значения

Параметр-значение указывается в заголовке метода своим типом и именем. Имя параметра может быть произвольным. Параметр-значение представляет собой локальную переменную, которая получает свое значение из вызывающего блока при вызове метода. Например, заголовок метода, имеющего один параметр-значение целого типа, может иметь вид:

void В( int  z );

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

Например, пусть в вызывающей функции описаны переменные и им до вызова метода присвоены значения:

int          х = 1;

sbyte     с = 1;

Тогда вызов метода В, заголовок которого был описан ранее, может быть осуществлен, например, так:

В( х );       В(  с  );          В(  10  );         В(  х  + 2*с  );

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

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

Основное достоинство способа передачи параметров по значению — защита значений переменных в вызывающем блоке от непреднамеренных изменений. Недостаток его — увеличение объёма используемой памяти.

Параметры-ссылки

Передача по ссылке является вторым способом передачи параметров. В таком случае в метод передается ссылка на аргумент, а не сам аргумент. Следует учитывать, что  сама ссылка передается по значению, то есть копируется. Внутри метода эта ссылка используется для доступа к области памяти, в которой хранится аргумент. Такая передача называется передачей  «по ссылке», а параметры, переданные посредством ссылки, называются параметрами-переменными или параметрами - ссылками.

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

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

Способ передачи параметра по адресу устанавливает программист в заголовке метода следующим образом: имени параметра-ссылки в заголовке метода перед описанием параметра должно предшествовать ключевое слово ref:

ref тип имя

Пример заголовка метода, имеющего один параметр-ссылку целого типа:       void В( ref int z );

Строго говоря, методы, которые результатом своей работы имеют лишь одну величину, возвращают ее в вызывающий блок с помощью оператора return. Этот вариант намного проще, так как не требует работы с параметрами-ссылками.

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

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

Проиллюстрируем передачу параметров-значений и параметров-ссылок на примере (листинг 3).

Листинг 3- Параметры-значения и параметры-ссылки

using System;

namespace ConsoleApplication3

{

   class Program

   {

       static void Prim(int w, ref int z)

       {

           w = 5; z = w;

           Console.WriteLine("внутри метода Prim: w="+w+"  z="+z);

       }

       static void Main()

       {

           int w = 1, z = 2;

           Console.WriteLine("до вызова Prim: w=" + w + "  z=" + z);

           Prim(w, ref z);

           Console.WriteLine("после завершения работы Prim: w=" + w + "  z=" + z);

       }

   }

}

Суть этой простой программы заключается в следующем: в методе Main задаются начальные значения двух переменных int w = 1, z = 2;

Затем вызывается объявленный ранее в данном классе метод Prim, в котором значения переменных становятся равными:   w = 5; z = w;

После завершения работы метода Prim вновь проверяются значения переменных.

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

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

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

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

Выходные параметры

Довольно часто возникает необходимость в методах, которые сами  формируют несколько величин, например, если в методе создаются объекты или инициализируются ресурсы. В этом случае становится неудобным ограничение параметров-ссылок: необходимость присваивания значения аргументу до вызова метода. Это ограничение снимает спецификатор out. Параметру, имеющему этот спецификатор, должно быть обязательно присвоено значение внутри метода, компилятор за этим следит. Зато в вызывающем коде можно ограничиться описанием переменной без инициализации.

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

Листинг 4-  Выходные параметры  

using System;

namespace ConsoleApplication1

{        class Class1

         {

               static void P( int a, out int b )

               {

                    а = 44;  b = 33;

                    Сonsole.WriteLine(  "внутри метода {0} {1}", a, b );            

                }           

               static void Main( )

               {

                       int a = 2, b;

                       Р( a, out b );

                      Соnsole.WriteLine( "после вызова   {0} {1}", a, b );

                 }

           }

     }

При вызове метода перед соответствующим параметром тоже указывается ключевое слово оut.

В списке параметров записывайте сначала все входные параметры, затем — все ссылки и выходные параметры.

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

Каждый объект содержит свой экземпляр полей класса. Методы находятся в памяти в единственном экземпляре и используются всеми объектами совместно, поэтому необходимо обеспечить работу методов нестатических экземпляров с полями именно того объекта, для которого они были вызваны. Для этого в любой нестатический метод автоматически передается скрытый параметр this, в котором хранится ссылка на вызвавший функцию экземпляр.

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

       class Demо

        {

               double  у;

               рublic Demo T( )                 / / метод возвращает ссылку на экземпляр

               {

                    гreturn this;               

                }

                рublic void Sety( double у )       

               {

                       this.y = у;              / / полю у присваивается значение параметра у

       }

    }

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

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

Компилятор определяет, какой именно метод требуется вызвать, по типу аргументов. Этот процесс называется разрешением (resolution) перегрузки. Тип возвращаемого методом значения в разрешении не участвует (Если последний параметр метода имеет модификатор params, этот параметр также не учитывается). Механизм разрешения основан на ряде установок, позволяющих применить наиболее подходящий к аргументам метод, если, конечно, такой найдется. Допустим, имеется четыре варианта метода, определяющего наибольшее значение:

// Возвращает наибольшее из двух целых:

int mах( int а, int b )

// Возвращает наибольшее из трех целых:

int mах( int а, int b, int c )

// Возвращает наибольшее из первого параметра и длины второго:

int mах( int а, string b )

// Возвращает наибольшее из второго параметра и длины первого:

int mах(  string b, int а )

...

Console.WriteLine( mах ( 1, 2 )  );

Console.WriteLine( mах ( 1.  2,  3 )  ):

Console.WriteLine( mах ( 1,  "2"  )  );

Console.WriteLine( mах ( "1",  2 )  );

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

Если точного соответствия не найдено, выполняются неявные преобразования типов в соответствии с общими правилами, например, bool и char в int, float; в doublе и т. п. Если преобразование невозможно, выдается сообщение об ошибке. Если соответствие на одном и том же этапе может быть получено более чем одним способом, выбирается «лучший» из вариантов, то есть вариант, содержащий меньшие количество и длину преобразований в соответствии с определенными правилами. Если существует несколько вариантов, из которых невозможно выбрать лучший, выдается сообщение об ошибке.

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

int mах( int а, int b )

int mах( int а, ref int b )

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

В классе Сlass1 описан вспомогательный статический метод РrintArrау, предназначенный для вывода массива на экран. В него передаются два параметра: строка заголовка header и массив. Количество элементов массива определяется внутри метода с помощью свойства Length. Таким образом, этот метод можно использовать для вывода любого целочисленного одномерного массива.

Листинг 5- Печать элементов массива

using System;

namespace ConsoleApplication1

{

   class Class1

   {

       static void Main()

       {

           int[] a = { 24, 50, 18, 3, 16, -7, 9, -1 };

           PrintArray("Исходный массив:", a);

           Console.WriteLine(Array.IndexOf(a, 18));

           Array.Sort(a);

           PrintArray("Упорядоченный массив:", a);

           Console.WriteLine(Array.BinarySearch(a, 18));

       }

       public static void PrintArray(string header, int[] a)

       {

           Console.WriteLine(header);

           for (int i = 0; i < a.Length; ++i)

               Console.WriteLine("\t" + a[i]);

           Console.WriteLine();

       }

   }

}

Для того чтобы применять метод РrintАrrау к массивам, состоящим из элементов другого типа, можно описать его второй параметр как Аrrау. Правда, при этом значение элемента массива придется получать с помощью метода GetValue, поскольку доступ по индексу для класса Аrrау не предусмотрен. Обобщенный метод вывода массива выглядит так:

public static void PrintArrау( string header, Аrrау а )

{

     Console.WriteLine( header );

      for ( int i = 0;  i < а.Length: ++i  )

           Console.WriteLine( "\t" + а.GetValuе(i) );

      Console.WriteLine( );

}

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

Описать класс «цветная точка». Для точки задаются координаты и цвет. Предусмотреть различные методы инициализации объекта с проверкой допустимости значений. Описать свойства для получения состояния объекта и методы вывода точки на экран и изменения цвета точки.

Написать программу, демонстрирующую все разработанные элементы класса.

Листинг  6 – Создание класса

using System;

using System.Collections.Generic;

namespace Lab_class

{

   public class Point // Класс точка

   {

//Создание параметризированного конструктора класса точка

     public Point(int x, int y, ConsoleColor color)

       {

           Console.ForegroundColor = color;         //Установка цвета точки по умолчанию

               

       }

       public void ShowPoint()                //Метод вывода точки на экран

       {

           Console.Write(".");  

       }

       public void ChangeColor()             // Метод изменения цвета точки

       {

           Console.Clear();                  // Очистка экрана

           Type type = typeof(ConsoleColor); //Создание конструкции Type, хранящей цвета

 //Переменная - счетчик для добавления цвета в конструкцию Dictionary (словарь)           

           int k=1;

 //Переменная, с помощью которой пользователь задает цвет точки                        

           int n;                           

          Dictionary<int, ConsoleColor> d=new Dictionary<int,ConsoleColor>(); //Конструкция - словарь с цветами и индексом

//Цикл foreach для перебора элементов конструкции Type

           foreach (var name in Enum.GetNames(type))            

           {

            //Заполнение словаря значениями из Type

               d.Add(k,(ConsoleColor)Enum.Parse(type, name));

               Console.WriteLine("Введите " + k+" и Enter для выбора "+name) ;

          k++;                                          //Инкремент переменной

           }

          n=Convert.ToInt16(Console.ReadLine());        //Ввод нового цвета точки

          Console.ForegroundColor = d[n];               //Установка нового цвета

           Console.WriteLine("Цвет задан");

       }

      public void MovePoint(int x, int y)               //Метод для перемещения точки

    {

        Console.CursorVisible = false;      // Скрытие курсора (он становится невидимым)

        ConsoleKeyInfo k;          //Переменная для считывания событий нажатия клавиш

          do                                            // Цикл для перемещения точки

          {

              Console.Clear();                          //Очистка экрана

            Console.WriteLine("Используйте стрелки для перемещения точки. Для окончания перемещения нажмите Esc");

            Console.SetCursorPosition(x, y);           //Установка позиции курсора

            ShowPoint();                               //Вызов метода ShowPoint

            k = Console.ReadKey(true);                 //Считывание команды с клавиатуры

//Задание границ перемещения точки, если точка подходит к границе,

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

                if (x ==79) x--;

                if (x == 0) x++;

                if (y == 0) y++;

                if (y == 299) y--;

 //Считывание событий клавиатуры

//При нажатии клавиши "вверх" декремент координаты у вызывает перемещение точки вверх

                if (k.Key == ConsoleKey.UpArrow)

                    y--;

//При нажатии клавиши "вниз" инкремент координаты у вызывает перемещение точки вниз

                else if (k.Key == ConsoleKey.DownArrow)

                    y++;

//При нажатии клавиши "налево" декремент координаты х вызывает перемещение точки налево  

                else if (k.Key == ConsoleKey.LeftArrow)

                    x--;

//При нажатии клавиши "направо" инкремент координаты х вызывает перемещение точки направо

                 else if (k.Key == ConsoleKey.RightArrow)

                    x++;     

                

            }

 while (k.Key != ConsoleKey.Escape);                // Выход из цикла по нажатию Esc

//Установка курсора в левый верхний угол  

          Console.SetCursorPosition(0, 0);                      

    }

  

   }

 public class Program 

   {

       static void Main(string[] args)

       {

//Создание объекта класса Point(точка)

           Point p = new Point(15,15,ConsoleColor.Red);

           String s;

           do                                           //Цикл для меню

           {

               Console.Clear();

               Console.WriteLine("Введите 1 и Enter для показа и  перемещения точки");

               Console.WriteLine("Введите 2 и Enter для изменения цвета точки");

               Console.WriteLine("Введите 3 и Enter для выхода");

               s = Console.ReadLine();

//Вызов метода MovePoint(передвижение точки)

               if (s.Equals("1")) p.MovePoint(15, 15);

 //Вызов метода ChangeColor(изменение цвета)        

               if (s.Equals("2")) p.ChangeColor();              

               

           }

           while (s != "3");                                    //Выход из программы

           }

   }

   }

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

3 Задания для самостоятельной работы

     1. Дана действительная квадратная матрица порядка n.

        а) Найти сумму элементов первого столбца.

        б) Найти сумму элементов главной и побочной диагоналей.

     2. Даны действительные числа s, t, и действительный массив a[12]. Получить:

        p(1)-p(t)+(p(s-t))2-(p(1))3, где

        p(x)=a[12]*x12+a[11]*x11+...+ a[0].

     3. Даны целое n, действительные массивы а[n], b[m]. В массиве а и в массиве b все элементы, следующие за элементом с наибольшим значением, заменить на 0.5.

     4. Даны массивы целых чисел а[n], b[m], и целое k.  Если в массиве а нет ни одного элемента со значением k, то первый по порядку элемент этого массива, не меньший всех остальных элементов, заменить на значение k.  По такому же правилу  преобразовать массив b применительно к значению 10.

     5. Даны действительные числа s, t. Получить:

            f(t,-2*s,1.17)+f(2.2,t,s-t),

                               2*a-b-sin(c)

         где  f(a,b,c)= ───────

                                  5+abs(c)

     6. Даны действительные числа s, t. Получить:

              g(1.2,s)+g(t,s)-g(2*s-1,s*t),

                                 a2 + b2

        где  g(a,b)= ───────────

                            a2 +2*a*b+3*b2 +4

     7. Даны действительные числа x, y, z. Получить:

                 h(1,2,3)+h(x,y,z),

                               max(a,a+b)+max(a,b+c)

        где  h(a,b,c)=  ──────────────     .

                                  1+max(a+b*c,1.15)

     8. Даны действительные числа a, b. Получить:

            u=min(a,b), v=min(a*b,a+b),  min(u+v2 ,(u+v)+3.14).

     9. Даны  действительные  числа  n, m,  целые  массивы  а[n], b[m], c[30]. Получить:

                         min(b(0),...,b(m))+min(c(0),...,c(30))

                    

             T  =                               при  abs(min(a(0),...,a(n))) > 10,

                    

                         1+(max(c(0),...,c(30)))   в противном случае.

     10. Даны  натуральные числа k, l, m, действительные массивы х[k],  y[l], z[m]. Получить:

         

                         (max(y(0) ,...,y(l))+max(z(0),...,z(m)))/2

                 

              t=              при max(x(0),...,x(k)) >=0,

                 

                         (max(x(0),...,x(k)))2    в противном случае.

     11. Дано натуральное число n. Среди чисел 1,2,...,n найти все те, которые можно представить в виде суммы квадратов двух натуральных чисел. (Определить метод, позволяющий распознать полные квадраты).

     12. Даны действительные числа x(0), y(0), x(1), y(1),...,x(10), y(10). Найти периметр многоугольника, вершины которого имеют соответственно координаты (x(0), y(0)), (x(1), y(1)),...,(x(10), y(10)). (Определить метод вычисления расстояния между двумя точками, заданными своими координатами.)

     13. Даны   натуральное  число  n,  действительные  числа x(0), y(0), x(1), y(1),...,x(n), y(n).  Найти площадь многоугольника, вершины которого при некотором последовательном обходе имеют координаты (x(0), y(0)), (x(1), y(1)),...,(x(n), y(n)). (Определить метод вычисления площади треугольника по координатам его вершин.)

     14. Дано натуральное число n. Выяснить, имеются ли среди чисел:

n, n+1, ...,2*n  - близнецы,  т.е.  простые  числа, разность между которыми равна двум. (Определить метод, позволяющий распознавать простые числа.)

     15. Определить полусумму длин двух векторов А[3], В[5]. Длина вектора определяется как корень квадратный из суммы квадратов его проекций. (Использовать метод определения длины вектора).

     16. Найти среднее геометрическое положительных элементов каждого столбца матрицы А[10,15].

     17. Даны две матрицы А[5,5] и В[6,6]. Определить полусумму следов матриц.

     18. Определить метод нахождения корней нелинейных уравнений вида f(x)=0 методом половинного  деления, a*x4+b*x2+c*x+d=0,  где  a,b,c - массивы  из  трех  чисел, d-const.

     19. Определить метод вычисления чисел Мaрсена из интервала (1, n), n- задано. (Простое число называется числом Мaрсена, если оно может быть представлено в виде 2p-1, где р- тоже простое число.)

     20. Заданы вещественные массивы А[10], В[8]. Определить метод, заменяющий в заданном массиве все отрицательные элементы на нули.

     21. Даны действительные числа s,t. Получить:

                 f(t,- 2*s, 1.17)+f(2.2,t,s-t),

         где

                              2*a-b-sin(c)

              f(a,b,c) = ─────────── .

                                5 + abs(c)

     22. Даны действительные числа s,t. Получить:

                 g(1.2, s)+g(t, s)-g(2s-1,st),

           где

                                      a2+b2

              g(a,b) =  ──────────────   

                                 a2+2*a*b+3*b2+4

     23. Дано действительное число y. Получить:

           1.7*t(0.25)+2*t(1+y)

           ──────────────         ,

                     6-t(y2-1)

                                   4        x+1

                                      ────

                                 k=0   (2*k+1)!

       где     t(x) =    ──────────                        

                                   4        x*k

                                     ────

                                  k=0   (2*k)!

     24. Даны действительные числа a, b, c. Определить метод, вычисляющий

              max(a,a+b)+max(a,b+c)

             ───────────────

                 1+max(a+b*c,1+a,15)

     25. Даны действительные числа a, b. Получить:

                u=min(a,b),  v=min(a*b,a+b)*min(u+a2, 3.14).

     26. Даны  две квадратные матрицы порядка 5. Найти последовательность из нулей и единиц b такую, что b[i]=1, когда все элементы i-й строки первой матрицы содержатся в i-й строке второй матрицы.

27.  Дана действительная квадратная матрица порядка n. Найти  наибольшее из значений элементов первой и последней строк.

    28.  Даны   действительные числа s,t. Получить:

           h(s,t)+max(h(s-t,s*t), h(s-t,s+t) 2)+ h(1,1),

             где

                                 a                     b

           h(a, b) = ────── +  ───────  - (a-b)3.

                             1+b2                1+a2

    29. Дан действительный массив  a[6].  Получить  для x=1,3,4 значения p(x+1)-p(x), где

           p(y)=a[6]*y6 + a[5]*y5 + ... + a[0].

    30. Даны действительные числа s, t и действительный массив a[8]. Получить:

           p(1)-p(t)+p(s-t)-p(1),  где

            p(x)=a[8]*x8 + a[7]*x7 + ... + a[0].

    31. Даны действительные массивы a[n], b[m]. В массиве a и  в  массиве b все элементы, следующие за элементом с наибольшим значением (за первым по порядку, если их несколько), заменить на 0.5.

    32. Даны целые массивы a[n], b[m] и целое k. Если в массиве a нет ни одного элемента со значением k, то первый по порядку элемент этой последовательности, не меньший всех остальных элементов, заменить  на значение k.  По такому же правилу преобразовать массив b применительно  к значению 11.

    33. Даны  целые  числа  a, b и массивы целых чисел n[7], d[7].

         Вычислить по схеме Горнера

         n[7] *  a7 + n[6] *  a6 + ... +   n[0]

         ───────────────────

          d[7] *  b7 + d[6] *  b6 + ... +  d[0]

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

        Схема Горнера (для n=3):

        a[3]*x3 + a[2]*x2 + a[1]*x + a[0] = (a[3]*x2 + a[2]*x + a[1])*x + a[0] =

        ((a[3]*x +a[2])*x + a[1])*x + a[0]

    34. Даны натуральное число n, действительные числа x, y и массивы  действительных чисел a[n], b[n]. Вычислить по схеме Горнера (см. задание 33) значение многочлена с комплексными коэффициентами:

        (a[n]+i*b[n])(x+i*y)n + (a[n]-1+i*b[n]-1)(x+i*y)(n-1)+...+ (a[0]+i*b[0]).

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

    35. Даны  натуральное  число n,  массив целых чисел a[n]. Рассмотреть  отрезки  последовательности  a[n] (подпоследовательности идущих подряд членов), состоящие из:

        а) полных квадратов;

        б) степеней пятерки.

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

   36. Даны  натуральное  число n,  массив целых чисел a[n]. Рассмотреть  отрезки  последовательности a[n] (подпоследовательности идущих подряд членов), состоящие из простых чисел. Получить наибольшую из длин рассматриваемых отрезков. (Определить метод, позволяющий распознавать простые числа).

    37. Даны натуральное  число  n, массив целых  чисел  a[n]. Рассмотреть  все отрезки последовательности a[n] (см. задачу 35), состоящие из совершенных чисел. (Определить  метод, позволяющий распознавать совершенные числа).

38.  Дана действительная квадратная матрица порядка n. Найти наименьшее из значений элементов побочной диагонали и двух соседних с ней линий.

   39. Дана действительная квадратная матрица порядка n. Для  данного натурального m (m<=2*n) найти сумму тех элементов матрицы, сумма индексов которых равна m.

    40. Выяснить: верно ли, что наибольшее из значений элементов главной диагонали действительной квадратной матрицы порядка n больше, чем  наименьшее из значений элементов побочной диагонали.

   41.  Даны массивы действительных чисел x[5], y[5]. Точки с координатами (x[0], y[0]), (x[1], y[1]), (x[2], y[2]) рассматриваются как вершины первого треугольника, точки с координатами (x[3], y[3]), (x[4], y[4]), (x[5], y[5]) - второго треугольника. Выяснить, верно ли, что первый треугольник целиком содержится во втором. (Определить метод, позволяющий выяснить, лежат ли две точки в одной полуплоскости относительно заданной  прямой и метод вычисления расстояния между двумя  точками).

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

    43. Даны массивы натуральных чисел x[3], y[3]. Точки с координатами (x[0], y[0]),  (x[1], y[1) рассматриваются  как  диагональные вершины первого прямоугольника, точки с координатами (x[2], y[2]), (x[3], y[3]) – второго, лежащего внутри первого. Провести вычисления, аналогичные тем, которые были описаны в предыдущей задаче  в  отношении  треугольников.  Стороны  прямоугольников считаются параллельными осям экрана.

    44. Даны  две целочисленные квадратные матрицы порядка 6. Найти последовательность из нулей и единиц b[6] такую, что b[i]=1, когда все элементы i-й строки первой матрицы больше соответствующих элементов i-й  строки второй матрицы.

    45. Даны  две целочисленные квадратные матрицы порядка 6. Найти последовательность из нулей и единиц b[6] такую, что b[i]=1, когда все элементы i-х строк  первой и второй матриц отрицательны.

    46. Даны  две целочисленные квадратные матрицы порядка 5. Найти последовательность из нулей и единиц b[5] такую, что  b[i]=1, когда i-е  строки первой и второй матриц содержат вместе не более трех положительных элементов.

    47. Даны  две целочисленные квадратные матрицы порядка 6. Найти последовательность из нулей и единиц b[6] такую, что b[i]=1, когда количество отрицательных и неотрицательных элементов i-й строки  первой  матрицы совпадает  соответственно с количеством отрицательных и неотрицательных элементов i-й строки второй  матрицы.

    48.  Два треугольника  заданы  координатами  своих  вершин так, как указано в задаче 41. Определить, какой треугольник имеет больший периметр.

    49. Даны действительные числа s,t. Получить f(t,s2,3.56)+f(2.4,t,abs(s-t)),

         где

                                2*cos(a)-b-sin(c)

              f(a,b,c ) = ─────────── .

                               5+abs(a)+abs(b)

     50. Даны действительные числа s,t. Получить g(7,s-t)+g(7,s+t)-g(s-1,s*t),

         где                  ┌───

                                \| a2+b2

              g(a,b) =  ──────.

                                a2+b2

     51. Даны действительные числа a, b, c. Получить функцию, вычисляющую:

              min(a,c)+max(a,b)+sign(a)

             ────────────────.

                 1+max(a+b*c,15)

Математическая функция sign(x) даёт (-1) при x<0, 0 при x=0, и 1 при x>0.

     52. Дано действительное число y.

Получить:

           1.3*t(y)-2*t(1+y)

            ─────────      ,

                  6-t(y2-1)

    

                          7           x+1

                               ─────

                         k=0     (2*k+1)!

      где   t(x) =  ───────────

                          8           x*k

                                ─────                                   

                         k=1        (2*k)!

     53. Даны действительные числа a,b. Получить:

                   u(a,b2)-v(b,a2)

             где

                u(x,y)=sin(x)*min(x,y),

                v=min(x*y,x+y)*min(y+x2,6.2832).

     54. Даны натуральные числа k, l, m, массивы действительных чисел x[k], y[l], z[m]. Получить:

                        (min(y[1..l])+max(z[1..m]))/2

            F=                        при min(x[1],...,x[k])>0,

                        (max(x[1],..., x[k]))3   в противном случае.

              

    55. Дан массив действительных  чисел  a[6].  Получить для x=2 значения f(x2)+f(x3), где  f(y)=a[0]*y6 + a[1]*y5 + ... + a[6].

    56. Даны действительные числа d,t и массив действительных чисел a[7]. Получить:

          p(15)-p(t-5)+p(d+t)-p(1),  где

          p(y)=a[7]*y7 + a[6]*y6 + ... + a[0].

    57. Даны натуральные числа n, m и массивы действительных чисел a[n], b[m]. В массиве a и в массиве b все элементы, перед элементом с наименьшим значением модуля (за первым по порядку, если их несколько), заменить на противоположные.

    58. Даны  две квадратные матрицы порядка 5. Найти последовательность из нулей и единиц b[5] такую, что b[i]=1, когда 2 элемента i-й строки первой матрицы больше соответствующих элементов i-го столбца второй матрицы.

  1.  Содержание отчета

4.1  Титульный лист.

4.2  Краткое теоретическое описание.

4.3  Задание на лабораторную работу, включающее математическую формулировку задачи.

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

PAGE   \* MERGEFORMAT 152




1. Лабораторна робота 1 з дисципліни Комп~ютерна обробка гідрогеологічних та інженерногеологічних даних
2. тема управления ресурсами Определение операционной системы Операционная система в наибольшей степ
3. Тема- Г. Остер. Будем знакомы Цели- Цели урока- образовательные познакомить с творчеством Г.html
4. Вышитые работы как вещь культуры
5. і. Еволюцію розвитку туризму можна охарактеризувати декількома етапами- передісторія туризму період роз
6. 112002 ВВР 2003 N 2 ст
7. Змеиногорская средняя общеобразовательная школа ’1 Змеиногорского района Алтайского края.html
8. Тема- Введение
9. Робоче обладнання екскаваторів з гідравлічним приводом 2-ї та 3-ї розмірних гру
10. Кемеровский государственный профессиональнопедагогический колледж ГОУ СПО КемГППК
11. Тема код по кодиф
12. права полного хозяйственного ведения
13. Биологическое и медицинское значение производных имидазола и тиазола
14. I. Результаты исследований Первый этап работы ~ определение должного и фактического биологического в.html
15. Культура Кыргызстана
16. выгрузки деталей и приспособлений на многооперационных станках
17. Сравнение отчета о движении денежных средств с российской системой учета и требованиями МСФО
18. Царизм в России свергнут
19. РОЗРОБКА ПРОГРАМНОЇ РЕАЛІЗАЦІЇ
20. строительной части Локальная смета 1 на общестроительные работы подземной части Составлена в цена