Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] Funkcje drukowanie i sumowanie

juniorowy 29 Mar 2010 16:59 1439 22
  • #1 29 Mar 2010 16:59
    juniorowy
    Poziom 8  

    Witam
    Napisałem program mający po kolei:
    1. Robić array jednowymiarowy o 7 elementach: 1,2,3,8,16,24,48.
    2. Z niego zrobić dwuwymiarowy array na podstawie takiej, że ten array jest jakby przylegający do niego od góry i lewej strony, (indeksy i,j) i z niego wyliczać logarytm naturalny.
    3. Stworzyć funkcję sumującą elementy znajdujące się "na skraju" tablicy. - tu jest problem, niby funkcja jest dobrze napisana a zwraca mi 0.
    4. Stworzyć funkcję która drukuje elementy dwuwymiarowej tablicy z punktu 2. - napisałem coś podobnego do procedury w pascalu, jednak nie potrafię zrobić tak aby zwróciło mi tyle tekstu :(
    5. Opcje zrobione w indeksach i za pomocą pointerów.
    Oto mój kod:(kompletny)

    Code:
    #include<stdio.h>
    
    #include<math.h>
    #define N 7

    double boundsum(double sqtab[N][N])
    {
       int i;
       double sum=0;

        for (i=0;i<N;i++)
       {sum=sum+sqtab[i][6]+sqtab[i][0];}

       for (i=1;i<N;i++)
       {sum=sum+sqtab[0][i]+sqtab[6][i];}

       
             return(sum);

    }
     
    double boundsumpoint(double sqtab[N][N])
    {
       int i;
       double *psum,sum=0;

       psum=sqtab;
       for (i=0;i<N;i++)
          sum=sum+(*(psum+i))+(*(psum+i+6*N));

       for (i=1;i<N;i++)
          sum=sum+(*(psum+N*i))+(*(psum+6+N*i));
       return(sum);
    }


    void printtabpoint(double sqtab[N][N])
    {int i,j=2;
    double *pprin;

    pprin=sqtab;
     
      for(j=0;j<N;j++)
      {
          for(i=0;i<N;i++)
          {
             printf("[%d][%d]=%f ",i,j,*(pprin+j*N+i));
             
          }
    printf("\n");
       }
    }




    void printtab(double sqtab[N][N])
    { int i,j;
     for( i=0;i<N;i++)
     {
      for( j=0;j<N;j++)
       printf("[%d][%d]=%f ",j,i,sqtab[i][j]);
      printf("\n");
     }
    }


    main()
    {
    int patt[N]={1,2,3,8,16,24,48},  i,j;
    double sqtab[N][N];



        for (i=0;i<N;i++)
         {for (j=0;j<N;j++)
         sqtab[i][j]=log(patt[i]+patt[j]); 
         }
       

        printf("The boundary sum is equal to %f\n", boundsum(sqtab));
       printf("The boundary sum is equal to %f\n", boundsumpoint(sqtab));

       printtab(sqtab);
       printf("\n\n");
       printtabpoint(sqtab);
    printf("\n");
    }
    }


    Bardzo proszę o pomoc. Pozdrawiam


    Edit:Down: Kolego Moderatorze. Użycie słowa functions było celowe, chodziło mi o podkreślenie że chodzi o funkcje pisane a nie funkcje zaimplementowane w C, takie jak printf. Błędu ortograficznego nie było żadnego, chyba że Kolega Moderator uważa za błąd ortograficzny brak polskich znaków, w takim razie Kolega wybaczy.

    0 22
  • #2 29 Mar 2010 17:03
    arnoldziq
    Moderator Programowanie

    Proszę o poprawienie błędów ortograficznych, w które wypowiedź kolegi obfituje.

    0
  • Pomocny post
    #3 29 Mar 2010 17:12
    akaz_
    Poziom 12  

    Zgadzam się z przedmówcą, zdecyduj się jakiego języka chcesz używać.

    Problem znajduje się tutaj:

    Code:

        printf("The boundary sum is equal to %f", boundsum);


    Podanie samej nazwy funkcji, bez parametru, zwraca jej adres w pamięci.
    Zmień %f na %h , a zobaczysz wartość heksadecymalną adresu funkcji w pamięci.
    Jeżeli chcesz wywołać funkcję, musisz podać jej parametry.

    0
  • #4 29 Mar 2010 17:15
    arnoldziq
    Moderator Programowanie

    Także użycie for bez nawiasów, może stwarzać problemy :

    Code:
    double boundsum(double sqtab[N][N])
    
    {
       int i;
       double sum;

       for (i=0;i<N-1;i++){
          sum=sum+sqtab[i][6]+sqtab[i][0];
       }
       for (i=1;i<N-2;i++){
          sum=sum+sqtab[0][i]+sqtab[6][i];
       }
       
    return(sum);
    }

    0
  • Pomocny post
    #5 29 Mar 2010 17:22
    s36725
    Poziom 16  

    juniorowy napisał:
    Witam
    Napisałem program mający po kolei:
    1. Robić array jednowymiarowy o 7 elementach: 1,2,3,8,16,24,48.

    to wyglada ok

    Cytat:

    2. Z niego zrobić dwuwymiarowy array na podstawie takiej, że ten array jest jakby przylegający do niego od góry i lewej strony, (indeksy i,j) i z niego wyliczać logarytm naturalny.

    to też

    Cytat:

    3. Stworzyć funkcję sumującą elementy znajdujące się "na skraju" arraya. - tu jest problem, niby funkcja jest dobrze napisana a zwraca mi 0.


    wywołanie funkcji bez parametrów?
    spróbuj:
    Code:

    printf("The boundary sum is equal to %f", boundsum(sqtab));


    Cytat:

    4. Stworzyć funkcję która drukuje elementy dwuwymiarowego arraya z punktu 2. - napisałem coś podobnego do procedury w pascalu, jednak nie potrafię zrobic tak aby zwróciło mi tyle tekstu :(


    najprościej chyba będzie tak:
    Code:

    int printtab(double tab[N][N])
    {
     int i,j;
     for(i=0;i<N;i++)
     {
      for(j=0;j<N;j++)
       printf("[%d][%d]=%f \t",i,j,tab[i][j]);
      printf("\n");
     }
     return 0;
    }


    wywołasz to z main() poprzez:
    Code:

     printtab(sqtab);


    a tak przy okazji (żeby nikt się nie czepił, że BTW to nie po polsku :P)
    Po co właściwie ta funkcja praddr()?

    0
  • #6 29 Mar 2010 17:24
    juniorowy
    Poziom 8  

    Suma działa. Dziękuję bardzo. Problemem faktycznie był brak parametru funkcji. Pozostaje tylko te nieszczęsne wypisanie...
    Uaktualnię kod w pierwszym poście.

    0
  • Pomocny post
    #7 29 Mar 2010 17:26
    arnoldziq
    Moderator Programowanie

    juniorowy napisał:
    Edit:Down: Kolego Moderatorze. Użycie słowa functions było celowe, chodziło mi o podkreślenie że chodzi o funkcje pisane a nie funkcje zaimplementowane w C, takie jak printf. Błędu ortograficznego nie było żadnego, chyba że Kolega Moderator uważa za błąd ortograficzny brak polskich znaków, w takim razie Kolega wybaczy.


    Jeżeli ktoś żyje poza granicami kraju, lub używa telefonu komórkowego do komunikacji z elektroda.pl, to jestem w stanie "przymknąć oko" na brak polskich liter.
    Jednak w przypadku gdy część postu jest napisana z polskimi znakami a część nie, to świadczy tylko o niedbalstwie i będzie ścigane z całą stanowczością.
    Proszę także o wybaczenie, ale użycie słowa array w jego angielskiej wymowie, jest całkowicie dopuszczalne, to użycie słowa arraya, uważam za nieporozumienie.
    Mamy w języku polskim piękne słowo które całkowicie odpowiada znaczeniu słowa array, jest to słowo tablica, oraz wszelkie jego odmiany tablicy, tablicą itd.

    0
  • #8 29 Mar 2010 17:39
    juniorowy
    Poziom 8  

    Masz kolego rację. Przepraszam, nie zobaczyłem że napisałem "arraya".

    Program już działa. W kodzie który jest w pierwszym poście muszę zmienić parę rzeczy, wkleję go żeby być może przysłużył się innym. Dziękuje bardzo jeszcze raz, pozdrawiam.

    0
  • #9 29 Mar 2010 17:53
    s36725
    Poziom 16  

    Cytat:
    Code:

    main()
    {
    int patt[N]={1,2,3,8,16,24,48},  i,j;
    double sqtab[N][N];

        for (i=0;i<N-1;i++)
         {for (j=0;j<N-1;j++)
         sqtab[i][j]=log(patt[i]+patt[j]);
         }
       

        printf("The boundary sum is equal to %f", boundsum(sqtab));
    printf("%s",printtab(sqtab));
         
    printf("\n");
    }
    }


    ten zapis jest niepoprawny.
    funkcja printtab() sama w sobie pisze na standardowe wyjście, więc wywołujesz ją po prostu:
    Code:

     printtab(sqtab);


    poza tym jeden nawias na końcu za dużo ;)

    jeszcze coś - poprawiłem już w zaproponowanej przeze mnie funkcji printtab - zwracany typ void może być niekompatybilny z ansi C - tam o ile dobrze pamiętam funkcja nie robiąca nic zwraca 0 i jest typu int.

    a na dole pod postem jest taki przycisk "pomógł" ;)

    0
  • #10 29 Mar 2010 18:13
    juniorowy
    Poziom 8  

    Przy okazji napatoczył się jeszcze jeden problem.
    Pisząc funkcję printf("%f",log(1+48)) czy printf("%f",log(patt[0]+patt[6]) daje to wynik 3.89120. Z funkcji zwraca jakieś -925......... i jeszcze z 30 cyferek. O co chodzi?

    0
  • #11 29 Mar 2010 18:18
    s36725
    Poziom 16  

    Pokaż, jak to wywołujesz, bo to co piszesz wygląda na poprawne. Błąd musi tkwić w jakimś szczególe ;)

    0
  • #12 29 Mar 2010 18:28
    juniorowy
    Poziom 8  

    Code:

    main()
    {
    int patt[N]={1,2,3,8,16,24,48},  i,j;
    double sqtab[N][N];



        for (i=0;i<N-1;i++)
         {for (j=0;j<N-1;j++)
         sqtab[i][j]=log(patt[i]+patt[j]); 
         }
       

        printf("The boundary sum is equal to %f", boundsum(sqtab));

       printtab(sqtab);
       printf("%f",sqtab[0][6]);  //tu daje wynik -925......
       printf("%f",log(patt[0]+patt[6]); //tu jest wynik normalny
    printf("\n");
    }

    Ogólnie patrze ze wszystko powyżej wyniku 3.87 daje -925..... Może dam skompilowany, może cos pomoże?
    Może to coś jest źle z typami?

    0
  • Pomocny post
    #13 29 Mar 2010 18:31
    s36725
    Poziom 16  

    element sqtab[0][6] jest nie zadeklarowany.
    czeski błąd w pętli sumującej - zły warunek końcowy.
    powinno być

    Code:
    for (i=0;i<N;i++)
    a nie N-1. Wcześniej nie rzuciło mi się to w oczy ;) z "j" tak samo.

    0
  • #14 29 Mar 2010 20:04
    juniorowy
    Poziom 8  

    Chyba w życiu tego programu nie napiszę...
    Chcę napisać fragment programu odpowiadającego za drukowanie wskaźnikami. Oto co mi wyszło:

    Code:
    void printtabpoint(double sqtab[N][N]) 
    
    {int i,j;
    double *pprin;

    pprin=sqtab; 

       for(j=0;j<N;j++)
       {
          for(i=0;i<N;i++)
          {
             printf("[%d][%d]=%f ",i,j,*(pprin+i));
             printf("\n");
          }
    pprin++;
    printf("\n");
       }}

    Kompiluje się ale nie zwraca mi dobrych wartości, tzn pierwszy rząd j=0 jest dobry, w następnym [1,1] wraca do [0,0]. Co mam zrobić?

    0
  • #15 29 Mar 2010 20:33
    s36725
    Poziom 16  

    źle odnosisz się do wskaźników w kolejnych wierszach.
    by "przejść do nowego wiersza" musisz podać, jaka jest jego długość.
    numer komórki = nr_wiersza*długość wiersza + nr kolumny

    np przy długości wiersza równej 5:
    komórka [4][4] (indeksując od zera) ma numer: 4*5+4=24

    Code:
    void printtabpoint(double sqtab[N][N]) 
    
    {int i,j;
    double *pprin;

    pprin=sqtab; 

       for(j=0;j<N;j++)
       {
          for(i=0;i<N;i++)
          {
             printf("[%d][%d]=%f ",i,j,*(pprin+j*N+i));
             printf("\n");
          }
    printf("\n");
       }}

    0
  • #16 29 Mar 2010 21:06
    juniorowy
    Poziom 8  

    Zjada wartości czyli każdej pierwszej komórki z rzędu, reszta chyba jest poprawnie... Dziwne, przecież to jest ciągłe.

    0
  • #17 29 Mar 2010 21:22
    s36725
    Poziom 16  

    "zjada"? czym dokładnie owo zjadanie się objawia? nie oblicza, czy może nie wyświetla?

    w celu debugowania w pętli sumującej dodaj takiego samego printf() po wpisaniu każdej wartości. da Ci to obraz tego, co rzeczywiście jest wpisywane do tablicy.

    jak to zrobisz, skompiluj, uruchom i wklej wynik.

    ---

    drugi for w pętli sumującej liczy od 1 a nie od 0

    0
  • #18 29 Mar 2010 21:37
    juniorowy
    Poziom 8  

    [C] Funkcje drukowanie i sumowanie

    zrobilem w ten sposob. Pierwsza funkcja to jest ta bez pointera, druga z. Jak widać, wartości pierwszej sa zgodne z tymi z excela, natomiast w stosunku do drugiej, jest wycięty np. 0,1

    0
  • #19 29 Mar 2010 21:53
    s36725
    Poziom 16  

    to są double...
    double jest większy od int, a indeksy w pętlach są intami. więc przy przesuwaniu wskaźnika należy poruszać się krokami o rozmiarze double, a nie int.

    Code:

    void printtabpoint(double sqtab[N][N])
    {int i,j;
    double *pprin;

    pprin=sqtab;

       for(j=0;j<N;j++)
       {
          for(i=0;i<N;i++)
          {
             printf("[%d][%d]=%f ",i,j,*(pprin+j*N+sizeof(double)*i));
             printf("\n");
          }
    printf("\n");
       }}


    sprawdź teraz. człowiek uczy się całe życie ;]

    0
  • #20 29 Mar 2010 22:01
    juniorowy
    Poziom 8  

    Access violation. Dochodzi do 1,3 przy czym cale 1,x to liczby nieskończenie wielkie na minusie.

    0
  • #21 29 Mar 2010 22:14
    s36725
    Poziom 16  

    spróbuj teraz. jeden sizeof za dużo.

    0
  • #22 29 Mar 2010 22:37
    juniorowy
    Poziom 8  

    Spójrz kolego do pierwszego postu. Jednak ten Twój pierwszy sposób działał dobrze, nie wiem dlaczego wyskakiwały błędy. Program ostatecznie skończony.
    Chciałbym Ci bardzo podziękować za stracony na mnie czas. Chciałbym się również jakoś odwdzięczyć, przynajmniej 'smacznym napojem z bąbelkami' :) niestety... internet. Chyba ze poczta wysle :D
    Pozdrawiam

    0
  • #23 29 Mar 2010 22:50
    s36725
    Poziom 16  

    To i ja nie wiem czemu wywalał błędy. Niemniej cieszę się, że w końcu ruszył ;)
    Takie pisanie to akurat dla mnie relaksik :D Czego to się nie zrobi, by odpocząć od pisania magisterki :)
    Jakby były jeszcze jakieś problemy z programowaniem, wal śmiało, na pewno znajdę chwilę na odpoczynek :P
    Pozdrawiam

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo