Namespace ConsoleApplication1
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

{

class Program

{

   static void Main(string[] args)

   {

       double x; //описание переменной типа double без означивания

       Console.WriteLine(" Введите x,y");

       // вывода в консольное окно подсказки

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

       //присваивание переменной x действительного значения

// Cons o le.ReadLine() возвращает строку, набранную с клавиатуры.

// Convert.ToDouble преобразует строку к типу double.

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

       //объявление переменной y с присваением ей значения

       double z = 10*(Math.Cos(x) / (Math.Sin(x) + 1)) /  

                  (Math.Sqrt(Math.Abs(0.1 - Math.Exp(x))));

       /* арифметическое выражение, иллюстрирующее приоритеты

          выполнения арифметических операторов */

       int i;

       i = (int)z; // явное преобразование к типу int

       int j = Convert.ToInt32(Math.Round(z));

/*использование метода Round - округление до ближайшего целого и конвертация к типу int*/

       bool b = i == j;// объявление логической переменной b

       /* и присваивание ей результата операции отношения - проверка на эквивалентность*/

 //далее вывод в консольное окно исходных данных и результатов

       Console.WriteLine("для исходных данных x="+x+" и y="+y);

       Console.WriteLine("z=" + z);

       Console.WriteLine("i=" + i+" j="+j);

       string s="проверка i=j оказалась ";

  // описание строкой переменной с присваиванием значения

       Console.WriteLine(s + b);

       Console.ReadLine();

       /* использование метода ReadLine для задержки закрытия

          консольного окна */

   }

}

}

 

 

Затем надо откомпилировать проект, то есть создать PE-файл. Для этого надо войти в пункт Построить (Build) главного меню и активизировать пункт Построить (Build) ConsoleApplication1. Скорее всего, откроется окно Список ошибок (Error List), в котором будут видны ошибки компиляции. После того как в окне Список ошибок (Error List) количество ошибок станет равным нулю, можно запустить проект на выполнение (Start/Start Debuging).

Результаты работы программы для разных исходных данных приведены на рис. 1.5 и 1.6.

 

 

Рис. 1.5. Консольное окно с результатами работы программы примера 1.5

 

 

Рис. 1.6. Консольное окно с результатами работы последовательной программы примера 1.5 с другими исходными данными

 

 

Следует обратить внимание на рис. 1.7. При вводе действительных чисел в качестве разделителя целой и дробной части используется запятая «2,4».

 Эта лекция получилась длинной из-за большого объема фактического материала, но очень хотелось добраться до первой содержательной программы, в которой, по крайней мере, внутри метода Main() будет все понятно, или, лучше сказать, обо всем, что в ней написано, можно найти материал в этой лекции.

 

 



Лекция 2. Методы класса

 

Итак, методы. Надо вспомнить, как организована программа на C#. Помните «матрешку»? После освоения материалов первой лекции более-менее понятно, как организован метод Main(), то есть возможность написать какой-то код в теле этого метода. Надо идти дальше! Теперь надо разобраться, как организованы методы вообще. Если это будет понятно, то появится возможность писать другие методы в теле класса и вызывать их как в методе Main(), так и в других методах. Таким образом, будет освоен следующий уровень вложения этой «матрешки». И тогда в примере рис.1.4 из предыдущей лекции сможем в классе Program (class Program), который до этого состоял из одного метода Main(), написать свои методы, которые могут вызываться как из метода Main(), так и из других методов этого класса. В дальнейшем поднимемся еще на один уровень в «матрешке» – научимся организовывать свой класс, и использовать экземпляры этого класса, называемые объектами, в своих программах. Вот такой план введения или ввода в объектно-ориентированное программирование (ООП). Но о классах будем говорить в Лекции 4.

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

Определение метода следующее: формально, метод – это часть программного кода, к которому можно обратиться по имени. Значит, у метода есть имя. Это имя является составной частью заголовка метода. Заголовок метода, по сути, является описанием (объявлением) метода. Зная заголовок метода, можно, организовать его вызов. Как? По его имени. Кроме имени в этом описании есть возвращаемый тип, то есть тип данных, который будет возвращен в вызывающую программу при вызове метода. Как? Через имя метода. Заголовок является началом описания метода. После заголовка находится программный блок, который называется телом метода. В нем и записывается тот код, о котором шла речь в определении метода. Кроме операторов в теле метода могут быть объявлены имена, которые называются локальными. Следует напомнить, что программный блок – это код, заключенный в фигурные скобки «{…}» и все имена, описанные внутри программного блока, действуют только внутри этого блока. Поэтому они и называются локальными.

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

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

<модификатор><тип_возвр._рез-та> <имя_метода><(список_форм._пар-ов)>;

После того как появилось описание метода, этот метод может быть вызван. Сколько раз можно вызвать метод? Вызвать метод можносколько угодно раз (сколько требуется согласно алгоритму решения задачи). Как вызвать метод? Метод вызываетсяпо имени со списком фактических параметров в другом методе. Список фактических параметров пишется в скобках за именем метода при вызове метода.

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

Первый список - список формальных параметров - это набор переменных с описанием их типов, а также с описанием способа взаимодействия со вторым списком - списком фактических параметров. Но о способах взаимодействия чуть позже. Список формальных параметров есть расширение списка локальных имен, описанных в теле метода, поэтому память под них отводится в той части ОП, которая используется внутри метода. Эта память начинает захватываться в момент вызова метода и передачи ему управления выполнением программы. Эта память освобождается в момент окончания метода и передачи управления назад в вызывающую программу. Список формальных параметров может быть пустым, тогда от него остается только пара скобок. По этим скобкам компилятор отличает имя метода от других имен, использующихся в C#. Зачем нужен список формальных параметров? – еще раз, это один из двух списков параметров, с помощью которых организован обмен информацией между вызываемой программой и методом.

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

