2016-09-11 2 views
0

Я сделал этот образец 2d массив строкЗначение столбца отчетности Строковый массив C

char *strings[][4] = {{"Sport", "gender", "country", "medal"}, 
         {"Cycling", "Womens", "China", "first"}, 
         {"Swimming", "Womens", "China", "second"}, 
         {"Swimming", "Womens", "Indonesia", "third"}, 
         {"Cycling", "Womens", "New Zealand", "second"}, 
         {"Cycling", "Womens", "New Zealand", "third"}, 
         {"Swimming", "Womens", "New Zealand", "first"}} 

, который уже был предварительно сортируется на основе столбцов 3 1, в результате чего она была отсортированных первой страной (колонка 3), а затем, когда эта колонка имела связи, затем она сортировалась по спорту (столбец 1).

Я пытаюсь сделать несколько простых иерархических отчетов, с заголовками в верхней части, что-то вроде этого:

Country 
    Sport Count 
----------------- 
China 
    Cycling  1 
    Swimming 1 

Indonesia 
    Swimming 1 

New Zealand 
    Cycling  2 
    Swimming 1 

Если данные сгруппированы в первую очередь странами (столбец 3), то отсчеты из спорта для каждой страны принимаются, когда в каждой стране не должно повторяться никакого вида спорта.

Я также хочу, чтобы сделать это разнообразно, скажем, массив предварительно сортируется по столбцам 3 1 2, то это будет выглядеть так:

{{"Sport", "gender", "country", "medal"}, 
{"Cycling", "Womens", "China", "first"}, 
{"Swimming", "Womens", "China", "second"}, 
{"Swimming", "Womens", "Indonesia", "third"}, 
{"Cycling", "Womens", "New Zealand", "second"}, 
{"Cycling", "Womens", "New Zealand", "third"}, 
{"Swimming", "Womens", "New Zealand", "first"}} 

но иерархическая отчетность будет выглядеть несколько иначе:

China 
    Cycling 
     Womens 1 
    Swimming 
     Womens 1 

Indonesia 
    Swimming 
     Womens 1 

New Zealand 
    Cycling 
     Womens 2 
    Swimming 
     Womens 1 

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

Для спецификации столбцов, я только что с помощью аргументов командной строки, и моя программа выглядит следующим образом до сих пор:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MAXSIZE 10 

int 
main(int argc, char **argv) { 
    char *strings[][4] = {{"Sport", "gender", "country", "medal"}, 
          {"Cycling", "Womens", "China", "first"}, 
          {"Swimming", "Womens", "China", "second"}, 
          {"Swimming", "Womens", "Indonesia", "third"}, 
          {"Cycling", "Womens", "New Zealand", "second"}, 
          {"Cycling", "Womens", "New Zealand", "third"}, 
          {"Swimming", "Womens", "New Zealand", "first"}}; 

    int count, start_index, i; 
    int columns[MAXSIZE]; 

    /* printing command line args out */ 
    for (i = 0; i < count; i++) { 
     printf("%d ", columns[i]); 
    } 

    return 0; 
} 

Есть ли способ, что я могу достигнуть такого рода иерархической отчетности? Есть ли какой-то специальный алгоритм, который мне нужно реализовать для этого?

+0

Пожалуйста, взгляните на мою идею, как решить эту проблему. –

+0

Я думаю, что множественное число для слова «женщина» - это «женщины» - не женщины – i486

+0

@ i486, да, но с точки зрения спортивных ссылок я использую «Женские», это не имеет значения. – RoadRunner

ответ

1

Я знаю, вы упомянули, что вы рамами отсортировал эти данные, но пока вы не захотите использовать другие структуры данных (например, графики строк, а не массивы строк), вы не получите нигде без динамической сортировки. возьмите быстро способ:

Давайте просто переосмыслим qsort хрип ... ждать! ПОЛЬЗУЙТЕСЬ qsort!

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

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

int sport_compare(void const *x, void const *y) { 
    typedef char const * const row[4]; 
    row *fu = x, *ba = y; 
    return strcmp(fu[0], ba[0]); 
} 

int gender_compare(void const *x, void const *y) { 
    typedef char const * const row[4]; 
    row *fu = x, *ba = y; 
    return strcmp(fu[1], ba[1]); 
} 

