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

Основные структуры данных C#

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

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

Упражнение 6.1. Нахождение суммы массива

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

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

using System;
class Example
{
    static void Main()
    {
        int n = 3;
        int[] a = new int[n];
        string str;
        int i;
        a[0] = 1;
        a[1] = -8;
        a[2] = 14;

        int sum = 0;

        for (i = 0; i < n; i++)
        {
            sum += a[i];
        }
        str = "Сумма массива равна " + sum;
        Console.WriteLine(str);
        Console.WriteLine("Нажмите любую кнопку!");
        Console.ReadKey();
    }
}
    

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

Упражнение 6.2. Отображение символьного массива

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

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

using System;
class Example
{
    static void Main()
    {
        int n = 5;
        string[] a = new string[n];
        string str;
        int i;
        a[0] = "Миссисипи";
        a[1] = "Нил";
        a[2] = "Амазонка";
        a[3] = "Енисей";
        a[4] = "Белая";

        str = "";

        for (i = 0; i < n; i++)
        {
            str += a[i] + "\n";
        }

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

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

Упражнение 6.3. Создание динамического массива

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

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

using System;
class Example
{
    static void Main()
    {
        double[] a = new double[] { -8, 13, 26, 14, 17, 21, -34, 28 };
        int n = a.Length;
        string str;
        int i;
        double sum = 0;
        for (i = 0; i < n; i++)
        {
            Console.WriteLine(a[i]);
            sum += a[i];
        }
        double avg;
        avg = sum / n;
        str = "Сумма массива равна " + sum + "\nСреднее арифметическое массива равно  " + avg;
        Console.WriteLine(str);
        Console.WriteLine("Нажмите любую кнопку!");
        Console.ReadKey();
    }
}
    

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

Упражнение 6.4. Многомерные массива (Герберт Шилдт)

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

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

using System;
class Example
{
    static void Main()
    {
        int t, i;
        int[,] table = new int[3, 4];
        for (t = 0; t < 3; ++t)
        {
            for (i = 0; i < 4; ++i)
            {
                table[t, i] = (t * 4) + i + 1;
                Console.WriteLine(table[t, i] + " ");
            }
            Console.WriteLine();
        }
        Console.WriteLine("Нажмите любую кнопку!");
        Console.ReadKey();
    }
}
    

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

Упражнение 6.5. Сортировка целочисленного массива. Бинарный поиск элементов

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

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

using System;

class arraySort
{

    static void print(int[] alpha)
    {
        foreach (int i in alpha)
            Console.WriteLine(i + " ");
        Console.WriteLine();
    }

    static void Main()
    {

        int[] alpha = { -4, 8, 28, -6, -98, -47, 12 };
        //Отобразить исходный массив

        Console.WriteLine("Исходный массив ...");
        print(alpha);

        //Найти значение 8
        int pattern = 8;
        int indx = Array.BinarySearch(alpha, pattern);
        Console.WriteLine("Индекс элемента массива со значением 8: " + indx);

        //Сортируем массив
        Array.Sort(alpha);
        Console.WriteLine("Сортировка по возрастанию ...");
        //Отображаем массив после сортировки
        print(alpha);

        //Сортируем массив по убыванию
        Array.Reverse(alpha);
        //Отображаем массив после сортировки по убыванию
        Console.WriteLine("Сортировка по убыванию ...");
        print(alpha);
        Console.WriteLine("Нажмите любую кнопку!");
        Console.ReadKey();
    }
}
    

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

Упражнение 6.6. Вывод на экран двумерного массива (Герберт Шилдт)

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

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

using System;

class arraySort
{

    static void print(int[][] alpha)
    {
        // Отображаем элементы массива
        for (int i = 0; i < alpha.Length; i++)
        {
            for (int j = 0; j < alpha[i].Length; j++)
            {
                System.Console.Write("{0}{1}", alpha[i][j], j == (alpha[i].Length - 1) ? "" : " ");
            }
            System.Console.WriteLine();
        }
    }

    static void Main()
    {

        int[][] alpha = new int[4][];
        alpha[0] = new int[4] { 1, 2, 3, 4 };
        alpha[1] = new int[4] { 5, 6, 7, 8 };
        alpha[2] = new int[4] { 9, 10, 11, 12 };
        alpha[3] = new int[4] { 13, 14, 15, 16 };

        print(alpha);

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

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

Упражнение 6.7. Массивы в качестве выходных параметров функций

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

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

using System;

class ArraySort
{

    static void print(int[] alpha)
    {
        foreach (int i in alpha)
            Console.WriteLine(i + " ");
        Console.WriteLine();
    }

    static void FillArray(out int[] alpha)
    {
        // Создаем массив
        alpha = new int[5] { 1, 2, 3, 4, 5 };
    }

    static void Main()
    {

        int[] alpha; // Не требуется инициализация

        // Заполняем массив
        FillArray(out alpha);

        // Отображаем элементы массива
        System.Console.WriteLine("Отображаем элементы массива:");

        print(alpha);

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

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

Упражнение 6.8. Определение факторов геометрического снижения точности ГЛОНАСС

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

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

using System;

class arraySort
{

    static void print(double[,] alpha)
    {
        int ArraySize = 4;

        for (int i = 0; i < ArraySize; i++)
        {
            for (int j = 0; j < ArraySize; j++)
            {
                Console.Write("{0}{1}", alpha[i, j], j == (ArraySize - 1) ? "" : " ");
            }
            Console.WriteLine();
        }
    }

    static void transpositiong(double[,] alpha)
    {
        int ArraySize = 4;
        double x;
        for (int i = 0; i < ArraySize - 1; i++)
            for (int j = i + 1; j < ArraySize; j++)
            {
                x = alpha[i, j];
                alpha[i, j] = alpha[j, i];
                alpha[j, i] = x;
            }
    }

    static void multiplying(double[,] a, double[,] b, double[,] M)
    {
        int ArraySize = 4;
        int irow, icol, k;
        double sum;

        for (irow = 0; irow < ArraySize; irow++)
            for (icol = 0; icol < ArraySize; icol++)
            {
                sum = 0;
                for (k = 0; k < ArraySize; k++)
                {
                    sum += a[irow, k] * b[k, icol];
                }
                M[irow, icol] = sum;
            }
    }


    ////////////////////////////////////////////////////
    //Обращение квадратной матрицы методом Жордана-Гаусса
    ////////////////////////////////////////////////////
    static void inversion(double[,] alpha)
    {
        int col, lin;
        col = 100;
        lin = 100;
        int i, j, k, t, s;
        double b, c;
        int ArraySize = 4;

        //long double a[col][lin];

        double[,] a = new double[col, lin];

        for (i = 0; i < ArraySize; i++)
        {
            for (j = 0; j < ArraySize; j++)
            {
                a[i, j] = alpha[i, j];
                a[i, ArraySize + j] = 0;
            }
            a[i, ArraySize + i] = 1;
        }

        for (s = 0; s < ArraySize; s++)
        {
            for (t = s; t < ArraySize; t++)
            {
                if (a[t, s] != 0) goto beta;
            }

            Console.WriteLine("Действительных корней нет!"); // exit(1);

        beta:
            for (j = 0; j < 2 * ArraySize; j++)
            {

                b = a[s, j];
                a[s, j] = a[t, j];
                a[t, j] = b;
            }

            c = 1 / a[s, s];

            for (j = 0; j < 2 * ArraySize; j++)
            {
                a[s, j] *= c;
            }

            for (t = 0; t < ArraySize; t++)
            {
                if (t == s) goto teta;
                c = -a[t, s];
                for (j = 0; j < 2 * ArraySize; j++)
                {
                    a[t, j] += c * a[s, j];
                }

            teta: ;
            }
        }

        for (i = 0; i < ArraySize; i++)
        {
            for (j = 0; j < ArraySize; j++)
            {
                a[i, j] = alpha[i, j];
            }
        }

        Console.WriteLine("\nОбращенная матрица .... ");

        for (i = 0; i < ArraySize; i++)
        {
            Console.WriteLine();
            //cout.precision(3);     //Два десятичных разряда
            for (j = ArraySize; j < 2 * ArraySize; j++)
            {
                Console.Write("{0}{1}", a[i, j], j == (ArraySize - 1) ? "" : " ");
            }
        }

        double dx, dy, dz, dt;
        dx = a[0, 4];
        dy = a[1, 5];
        dz = a[2, 6];
        dt = a[3, 7];

        Console.WriteLine();

        Console.WriteLine("\ndx = " + dx + "\ndy = " + dy + "\ndz = " + dz + "\ndt = " + dt);

        double tdop = Math.Sqrt(dt);
        double vdop = Math.Sqrt(dz);
        double hdop = Math.Sqrt(dx + dy);
        double pdop = Math.Sqrt(dx + dy + dz);
        double gdop = Math.Sqrt(dx + dy + dz + dt);

        Console.WriteLine("\ngdop = " + gdop + "\npdop = " + pdop + "\nhdop = " + hdop + "\nvdop = " + vdop + "\ntdop = " + tdop);


        Console.WriteLine();

        Console.WriteLine("Проверяем результат ... ");

        for (i = 0; i < ArraySize; i++)
        {
            Console.WriteLine();
            for (j = 0; j < ArraySize; j++)
            {
                c = 0;
                for (k = 0; k < ArraySize; k++)
                {
                    c += a[i, k] * a[k, j + ArraySize];
                }
                Console.Write("\t" + c);

            }
        }
        Console.WriteLine();
    }



    static void Main()
    {

        double[,] A = new double[,] { { 0.0, 0.996, 0.087, 1.0 }, { 0.863, -0.498, 0.087, 1.0 }, 
       { -0.863, -0.498, 0.087, 1.0 }, { 0.0, 0.0, 1.00, 1.0 } };
        Console.WriteLine("Исходная матрица ... ");
        print(A);
        double[,] T = new double[4, 4];
        Array.Copy(A, T, 16);
        Console.WriteLine("Транспонирование ... ");
        transpositiong(T);
        print(T);

        double[,] M = new double[4, 4];
        multiplying(T, A, M);
        Console.WriteLine("Перемножаем матрицы ... ");
        print(M);

        double[,] I = new double[4, 4];
        Array.Copy(M, I, 16);
        inversion(I);
        //print(I);

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

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

Упражнение 6.9. Более универсальная программа определения фактора геометрического снижения точности ГЛОНАСС (использование структур)

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

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

using System;

class GDOP
{
    static void print(double[,] alpha)
    {
        int ArraySize = 4;

        for (int i = 0; i < ArraySize; i++)
        {
            for (int j = 0; j < ArraySize; j++)
            {
                Console.Write("\t{0:##.###}", alpha[i, j]);
            }
            Console.WriteLine();
        }
    }

    static void transpositiong(double[,] alpha)
    {
        int ArraySize = 4;
        double x;
        for (int i = 0; i < ArraySize - 1; i++)
            for (int j = i + 1; j < ArraySize; j++)
            {
                x = alpha[i, j];
                alpha[i, j] = alpha[j, i];
                alpha[j, i] = x;
            }
    }

    static void multiplying(double[,] a, double[,] b, double[,] M)
    {
        int ArraySize = 4;
        int irow, icol, k;
        double sum;

        for (irow = 0; irow < ArraySize; irow++)
            for (icol = 0; icol < ArraySize; icol++)
            {
                sum = 0;
                for (k = 0; k < ArraySize; k++)
                {
                    sum += a[irow, k] * b[k, icol];
                }
                M[irow, icol] = sum;
            }
    }

    ////////////////////////////////////////////////////
    //Обращение квадратной матрицы методом Жордана-Гаусса
    ////////////////////////////////////////////////////
    static void inversion(double[,] alpha)
    {
        int col, lin;
        col = 100;
        lin = 100;
        int i, j, k, t, s;
        double b, c;
        int ArraySize = 4;

        double[,] a = new double[col, lin];

        for (i = 0; i < ArraySize; i++)
        {
            for (j = 0; j < ArraySize; j++)
            {
                a[i, j] = alpha[i, j];
                a[i, ArraySize + j] = 0;
            }
            a[i, ArraySize + i] = 1;
        }

        for (s = 0; s < ArraySize; s++)
        {
            for (t = s; t < ArraySize; t++)
            {
                if (a[t, s] != 0) goto beta;
            }

            Console.WriteLine("Действительных корней нет!");

        beta:
            for (j = 0; j < 2 * ArraySize; j++)
            {

                b = a[s, j];
                a[s, j] = a[t, j];
                a[t, j] = b;
            }

            c = 1 / a[s, s];

            for (j = 0; j < 2 * ArraySize; j++)
            {
                a[s, j] *= c;
            }

            for (t = 0; t < ArraySize; t++)
            {
                if (t == s) goto teta;
                c = -a[t, s];
                for (j = 0; j < 2 * ArraySize; j++)
                {
                    a[t, j] += c * a[s, j];
                }

            teta: ;
            }
        }

        for (i = 0; i < ArraySize; i++)
        {
            for (j = 0; j < ArraySize; j++)
            {
                a[i, j] = alpha[i, j];
            }
        }

        Console.WriteLine("\nОбращенная матрица .... ");

        for (i = 0; i < ArraySize; i++)
        {
            Console.WriteLine();
            for (j = ArraySize; j < 2 * ArraySize; j++)
            {
                Console.Write("\t{0:##.###}", a[i, j]);
            }
        }

        double dx, dy, dz, dt;
        dx = a[0, 4];
        dy = a[1, 5];
        dz = a[2, 6];
        dt = a[3, 7];

        Console.WriteLine();

        Console.WriteLine("\ndx = " + dx + "\ndy = " + dy + "\ndz = " + dz + "\ndt = " + dt);

        double tdop = Math.Sqrt(dt);
        double vdop = Math.Sqrt(dz);
        double hdop = Math.Sqrt(dx + dy);
        double pdop = Math.Sqrt(dx + dy + dz);
        double gdop = Math.Sqrt(dx + dy + dz + dt);

        Console.WriteLine("\ngdop = " + gdop + "\npdop = " + pdop + "\nhdop = " + hdop + "
 \nvdop = " + vdop + "\ntdop = " + tdop);


        Console.WriteLine();

        Console.WriteLine("Проверяем результат ... ");

        for (i = 0; i < ArraySize; i++)
        {
            Console.WriteLine();
            for (j = 0; j < ArraySize; j++)
            {
                c = 0;
                for (k = 0; k < ArraySize; k++)
                {
                    c += a[i, k] * a[k, j + ArraySize];
                }
                Console.Write("\t{0:##.###}", c);
            }
        }
        Console.WriteLine();
    }


    /// ////////////
    /// Структура декартовых координат
    struct Cartesian
    {
        public double x;
        public double y;
        public double z;
    }

    //Заполняем исходную матрицу значениями
    static void fill_satellite(double[,] alpha)
    {
        double x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4, Rx, Ry, Rz;

        int ArraySize = 4;
        Cartesian rover;

        // Координаты потребителя
        Rx = -730000;
        Ry = -5440000;
        Rz = 3230000;

        // Координаты потребителя
        rover.x = Rx;
        rover.y = Ry;
        rover.z = Rz;

        //Координаты спутников
        Cartesian[] satellite = new Cartesian[ArraySize];
        //Компоненты единичного вектора от спутников к наблюдателю
        Cartesian[] s = new Cartesian[ArraySize];

        x1 = 15524471.175; y1 = -16649826.222; z1 = 13512272.387;  // Координаты первого спутника
        x2 = -2304058.534; y2 = -23287906.465; z2 = 11917038.105;  // Координаты второго спутника
        x3 = 16680243.357; y3 = -3069625.561; z3 = 20378551.047;  // Координаты третьего спутника
        x4 = -14799931.395; y4 = -21425358.24; z4 = 6069947.224;   // Координаты четвертого спутника

        satellite[0].x = x1; satellite[0].y = y1; satellite[0].z = z1;  // Координаты первого спутника
        satellite[1].x = x2; satellite[1].y = y2; satellite[1].z = z2;  // Координаты второго спутника
        satellite[2].x = x3; satellite[2].y = y3; satellite[2].z = z3;  // Координаты третьего спутника
        satellite[3].x = x4; satellite[3].y = y4; satellite[3].z = z4;  // Координаты четвертого спутника


        //Растояния от наблюдателя до i-го спутника
        double[] R = new double[ArraySize];

        int i;
        for (i = 0; i < ArraySize; i++)
        {
            R[i] = Math.Sqrt(Math.Pow((satellite[i].x - rover.x), 2) + Math.Pow((satellite[i].y - rover.y),
 2) + Math.Pow((satellite[i].z - rover.z), 2));
        }

        for (i = 0; i < ArraySize; i++)
        {
            s[i].x = (satellite[i].x - rover.x) / R[i];
            s[i].y = (satellite[i].y - rover.y) / R[i];
            s[i].z = (satellite[i].z - rover.z) / R[i];
        }

        //Исходная матрица

        for (i = 0; i < ArraySize; i++)
        {
            alpha[i, 0] = s[i].x;
            alpha[i, 1] = s[i].y;
            alpha[i, 2] = s[i].z;
            alpha[i, 3] = 1;
        }
    }


    static void Main()
    {
        double[,] A = new double[4, 4];
        //Заполняем исходную матрицу
        fill_satellite(A);

        Console.WriteLine("Исходная матрица ... ");
        print(A);
        double[,] T = new double[4, 4];
        Array.Copy(A, T, 16);
        Console.WriteLine("Транспонирование ... ");
        transpositiong(T);
        print(T);

        double[,] M = new double[4, 4];
        multiplying(T, A, M);
        Console.WriteLine("Перемножаем матрицы ... ");
        print(M);

        double[,] I = new double[4, 4];
        Array.Copy(M, I, 16);

        inversion(I);

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

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

Упражнение 6.10. Разработка запросов LINQ

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

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

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

using System;
using System.Linq;


class Animal
{
    public string Chorda { get; set; }
    public string Species { get; set; }

    public Animal(string ch, string sp)
    {
        Chorda = ch;
        Species = sp;
    }
}

class GroupJoin
{
    static void Main()
    {
        string[] Chordata = {    "Птицы",
                                     "Рыбы",
                                     "Млекопитающие",
                                     "Земноводные",
                                     "Пресмыкающиеся"
                                   };

        Animal[] Animals = {       new Animal("Слон","Млекопитающие"),
                                       new Animal("Журавль","Птицы"),
                                       new Animal("Лягушка","Земноводные"),
                                       new Animal("Аист","Птицы"),
                                       new Animal("Семга","Рыбы"),
                                       new Animal("Крокодил","Пресмыкающиеся"),
                                       new Animal("Черепаха","Пресмыкающиеся"),
                                       new Animal("Тритон","Земноводные"),
                                       new Animal("Осетр","Рыбы"),
                                       new Animal("Какаду","Птицы"),
                                       new Animal("Саламандра","Земноводные"),
                                       new Animal("Змея","Пресмыкающиеся"),
                                       new Animal("Носорог","Млекопитающие"),
                                       new Animal("Акула","Рыбы"),
                                       new Animal("Жираф","Млекопитающие"),
                                       new Animal("Ящерица","Пресмыкающиеся"),
                                       new Animal("Заяц","Млекопитающие")
                                       };

        var bySpecies = from Species in Chordata
                        join Animalia in Animals
                        on Species equals Animalia.Species
                        into lst
                        select new { Species = Species, AnimalList = lst };
        foreach (var t in bySpecies)
        {
            Console.WriteLine("К классу {0} относятся: ", t.Species);
            foreach (var m in t.AnimalList)
                Console.WriteLine("  " + m.Chorda);
            Console.WriteLine();
        }
        Console.WriteLine("Нажмите любую кнопку!");
        Console.ReadKey();
    }
}
    

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

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