Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2015, 09:39   #41
Fil_1990
Пользователь
 
Регистрация: 23.09.2015
Сообщений: 76
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
начать никогда не поздно.
Согласен c вами!

Сергей возможен ли подсчёт таким счётчиком?
Код:
int k=0; 
 
foreach(string s in elements)
 
{
 
if (elements[1]=="01")
 
{
 
k++;
 
continue;
 
}
 

 
Console.WriteLine("01: {0} ",k);

Последний раз редактировалось Stilet; 02.10.2015 в 18:43.
Fil_1990 вне форума Ответить с цитированием
Старый 02.10.2015, 15:17   #42
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Fil_1990
Сергей возможен ли подсчёт таким счётчиком?
ну да, возможен.
но так Вы подсчитаете только число с кодом "01"
а что потом с кодом "02", "03" и прочими делать?
мне кажется, проще это всё подсчитать за один цикл.
Хотя, если Вам другие коды не нужны, то такой вполне себе решение.

а зачем Вы continue; воткнули? если Вы код привели полностью, то никакого continue там не нужно! Это бессмысленно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.10.2015, 15:44   #43
Fil_1990
Пользователь
 
Регистрация: 23.09.2015
Сообщений: 76
По умолчанию

А так?
Код:
// массив,каждая позиция соответствует значению в файле
            Int32[] arrCounter = { 0, 0, 0, 0, 0, 0 };
 
switch (elements[1])
                {
                    case "01": arrCounter[0]++; break;
                    case "02": arrCounter[1]++; break;
                    case "03": arrCounter[2]++; break;  
                    case "04": arrCounter[3]++; break;
                    case "05": arrCounter[4]++; break;
                    case "06": arrCounter[5]++; break;
                }
            Console.WriteLine(String.Format("01: {0}; 02: {1}; 03: {2}; 04: {3}; 05: {4}; 06: {5}"
        ,arrCounter[0], arrCounter[1], arrCounter[2], arrCounter[3]
        ,arrCounter[4], arrCounter[5]));
Сергей возник вопрос после того как убрал один счётчик он не корректно считает общее время в выходном файле, ну и соответственно среднее время меняется. При добавлении счётчика общее время увеличивается, и соответственно среднее увеличивается.Как сделать так чтоб общее время выводилось по старому 17 дней и....., а среднее считалось с корректным временем отклонения не более 2 ч? вот мой код последняя версия.
Код:
{
    class Program
    {
        static void Main(string[] args)
        {

            DirectoryInfo papka = new DirectoryInfo(@"C:\Users\a.filatov\Desktop\Test\");
            try
            {

                papka.CreateSubdirectory(@"Writer");
                papka.CreateSubdirectory(@"Incorrect");
            }
            catch (IOException e) { Console.WriteLine(e.Message); }
            string path = @"C:\Users\a.filatov\Desktop\1\COMMA.txt";

            string[] readText = File.ReadAllLines(path);

            TimeSpan intervaltimesum = new TimeSpan();

            TimeSpan current_time;

            int countTime = 0;

            //Создание потока для записи в файл
            StreamWriter W = new StreamWriter(@"C:\Users\a.filatov\Desktop\Test\Writer\Write.txt");
            StreamWriter A = new StreamWriter(@"C:\Users\a.filatov\Desktop\Test\Incorrect\Incorrect.txt");

            Int32[] arrCounter = { 0, 0, 0, 0, 0, 0 };
           
            for (int i = 19; i < 1019; i++)
            {
                string[] elements = readText[i].Split(',');
                
                switch (elements[1])
                {
                    case "01": arrCounter[0]++; break;
                    case "02": arrCounter[1]++; break;
                    case "03": arrCounter[2]++; break;  
                    case "04": arrCounter[3]++; break;
                    case "05": arrCounter[4]++; break;
                    case "06": arrCounter[5]++; break;
                }

                if (elements.GetLength(0) > 4)
                {
                    //Разбор 4 элемента массива
                    try
                    {
                        //Разделитель ":"
                        string[] times = elements[4].Split(':');
                        int hours = int.Parse(times[0]);
                        int minutes = int.Parse(times[1]);
                        int seconds = int.Parse(times[2]);
                        current_time = TimeSpan.FromHours(hours) +
    TimeSpan.FromMinutes(minutes) + TimeSpan.FromSeconds(seconds);

                        // Запись в файл
                        W.WriteLine("{0} {1} {2}  \t\t Текущее время = {3} Общее время = {4}"
         , i - 18, elements[0], elements[4], current_time, intervaltimesum);

                        if (current_time.TotalHours > 2)
                        {
                            A.WriteLine("{0}", current_time);
                        }
                        else
                        {  // если меньше двух часов - тогда суммируем
                            intervaltimesum += current_time;
                            countTime++;
                        }

                    }
                    catch (Exception)
                    {

                        throw;
                    }
                }

            }
            Console.WriteLine(String.Format("01: {0}; 02: {1}; 03: {2}; 04: {3}; 05: {4}; 06: {5}"
    , arrCounter[0], arrCounter[1], arrCounter[2], arrCounter[3]
    , arrCounter[4], arrCounter[5]));
            A.Close();

            TimeSpan intervalAverage = TimeSpan.FromSeconds(intervaltimesum.TotalSeconds / countTime);
            Console.WriteLine("Среднее время = {0:hh\\:mm\\:ss}", intervalAverage);

            W.WriteLine("\n\n Всё время отклонения = {0} в секундах = {1}"
             , intervaltimesum, intervaltimesum.TotalSeconds);


            W.WriteLine(" Среднее время {0:hh\\:mm\\:ss}", intervalAverage);
            W.Close();


        }

    }
}

Последний раз редактировалось Stilet; 02.10.2015 в 18:48.
Fil_1990 вне форума Ответить с цитированием
Старый 02.10.2015, 17:10   #44
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вам нужно считать общее время с учётом всех строк (даже тех, что более 2-х часов),
а для среднего нужно считать без строк, где время более 2-х часов?
так это просто.
Заведите отдельную переменную, где будете суммировать всё время.

например, так:
Код:
           //Объявляем интервал времени
            TimeSpan intervaltimesum = new TimeSpan();
            TimeSpan intervaltimeAllSum = new TimeSpan();
..........

 //Если четвертый элемент в строке существует, то работаем с ним
                if (elements.GetLength(0) > 4)
                {
                    //Разбор 4 элемента массива
                    try
                    {
                        //Разделитель ":"
                        string[] times = elements[4].Split(':');
                        int hours = int.Parse(times[0]);
                        int minutes = int.Parse(times[1]);
                        int seconds = int.Parse(times[2]);
                        current_time = TimeSpan.FromHours(hours) + TimeSpan.FromMinutes(minutes) + TimeSpan.FromSeconds(seconds);

                        // Запись в файл
                        W.WriteLine("{0} {1} {2}  \t\t Текущее время = {3} Общее время = {4}"
      , i - 18, elements[0], elements[4], current_time, intervaltimesum);

                        // суммируем общее время 
                        intervaltimeAllSum += current_time;

                        //Вывод 4 элемента массива в файл более 2 часов
                        if (current_time.TotalHours > 2)
                        {
                            // в отдельный файл выведем значение более 2-х часов
                            A.WriteLine("{0}", current_time);
                        }
                        else
                        {  // если меньше двух часов - тогда суммируем
                            intervaltimesum += current_time;
                            countTime++;
                        }

                    }
                    catch (Exception)
                    {

                        throw;
                    }
                }

            }
            // Вывод узлов в консоль
            Console.WriteLine(String.Format("01: {0}; 02: {1}; 03: {2}; 04: {3}; 05: {4}; 06: {5}"
            , arrCounter[0], arrCounter[1], arrCounter[2], arrCounter[3]
            , arrCounter[4], arrCounter[5]));
            //Закрытие потока 
            A.Close();

            //Вывод среднего времени в нужном формате
            TimeSpan intervalAverage = TimeSpan.FromSeconds(intervaltimesum.TotalSeconds / countTime);
            Console.WriteLine("Среднее время = {0:hh\\:mm\\:ss}", intervalAverage);

            //Запись в файл времени 
            W.WriteLine("\n\n Всё время отклонения = {0} в секундах = {1}", intervaltimeAllSum, intervaltimeAllSum.TotalSeconds);

Последний раз редактировалось Stilet; 02.10.2015 в 18:49.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.10.2015, 17:24   #45
Fil_1990
Пользователь
 
Регистрация: 23.09.2015
Сообщений: 76
По умолчанию

Сергей это всё хорошо, а чтоб в файле writer он писал общее время-всё суммированное время?А среднее считал для времени не более 2ч?

А хотя и так сойдёт, спасибо.

Последний раз редактировалось Stilet; 02.10.2015 в 18:49.
Fil_1990 вне форума Ответить с цитированием
Старый 02.10.2015, 17:30   #46
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Fil_1990 Посмотреть сообщение
Сергей это всё хорошо, а чтоб в файле writer он писал общее время-всё суммированное время?А среднее считал для времени не более 2ч?
Так я же так и сделал.
в файл W будет записано ВСЁ время:
Цитата:
Код:
//Запись в файл времени 
            W.WriteLine("\n\n Всё время отклонения = {0} в секундах = {1}", intervaltimeAllSum, intervaltimeAllSum.TotalSeconds);
т.к. в переменную intervaltimeAllSum мы суммируем все строчки.

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

что не так?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.10.2015, 17:46   #47
Fil_1990
Пользователь
 
Регистрация: 23.09.2015
Сообщений: 76
По умолчанию

Сергей всё устраивает спасибо.
Вот очередной вопрос, подсчёт количества узлов во второй позиции реализовал с помощью switch case, а если например будет 100 позиций не вводить же их вручную?
Как с этим быть?
Fil_1990 вне форума Ответить с цитированием
Старый 02.10.2015, 17:58   #48
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Вот очередной вопрос, подсчёт количества узлов во второй позиции реализовал с помощью switch case, а если например будет 100 позиций не вводить же их вручную?
Вы изначально неверно подошли к решению этой проблемы.
Эту задачу лучше, конечно, решать используя БД или LINQ
но даже если решать её традиционным способом, то нужно делать это не так.
нужно заводить структуру (массив), где по ключу можно читать или записывать данные. Далее, если встретили значение, то, если такое значение уже есть в массиве, то наращиваем счётчик, если нет, то добавляем в массив новое значение и присваиваем ему начальное значение 1.

Но ещё раз повторю.
LINQ эта задача может быть эффективно решена буквально одной строчкой (один запрос).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.10.2015, 09:38   #49
Fil_1990
Пользователь
 
Регистрация: 23.09.2015
Сообщений: 76
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Вы изначально неверно подошли к решению этой проблемы.
Эту задачу лучше, конечно, решать используя БД или LINQ
но даже если решать её традиционным способом, то нужно делать это не так.
нужно заводить структуру (массив), где по ключу можно читать или записывать данные. Далее, если встретили значение, то, если такое значение уже есть в массиве, то наращиваем счётчик, если нет, то добавляем в массив новое значение и присваиваем ему начальное значение 1.

Но ещё раз повторю.
LINQ эта задача может быть эффективно решена буквально одной строчкой (один запрос).
Сергей теперь я понял что пошёл не верным способом, у меня в 4 элементе хранится код ошибки, факт в том что я не знаю какие там хранятся числа ну например от 01 до 100, как реализовать алгоритм приведённый вами выше на этом примере,собственно к чему спрашивал.
http://professorweb.ru/my/LINQ/base/level1/1_6.php[/URL] почитал статью ну пока сложновато понимается(
Читаю эту статью https://msdn.microsoft.com/ru-ru/lib...v=vs.110).aspx

Последний раз редактировалось Fil_1990; 05.10.2015 в 10:19.
Fil_1990 вне форума Ответить с цитированием
Старый 05.10.2015, 10:56   #50
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, почему в "4-м элементе"?
вы про эту структуру?
Цитата:
Код:
#,LM,Jam ID,Date Occurred,Time Jammed,Rc,Rt,Cl,Jam Text
001,05,015,04/07/15 15:18,00:00:32,01,02,00,Picker can't detect all parts:Ck #1 A1
002,02,030,09/21/15 15:17,00:00:19,00,00,01,ATT unable to detect tray at Gripper
003,01,045,09/21/15 15:15,00:01:32,00,01,00,Aux tray is hanging on guides or stuck in gripper.
004,01,045,09/21/15 15:15,00:00:17,00,01,00,Aux tray is hanging on guides or stuck in gripper.
005,04,030,09/18/15 19:28,00:00:55,01,02,00,Missing sort device(s) on sort boat. B1
Вы, наверное имели в виду 3-й элемент (то, что в таблице озаглавлено "Jam ID") ?

во-вторых, ну да, там есть 3-хзначные коды (все меньше 100, но, как видно из цитаты, некоторые коды повторяются).
Так в чём состоит задача? Что Вы хотите получить?



p.s. я бы лично всю вашу таблицу затащил в БД (любую) и потом SQL запросами получал любую необходимую статистику.
но, впрочем, думаю, что LINQ запросами это тоже можно сделать...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не работает вывод результат проверки теста. Utyf Помощь студентам 0 05.05.2013 14:55
C++ при написание слова вывод строчки. olegass Помощь студентам 0 12.02.2013 01:22
3 условия проверки. Оптимизация. artemavd Общие вопросы Delphi 15 22.12.2011 13:40
вывод в файл Dimarik Общие вопросы C/C++ 20 21.03.2011 19:40