... и так далее.

Как их использовать, чтобы изобрести колесо qsort?

#define nelem(array) (sizeof array/sizeof *array) 
qsort(array, nelem(array), sizeof *array, country_compare); 

Сейчас array сортируется по стране ... вы преследуете?

qsort(array, nelem(array), sizeof *array, gender_compare); 

... и так далее.


Теперь, когда вы знаете, как обращаться ваш массив с практически в любых условиях всего за пять или шесть строк кода, вы можете положить больше мысли в функции сравнения, чтобы решить актуальную проблему (то есть иерархия вы желание) ..

Например, если два ряда равны в спорте, равны ли они во всем остальном? Вы можете думать об изменении sport_compare, чтобы осмотреть остальные столбцы, когда две колонки имеют один и тот же вид спорта ... К примеру:

int sport_compare(void const *x, void const *y) { 
    typedef char const * const row[4]; 
    row *fu = x, *ba = y; 
# define maybe_return(condition) do { int c = (condition); if (c) { return c; } } while (0) 
    maybe_return(strcmp(fu[0], ba[0])); 
    maybe_return(strcmp(fu[1], ba[1])); 
    maybe_return(strcmp(fu[2], ba[2])); 
    return strcmp(fu[3], ba[3]); 
} 

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

Для четырех столбцов имеется в общей сложности шестнадцать перестановок в порядке колонны. Я оставлю это упражнением для вас, чтобы написать те, которые вас больше всего интересуют.

+0

Спасибо, что ответишь, сэр! – RoadRunner

+0

Вы также можете (в конечном счете) заинтересовать имена членов вашей структуры, например. 'struct entry {спортивный спорт; гендерный гендер; и т. д.}} – Sebivor

3

Если отсортировать массив и использовать для цикла, то вы получите почти точно выход вам нужно:

China 
    Cycling first 
    Swimming second 
Indonesia 
    Swimming third 
New Zealand 
    Cycling second 
    Swimming first 

код

#include <stdio.h> 
#include <stdlib.h> 

#define MAXSIZE 10 

int main(int argc, char **argv) { 
    char *a[][4] = {{"Sport", "gender", "country",  "medal"}, 
          {"Cycling", "Womens", "China",  "first"}, 
          {"Swimming", "Womens", "China",  "second"}, 
          {"Swimming", "Womens", "Indonesia", "third"}, 
          {"Cycling", "Womens", "New Zealand", "second"}, 
          {"Cycling", "Womens", "New Zealand", "third"}, 
          {"Swimming", "Womens", "New Zealand", "first"}}; 

    int count, start_index, i; 
    int columns[MAXSIZE]; 

    /* Storing command line args in array */ 
    start_index = 1; 
    count = 0; 
    for (i = 0; i < argc - 1; i++) { 
     columns[i] = atoi(argv[start_index]); 
     count++; 
     start_index++; 
    } 
    char * temp; 
    char * temp1; 
    for(int j=1;j<6;j++) 
    { 
     for(i=0; i<5; i++) 
     { 
      if(a[0][i]>a[0][i+1]) 
      { 
       temp=a[0][i]; 
       a[0][i]=a[0][i+1]; 
       a[0][i+1]=temp; 

       temp1 = a[1][i]; 
       a[1][i] = a[1][i+1]; 
       a[1][i+1]=temp1; 
      } 
     } 
    } 
    char * country =""; 
    char * sport = ""; 
    for (int i=1; i<=6; i++) { 
     if (strcmp(country, a[i][2])) printf("%s \n", a[i][2]); 
     if (strcmp(country, a[i][2]) || strcmp(sport, a[i][0])) { 
      country = a[i][2]; 
      sport = a[i][0]; 
      printf("\t%s %s", a[i][0], a[i][3]); 
      printf("\n "); 

      } 
    } 

    return 0; 
} 
+0

Да, спасибо за ответ. Мой массив уже предварительно отсортирован, я уже обработал это в другой программе. Я просто нахожу способ просто получить этот выход в зависимости от столбцов. Его не нужно сортировать в этой текущей программе. – RoadRunner

Смежные вопросы