Разработка приложений для Windows Phone 7

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

Показывать лекцию целиком

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

Упражнение 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 (…Методы преобразований координат определяемых точек), внеся в него небольшие изменения.

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

  • Вычислить вспомогательную величину $$D$$ по формуле $$D=\sqrt{x^2+y^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.$$
  • Проанализировать значение $$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$$
  • Вычислим вспомогательную величину $$D$$: $$D=\sqrt{x^2+y^2}=\sqrt{2616905,988^2+5135967,188^2}=5764230,72978892$$
  • Так, как $$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{ градуса}$$
  • Проанализируем значение $$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{ м}$$
  • Разработать соответствующую программу

    Вернуться к учебному плану