Опубликован: 01.11.2011 | Доступ: свободный | Студентов: 1422 / 62 | Оценка: 3.84 / 3.44 | Длительность: 15:38:00
Специальности: Программист
Практическая работа 3:

Объектно-ориентированное программирование в C#

< Практическая работа 2 || Практическая работа 3 || Лекция 5 >
Аннотация: На этом занятии учащиеся поработают с функциями и классами.

Дополнительные материалы к занятию можно скачать здесь.

Упражнение 7.1. Создание простого класса

Создаем новое консольное приложение C#. Называем проект practice_3_1.

Наберите в окне кода следующую программу:

using System;

class goods
{
    public string ProductName;
    public DateTime ExpireDate;
    public double Price;
}

class Example
{
    static void Main()
    {
        goods Product = new goods();
        Product.ProductName = "Хлеб Изобилие";
        Product.ExpireDate = new DateTime(2011, 5, 1, 8, 30, 52);
        Product.Price = 43.54;

        string str;
        str = "Товар: " + Product.ProductName + "\nСрок годности: " + Product.ExpireDate + "\nЦена: " + Product.Price + " рубля";

        Console.WriteLine(str);
        Console.WriteLine("Нажмите любую кнопку!");
        Console.ReadKey();
    }
}
    

Получаем следующий результат:


Упражнение 7.2. Создание двух экземпляров одного класса

Создаем новое консольное приложение C#. Называем проект practice_3_2.

Наберите в окне кода следующую программу:

using System;

class goods
{
    public string ProductName;
    public DateTime ExpireDate;
    public double Price;
}

class Example
{

    static void Main()
    {
        goods Bread = new goods();
        Bread.ProductName = "Хлеб Изобилие";
        Bread.ExpireDate = new DateTime(2011, 5, 1, 8, 30, 52);
        Bread.Price = 43.54;

        goods Milk = new goods();
        Milk.ProductName = "Молоко";
        Milk.ExpireDate = new DateTime(2011, 5, 5, 6, 30, 52);
        Milk.Price = 35.6;

        string str;
        str = "Товар: " + Bread.ProductName + "\nСрок годности: " + Bread.ExpireDate + "\nЦена: " + Bread.Price + " рубля";
        str += "\nТовар: " + Milk.ProductName + "\nСрок годности: " + Milk.ExpireDate + "\nЦена: " + Milk.Price + " рубля";

        Console.WriteLine(str);
        Console.WriteLine("Нажмите любую кнопку!");
        Console.ReadKey();
    }
}
    

Получаем следующий результат:


Упражнение 7.3. Знакомство с методами класса

Создаем новое консольное приложение C#. Называем проект practice_3_3.

Наберите в окне кода следующую программу:

using System;

class shape
{
    public double Length(double r)
    {
        double l;
        l = 2 * Math.PI * r;
        return l;
    }

    public double Area(double r)
    {
        double s;
        s = Math.PI * Math.Pow(r, 2);
        return s;
    }
}

class Example
{
    static void Main()
    {
        shape figure = new shape();
        double a;
        a = 10;
        double l, s;
        l = figure.Length(a);
        s = figure.Area(a);

        string str;
        str = "Радиус равен " + a;
        str += "\nДлина окружности равна " + l;
        str += "\nПлощадь круга равна " + s;
        Console.WriteLine(str);
        Console.WriteLine("Нажмите любую кнопку!");
        Console.ReadKey();
    }
}
    
Листинг .

Получаем следующий результат:


Упражнение 7.4. Знакомство с методами класса (продолжение)

Создаем новое консольное приложение C#. Называем проект practice_3_4.

Наберите в окне кода следующую программу:

using System;

class shape
{
    public double r;

    public double SphereArea()
    {
        double s;
        s = 4 * Math.PI * Math.Pow(r, 2);
        return s;
    }

    public double SphereVolume()
    {
        double v;
        v = 4 * Math.PI * Math.Pow(r, 3) / 3;
        return v;
    }
}

