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.

Jezyk C - Problem z dynamiczna tablica

el loco 11 Sty 2009 20:09 4533 7
  • #1 11 Sty 2009 20:09
    el loco
    Poziom 2  

    Code:
    #include <stdio.h>
    
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>

    double random();                     // Funkcja generuje liczbę losową.
    void prosta(double *wsk1, double *wsk2);   // Funkcja wyznacza prostą.
    double minimum(int n);                     // Funkcja szuka najblizszego punktu.
    double maksimum(int n);                     // Funkcja szuka najdalszego punktu.

    FILE* f;   // W pliku są umieszczone wszystkie badane punkty.
    FILE* g;   // Jest w nim drukowany wzór prostej.
    FILE* h;   // W nim znajduje się punkt leżący najbliżej i punkt leżący najdalej prostej.

    double *odl;
    int i,j,n;

    void main()
    {
       int m;
       double a1,a2,b1,b2,max,min,xp,yp;/* a1 i b1 są to odpowiednio współczynnik kierunkowy i stała danej prostej.
                                   a2 i b2 określają wzór prostej prostop. do danej i przechodzącej przez P(losx,losy)
                                  Punkt (xp,yp) jest miejscem przecięcia się dwóch prostych. */
       double *losx,*losy;
       double *wsk1,*wsk2;
       wsk1=&a1;
       wsk2=&b1;
       f=fopen("punkty.dat","wt");
       g=fopen("wzor.dat","wt");
       h=fopen("Max i min.dat","wt");
       if(!f||!g||!h)
       {
          printf("Blad otwarcia pliku\n");
          exit(-1);
       }
       printf("Sposrod ilu punktow lezacych na plaszczyznie chcesz wybrac tej najblizej i najdalej lezacy ??\n");
       scanf("n = %d", &n);
       losx=(double*)malloc(n*sizeof(double));
       losy=(double*)malloc(n*sizeof(double));
       odl=(double*)malloc(n*sizeof(double));
       if((losx==NULL)||(losy==NULL)||(odl==NULL))exit(0);
       srand((unsigned)time(NULL));
       prosta(&a1,&b1);
       for(i=0;i<n;i++)
       {




          j=i;
          *(losx+j)=random();
          *(losy+j)=random();
          fprintf(f,"%g \t %g \n",(losx+j),(losy+j));
       }
       if(b1<0)
       {
          fprintf(g,"y = %g x %g",a1,b1);
       }
       else
       {
          fprintf(g,"y = %g x + %g ",a1,b1);
       }
       a2=-1./a1;
       for(i=0;i<n;i++)
       {
          j=i;
          b2=(*(losy+j))+(*(losx+j))/a1;
          xp=(b2-b1)/(a1-a2);
          yp=(a2*b1-a1*b2)/(a2-a1);
          *(odl+j)=sqrt((xp-(*(losx+j)))*(xp-(*(losx+j)))+(yp-(*(losy+j)))*(yp-(*(losy+j))));
          printf("tablica %d --- %g",i,(odl+j));
       }
       min=minimum(n);
       max=maksimum(n);
       printf("Wybierz\n(1) - wyswietlic wyniki na ekranie\n(2) - zapisac wyniki do pliku\n");
       scanf("%d", &m);
       switch(m)
       {
       case 1:
          {
             printf("%g - punkt lezacy najblizej prostej\n",min);
             printf("%g - punkt lezacy najdalej prostej\n",max);
             break;
          }
       case 2:
          {
             fprintf(h,"Punkt lezacy najblizej prostej\t%g\n",min);
             fprintf(h,"Punkt lezacy najdalej prostej\t%g\n",max);
             break;
          }
       }
       fclose(f);
       fclose(g);
       fclose(h);
    }

    double random()
    {
       double v;
       v=rand();
       return(v);
    }

    void prosta(double *wsk1, double *wsk2)
    {
       double x1,x2,y1,y2;
       x1=random();
       y1=random();
       x2=random();
       y2=random();
       *wsk1=(y1-y2)/(x1-x2);
       *wsk2=(x2*y1-x1*y2)/(x2-x1);
    }

    double minimum(int n)
    {
       double mini;
       odl=(double*)malloc(n*sizeof(double));
       mini=*odl;
       for(i=0;i<n;i++)
       {
          j=i;
          if(mini<(*(odl+j)))
          {
             mini=(*(odl+j));
          }
       }
       return(mini);
    }

    double maksimum(int n)
    {
       double maks;
       odl=(double*)malloc(n*sizeof(double));
       maks=*odl;
       for(i=0;i<n;i++)
       {
          if(maks>(*(odl+j)))
          {
             maks=(*(odl+j));
          }
       }
       return(maks);
    }



    Wiem że ten program można napisać krócej, ale ja muszę go zrobić w ten sposób. Miałem tylko zamienić tablicę zdeklarowaną na 100 elementów na tablicę n-elementową (gdzie o ilości elementów decyduje użytkownik). Proszę o pomoc. Program z tablicą 100-elementową działał, a teraz już nie.
    Z góry dziękuję za pomoc.

    0 7
  • #3 11 Sty 2009 20:41
    one_eddie
    Poziom 25  

    oto prosta zmiana ze statycznej tablicy na te tworzona dynamicznie.

    Code:

    #define SIZE 100
    int main()
    {
      int i, data[SIZE] = { 0 };
      // fill
      for(i = 0; i < SIZE; i++)
        printf("[%d] = %d\n", i, data[i]);
    }



    Code:

    #define SIZE 100
    int main()
    {
      int i, *data = NULL;
      data = (int*)malloc(SIZE * sizeof(int));
      // fill
      for(i = 0; i < SIZE; i++)
        printf("[%d] = %d\n", i, data[i]);
      free(data);
    }


    Tak wyglada taka zamiana. Makrodefinicje mozna latwo zamienic na zmienna wczytywana podczas pracy programu.

    0
  • #4 11 Sty 2009 21:11
    el loco
    Poziom 2  

    A byłby ktoś w stanie napisać co w moim programie jest źle ?

    0
  • #5 11 Sty 2009 21:43
    Dr.Vee
    VIP Zasłużony dla elektroda

    A kto to wie? Prezentujesz program, nie piszesz co ma robić, co niby robi źle i jak to się objawia...

    Jeśli Ty nie poświęciłeś czasu na wyjaśnienie nam o co chodzi w Twoim problemie, to dlaczego my mamy poświęcać czas na jego rozwiązywanie?

    Pozdrawiam,
    Dr.Vee

    0
  • #6 11 Sty 2009 22:46
    el loco
    Poziom 2  

    Program ma znajdować 2 punkty. Jeden z nich znajduje się najbliżej danej prostej a drugi najdalej.
    Najciekawsze jest to (jak już wcześniej pisałem), że program dla tablic z określoną liczbą indeksów działał. Problem powstał gdy próbowałem zmienić te tablice na tablice dynamiczne (takie w których użytkownik sam by ustalał z ilu punktów będzie wybierał te dwa).
    Wcześniej program sprawdzałem kilka razy i działał bez zarzutu (wyniki były właściwe), więc raczej algorytm błędów nie ma.
    W języku C programuję od niedawna a wyjaśnienia jakie mam na zajęciach wiele nie mówią. Co z tego że prymitywny przedstawiony na lekcji działa jak później w domu trzeba się męczyć z bardziej złożonymi zadaniami.
    Mam nadzieję że ktoś się połapie w tym programie. Wiem że ten program można napisać krócej, ale nic prócz tablic dynamicznych zmieniać nie mogę.

    0
  • #7 11 Sty 2009 23:40
    Dr.Vee
    VIP Zasłużony dla elektroda

    Czyli teraz wyniki są niewłaściwe?

    Masz kilka błędów tego samego typu - zamiast *(wsk + i) używasz (wsk + i), co jest błędem (np. kompilator o tym ostrzega).
    W języku C z definicji

    Code:
    *(wsk+i) === wsk[i]
    Może lepiej używaj tej drugiej formy? Łatwiej się wtedy połapać o co chodzi.

    Poza tym w funkcjach minimum i maksimum przydzielasz pamięć i jej nie zwalniasz... Zresztą lepiej byłoby napisać te funkcje tak:
    Code:
    double minimum(double *arr, int size)
    
    {
        int i = 0;
        double min = arr[0];
        for (i = 0; i < size; ++i)
            if (min > arr[i])
                min = arr[i];
        return min;
    }

    PS. Z Twojego tłumaczenia sam byś pewnie się nie połapał o co w tym programie chodzi :)

    Pozdrawiam,
    Dr.Vee

    0
  • #8 14 Sty 2009 19:23
    el loco
    Poziom 2  

    Dzięki za próbę pomocy ale błąd był gdzie indziej. Już mi wszystko działa.

    0