Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Алгоритм сортировки данных

19K
24 марта 2010 года
WantToProg
63 / / 19.01.2009
Доброе всем время суток. Возникла такая проблемка, которую решают скорее всего на первом курсе универа, если не в школе. А вот я не могу сообразить, как мне сделать лучше.
Итак, я пишу приложение в которе передается массив данных(пакет).
Структура пакета такова:
1. Первые 10 элементов массива данные, которые меня не интересуют.
2. каждый одинадцатый элемент массива, ключ, в зависимости от данных в нем 0 или 1 сообщает что находится в последующих 10ти элементах.
3. Элементы массива c n*11 +1 до n*11 + 10 содержат полезную информацию. n*11+10 = год, n*11+9 = месяц, n*11+8 = день, n*11+7 = час, n*11+6 минуты
4. Последний элемент массива, контрольная сумма всего пакета.

Что необходимо сделать мне:
1. Произвести просмотр массива и разделить пакеты в зависимости от ключа и сортировать разделенные пакеты по содержимому в элементах даты.
Каждый элемент массива содержит один байт.

PS: если слишком топорно написал, то намекните, что не понятно. Очень надеюсь на вашу помощь ;)

А вообще задача сводится к тому, что бы получить последние по дате данные, которые находятся в элементах массива n*11+1 и n*11+2, при этом, если данные равны нулю (n*11+1 = 0 и n*11+2 = 0), то получить данные за дату ранее.
602
24 марта 2010 года
KPI Student
265 / / 16.12.2006
Сортировка - это кпорядочивание какой-либо последовательности. Например 142983 -> 123489. То, что вы написали - это скорее всего разбор присланного пакета.

Может, вам поможет вот такое решение?
Код:
struct PacketData
{
    char unused[10];
    char yead;
    char month;
    ....    
};

const char*       sourceData = /* исходные данные */;
const PacketData* array = (const PacketData*) sourceData;

cout << "Year 3" << array[2].year;