class Example
{
    static void Main()
    {
        shape figure = new shape();
        double a;
        a = 10;
        figure.r = a;
        double v, s;
        s = figure.SphereArea();
        v = figure.SphereVolume();

        string str;
        str = "Радиус равен " + a;
        str += "\nПлощадь сферы равна " + s;
        str += "\nОбъем шара равен " + v;
        Console.WriteLine(str);
        Console.WriteLine("Нажмите любую кнопку!");
        Console.ReadKey();
    }
}
    
Листинг .

Получаем следующий результат:


Упражнение 7.5. Нахождение широты, долготы и высоты спутника ГЛОНАСС исходя из его геоцентрических координат

Даны следующие геоцентрические координаты спутника:

x = 2616905,988\\y = 5135967,188\\z = 3003938,098

Радиус Земли составляет:

R_0=6373637,00\,м

Геоцентрические координаты связаны с широтой и долготой следующими соотношениями:

x=r\cos(\varphi)\cos(\lambda),\;y=r\cos(\varphi)\sin(\lambda),\;z=r\sin(\lambda)\\r=\sqrt{x^2+y^2+z^2},\;\tg(\lambda)=\frac yx,\;\tg(\varphi)=z/\sqrt{x^2+y^2}

Найдем радиус-вектор r, соединяющий объект с центром масс Земли:

r=\sqrt{2616905.988^2+5135967.188^2+3003938.098^2}=6500000,00\,м

Широта \varphi=\arctg\left(\frac z{\sqrt{x^2+y^2}}\right)=\arctg\left(\frac{3003938,098}{\sqrt{2616905,988^2+5135967,188^2}}\right)\cdot\frac{180}\pi=27,52\text{ градуса}

Долгота \lambda=\arctg\left(\frac yx\right)=\arctg\left(\frac{5135967.188}{2616905.988}}\right)\cdot\frac{180}\pi=63,00\text{ градуса}

Для нахождения высоты над уровнем моря h мы вычтем радиус Земли R_0 из радиус-вектора r:

h= r- R_0=6500000,00-6373637,00=126363,00\,м.

Создаем новое консольное приложение C#. Называем проект practice_3_5.

Наберите в окне кода следующую программу:

using System;

class Satellite
{
    public double x;
    public double y;
    public double z;
    double R0 = 6373637.00; //Радиус Земли

    public double Height()
    {
        double h;
        h = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2) + Math.Pow(z, 2)) - R0;
        return h;
    }

    public double Latitude()
    {
        double phi;
        phi = Math.Atan(z / Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2))) * 180 / Math.PI;
        return phi;
    }

    public double Longitude()
    {
        double lambda;
        lambda = Math.Atan(y / x) * 180 / Math.PI;
        return lambda;
    }

}

class Example
{

    static void Main()
    {
        double x, y, z;
        x = 2616905.988;
        y = 5135967.188;
        z = 3003938.098;
        Satellite GLONASS = new Satellite();
        GLONASS.x = x;
        GLONASS.y = y;
        GLONASS.z = z;

        double h, phi, lambda;
        h = GLONASS.Height();
        phi = GLONASS.Latitude();
        lambda = GLONASS.Longitude();

        string str;
        str = "Высота над уровнем моря: " + h + " метра" + "\nГеографическая широта: " + phi + " градуса" 
  + "\nГеографическая долгота " + lambda + " градуса";
        Console.WriteLine(str);
        Console.WriteLine("Нажмите любую кнопку!");
        Console.ReadKey();
    }
}
    
Листинг .

Получаем следующий результат:


Задание: Преобразование декартовых координат {x,y,z} в геодезические {H,L,B}

Связь между геодезическими параметрами \{H,L,B\} точки пространства и декартовыми координатами \{x,y,z\} можно определить следующим образом:

x=(N+H)\cos B\cos L,\;y=(N+H)\cos B\sin L,\;z=[(1-e^2)N+H]\sin B,

