Exemplo n.º 1
0
        static void Main(string[] args)
        {
            int    name_l = 0, exp_l = 0, l;
            string str = "";

            string[] lens;

            //загружаем Базу Данных
            for (int i = 0; i < CountFields.Length; i++)
            {
                File_Load(paths[i], i, CountFields[i]);
            }

            //Запросы
            while (true)
            {
                Console.Clear();
                Console.WriteLine(
                    "1.Добавить информацию о ДТП\n" +
                    "2.Удалить информацию о ДТП\n" +
                    "3.Список водителей, совершивших более одного ДТП.\n" +
                    "4.Список водителей, участвующих в ДТП в заданном месте.\n" +
                    "5.Список водителей, участвующих в ДТП на заданную дату.\n" +
                    "6.ДТП с максимальным количеством потерпевших.\n" +
                    "7.Список водителей, участвующих в ДТП с наездом на пешеходов.\n" +
                    "8.Причины ДТП в порядке убывания их количества.\n" +
                    "9.Выход.");
                char UserChoise = Console.ReadKey().KeyChar;
                switch (UserChoise)
                {
                case '1':    //Добавить информацию о ДТП
                    Console.Clear();
                    Random rand = new Random();
                    int    Key = 0, RA_Number = 0;
                    bool   IsUnique = false;

                    //Ключ не должен быть Использован ранее в базе !!!!!!
                    //Поэтому проверяем наличие сгенерированного
                    //ключа в списке с данными о ДТП
                    while (!IsUnique)
                    {
                        Key      = rand.Next(-2147483648, 2147483647);
                        IsUnique = true;
                        foreach (RoadAccident ra in road_accidents)
                        {
                            if (Key == ra.rKey)
                            {
                                IsUnique = false;
                            }
                        }
                    }
                    //По той же логике
                    while (!IsUnique)
                    {
                        RA_Number = rand.Next(-2147483648, 2147483647);
                        IsUnique  = true;
                        foreach (RoadAccident ra in road_accidents)
                        {
                            if (RA_Number == ra.RoadAccidentNumber)
                            {
                                IsUnique = false;
                            }
                        }
                    }

                    RoadAccident ra1 = new RoadAccident();
                    Driver       d1  = new Driver();
                    Car          c1  = new Car();
                    Console.WriteLine("Введите данные о ДТП:\n");

                    bool IsTpdSelect = false;
                    while (!IsTpdSelect)
                    {
                        Console.WriteLine("Введите название отдела ГИБДД, в котором"
                                          + " рассматривается данное ДТП (выберите из списка): ");
                        int i = 1;
                        foreach (TrafficPoliceDepartament tpd in tpds)
                        {
                            Console.WriteLine("{0}. {1}", ++i, tpd.Name);
                        }
                        string PD_Name = Console.ReadLine();
                        foreach (TrafficPoliceDepartament tpd in tpds)
                        {
                            if (PD_Name == tpd.Name)
                            {
                                IsTpdSelect = true;
                                ra1.tpd_Key = tpd.ra_Key;
                            }
                        }
                    }

                    ra1.rKey = d1.dKey = c1.cKey = Key;    //Устанавливаем значение ключа
                    ra1.RoadAccidentNumber = RA_Number;    //Уст. номер ДТП

                    //ввод ДТП
                    string[] Types_RA = ra1.GetTypesOfRoadAccidents();
                    while (true)
                    {
                        Console.WriteLine("Выберите причину ДТП:\n" +
                                          " 1. {0}\n 2. {1}\n 3. {2}\n 4. {3}\n5. {4}\n" +
                                          " 6. {5}\n 7. {6}\n 8. {7}\n 9. {8}\n",
                                          Types_RA[0], Types_RA[1], Types_RA[2], Types_RA[3], Types_RA[4],
                                          Types_RA[5], Types_RA[6], Types_RA[7], Types_RA[8]);
                        try
                        {
                            ra1.ReasonOfAccident = Types_RA[int.Parse(Console.ReadLine()) - 1];
                        }
                        catch
                        {
                            Console.WriteLine("Введите число из списка!\n");
                            continue;
                        }

                        break;
                    }

                    while (true)
                    {
                        Console.Write("Введите дату: ");
                        try
                        {
                            ra1.Date = uint.Parse(Console.ReadLine());
                        }
                        catch
                        {
                            Console.WriteLine("Введите число от 1 до 31!\n");
                            continue;
                        }
                        break;
                    }

                    while (true)
                    {
                        Console.Write("Введите дату: ");
                        try
                        {
                            ra1.CountOfVicttim = uint.Parse(Console.ReadLine());
                        }
                        catch
                        {
                            Console.WriteLine("Введите натуральное число!\n");
                            continue;
                        }
                        break;
                    }
                    Console.Write("Введите место ДТП: ");
                    ra1.Place = Console.ReadLine();
                    Console.Write("\nВведите причину ДТП: ");
                    ra1.ReasonOfAccident = Console.ReadLine();

                    //ввод Водитель
                    while (true)
                    {
                        string dl = Console.ReadLine();
                        int    a  = 0;
                        if (dl.Length > 12 && dl[2] == ' ' && dl[5] == ' ' &&
                            int.TryParse(dl.Substring(0, 1), out a) &&
                            int.TryParse(dl.Substring(3, 4), out a) &&
                            int.TryParse(dl.Substring(6, 11), out a)
                            )
                        {
                            Console.WriteLine("Введите номер формата \"ХХ ХХ ХХХХХХ\", где Х - цифра!\n");
                            continue;
                        }
                        d1.DriverLicense = dl;
                        break;
                    }
                    while (true)
                    {
                        Console.Write("Введите стаж водителя (в годах): ");
                        try
                        {
                            d1.Experience = uint.Parse(Console.ReadLine());
                        }
                        catch
                        {
                            Console.WriteLine("Введите натуральное число!\n");
                            continue;
                        }

                        break;
                    }
                    Console.WriteLine("Введите имя водителя");
                    d1.Name = Console.ReadLine();

                    //ввод Машина
                    while (true)
                    {
                        Console.Write("Введите номер автомобиля: ");
                        try
                        {
                            c1.StateCarNumber = Console.ReadLine();
                        }
                        catch
                        {
                            Console.WriteLine("Длина номера не может превышать 9!\n");
                            continue;
                        }

                        break;
                    }

                    Console.Write("Введите фирму автомобиля: ");
                    c1.Firm = Console.ReadLine();

                    Console.Write("Введите марку автомобиля: ");
                    c1.Brend = Console.ReadLine();

                    Console.Write("Введите тип кузова автомобиля");
                    c1.BodyType = Console.ReadLine();

                    Console.WriteLine("Информация о ДТП успешно добавлена!");
                    Console.WriteLine("Для продолжения нажмите любую клавишу...");
                    Console.ReadKey();
                    break;

                case '2':    //Удалить информацию о ДТП
                    Console.Clear();

                    bool IsDeleted        = false;
                    int  UserChoiseNumber = 0;

                    //Вывод исходной таблицы
                    lens = new string[6];

                    lens[0] = (-"Количество пострадавших".Length - 1).ToString();

                    l       = road_accidents.Max(Ra => Ra.RoadAccidentNumber.ToString().Length);
                    lens[1] =
                        l > "Номер ДТП".Length
                             ? (-l - 1).ToString()
                             : (-"Номер ДТП".Length - 1).ToString();

                    l       = road_accidents.Max(Ra => Ra.TypeOfAccident.Length);
                    lens[2] =
                        l > "Тип ДТП".Length
                             ? (-l - 1).ToString()
                             : (-"Тип ДТП".Length - 1).ToString();

                    l       = road_accidents.Max(Ra => Ra.ReasonOfAccident.Length);
                    lens[3] =
                        l > "Причина ДТП".Length
                             ? (-l - 1).ToString()
                             : (-"Причина ДТП".Length - 1).ToString();

                    l       = road_accidents.Max(Ra => Ra.Place.Length);
                    lens[4] =
                        l > "Место".Length
                             ? (-l - 1).ToString()
                             : (-"Место".Length - 1).ToString();

                    lens[5] = (-"Дата".Length - 1).ToString();

                    for (int i = 0; i < lens.Length; i++)
                    {
                        str += "{" + i.ToString() + "," + lens[i] + "}";
                    }
                    str += "\n";

                    Console.WriteLine(str,
                                      "Количество пострадавших", "Номер ДТП",
                                      "Тип ДТП", "Причина ДТП", "Место", "Дата");

                    foreach (RoadAccident ra in road_accidents)
                    {
                        Console.WriteLine(str,
                                          ra.CountOfVicttim, ra.RoadAccidentNumber,
                                          ra.TypeOfAccident, ra.ReasonOfAccident, ra.Place, ra.Date);
                    }


                    //Удаление
                    while (!IsDeleted)
                    {
                        Console.WriteLine(
                            "\nВыберите номер ДТП (см. таблицу), которое вы хотите удалить" +
                            " (если вы хотите отменить удаление, введите слово \"Отменить\")\n");

                        string user_choise = Console.ReadLine();
                        if (user_choise.ToLower() == "отменить")
                        {
                            break;
                        }
                        if (!int.TryParse(user_choise, out UserChoiseNumber))
                        {
                            Console.WriteLine(
                                "\nВы можете ввести целое число или слово \"Отменить\"\n"
                                + user_choise + " не является допустимым значением\n"
                                + "Чтобы продолжить нажмите любую клавишу...");
                            Console.ReadKey();
                            continue;
                        }

                        int i = -1;
                        foreach (RoadAccident ra in road_accidents)
                        {
                            i++;
                            if (UserChoiseNumber == ra.RoadAccidentNumber)
                            {
                                road_accidents.RemoveAt(i);
                                IsDeleted = true;
                                break;    //Выход из foreach
                            }
                        }
                    }

                    //Вывод результатов удаления
                    lens = new string[6];

                    lens[0] = (-"Количество пострадавших".Length - 1).ToString();

                    l       = road_accidents.Max(Ra => Ra.RoadAccidentNumber.ToString().Length);
                    lens[1] =
                        l > "Номер ДТП".Length
                             ? (-l - 1).ToString()
                             : (-"Номер ДТП".Length - 1).ToString();

                    l       = road_accidents.Max(Ra => Ra.TypeOfAccident.Length);
                    lens[2] =
                        l > "Тип ДТП".Length
                             ? (-l - 1).ToString()
                             : (-"Тип ДТП".Length - 1).ToString();

                    l       = road_accidents.Max(Ra => Ra.ReasonOfAccident.Length);
                    lens[3] =
                        l > "Причина ДТП".Length
                             ? (-l - 1).ToString()
                             : (-"Причина ДТП".Length - 1).ToString();

                    l       = road_accidents.Max(Ra => Ra.Place.Length);
                    lens[4] =
                        l > "Место".Length
                             ? (-l - 1).ToString()
                             : (-"Место".Length - 1).ToString();

                    lens[5] = (-"Дата".Length - 1).ToString();

                    for (int i = 0; i < lens.Length; i++)
                    {
                        str += "{" + i.ToString() + "," + lens[i] + "}";
                    }
                    str += "\n";

                    Console.WriteLine(str,
                                      "Количество пострадавших", "Номер ДТП",
                                      "Тип ДТП", "Причина ДТП", "Место", "Дата");
                    foreach (RoadAccident ra in road_accidents)
                    {
                        Console.WriteLine(str,
                                          ra.CountOfVicttim, ra.RoadAccidentNumber,
                                          ra.TypeOfAccident, ra.ReasonOfAccident, ra.Place, ra.Date);
                    }

                    Console.WriteLine("\nИнформация о ДТП с номером {0} успешно удалена!", UserChoiseNumber);
                    Console.WriteLine("\nДля продолжения нажмите любую клавишу...");
                    Console.ReadKey();
                    break;

                case '3':    //Список водителей, совершивших более одного ДТП
                    Console.Clear();
                    var Drivers_Most1RA =
                        //Нужна ли сортировка?
                        drivers.GroupJoin(road_accidents, d => d.dKey, ra => ra.rKey, (d, ra) =>
                                          new
                    {
                        d.DriverLicense,
                        d.Name,
                        d.Experience,
                        lst = ra
                    }).Where(group => group.lst.Count() > 1);

                    if (Drivers_Most1RA.Count() == 0)
                    {
                        Console.WriteLine("Нет данных!");
                        Console.WriteLine("\nДля продолжения нажмите любую клавишу...");
                        Console.ReadKey();
                        break;
                    }

                    name_l = -Drivers_Most1RA.Max(d => d.Name.Length) - 1;
                    exp_l  = -Drivers_Most1RA.Max(d => d.Experience.ToString().Length) - 1;

                    str =
                        "{0, " + ("Имя".Length > -name_l ? (-"Имя".Length - 1).ToString()
                            : name_l.ToString()) + "}" +
                        "{1, " + ("Опыт".Length > -exp_l ? (-"Опыт".Length - 1).ToString()
                            : exp_l.ToString()) + "}" +
                        "{2, " + (-"№ водительского уд.".Length).ToString() + "}\n";

                    Console.WriteLine(str,
                                      "Имя", "Опыт", "№ водительского уд.");
                    foreach (var dr in Drivers_Most1RA)
                    {
                        Console.WriteLine(str,
                                          dr.Name,
                                          dr.Experience, dr.DriverLicense);
                    }

                    Console.WriteLine("\nДля продолжения нажмите любую клавишу...");
                    Console.ReadKey();
                    break;

                case '4':    //Список водителей, участвующих в ДТП в заданном месте
                    Console.Clear();
                    Console.Write("Введите место ДТП: ");
                    string place = Console.ReadLine();

                    var Driver_InPlace =
                        road_accidents.Join(drivers, ra => ra.rKey, d => d.dKey,
                                            (ra, d) => new
                    {
                        d.DriverLicense,
                        d.Experience,
                        d.Name,
                        ra.Place
                    }
                                            ).Where(dp => dp.Place == place);

                    if (Driver_InPlace.Count() == 0)
                    {
                        Console.WriteLine("\nНет информации по заданному месту");
                        Console.WriteLine("\nДля продолжения нажмите любую клавишу...");
                        Console.ReadKey();
                        break;
                    }

                    name_l = -Driver_InPlace.Max(d => d.Name.Length) - 1;
                    exp_l  = -Driver_InPlace.Max(d => d.Experience.ToString().Length) - 1;

                    str =
                        "{0, " + ("Имя".Length > -name_l ? (-"Имя".Length - 1).ToString()
                            : name_l.ToString()) + "}" +
                        "{1, " + ("Опыт".Length > -exp_l ? (-"Опыт".Length - 1).ToString()
                            : exp_l.ToString()) + "}" +
                        "{2, " + (-"№ водительского уд.".Length).ToString() + "}\n";

                    Console.WriteLine(str,
                                      "Имя", "Опыт", "№ водительского уд.");
                    foreach (var dr in Driver_InPlace)
                    {
                        Console.WriteLine(str,
                                          dr.Name,
                                          dr.Experience, dr.DriverLicense);
                    }
                    Console.WriteLine("\nДля продолжения нажмите любую клавишу...");
                    Console.ReadKey();
                    break;

                case '5':    //Список водителей, участвующих в ДТП на заданную дату

                    uint date = 0;

                    while (true)
                    {
                        Console.Clear();
                        Console.Write("Введите дату ДТП: ");
                        try
                        {
                            date = uint.Parse(Console.ReadLine());
                            if (date > 31)
                            {
                                throw new Exception();
                            }
                        }
                        catch
                        {
                            Console.WriteLine("Дата должна лежать в диапазоне от"
                                              + "1 до 31 и являться целым числом!"
                                              + "\nДля продолжения нажмите любую клавишу... ");
                            Console.ReadKey();
                            continue;
                        }
                        break;
                    }
                    var Driver_ByDate =
                        road_accidents.Join(drivers, ra => ra.rKey, d => d.dKey,
                                            (ra, d) => new
                    {
                        d.DriverLicense,
                        d.Experience,
                        d.Name,
                        ra.Date
                    }
                                            ).Where(dd => dd.Date == date);
                    //Вывод таблицы
                    if (Driver_ByDate.Count() == 0)
                    {
                        Console.WriteLine("\nНет информации по заданной дате");
                        Console.WriteLine("\nДля продолжения нажмите любую клавишу...");
                        Console.ReadKey();
                        break;
                    }


                    name_l = -Driver_ByDate.Max(d => d.Name.Length) - 1;
                    exp_l  = -Driver_ByDate.Max(d => d.Experience.ToString().Length) - 1;

                    str =
                        "{0, " + ("Имя".Length > -name_l ? (-"Имя".Length - 1).ToString()
                            : name_l.ToString()) + "}" +
                        "{1, " + ("Опыт".Length > -exp_l ? (-"Опыт".Length - 1).ToString()
                            : exp_l.ToString()) + "}" +
                        "{2, " + (-"№ водительского уд.".Length).ToString() + "}\n";

                    Console.WriteLine(str,
                                      "Имя", "Опыт", "№ водительского уд.");
                    foreach (var dr in Driver_ByDate)
                    {
                        Console.WriteLine(str,
                                          dr.Name,
                                          dr.Experience, dr.DriverLicense);
                    }

                    Console.WriteLine("\nДля продолжения нажмите любую клавишу...");
                    Console.ReadKey();
                    break;

                case '6':    //ДТП с максимальным количеством потерпевших.
                    Console.Clear();
                    uint max_count = road_accidents.Max(ra => ra.CountOfVicttim);
                    //Если сделать запрос Where, то условный оператор при выводе не понадобится
                    //Надо ли?


                    road_accidents =
                        road_accidents.Where(Ra => Ra.CountOfVicttim == max_count).ToList();
                    //Вывод результатов
                    lens    = new string[6];
                    lens[0] = (-"Количество пострадавших".Length - 1).ToString();

                    l       = road_accidents.Max(Ra => Ra.RoadAccidentNumber.ToString().Length);
                    lens[1] =
                        l > "Номер ДТП".Length
                             ? (-l - 1).ToString()
                             : (-"Номер ДТП".Length - 1).ToString();

                    l       = road_accidents.Max(Ra => Ra.TypeOfAccident.Length);
                    lens[2] =
                        l > "Тип ДТП".Length
                             ? (-l - 1).ToString()
                             : (-"Тип ДТП".Length - 1).ToString();

                    l       = road_accidents.Max(Ra => Ra.ReasonOfAccident.Length);
                    lens[3] =
                        l > "Причина ДТП".Length
                             ? (-l - 1).ToString()
                             : (-"Причина ДТП".Length - 1).ToString();

                    l       = road_accidents.Max(Ra => Ra.Place.Length);
                    lens[4] =
                        l > "Место".Length
                             ? (-l - 1).ToString()
                             : (-"Место".Length - 1).ToString();

                    lens[5] = (-"Дата".Length - 1).ToString();

                    for (int i = 0; i < lens.Length; i++)
                    {
                        str += "{" + i.ToString() + "," + lens[i] + "}";
                    }
                    str += "\n";

                    Console.WriteLine(str,
                                      "Количество пострадавших", "Номер ДТП",
                                      "Тип ДТП", "Причина ДТП", "Место", "Дата");
                    foreach (RoadAccident ra in road_accidents)
                    {
                        Console.WriteLine(str,
                                          ra.CountOfVicttim, ra.RoadAccidentNumber,
                                          ra.TypeOfAccident, ra.ReasonOfAccident, ra.Place, ra.Date);
                    }
                    Console.WriteLine("\nДля продолжения нажмите любую клавишу...");
                    Console.ReadKey();
                    break;

                case '7':     //Список водителей, участвующих в ДТП с наездом на пешеходов.
                    Console.Clear();
                    var Drivers_Filtered = road_accidents.Join(drivers,
                                                               ra => ra.rKey, d => d.dKey, (ra, d) =>
                                                               new
                    {
                        d.DriverLicense,
                        d.Experience,
                        d.Name,
                        ra.TypeOfAccident
                    }).Where(df => df.TypeOfAccident == "Наезд на пешехода");

                    if (Drivers_Filtered.Count() == 0)
                    {
                        Console.WriteLine("\nНет информации по заданной дате");
                        Console.WriteLine("\nДля продолжения нажмите любую клавишу...");
                        Console.ReadKey();
                        break;
                    }


                    name_l = -Drivers_Filtered.Max(d => d.Name.Length) - 1;
                    exp_l  = -Drivers_Filtered.Max(d => d.Experience.ToString().Length) - 1;

                    str =
                        "{0, " + ("Имя".Length > -name_l ? (-"Имя".Length - 1).ToString()
                            : name_l.ToString()) + "}" +
                        "{1, " + ("Опыт".Length > -exp_l ? (-"Опыт".Length - 1).ToString()
                            : exp_l.ToString()) + "}" +
                        "{2, " + (-"№ водительского уд.".Length).ToString() + "}\n";

                    Console.WriteLine(str,
                                      "Имя", "Опыт", "№ водительского уд.");
                    foreach (var dr in Drivers_Filtered)
                    {
                        Console.WriteLine(str,
                                          dr.Name,
                                          dr.Experience, dr.DriverLicense);
                    }
                    Console.WriteLine("\nДля продолжения нажмите любую клавишу...");
                    Console.ReadKey();
                    break;

                case '8':    //Причины ДТП в порядке убывания их количества.
                    Console.Clear();
                    var list_of_groups = road_accidents.GroupBy(ra => ra.ReasonOfAccident)
                                         .Select(ra_grp => new
                    {
                        grp_name = ra_grp.Key,
                        lst      = ra_grp
                    }).OrderByDescending(ra_grps => ra_grps.lst.Count());

                    int l1 = list_of_groups.Max(gr => gr.grp_name.Length);
                    str = "{0, " +
                          (l1 > "Причина ДТП".Length? (-l1 - 1).ToString()
                            : (-"Причина ДТП".Length - 1).ToString()) +
                          "} {1}";

                    Console.WriteLine(str, "Причина ДТП", "Количество ДТП");
                    foreach (var ra_1grp in list_of_groups)
                    {
                        Console.WriteLine(str, ra_1grp.grp_name, ra_1grp.lst.Count());
                    }
                    Console.WriteLine("\nДля продолжения нажмите любую клавишу...");
                    Console.ReadKey();
                    break;

                case '9':    //Выход из программы
                    Console.Clear();
                    do
                    {
                        Console.WriteLine("Вы уверены, что хотите выйти? \n1.Да \n2.Нет");
                        UserChoise = Console.ReadKey().KeyChar;
                    } while (UserChoise != '1' && UserChoise != '2');
                    if (UserChoise == '1')
                    {
                        return;
                    }
                    break;
                }
            }
        }