Это конечно очень приблизительно и грубо, но думаю, идея ясна спрашивайте, что не понятно.
19K
24 марта 2010 года
WantToProg
63 / / 19.01.2009
так дело в том, что в принимаемом пакете(массиве) 123 элемента(может быть больше, может быть меньше, но всегда кратно 11, если мы исключим последний элемент и первые 11.

И еще, первые данные в массиве, всегда по дате последние, а те которые идут после, более ранние.
т.е. на примере конкретного пакета (может быть разной длины):
Код:
[0] 123 byte
[1] 231 byte
[2] 72  byte
[3] 137 byte
[4] 33  byte
[5] 255 byte
[6] 255 byte
[7] 124 byte
[8] 133 byte
[9] 237 byte
[10]    0   byte
[11]    1   byte //ключ
[12]    12  byte //Нужные данные
[13]    1   byte //Нужные данные
[14]    0   byte // бесполезный элемент :)
[15]    83  byte // бесполезный элемент :)
[16]    3   byte // бесполезный элемент :)
[17]    23  byte //минуты
[18]    7   byte //час
[19]    22  byte //Дата
[20]    2   byte //месяц
[21]    10  byte //год
[22]    0   byte //ключ
[23]    248 byte
[24]    2   byte
[25]    6   byte
[26]    250 byte
[27]    3   byte
[28]    32  byte
[29]    19  byte
[30]    21  byte
[31]    2   byte
[32]    10  byte
[33]    1   byte //ключ
[34]    186 byte
[35]    0   byte
[36]    0   byte
[37]    0   byte
[38]    4   byte
[39]    34  byte
[40]    23  byte
[41]    27  byte
[42]    1   byte
[43]    10  byte
[44]    0   byte //ключ
[45]    53  byte
[46]    2   byte
[47]    6   byte
[48]    250 byte
[49]    3   byte
[50]    16  byte
[51]    18  byte
[52]    27  byte
[53]    1   byte
[54]    10  byte
[55]    1   byte //ключ
[56]    126 byte
[57]    0   byte
[58]    0   byte
[59]    0   byte
[60]    4   byte
[61]    26  byte
[62]    23  byte
[63]    30  byte
[64]    0   byte
[65]    10  byte
[66]    0   byte //ключ
[67]    160 byte
[68]    1   byte
[69]    2   byte
[70]    169 byte
[71]    3   byte
[72]    25  byte
[73]    14  byte
[74]    30  byte
[75]    0   byte
[76]    10  byte
[77]    0   byte //ключ
[78]    176 byte
[79]    0   byte
[80]    4   byte
[81]    83  byte
[82]    4   byte
[83]    39  byte
[84]    17  byte
[85]    30  byte
[86]    11  byte
[87]    9   byte
[88]    1   byte //ключ
[89]    21  byte
[90]    0   byte
[91]    4   byte
[92]    83  byte
[93]    4   byte
[94]    27  byte
[95]    6   byte
[96]    30  byte
[97]    11  byte
[98]    9   byte
[99]    0   byte //ключ
[100]   116 byte
[101]   0   byte
[102]   1   byte
[103]   212 byte
[104]   4   byte
[105]   4   byte
[106]   18  byte
[107]   29  byte
[108]   10  byte
[109]   9   byte
[110]   0   byte //ключ
[111]   15  byte
[112]   0   byte
[113]   2   byte
[114]   169 byte
[115]   4   byte
[116]   4   byte
[117]   13  byte
[118]   27  byte
[119]   9   byte
[120]   9   byte
[121]   1   byte //ключ
[122]   5   byte
[123]   0   byte
[124]   0   byte
[125]   0   byte
[126]   4   byte
[127]   3   byte
[128]   7   byte
[129]   27  byte
[130]   9   byte
[131]   9   byte
[132]   137 byte//Контрольная сумма

т.е. смотрим ключ 11 элемента, он равен 1, далее смотрим Нужные данные, и если они не равны 0,0 то оставляем в переменной их, а также дату этого блока, если равны 0,0 то смотрим следующий блок с ключом 1. Тоже самое касается блока с ключом 0.
Может вы меня в конце концов натолкнете на мысль как это реализовать.
PS: Язык программирования использую C#.
602
24 марта 2010 года
KPI Student
265 / / 16.12.2006
То есть, у вас идет ненужный заголовок размером 11 байт, а далее N-ное число структур размером тоже 11 байт.

Но первому элементу структуры определяем, нужно ли ее обрабатывать, я вас правильно понял?

тогда мождет так:

Код:
struct Header
{
  ... // 11 bytes
};

struct ProcessableData
{
    // 10 bytes
}

struct UnprocesableData
{
    // 10 bytes
}


...
Header streamHeader;
myStream.read( streamHeader );

while ( myStream.isEmpty() == false )
{
     static char key;
     static ProcessableData toProcess;
     static UnprocessableData toIgnore;
     
     stream.read( key );
     
     if ( key==NEED_PROCESSING )
     {
         stream.read( toProcess );
         processData( toProcess );
     }
     else
         stream.read( toIgnore );
}
19K
25 марта 2010 года
WantToProg
63 / / 19.01.2009
Вашу идею я наверно понял :) Но такой вариант я помоему уже пробовал реальзовать. К сожалению в него не добавить условие проверки наличия "Нужных данных". Ну или я не знаю как это сделать.
В общем я делал таким образом:
Код:
int n, YEAR_D = 0, MONTH_D = 0, DATE_D = 0, HOUR_D = 0, MIN_D = 0, YEAR_N = 0, MONTH_N = 0, DATE_N = 0, HOUR_N = 0, MIN_N = 0;
byte[] testimony1 = new byte[2];
byte[] testimony2 = new byte[2];
int MBCount = ((messByte.Count() - 12) / 11);
  for (int i = 1; i < MBCount; i++)
       {
             n = i * 11;
             if (messByte[n] == 0)
                 {
                   testimony1[0] = messByte[n + 1];
                   testimony1[1] = messByte[n + 2];
                   YEAR_D = messByte[n + 10]; MONTH_D = messByte[n + 9];
                   DATE_D = messByte[n + 8]; HOUR_D = messByte[n + 7];
                   MIN_D = messByte[n + 6];                              
                 }
             else if (messByte[n] == 1)
                 {
                   testimony2[0] = messByte[n + 1];
                   testimony2[1] = messByte[n + 2];
                   YEAR_N = messByte[n + 10]; MONTH_N = messByte[n + 9];
                   DATE_N = messByte[n + 8]; HOUR_N = messByte[n + 7];
                   MIN_N = messByte[n + 6];
                  }
         }


И как вы понимаете, в результате получалось, что элементы testimony1[0], testimony1[1], testimony2[0], testimony2[1] получают результат последних элементов массива. Т.е. если посмотреть на массив в сообщении выше, результат такой:
testimony1[0] = 15; //[111]
testimony1[1] = 0; //[112]
testimony2[0] = 5; //[122]
testimony2[1] = 0; //[123]

Я не знаю как мне написать алгоритм, что бы получилось:
testimony1[0] = 248; //[23]
testimony1[1] = 2; //[24]
testimony2[0] = 12; //[12]
testimony2[1] = 1; //[13]
И было бы условие, что если оба элемента testimony1[0] и testimony1[1] равны 0, то брать следующее значение, которое находится в блоке с нужным ключом.

PS:фух, вроде объяснил. Думаю дальше, но если есть мысли по этому поводу, поделитесь пожалуйста.
19K
25 марта 2010 года
WantToProg
63 / / 19.01.2009
йа дятло!!!
Все, решил проблему. Думаю правильно, но если есть советы, то прочитаю.
В общем надо сделать 2 цикла, один проверяет "1" другой "0", далее внутри цикла проверка содержимого необходимых данных, и если они равны нулю, то continue, если не равны то break и запускать второй цикл. В результате получаю что нужно.
Имхо как то топорно, но работает.

PS:хочу обратно, одминить, надоело программы писать :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог