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

Tablice dynamiczne i statyczne

Object Storage Arubacloud
0 głosów
330 wizyt
pytanie zadane 26 stycznia 2021 w C i C++ przez szylvvia Początkujący (300 p.)
edycja 26 stycznia 2021 przez szylvvia

Cześć, byłabym wdzięczna za każdą pomoc.

Mam stworzyć tablice statyczną wypełnioną losowymi liczbami 1-100

Policzyć ile jest w niej liczb z przedziału od a do b

Następnie tymi liczbami z przedziału wypełnić nowo utworzoną tablicę dynamiczną.

To wszystko ma być za pomocą funkcji. O ile poradziłam sobie z tą tablicą statyczną, wypełnieniem i policzeniem tych liczb tak nie wiem jak zrobić działającą funkcję która tymi liczbami wypełni nową tablice dynamiczną. Ponadto ta funkcja ma być postaci wskaźnik do tablicy statycznej tabS, liczba jej elementów n, przedziały a i b, wskaźnik do liczby elementów tablicy dynamicznej m; funkcja zwraca wskaźnik do tablicy dynamicznej).

 

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

void losuj(int *tab, int x);
int licz(int tab[], int x, int a, int b);

int *nowa(int tabS[], int n, int m, int a, int b);

int main(int argc, char *argv[]) {
	int x =100;
	int tabS[x];
	int a =22;
	int b =55;
	int m = 0;
	int i;
	int *nowaTD;
	
	
	losuj(&tabS,x);
	
	for(i=0;i<x;i++)
	{
		printf("%d ",tabS[i]);
	}
	
	for(i=0;i<x;i++)
	{
		if(tabS[i]>=a && tabS[i]<=b) m++;
	}
	
	//printf("\n%d", m);
	printf("\n\n");
	
	nowaTD = nowa(tabS,x,m,a,b);
	wyswietl(nowaTD,m);


	return 0;
}


	
	//printf("\n%d", m);
	printf("\n\n");
	
	nowaTD = nowa(tabS,x,m,a,b);
	wyswietl(nowaTD,m);


	return 0;
}


void wyswietl(int *tab,int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("%d\t",*tab);
		tab++;		
	}
}


void losuj(int *tab, int x)
{
	int i;
	for(i=0;i<x;i++)
	{
		*tab = 1 + rand() % 100;
		tab++;
	}
}


int *nowa(int *tabS, int n, int m, int a, int b)
{
	int *td = (int*)malloc(m*sizeof(int));
	
	if (td==NULL)
	{
		printf("Blad");
		exit(EXIT_FAILURE);
	}
	
	int i,k;
	
	
	for(i=0;i<n;i++)
	{
		if( *(tabS+i) >= a && *(tabS+i) <= b )
			{
				td=&tabS;
				td++;
			}
		tabS++;
	}
	return td;
	
}

Wiem, że ta funkcja póki co jest nie taka jak w poleceniu, ale próbowałam, żeby ona cokolwiek wypisywała, chociaż widzę, ze nie jest to czego oczekują w zadaniu.

komentarz 26 stycznia 2021 przez manjaro Nałogowiec (37,390 p.)
Dwa pytania:

1) Tablica S ma  rozmiar 100, jeżeli się okaże że losowych liczb z przedziału (a,b) jest 45 to tablica D ma mieć rozmiar 45? Dobrze rozumiem?

2) To ma być język C czy C++?

2 odpowiedzi

0 głosów
odpowiedź 26 stycznia 2021 przez szylvvia Początkujący (300 p.)
Tak, dokładnie o to chodzi z tym rozmiarem tej dynamicznej, i jest to język C, zapomniałam dodać.
0 głosów
odpowiedź 26 stycznia 2021 przez manjaro Nałogowiec (37,390 p.)

Proszę

#include <stdio.h>

void losuj(int *tab, int x) {
    for(int i=0;i<x;i++){
        *tab = 1 + rand() % 100;
        tab++;
    }
}

int *nowaTD(int *tabS, int n, int a, int b, int m) {
    int *tab;
    int licznik = 0;
    tab = (int*)malloc(m*sizeof(int));
    for(int i=0;i<n;i++,tabS++){
        if(*tabS>=a && *tabS<=b) {
            *(tab+licznik) = *tabS;
            licznik++;
        }
    }
    return tab;
}


int main() {
    int n =100;
    int tabS[n];
    int a =22;
    int b =55;
    int m =0;
    int *tabD;

    losuj(tabS, n);

    for (int i=0; i<n; i++) {
        if(tabS[i]>=a && tabS[i]<=b) m++;
    }


    tabD = nowaTD(tabS, n, a, b, m);

    for (int i=0; i<n; i++) {
       printf("%d ",tabS[i]);
    }

    printf("\n\n");

    for (int i=0; i<m; i++) {
       printf("%d ",tabD[i]);
    }
}


 

komentarz 26 stycznia 2021 przez mokrowski Mędrzec (155,460 p.)
Brak <stdlib.h>

Wyciek pamięci (nie zwalniasz poprzez free() tablicy)

Zbędne dla C rzutowanie wyniku malloc()

Złamana zasada alokowania i zwalniania pamięci na tym samym poziomie abstrakcji.

Zadanie naprawdę lepiej rozbić na poszczególne funkcje niż tworzyć 5-argumentową.
komentarz 26 stycznia 2021 przez mokrowski Mędrzec (155,460 p.)
A no tak.. i jeszcze tablica tworzona na stosie to VLA a nie statyczna.
komentarz 26 stycznia 2021 przez manjaro Nałogowiec (37,390 p.)
Przyznam że nie znam języka C i pisałem trochę na czuja tak aby działało.

Faktycznie brakuje  <stdlib.h> i zwolnienia pamięci.

Reszta to już chyba dość subiektywne zarzuty.

Funkcja 5 argumentowa bo tak  było w poleceniu, pewnie jakiś wykładowca sobie tak zażyczył.
komentarz 26 stycznia 2021 przez manjaro Nałogowiec (37,390 p.)

Jak już wspominałem nie znam C, a malloc wziąłem stąd

C jest dla mnie archaicznym językieml, a nie wymarł jeszcze bo jest zdecydowanie najszybszy. No i na uczelniach stare grzyby go jeszcze forsują bo nic nowszego nie przyswoili.

komentarz 26 stycznia 2021 przez mokrowski Mędrzec (155,460 p.)
Nie ma sprawy :) Dzięki linkom możesz trochę poznać :)
komentarz 26 stycznia 2021 przez manjaro Nałogowiec (37,390 p.)
Dzięki, doceniam że chciało Ci się te linki tu podać.

Przepraszam, ale jednak nie będę tego studiował bo programuję w Pythonie głównie. Ale może koleżanka skorzysta.

Podobne pytania

0 głosów
1 odpowiedź 141 wizyt
0 głosów
5 odpowiedzi 5,285 wizyt
0 głosów
2 odpowiedzi 3,321 wizyt
pytanie zadane 26 stycznia 2017 w Java przez 0xf Dyskutant (8,180 p.)

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

61,935 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!

...