Ranking produktow (czysty C)

0

Witam,
Mam w swoim programie zrobic taki ranking produktow, ktore najczesciej wystepuja w przepisach do najmniej wystepujacego. Ktos podsunie jakis pomysl jak to zrobic?
Kombinowalem cos takiego:

int liczba_produktow_ranking=0;
    if(licznik_przepisow==0)
    {
        printf("Nie wczytano zadnych przepisow.\n");
        return;
    }
    int i, j, a;
    for(i=0; i<licznik_przepisow; i++)
    {
        for(j=0; j<ilosc_skladnikow_danego_dania[i]; j++)
        {
            tab2[i].tab1[j].nazwa_produktu;
            liczba_produktow_ranking++;
        }
    }
    for(a=0; a<liczba_produktow_ranking; a++)
    {
            for(i=0; i<licznik_przepisow; i++)
            {
                for(j=0; j<ilosc_skladnikow_danego_dania[i]; j++)
                {

                }
            }
    }
}
  1. Wpierw zliczylem sobie ile ogolnie jest produktow (niewazne czy sie powtarzaja czy nie) we wszystkich przepisach.
  2. Teraz zastanawiam się co z tym zrobic dalej? Myslalem nad wjazdem do dwuwymiarowej tablicy znakow gdzie liczba_produktow_ranking to liczba elementow tej tablicy, ale nie wiem czy to dobry pomysl?
    Moze stworzyc nowa liste jednokierunkowo pod ten ranking i tam powrzucac wszystko, ale tez nie wiem czy to dobre rozwiazanie, ktos moze robil takie cos?
    @Edit
    Taki pomysl bedzie dobry?
    Jezeli wykombinuje liste jednokierunkowa na ktorej dane beda typu strukturalnego - nazwa_produktu oraz liczba calkowita
    Wrzuce kazdy produkt z kazdego dania na to liste, potem bede przejezdzal przez calo liste i sprwadzal czy dane produkty sie powtarzaja jak sie powtarzaja to zwiekszam liczebe calkowita o 1 i usuwam produkt ktory sie powtorzyl i tak dalej i potem na podstawie tych liczb calkowitych bd mozna okreslic ktory produkt najczesciej wystepuje?
1
  1. Nie używaj postinkrementacji: http://4programmers.net/Forum/1101404
  2. Jeżeli funkcja zwraca int to ma zwracać int zaś return; w takiej funkcji jest nie na miejscu.
  3. Zacznij stosować dobrą praktykę - funkcja coś licząca/tworząca/itp nie smaruje po ekranie.
  4. Dla iteracji po tablicach stosuj size_t albo przynajmniej unsigned bo patrząc na int i zaczynam się zastanawiać gdzie i jak zaczniesz stosować ujemne indeksy.
    Odpowiedź na twoje pytanie jest niemożliwe ponieważ nie wiemy jak masz zorganizowane dane.

Poprawnym podejściem jest równoważone drzewo binarne, lub hash_table ale to nieco skomplikowana sprawa.
Więc ujdzie (jak na totalnie początkującego) nierównoważone drzewo binarne - w sumie jakieś 20 wierszy kodu.

0

@_13th_Dragon
Kurcze niestety nie trybi.
Zrobiłem taką liste jednokierunkowa pod ten ranking:

/* Pod ranking */
struct ranking{
    char nazwa_produktu[30];
    int liczba;
};
typedef struct ranking rank;

struct lista2{
    rank y;
    struct lista2 *next;
};
typedef struct lista2 element2;
typedef element2 *ADRES2;
element2 *PoczatekListy2 = NULL;

Następnie chciałem każda nazwe dania wrzucic do tej listy (to by mi bardzo ulatwilo robote bo raczej bym wiedzial jak potem to posegregowac i ustawic w ranking), w funkcji:

void RankingProduktow(int licznik_przepisow, int *ilosc_skladnikow_danego_dania, danie *tab2)
{
    struct lista2 *help = PoczatekListy2;
    if(licznik_przepisow==0)
    {
        printf("Nie wczytano zadnych przepisow.\n");
        return;
    }
    int i, j;
    for(i=0; i<licznik_przepisow; i++)
    {
        for(j=0; j<ilosc_skladnikow_danego_dania[i]; j++)
        {
            help->y.nazwa_produktu = tab2[i].tab1[j].nazwa_produktu;
            help = help->next;
        }
    }
}

Ale niestety wywala taki blad:
user image
Da sie cos z tym zrobic, nie wchodząc głębiej w strukturę programu?

0

Skoro nie jesteś w stanie zrozumieć prostych rad np:

_13th_Dragon napisał(a):

Nie używaj postinkrementacji: http://4programmers.net/Forum/1101404

to jak naprawić ten problem prawie na 100% nie zrozumiesz, więc nawet nie będę się wysilać z odpowiedzią.

0

Ale w tych pętlach jak użyje:

for(i=0; i<licznik_przepisow; ++i)
for(j=0; j<ilosc_skladnikow_danego_dania[i]; ++j)

To przecież najpierw zwiększy wartosc o jeden, a nastepnie dopiero wejdzie do pętli czyli bym musial zacząć pętle od wartosci -1 ("zaczynam się zastanawiać gdzie i jak zaczniesz stosować ujemne indeksy" to ironia?)
Druga sprawa to dopiero co sie ucze tego, nie mam za bardzo kogo podpytać co i jak, dlatego łapie się czego kolwiek, chce w jakis sposob zrobic ten projekt i na spokojnie zaczac krok po kroku ogarniac Symfonie C++ oraz czysty jezyk C aby w 90-100% rozumiec kod i w jaki sposob rozwiazywac dane problemy.
user image

0
Blue_Carpet napisał(a):

Ale w tych pętlach jak użyje:

for(i=0; i<licznik_przepisow; ++i)
for(j=0; j<ilosc_skladnikow_danego_dania[i]; ++j)

To przecież najpierw zwiększy wartosc o jeden, a nastepnie dopiero wejdzie do pętli czyli bym musial zacząć pętle od wartosci -1 ("zaczynam się zastanawiać gdzie i jak zaczniesz stosować ujemne indeksy" to ironia?)
Ktoś ci taką głupotę powiedział? http://ideone.com/6ITcN2

#include <stdio.h>

int main()
  {
   size_t i,licznik_przepisow=10;
   for(i=0;i<licznik_przepisow;++i) printf("%d ",i);
   return 0;
  }

Co myślisz o uczeniu się cukiernictwa od hydraulika?
A co z uczeniem się programowania od fizyka?
A wiesz kim ten Grębosz jest?

0

W sumie, z tego co na początku książki było napisane to był on pracownikiem/brał udział w jakichś fizycznych instytutach/projektach fizyki jądrowej bodajże.

1 użytkowników online, w tym zalogowanych: 0, gości: 1