• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

funkcje i wskaźnik do tablicy

Object Storage Arubacloud
+1 głos
476 wizyt
pytanie zadane 28 maja 2016 w C i C++ przez komo23 Nowicjusz (130 p.)
//mam napisać dwie funkcje,pierwsza, która rezerwuje pamieć dla n-elementów i wypełnia tablice, ma zwracać wskaźnik do tej tablicy,a druga sprawdza czy liczby z tablicy mieszą się w przedziale (a,b) ; w main wczytywać liczbę elementów n i  przedział (a,b)
//i mam pytanie czy dobrze przekazuje wskaźnik do tablicy do drugiej funkcji? 


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


int wczytaj (int n)
{
    int i;
    int * tab=NULL;
    tab = (int*)malloc(n * sizeof(int));
for(i=0;i<n;i++)
 { printf("podaj element %d\n",i);
   scanf("%d",&tab[i]);
 }
 return tab;
}

void *wypisz (int *tab3,int n,int a,int b)
{

    int i;
     for(i=0;i<n;i++)
      {
          if((tab3[i]>a)&&(tab3[i]<b))
        {
            printf("%d",tab3);
        }
           else
            {
               printf("nie ma takiej liczby ");
                }

       }
       return 0;
       }







int main ()
{ int n;
int a,b;
int* tab3;
do
scanf("%d",&n);
while(n<=0);
{
tab3=wczytaj(n);
}
scanf("%d %d",&a,&b);
wypisz(&tab3,n,a,b);


     return 0;
}

 

1 odpowiedź

+2 głosów
odpowiedź 28 maja 2016 przez draghan VIP (106,230 p.)

Ale niechlujne formatowanie... :(

Dlaczego funkcja wypisz ma zwracać wskaźnik na void? Dlaczego funkcja wczytaj ma zwracać int, zamiast wskaźnika do tablicy?

Wywołanie - przy założeniu poprawienia powyższych błędów - powinno odbyć się jakoś tak:

int *tab3;
// ...
tab3 = wczytaj(n);
// ...
wypisz(tab3, n, a, b);

 

komentarz 28 maja 2016 przez komo23 Nowicjusz (130 p.)

mój błąd funkcja wypisz ma tylko wypisywać liczby z przedziału, nic nie zwracać, a funkcja wczytaj ma zwracać *

return *tab;

i mam pytanie bo do funkcji wypisz mam przekazać wskaźnik do tablicy czy nie powinno być ?  

wypisz(&tab3,n,a,b) 

 

 

komentarz 28 maja 2016 przez draghan VIP (106,230 p.)
Popraw jeszcze prototypy funkcji, żeby zgadzały się z tym, co z każdej chcesz zwracać.

Owszem, masz tam przekazywać wskaźnik. Zanim napiszę więcej odnośnie tego, zapytam Cię: jakiego typu jest tab3?
komentarz 28 maja 2016 przez komo23 Nowicjusz (130 p.)

wydaje mi się że pierwsza funkcja w ten sposób jest dobrze: 

int wczytaj (int n)
{
    int i;
    int * tab3=NULL;
    tab3 = (int*)malloc(n * sizeof(int));
for(i=0;i<n;i++)
 { printf("podaj element %d\n",i);
   scanf("%d",&tab3[i]);
 }
 return *tab3;
}

a w funkcji wypisz nie jestem pewny instrukcji if

tab3 jest wskaźnikiem typu int 

komentarz 28 maja 2016 przez draghan VIP (106,230 p.)

tab3 jest wskaźnikiem typu int 

Zgadza się. Ta zmienna jest wskaźnikiem. A skoro masz do funkcji przekazać wskaźnik, to po prostu robisz to tak:

wypisz(tab3, n, a, b);

Wersja z ampersandem spowoduje, że podasz tej funkcji nie wskaźnik na tablicę, a adres wskaźnika - co nie będzie poprawne.

Myślę, że jedna kwestia wyjaśniona. Teraz reszta.

Funkcja wczytaj() powinna zwracać (wskaźnik na) tablicę, prawda?

komentarz 28 maja 2016 przez komo23 Nowicjusz (130 p.)
okey, teraz już rozumiem,

funkcja wczytaj() ma zwracać wskaźnik do wypełnionej tablicy
komentarz 28 maja 2016 przez draghan VIP (106,230 p.)


funkcja wczytaj() ma zwracać wskaźnik do wypełnionej tablicy

A Twoja wersja funkcji wygląda tak (z pominięciem fragmentów, dla zachowania jasności przekazu):

int wczytaj(int n)
{
    int * tab3=NULL;
    // ... 
    return *tab3;
}

Widzisz już, co trzeba zmienić...? :)