где:

  • N=a/\sqrt{1-e^2\sin^2B} - радиус кривизны в точке местной вертикали H,
  • e=\sqrt{1-\frac{b^2}{a^2}}=\sqrt{2a-a^2} эксцентриситет эллипсоида,
  • a=1-b/a - параметр сжатия эллипсоида.

Для преобразования координат мы воспользуемся алгоритмом, описанном в ГОСТ Р 51794-2001 (…Методы преобразований координат определяемых точек), внеся в него небольшие изменения.

Алгоритм предполагает следующую последовательность действий:

  1. Вычислить вспомогательную величину D по формуле D=\sqrt{x^2+y^2}
  2. Проанализировать значение D следующим образом:
    • а) если D=0, то B=\frac\pi2\frac Z{|Z|},\;L=0,\;H=Z\sin B-\alpha\sqrt{1-e^2\sin^2B}
    • б) если D >0, то L_a=\arcsin\left(\frac YD\right)

      при этом

      \left\{\begin{array}{l}\txt{если }Y<0,X>0,\text{ то }L=2\pi-L_a\\ \text{если }Y<0,X<0,\text{ то }L=2\pi+L_a\\ \text{если }Y>0,X<0,то L=\pi-L_a\\ \text{если }Y>0,X>0,то L=L_a\end{array}\right.
  3. Проанализировать значение Z:
    • а) если Z =0, то B=0,\;H=D-a
    • б) во всех других случаях вычисления выполняют следующим образом:

      Найти вспомогательную величину r по следующей формуле:

      r=\sqrt{X^2+Y^2+Z^2},
      Геодезическая широта B находится следующим образом:
      B=\arcsin\left(\frac Zr\right)
      H=D\cos B+Z\sin B-a\sqrt{1-e^2\sin^2B}

Итак, мы имеем следующие исходные данные:

x = 2616905,988\\y = 5135967,188\\z = 3003938,098
  1. Вычислим вспомогательную величину D:
    D=\sqrt{x^2+y^2}=\sqrt{2616905,988^2+5135967,188^2}=5764230,72978892
  2. Так, как D>0, то пункт 2a пропускаем. Переходим к пункту 2б.
    L_a=\arcsin\left(\frac YD\right)=\arcsin\left(\frac{5135967,188}{5764230,72978892}\right)=1,09955742907398
    Найдем геодезическую долготу L:

    Так как x>0 и y>0, то L=L_a=1,09955742907398\text{ радиан}.

    Найдем значение геодезической долготы в градусах:
    L\cdot\frac{180}\pi=1,09955742907398\cdot\frac{180}{3,14159265358979} = 63,0000000181943\text{ градуса}
  3. Проанализируем значение Z. Так как Z\ne 0, то пункт 3а пропускаем и переходим к пункту 3б. Найдем вспомогательную величину r:
    r=\sqrt{X^2+Y^2+Z^2}=\sqrt{2616905,988^2+5135967,188^2+3003938,098^2}= 6500000,0002199
    Найдем геодезическую широту B:
    B=\arcsin\left(\frac Zr\right)=\arcsin\left(\frac{3003938,098}{6500000,0002199}\right)=0,480411711894149\text{ радиан}
    Переведем радианы в градусы:
    B\cdot\frac{180}\pi=0,480411711894149\cdot\frac{180}{3,14159265358979} = 27,5255635201896\text{ градуса}
    Найдем геодезическую высоту H:
    H=D\cos B+Z\sin B-a\sqrt{1-e^2 sin^2 B}
    H=5764230,72978892\cdot\cos(0,480411711894149)+3003938,098\cdot\sin(0,480411711894149)-\\ -6378136\cdot\sqrt{1-\left(\frac 1{298,25784}\right)^2\sin^2(0,480411711894149)}=121871,656812661\text{ м}

Разработать соответствующую программу

< Практическая работа 2 || Практическая работа 3 || Лекция 5 >