Как же взаимодействует эта пара: список фактических параметров и список формальных параметров при вызове метода. Здесь есть два варианта взаимодействия. Первый – при вызове метода формальный параметр получает копию значения соответствующего фактического значения. Такая передача называется передача по значению. Второй – при вызове метода формальный параметр получает ссылку (адрес ОП) на соответствующий фактический параметр. Такая передача называется передача по адресу или по ссылке. Очевидно, что в этом случае в качестве фактического параметра может быть только переменная, так как у нее есть адрес ОП, по которому лежит её значение. При передаче же по значению в качестве фактического параметра может выступать и выражение соответствующего типа. С какой целью так сделано? Если передача фактического параметра организована по значению, то в этом случае информацию можно передать только из вызывающей программы в метод. Передали значение и потеряли связь с фактическим параметром. Если внутри метода формальный параметр будет изменяться, ведь это же переменная, значит, она может меняться, вызывающая программа этого никак не почувствует. Такие параметры можно классифицировать, как входные. Если же передача организована по адресу, то в формальный параметр передается адрес фактического параметра. При изменении формального параметра внутри метода, эти изменения будут проведены по переданному адресу фактического параметра. После того как код метода будет выполнен и передача управления будет передана назад в вызывающий метод, эти изменения останутся по адресу фактического параметра. Так можно передать информацию из метода в вызывающую программу. Естественно, что такие параметры классифицируются, как выходные. Используя этот механизм передачи, можно организовать параметр, который будет и входным и выходным. Так бывает, например, в случае, когда есть начальное значение, которое в процессе вычислений трансформируется в результирующее.

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

 

Пример 2.1. Определить все углы треугольника при заданных значениях сторон a , b , c , и спользуя вычисление угла по теореме косинусов:

                    .

Понятно, что угол, вычисленный по этой формуле, противоположен стороне a треугольника.

Сколько методов надо организовать для решения этой задачи? Можно ли организовать один метод, в котором бы вычислялся один угол? И решить задачку, вызывая этот метод для вычисления всех трех углов? Можно и достаточно просто. Надо написать один метод, допустим, с именем Ugol. У этого метода будет три формальных входных параметра, допустим, a,b,c. В этом методе будет вычисляться противоположный угол к первому параметру a по формуле из примера 2.1. Вызывать этот метод надо, используя разные списки фактических параметров: первый раз вызвать так – ug _ a =Ugol( a , b , c ), второй раз вызвать по-другому – ug _ b =Ug ol ( b , a , c ), третий раз вызвать так – ug _ c =Ugol( c , a , b ). В каждой переменой ug_a, ug_b, ug_c будут лежать противоположные углы, соответствующие первому фактическому параметру метода Ugol. Еще следует сказать, что формальные параметры a,b,c и фактические параметры a,b,c - это разные переменные, хотя и записаны одинаковыми идентификаторами. Почему? Память под них будет отводиться в разных местах ОП. И это хорошо – одни и те же идентификаторы можно использовать и при описании метода, и при его вызове, не опасаясь, что компилятор их перепутает.

В примере 2.2 приведен начальный вариант решения этой задачи.

 

Пример 2.2

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace ConsoleApplication1

{

class Program

{

   static double ugol(double a, double b, double c)

   {

       double aa;

       aa=(b*b+c*c-a*a)/(2*b*c);

       aa = Math.Acos(aa);

       return aa;

   }

 

   static void Main(string[] args)

   {

      double a,b,c;

      Console.WriteLine("Vvedite a,b,c так,чтобы получился треуг-ник");

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

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

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

      double ug_a = ugol(a, b, c); // угол a

      double ug_b = ugol(b, a, c); // угол b

      double ug_c = ugol(c, b, a); // угол c

      Console.WriteLine("a1=" + ug_a + " a2=" + ug_b + " a3=" + ug_c);

      Console.ReadLine();

   }

}

}

 

Запустим её в VS с такими сторонами  треугольника: a=1; b=1; c=1. Это тестовый пример. Все три угла должны быть одинаковыми и равны 60 градусам (рис. 2.1).

 

 

Рис. 2.1. Окно выполнения программы примера 2.1

 

Что-то не так? Углы одинаковые, но не 60 градусов. Да, конечно, углы ведь вычислены в радианах! Но это не страшно. Это подправим, но позже. А сейчас проанализируем  программный код, представленный в примере 2.1.

Внутри class Program теперь два метода: Main() и Ugol().

Разберем построчно метод Ugol().

static double ugol(double a, double b, double c) – это заголовок метода:

– static означает, что метод ugol может быть вызван без инициализации объект класса Program. Пока это непонятно, но потерпите до лекции 6.

– double означает, что в имя метода ugol будет возвращено значение типа double.

– ugol – имя метода.

– (double a, double b, double c) – список формальных параметров. Все они типа double, перед ними ничего не написано, значит способ обмена - передача по значению.

Далее в фигурных скобках – тело метода:

– double aa; - описание локального имени aa типа double.

– aa=(b*b+c*c-a*a)/(2*b*c); - присваивание переменной aa значения выражения, стоящего справа от знака «=». По смыслу задачи в переменной aa будет лежать значение косинуса угла, противоположного стороне из списка формальных параметров как a.

– aa = Math.Acos(aa); - По смыслу задачи переменной aa присваивается значение этого угла. Вызывется метод Acos(*) класса Math, который вычисляет арккосинус своего аргумента (фактического параметра). Угол здесь в радианах.

 – return aa; – возврат aa, то есть значение переменой aa будет возвращено в имя метода.

 

Дата: 2019-11-01, просмотров: 169.