komentarz 28 maja 2016 przez komo23 Nowicjusz (130 p.)
int *wczytaj(int n)
{
    int * tab3=NULL;
    // ... 
    return *tab3;
}

 

tak to ma być ? 

komentarz 28 maja 2016 przez draghan VIP (106,230 p.)

Prawie. :) tab3 jest wskaźnikiem na int, funkcja ma zwracać wskaźnik na int, więc po prostu zwróć tab3. :)

komentarz 28 maja 2016 przez komo23 Nowicjusz (130 p.)

właśnie do tego doszedłem, dzięki wielkie :) 

no tą pierwszą funkcje już wiem jak ma być

w wypisz() powinna wyglądać tak ? 

void wypisz (int *tab3,int n,int a,int b)
{

    int i;
     for(i=0;i<n;i++)
      {
          if((tab3[i]>a)&&(tab3[i]<b))
        {
            printf("%d",tab3[i]);
        }
           else
            {
               printf("nie ma takiej liczby ");
                }

       }

 

         
 
komentarz 28 maja 2016 przez draghan VIP (106,230 p.)

Mniej-więcej. Formatowanie jest fatalne. ;) No i else w każdym obiegu pętli był trochę bez sensu, bo wypisywałeś komunikat że nie znaleziono żadnej liczby nawet, jeśli np. tylko jedna nie należała do przedziału.

void wypisz(int *table, int size, int a, int b)
{
    int i;
    int count_numbers = 0;

    for(i=0; i < size; i++)
    {
        if(table[i]>a && table[i]<b)
        {
            printf("%d", table[i]);
            count_numbers++;
        }
    }

    if(count_numbers == 0)
    {
        printf("Nie znaleziono w tablicy liczby z podanego przedziału");
    }
}

 

komentarz 28 maja 2016 przez komo23 Nowicjusz (130 p.)

już to trochę poprawiłem, jeszcze raz wielkie dzięki za pomoc :D 

void wypisz (int *tab3,int n,int a,int b)
{
int licznik=0;
    int i;
     for(i=0;i<n;i++)
      {
          if((tab3[i]>a)&&(tab3[i]<b))
        {
            printf("%d",tab3[i]);
            licznik++;
        }


       }
  if(licznik==0)
        printf("nie ma takiej liczby!");
       }

 

komentarz 28 maja 2016 przez draghan VIP (106,230 p.)
Już wszystkie Twoje wątpliwości zostały rozwiane? :)
komentarz 28 maja 2016 przez komo23 Nowicjusz (130 p.)
na tą chwilę tak :) jestem dopiero na początku tej drogi i dopiero poznaję jak to funkcjonuje, dzięki wielkie :)
komentarz 28 maja 2016 przez draghan VIP (106,230 p.)
Na zdrowie. :) Miłego wieczoru.

Podobne pytania

0 głosów
2 odpowiedzi 704 wizyt
0 głosów
1 odpowiedź 150 wizyt
pytanie zadane 20 stycznia 2016 w C i C++ przez Jonki Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 296 wizyt
pytanie zadane 10 grudnia 2015 w C i C++ przez wiktortr Początkujący (250 p.)

92,632 zapytań

141,500 odpowiedzi

319,878 komentarzy

62,012 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...