Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

zczytywanie z pliku tablicy,która nie wiemy jakie ma wymiary

Wawa_19_ 03 Sty 2008 14:45 3314 25
  • #1 03 Sty 2008 14:45
    Wawa_19_
    Poziom 14  

    Chodzi o to, że w notatniku tablica kwadratowa o różnej liczbie elementów czyli nie znamy jej wymiaru. No i jak zrobić by program wiedział kiedy skończyć sczytywanie danych. Te dane są typu integer i chciałem je sczytywać do tablicy no i właśnie tu jest zgrzyt bo nie mogę na początku zadeklarować tablicy o określonym wymiarze, bo niewiadomo jaki ma rozmiar ta tablica w pliku.

    0 25
  • Pomocny post
    #2 03 Sty 2008 15:55
    szelus
    Specjalista - Mikrokontrolery

    Co znaczy kwadratowa? Dwuwymiarowa, tyle samo wierszy, co kolumn? Liczby w pliku po prostu "lecą ciurkiem"?
    Jeżeli tak, to najprościej będzie chyba przeczytać plik raz, policzyć wszystkie liczby, wyciągnąć pierwiastek kwadratowy (jak nie całkowity, to błąd), przewinąć plik, zaalokować tablicę i wczytać jeszcze raz.

    0
  • Pomocny post
    #3 03 Sty 2008 17:07
    Fyszo
    Spec od GSM

    Tablica dynamiczna rekordów, tak samo jak to się robi z listami w pascalu.

    0
  • Pomocny post
    #4 03 Sty 2008 18:35
    Seba85
    Poziom 16  

    Nie napisałeś w jakim języku piszesz program. Generalnie, warto na samym początku pliku wypisać w pierwszej linii rozmiar tablicy, tak żeby było wiadomo ile trzeba zaalokować pamięci. Samą tablicę deklarujesz dynamicznie, a jak, to już zależy od języka programowania.

    0
  • Pomocny post
    #5 03 Sty 2008 20:27
    ~sojer
    Poziom 27  

    Tak jak kolega wcześniej napisał często dla uproszczenia w pierwszym wieszu pliku podaje się rozmiar macierzy. Jeżeli nie będziesz miał tej informacji to pozostaje ci albo utworzyć dostatecznie dużą tablicę, aby zawsze dane wejściowe się zmieściły, albo kombinować z listami.

    0
  • Pomocny post
    #6 04 Sty 2008 23:31
    RhinoRace
    Poziom 16  

    ewentualnie zastosowac vector ;) - jest to taka dynamiczna tablica ;)

    0
  • Pomocny post
    #7 05 Sty 2008 20:35
    Mihó
    Poziom 27  

    Ilosc_elementow=sizeof(tablica) / sizeof(tablica[1]) ?

    0
  • #8 06 Sty 2008 00:49
    Wawa_19_
    Poziom 14  

    w języku C.
    Plik tekstowy jest takiej postaci np.:

    0,3,1,7,11
    1,0,5,6,9
    0,5,3,9,23
    21,3,4,5,8
    2,6,3,13,45

    czyli liczby i przecinki.
    No i tablica jest 5x5 tutaj. I chodzi o to aby do zmiennej tablicowej tab[][] wczytać te liczby z pliku. Ale tablica niekoniecznie musi być 5x5 ale zawsze jest nxn tylko nie znam tego n. No to rozumiem, że programowanie dynamiczne, ale chyba prościej jednak przeliczenie elementów będzie choćby pierwszej linii i podstawienie tej liczby za x a potem dać:
    int tab[x][x];
    Ale i tak mam problem z tym, bo chciałbym dać takie coś, bo inczej to nie wiem jak:

    int x=0;
    while(nie przeszliśmy w pliku tekstowym do następnej linii)
    {if (sczytywany znak = integer) x=x+1; else continue}
    w ten sposób bym policzył te x-sy ale nie wiem jak to zrobić.

    0
  • Pomocny post
    #9 06 Sty 2008 11:03
    Seba85
    Poziom 16  

    Można by to zrobić tak:

    Code:
    int liczba;
    
    char c;
    int n = 0;
    do {
       fscanf(plik, "%d%c", &liczba, &c);
       ++n;
    } while(c == ',');
    rewind(plik);

    0
  • #10 06 Sty 2008 16:03
    Wawa_19_
    Poziom 14  

    A jak zadeklarować odczyt z pliku bo mi w ten sposób nie działa:
    //odczyt z pliku

    Code:
    printf("Podaj nazwe pliku w ktorym miesci sie graf:\n");
    
    scanf("%s",&nazwa_pliku);
    plik = fopen(nazwa_pliku, "r");
    do
      {
      fscanf(plik,"%d%c",&w,&znak);
      w=w+1;
      }
    while(znak==',');
    rewind(plik);
    int tab[w][w];
    for(i=0;i<=w-1;i++)
      {
      do
        {
        fscanf(plik,"%d%c",&tab[i][z],&znak);
        z=z+1;
        }
      while(znak==',');
        z=0;
      }
    fclose(plik);
    printf("\n wykonano");

    Chodzi pewnie o pierwsze 3 linijki kodu. Mimo, że wydaje się, że dobrze jest to jednak w trakcie wykonywania programu program stoi w miejscu, kursor miga cały czas i nic sie nie dzieje, nie pojawia się napis "wykonano" dzięki czemu wiadomo by było że się wykonało. Dodam, że plik jest stworzony np. gowno.txt w katalogu roboczym w ktorym jest zainstalowany dev-cc i w pliku wpisana tablica:
    0,1,2
    1,0,3
    2,3,0
    i tez nazwe gowno.txt podaje w programie gdy pyta o nazwe pliku.

    Dodano po 2 [minuty]:

    No na początku zadeklarowane są wszystkie zmienne odpowiednio i dane z=0;w=0.

    0
  • Pomocny post
    #11 06 Sty 2008 18:54
    Seba85
    Poziom 16  

    W tej pętli zliczającej niepotrzebnie wczytujesz liczbę do w, przez to "gubisz" liczbę elementów już wczytanych.

    Chyba jeszcze nie miałeś dynamicznego alokowania pamięci, nie można zrobić czegoś takiego:

    Code:
    int tab[w][w];
    ponieważ rozmiar deklarowanej tablicy w ten sposób musi być już znany podczas kompilacji, a wartość w jest dopiero znana po zliczeniu elementów. Do dynamicznego przydzielania i zwalniania pamięci wykorzystuje się funkcje malloc i free. Ten kod powinien być poprawny:
    Code:
    char nazwa_pliku[20];
    
    int w = 0, i, j;
    int** tab;
    char znak;
    FILE* plik;

    printf("Podaj nazwe pliku w ktorym miesci sie graf:\n");
    scanf("%s",&nazwa_pliku);
    plik = fopen(nazwa_pliku, "rt");
    do
    {
       fscanf(plik,"%d%c",&i,&znak);
       w++;
    }
    while(znak==',');
    rewind(plik);

    /* zadeklarowanie dynamiczne tablic */
    tab = malloc(w*sizeof(int*));
    for(i = 0; i < w; i++)
       tab[i] = malloc(w*sizeof(int));

    for(i = 0; i < w; i++)
       for(j = 0; j < w; j++)
          fscanf(plik,"%d,",&tab[i][j]);

    /* zwolnienie pamięci */
    for(i = 0; i < w; i++)
       free(tab[i]);
    free(tab);

    fclose(plik);
    printf("\n wykonano");

    0
  • Pomocny post
    #12 06 Sty 2008 21:58
    RhinoRace
    Poziom 16  

    do alokowania pamieci jest jeszcze new i delete ;) - tyle ze w C++ i generalnie jest to bardziej zalecane podejscie od malloc i free
    poza tym podejscie

    Code:
    tab = malloc(w*sizeof(int*));
    
    for(i = 0; i < w; i++)
       tab[i] = malloc(w*sizeof(int));

    chyba nie jest zbyt optymalne ;)
    lepiej jezeli koniecznie chcesz korzystac z malloc zrobic
    Code:
    tab = malloc(w*w*sizeof(int));
    

    zwlaszcza, ze tablica w programowaniu powinna zajmowac ciagly obszar pamieci, a podejscie alokowania pamieci w petli tego nie gwarantuje.
    wtedy tez nie potrzeba miec int** tab, a wystarczy miec int* tab ;)

    0
  • #13 06 Sty 2008 22:32
    Seba85
    Poziom 16  

    RhinoRace napisał:
    do alokowania pamieci jest jeszcze new i delete ;) - tyle ze w C++ i generalnie jest to bardziej zalecane podejscie od malloc i free

    Jasne, ja też nie używam malloc i free, ale kolega pisał, że program jest w C...
    RhinoRace napisał:

    poza tym podejscie
    Code:
    tab = malloc(w*sizeof(int*));
    
    for(i = 0; i < w; i++)
       tab[i] = malloc(w*sizeof(int));

    chyba nie jest zbyt optymalne ;)
    lepiej jezeli koniecznie chcesz korzystac z malloc zrobic
    Code:
    tab = malloc(w*w*sizeof(int));
    


    Wiesz co, nawet nie wiem, przy tak zaalokowanej tablicy można się odwoływać do elementów przez dwa nawiasy kwadratowe : tab[][] ?

    0
  • #14 06 Sty 2008 22:43
    RhinoRace
    Poziom 16  

    tak - przeciez nazwa tablicy jest wskaznikiem na jej pierwszy element i przy obliczaniu adresu komorki najpierw mnozy wskazywany index przez wielkosc elementu, a potem dodaje do adresu poczatku tablicy
    zreszta chyba pamietasz nasz dyskusje o optymalizacji :p

    0
  • #15 07 Sty 2008 09:00
    Seba85
    Poziom 16  

    RhinoRace napisał:
    tak - przeciez nazwa tablicy jest wskaznikiem na jej pierwszy element i przy obliczaniu adresu komorki najpierw mnozy wskazywany index przez wielkosc elementu, a potem dodaje do adresu poczatku tablicy
    zreszta chyba pamietasz nasz dyskusje o optymalizacji :p


    Sprawdziłem, bo już się bałem, że czegoś kiedyś nie doczytałem i przez te kilka lat żyłem w słodkiej niewiedzy, że coś da się zrobić prościej niż ja to robie ;). Okazało się, że miałem racje - przy próbie odwołania się do tak zadeklarowanej tablicy poprzez tab[w][k] dostaję błąd kompilacji w VS2005:
    Code:
    error C2109: subscript requires array or pointer type


    W sumie jest to logiczne, bo przecież kompilator, kiedy ma typ int* , nie wie jaka jest liczba kolumn, dlatego nie wie przez ile trzeba przemnożyć liczbę w pierwszym nawiasie kwadratowym żeby odwołać się do i-tego wiersza.

    0
  • #16 07 Sty 2008 21:22
    Wawa_19_
    Poziom 14  

    To polecam także sprawdzić, że działa i to, że można w środku zadeklarować int tab[w][w] bo ktoś pisał że tak nie można:

    Code:
    #include<stdio.h>
    
    #include<stdlib.h>
    #include<string.h>
    main()
    {
    int i,j,w;

    printf("Podaj jakas liczbe:\n");
    scanf("%d",&w);
    int tab[w][w];
    for(i=0;i<w;i++)
    for(j=0;j<w;j++)
    tab[i][j]=1;

    for(i=0;i<w;i++)
    for(j=0;j<w;j++)
    printf("%d\n",tab[i][j]);

    system("PAUSE");
    return 0;
    }


    tylko z roszerzeniem cpp trzeba zapisać bo z rozszerzeniem .c rzeczywiście nie da rady.

    Dodano po 1 [godziny] 4 [minuty]:

    Oto kod, który dobrze odczytuje tą nieszczesną tablice z pliku:
    Code:
    //odczyt z pliku
    
    printf("Podaj nazwe pliku w ktorym miesci sie graf:\n");
    scanf("%s",&nazwa_pliku);
    plik = fopen(nazwa_pliku, "r");
    do
      {
      fscanf(plik,"%d%c",&i,&znak);
      w=w+1;
      }
    while(znak==',');
    rewind(plik);
    int tab[w][w];
    for(i=0;i<=w-1;i++)
      for(j=0;j<=w-1;j++)
        {
        fscanf(plik,"%d,",&tab[i][j]);
        }
    fclose(plik);


    Rzeczywiście Seba traciłęm tą informacje o "w" sczytując za każdym razem "w". No i drugą pętlę trochę zmieniłem patrząc na Twoje sczytywanie tabeli scanf-em. No i potem jak wypisuje sobie:
    Code:
    for(i=0;i<=w-1;i++)
    
      for(j=0;j<=w-1;j++)
      printf("%d\n",tab[i][j])


    To mi poprawnie wypisują się te wartości. Ale nie mogę w ogóle robić żadnych operacji na tych tab[i][j] bo np. tab[0][0] wynosi 1 a potem nagle jakieś 1356832. Chodzi o to, że np. kiedys robiłem taki program z liczbami pierwszymi i to mi poprawnie zapisywało tab[i] do pliku:
    Code:
    for(i=2;i<=n;i++)
    
             {
             y=tab[i];
             if(y!=0)
               fprintf(f,"%d\n",y);       
             }

    pod warunkiem, że zmienna y nie była użyta w programie ani razu, ale już to nie:
    Code:
    for(i=2;i<=n;i++)
    
             {
             if(tab[i]!=0)
               fprintf(f,"%d\n",tab[i]);       
             }


    No a teraz sobie wyobraźcie że w tym programie z tab[i][j] ja musze wykonywać dużo operacji logicznych na tych tab[i][j] i zapisywać je do struktury:
    struct KrawedzGrafu{
    int odwezla;
    int dowezla;
    int waga;
    };
    no to o ile w tamtym programie z liczbami pierwszymi sobie poradziłem, bo nie był zbyt rozbudowany, przypadkiem natrafiłem na to, że trzeba dać y=tab[i] to tutaj w tym programie ja chce mieć od razu tab[i][j] jako dobre a nie kombinować.
    NO WIĘC JAK ZROBIĆ ŻEBY PROGRAM MI TRAKTOWAŁ TE LICZBY TAB[i][j] JAKO NORMALNE LICZBY, ŻE NIE RAZ JE DOBRZE WIDZI A RAZ WIDZI JAKIEŚ 223234445. PROGRAMOWANIE W C to po prostu porażka!!!

    Dodano po 11 [minuty]:

    Albo mam taki kompilator beznadziejny, jakąś gównianą wersje, niedoroba Dev-C++ 4.0.0.0

    0
  • Pomocny post
    #17 07 Sty 2008 22:41
    Seba85
    Poziom 16  

    Już drugi raz spotkałem się z tym, że komuś działa taka deklaracja tablicy:

    Code:
    tab[jakas_zmienna];

    Chociaż wydawałoby się, że nie powinno się dać. No więc zrobiłem mały research i się okazało, że takie coś nazywa się variable-size array, czyli tablica o zmiennym rozmiarze. Jak próbowałem u siebie kompilować ten kod na Visual Studio to oczywiście mi to nie przeszło, bo specom z microsoftu nie chciało się tego implementować w ich kompilatorze, za to jest to zaimplementowane w djgpp, sprawdziłem i się kompiluje - w czystym C też! No a dev korzysta z djgpp i wszystko jasne :). Jak ktoś myśli o dłuższym wiązaniu się z programowaniem, to bym odradzał stosowania takich tablic, bo przy przesiadce na inny kompilator może być niespodzianka :).

    Co do problemów z wczytywaniem z pliku, to program wydaje się poprawny, zresztą podobnie jak ten przykład z tym y. Napisz co dokładnie się dzieje, co wypisuje na wyjściu.

    Jak zamiast tab[w][w] dasz np. tab[100][100] też masz ten sam błąd?

    0
  • #18 08 Sty 2008 02:38
    Wawa_19_
    Poziom 14  

    Tak jak dam np. tab[100][100] to to samo się dzieje.
    Już znalazłem błąd. Po prostu wcześniejsza wersja programu była że tablice się w programie wpisuje a musiałem program zmodyfikować tak by wczytywał z pliku tą tablice i modyfikując usunąłem pewne równanie które obliczało liczbe wierzchołków i potem jak program odwoływał się do zmiennej która ją zawierała to te jaja się działy. Ale tak czy owak podczas robienia programu z liczbami pierwszymi przy zapisie do pliku musiałem podstawiać za y=tab[i] bo mi sie jakieś śmieci zapisywały do pliku. Myślałem przez analogie że tu to samo z odczytem z pliku ale na szczęście to tylko sie dzieje podczas zapisu. Mnie programowanie aż tak nie interesuje to nie będę dociekał czemu trzeba podstawiać jakąś zmienną i to taką która wcześniej nie była użyta w programie by ten nie zapisywał śmieci do pliku. Grunt, że da się.:)

    0
  • #19 08 Sty 2008 09:44
    RhinoRace
    Poziom 16  

    Seba85 napisał:

    Sprawdziłem, bo już się bałem, że czegoś kiedyś nie doczytałem i przez te kilka lat żyłem w słodkiej niewiedzy, że coś da się zrobić prościej niż ja to robie ;). Okazało się, że miałem racje - przy próbie odwołania się do tak zadeklarowanej tablicy poprzez tab[w][k] dostaję błąd kompilacji w VS2005:
    Code:
    error C2109: subscript requires array or pointer type


    W sumie jest to logiczne, bo przecież kompilator, kiedy ma typ int* , nie wie jaka jest liczba kolumn, dlatego nie wie przez ile trzeba przemnożyć liczbę w pierwszym nawiasie kwadratowym żeby odwołać się do i-tego wiersza.

    no rzeczywiscie nie dziala - moj blad

    0
  • #20 08 Sty 2008 17:54
    Wawa_19_
    Poziom 14  

    A tu zamieszczam program co są jaja, że trzeba za y podstawiać tab[i]. Tu wersja gdzie nie podstawiam tylko zapisuje tab[i] bezpośrednio do pliku. Zobaczcie co zapisuje do pliku liczby_pierwsze.txt w katalogu roboczym:

    Code:
    #include <stdio.h>
    
    #include<stdlib.h>
    main()
    {
    int i,n,x,*tab;
    char znak;

    printf("\t\t\tSITO ERATOSTENESA\n\n\t\t\tWykonal: xxx\n\n\n");
    printf("Sito Eratostenesa jest algorytmem sluzacym do wyznaczenia ");
    printf("wszystkich\nliczb pierwszych z zakresu od 2 do zadanego n.\n\n");
    printf("Podaj n\n\n");
    scanf("%d",&n);

    //tworzenie tablicy n+1-elementowej:
    tab = (int *)malloc((n+1) * sizeof(int));

    //tworzenie tablicy z liczbami od 2 do n:
    for(i=2;i<=n;i++)
    tab[i]=i;

    //wykreślanie (zaznaczanie zerami) z tablicy liczb, które nie są pierwsze:
    for(x=2;x<=n;x++)
     {
      if(tab[x]!=0)
         {
          for(i=2*x;i<=n;i=i+x)
          tab[i]=0;
         }
      else continue;
     }

    //Wypisanie liczb pierwszych
    printf("\nLiczby pierwsze z przedzialu od 2 do %d to:\n",n);
    for(i=2;i<=n;i++)
      if(tab[i]!=0) printf("%d\n",tab[i]);
      else continue;

    printf("\nCzy chcesz zapisac wyznaczone liczby pierwsze do pliku?(t/n)\n");
    scanf("%s",&znak);
    if(znak=='t')
    {
     FILE *f = fopen("liczby_pierwsze.txt", "a");
          if (f)
             {
             fprintf(f,"Liczby pierwsze z zakresu od 2 do %d to:\n",n);
             for(i=2;i<=n;i++)
             {
             if(tab[i]!=0)
                {
                fprintf(f,"%d\n",tab[i]);        // zapisanie liczb pierwszych do pliku
                }
             }
             fclose(f);                     // zamknięcie pliku i zapisanie zmian
             }
             else
             {




             perror("Nie udalo sie otworzyc pliku 'liczby_pierwsze.txt' do zapisu");
             return 1;
             }
    }
    else
    printf("\n");

    system("PAUSE");
    return 0;
    }


    A tu wersja gdzie podstawiam za y=tab[i] i jest wszystko ok wtedy.
    Code:
    #include <stdio.h>
    
    #include<stdlib.h>
    main()
    {
    int i,n,x,*tab,y;
    char znak;

    printf("\t\t\tSITO ERATOSTENESA\n\n\t\t\tWykonal: xxx\n\n\n");
    printf("Sito Eratostenesa jest algorytmem sluzacym do wyznaczenia ");
    printf("wszystkich\nliczb pierwszych z zakresu od 2 do zadanego n.\n\n");
    printf("Podaj n\n\n");
    scanf("%d",&n);

    //tworzenie tablicy n+1-elementowej:
    tab = (int *)malloc((n+1) * sizeof(int));

    //tworzenie tablicy z liczbami od 2 do n:
    for(i=2;i<=n;i++)
    tab[i]=i;

    //wykreślanie (zaznaczanie zerami) z tablicy liczb, które nie są pierwsze:
    for(x=2;x<=n;x++)
     {
      if(tab[x]!=0)
         {
          for(i=2*x;i<=n;i=i+x)
          tab[i]=0;
         }
      else continue;
     }

    //Wypisanie liczb pierwszych
    printf("\nLiczby pierwsze z przedzialu od 2 do %d to:\n",n);
    for(i=2;i<=n;i++)
      if(tab[i]!=0) printf("%d\n",tab[i]);
      else continue;

    printf("\nCzy chcesz zapisac wyznaczone liczby pierwsze do pliku?(t/n)\n");
    scanf("%s",&znak);
    if(znak=='t')
    {
     FILE *f = fopen("liczby_pierwsze.txt", "a");
          if (f)
             {
             fprintf(f,"Liczby pierwsze z zakresu od 2 do %d to:\n",n);
             for(i=2;i<=n;i++)
             {
             y=tab[i];
             if(y!=0)
                {
                fprintf(f,"%d\n",y);        // zapisanie liczb pierwszych do pliku
                }
             }
             fclose(f);                     // zamknięcie pliku i zapisanie zmian
             }
             else
             {
             perror("Nie udalo sie otworzyc pliku 'liczby_pierwsze.txt' do zapisu");
             return 1;
             }
    }
    else
    printf("\n");

    system("PAUSE");
    return 0;
    }


    W moich próbach doszedłem do tego tez że wystarczy zadeklarować zmienną y i za nią nic nie podstawiać, ale jej nie używc w programie i wtedy również poprawnie zapisuje!!! No chyba, że to wszystko wina kompilatora. Aha i z rozszerzeniem .cpp trzeba zapisać program jak ktoś z ciekawości chce sobie zobaczyć jakie to są jaja:)

    0
  • Pomocny post
    #21 08 Sty 2008 20:09
    Seba85
    Poziom 16  

    To nie jaja, tylko niedorobiona funkcja scanf, która nie sprawdza poprawności typów. W scanf masz "%s", przez co traktuje zmienną znak jak tablicę znakową i nadpisuje którąś zmienną, która znajduje się na stosie za zmienną znak.. Po tym jak dodałeś zmienną y zmieniła się kolejność zmiennych na stosie, przez co była nadpisywana inna zmienna niż ta, która sprawiała problem. Dla typu char stosuje się %c.

    0
  • #22 09 Sty 2008 00:46
    Wawa_19_
    Poziom 14  

    Jak dam %c to w ogóle program sie sypie. Pojawia się pytanie czy zapisać dane do pliku, program nie czeka na wpisanie (t/n) tylko od razu wyświetla napis naciśnij jakiś klawisz by zakończyć działanie programu. Mnie nic nie przekona, programowanie w C to porażka. Pamiętam jak kilka lat temu programowałem w Turbo Pascalu, tam wszystko co zgadzało się w teorii wychodziło w praktyce a tu są po prostu jaja.

    0
  • Pomocny post
    #23 09 Sty 2008 08:50
    Seba85
    Poziom 16  

    Sypie się, bo prawdopodobnie program wczytuje znak entera ze standardowego wejścia, można to ominąć np. tak:

    Code:

    do znak = getchar();
       while (znak != 't' && znak != 'n');

    Wtedy program przejdzie dalej jak wczyta t lub n.
    Można też zrobić tak:
    Code:

    char znak[2];
    scanf("%s", &znak);

    Program wczytuje wtedy znak 0 do drugiego elementu tablicy znakowej.
    Możesz też wczytać znak entera w miejscu, gdzie wczytujesz liczbę :
    Code:

    scanf("%d", &n);
    getchar();

    Wtedy za każdym takim wczytaniem liczby powinno się dać getchar(), żeby pozbyć się znaku entera z standardowego wejścia.

    Ja też nie lubię pisać w C, dużo lepsze jest C++, posiada większy poziom kontroli zmiennych oraz jest wygodniejszy w programowaniu.

    0
  • Pomocny post
    #24 09 Sty 2008 09:49
    szelus
    Specjalista - Mikrokontrolery

    Wawa_19_ napisał:
    Jak dam %c to w ogóle program sie sypie. Pojawia się pytanie czy zapisać dane do pliku, program nie czeka na wpisanie (t/n) tylko od razu wyświetla napis naciśnij jakiś klawisz by zakończyć działanie programu. Mnie nic nie przekona, programowanie w C to porażka. Pamiętam jak kilka lat temu programowałem w Turbo Pascalu, tam wszystko co zgadzało się w teorii wychodziło w praktyce a tu są po prostu jaja.


    Bo niedoczytałeś jak działa funkcja scanf i %c. Żeby zadziałało tak, jak chcesz musisz poprzedzić %c spacją, tzn. " %c". Inaczej nie pominie znaku nowej linii, jak napisał Seba85.
    Niestety, C jest jakby językiem niższego poziomu niż np. Pascal, łatwo tu o błędy, semantyka nie jest czasem intuicyjna, a za kontrolę błędów w dużym stopniu odpowiada programista. Jeżeli ktoś potrzebuje tylko okazjonalnie pisać programy przetwarzania danych, bez wnikania w szczegóły, to nie jest to najlepszy wybór. C++ tym bardziej nie.
    Z tradycyjnych języków lepszy będzie właśnie Pascal, albo może nawet Visual Basic (to hipoteza, bo w zasadzie nie znam VB). Z obiektowych to np. Python lub Java.

    0
  • #25 09 Sty 2008 12:36
    Wawa_19_
    Poziom 14  

    Ok, dzięki Seba85 i Szelus za wyjaśnienie. A czy w Dev-C++ są jakieś takie komendy, które powodują rysowanie elementów. Chodzi o to, że jak mam tablicę np.
    0 1 2 7
    1 0 0 0
    2 0 0 3
    7 0 3 0
    to potem program robi mi taką tablicę:(to już mam)
    0 1 2 0
    1 0 0 0
    2 0 0 3
    0 0 3 0
    i żeby na ekranie pojawiła się jej taka interpretacja:
    zczytywanie z pliku tablicy,która nie wiemy jakie ma wymiary
    czyli jak mam tab[i][j] to i jest jednym końcem krawędzi, j - drugim jej końcem a wartość tab[i][j] jest odległością między wierzchołkami. No i te pogrubione kreski to drzewo minimalne wg Alg.Kruskala. Akurat w tym przypadku nie muszę w trybie graficznym zrobić, ale następny projekt mam w trybie graficznym (kolorowanie grafu) no to sobie pomyślałem, że jak i tak muszę poznać tryb graficzny to i wynik Alg. Kruskala w nim zrobie, aby ładniej wyglądało, bo w trybie tekstowym na tablicach juz mam program.
    Czy ten tryb graficzny to jest tak poj*** że w przeliczeniu na godziny poniżej 10 godzin się nie da poznać na tyle by umieć tablicę reprezentować za pomocą grafu czy to w taki sposób jak przedstawiony na rysunku czy w inny, że koloruje sie wierzchołki a wartość tab[i][j] zawsze dwucyfrowa np. 14 oznacza, że 1-szy wierzchołek jest czerwony(1), drugi niebieski(4).

    0
  • #26 13 Sty 2008 12:57
    RhinoRace
    Poziom 16  

    uzywajac bibliotek graficznych i funkcji w nich zapisanych
    np biblioteka graphics.h lub jezeli piszesz aplikacje okienkowa komponent TImage

    0