Exemplo n.º 2
0
        static void File_Load(string path, int NumberOfList, int Count_Fields)
        {
            StreamReader FileR = new StreamReader(path, Encoding.Default);
            string       str;

            while ((str = FileR.ReadLine()) != null)//пока не конец файла
            {
                string[] data = new string[Count_Fields];
                data = str.Split(';');
                switch (NumberOfList)
                {
                case 0:    //Водитель
                    Driver d = new Driver();
                    try
                    {
                        d.dKey       = int.Parse(data[0]);
                        d.Experience = uint.Parse(data[2]);
                    }
                    catch
                    {
                        Console.WriteLine("Ошибка в строке:\n", str);
                        Console.WriteLine("Для продолжения нажмите на любую клавишу...");
                        Console.ReadKey();
                        return;
                    }
                    d.Name          = data[1];
                    d.DriverLicense = data[3];

                    drivers.Add(d);
                    break;

                case 1:    //Машина
                    cars.Add(new Car(Convert.ToInt32(data[0]), data[1], data[2], data[3], data[4]));
                    break;

                case 2:
                    RoadAccident ra = new RoadAccident();
                    try
                    {
                        ra.rKey               = int.Parse(data[0]);
                        ra.tpd_Key            = int.Parse(data[1]);
                        ra.Date               = uint.Parse(data[2]);
                        ra.RoadAccidentNumber = int.Parse(data[3]);
                        ra.CountOfVicttim     = uint.Parse(data[5]);
                    }
                    catch
                    {
                        Console.WriteLine("Ошибка в строке:\n", str);
                        Console.WriteLine("Для продолжения нажмите на любую клавишу...");
                        Console.ReadKey();
                        return;
                    }
                    ra.Place            = data[4];
                    ra.TypeOfAccident   = data[6];
                    ra.ReasonOfAccident = data[7];

                    road_accidents.Add(ra);
                    break;


                case 3:    //Отдел ГИБДД
                    TrafficPoliceDepartament tpd = new TrafficPoliceDepartament();
                    try
                    {
                        tpd.tKey   = int.Parse(data[0]);
                        tpd.ra_Key = int.Parse(data[1]);
                    }
                    catch
                    {
                        Console.WriteLine("Ошибка в строке\n", str);
                        Console.ReadKey();
                        return;
                    }
                    tpd.Name = data[2];

                    tpds.Add(tpd);
                    break;
                }
            }
        }