Zadanie-Wartości losowe w tablicy dynamicznej

0

Witam
Potrzebuje napisać program w którym funkcja generuje dwie tablice dynamiczne,wypełnia je wartościami losowymi od 0 do 5 tak aby były od razu posortowane.Program ma wyświetlać te dwie tablice.
[C]

 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int tworzenie(int rozmiar,int rozmiar1,int *wsk,int *wsk1)
{
	int i;
	wsk=(int*)malloc(rozmiar*sizeof(int));
	if(wsk==NULL)
	return -1;	
	wsk1=(int*)malloc(rozmiar1*sizeof(int));
	if(wsk==NULL)
	return -1;	
	srand(time(0));
	for (i=0;i<rozmiar;i++)
	{
		wsk[i]=rand() % 6+i;
		printf("%d ",wsk[i]);	
	}
	for(i=0;i<rozmiar1;i++)
	{
		wsk1[i]=rand() % 6+i;
		printf("%d ",wsk1[i]);	
	}
        free(wsk);
	free(wsk1);

}
int main() 
{
	
	int r,r1,*w1,*w2;
	printf("Podaj rozmiar pierwszej tablicy ");
	scanf("%d",&r);
	fflush(stdin);
	printf("Podaj rozmiar drugiej tablicy ");
	scanf("%d",&r1);
	fflush(stdin);
	tworzenie(r,r1,*w1,*w2);

	return 0;
	system("pause"); 
}



Program przestaje działać po podaniu rozmiarów tablic.Z góry dzięki za pomoc.

0
tworzenie(r,r1,*w1,*w2);

Powinno być

tworzenie(r, r1, w1, w2);

bo w tej chwili przekazujesz jakieś śmieciowe wartości pod adresami wskazanymi przez w1 i w2.
Drugą sprawą jest, po co przekazujesz te wskaźniki? Funkcja tworzenie() może operować na lokalnych wskaźnikach, a te przekazane są bezużyteczne bo i tak operujesz na ich kopii.

0

Ok rozumiem.Program działa lecz dalej mam problem z tym losowaniem ponieważ liczby nie są z przedziału 0-5 oraz tablica nie jest posortowana.
Mam jeszcze pytanie jak zrobić ten program alby wyświetlanie tablic odbywało się w funkcji main() a nie w funkcji tworzenie()

 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int tworzenie(int rozmiar,int rozmiar1)
{
	int *wsk,*wsk1;
	int i;
	wsk=(int*)malloc(rozmiar*sizeof(int));
	if(wsk==NULL)
	return -1;	
	wsk1=(int*)malloc(rozmiar1*sizeof(int));
	if(wsk==NULL)
	return -1;	
	srand(time(0));
	for (i=0;i<rozmiar;i++)
	{
		wsk[i]=rand() % 6+i;
		printf("%d ",wsk[i]);	
	}
	printf("\nDruga tablica ");
	for(i=0;i<rozmiar1;i++)
	{
		wsk1[i]=rand() % 6+i;
		printf("%d ",wsk1[i]);	
	}
	free(wsk);
	free(wsk1);

}
int main() 
{
	
	int r,r1;
	printf("Podaj rozmiar pierwszej tablicy ");
	scanf("%d",&r);
	fflush(stdin);
	printf("Podaj rozmiar drugiej tablicy ");
	scanf("%d",&r1);
	fflush(stdin);
	tworzenie(r,r1);

	return 0;
	system("pause"); 
}



0

Liczby z przedziału 0-5 uzyskujesz za pomocą

  
 wsk[i] = rand() % 6 ;

Cały kod można też rozbić na dwie funkcje:

 
int* tworzenie( int rozmiar )
{
    int* wsk=(int*)malloc(rozmiar*sizeof(int));
    if(wsk==NULL) return NULL;    
 
    srand(time(0));
    for (i=0;i<rozmiar;i++)
     {
        wsk[i]=rand() % 6;
     }
    return wsk;   
}

void przegladaj( int *tablica , int rozmiar )
{
 if( tablica !=NULL )
  {
   for(i=0;i<rozmiar;i++)
    {       
      printf("%d ",tablica[i]);    
    }
   free(tablica); 
  }
}

int main() 
{
 
    int rozmiar1,rozmiar2;
    printf("Podaj rozmiar pierwszej tablicy ");
    scanf("%d",&rozmiar1);
    fflush(stdin);
    printf("Podaj rozmiar drugiej tablicy ");
    scanf("%d",&rozmiar2);
    fflush(stdin);
  
    przegladaj( tworzenie(rozmiar1), rozmiar1 );  
    przegladaj( tworzenie(rozmiar2), rozmiar2 );
 
    return 0;
    system("pause"); 
}
0

Ja bym w ogóle nie losował liczb w tablicy. Losowałbym pozycję ostatniego zera, ostatniej jedynki,...

0

Potrzebuje jeszcze dopisać funkcję która połączy te dwie tablice w jedną.Próbowałem to zrobić ale coś nie działa jak powinno.
Z góry dzięki za pomoc :)

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

int* tworzenie(int rozmiar)
{
    int i;
	int* wsk=(int*)malloc(rozmiar*sizeof(int));
    if(wsk==NULL) 
	printf("Alokacja nie powiodla sie/n");    
    srand(time(0));
    for (i=1;i<rozmiar;i++)
     {
        wsk[0]=rand() % 6;
		wsk[i]=wsk[i-1]+(rand() % 6);
     }
    return wsk;   
}
 
void przegladaj( int *tablica , int rozmiar )
{
int i;
 if( tablica!=NULL )
  {
   for(i=0;i<rozmiar;i++)
    {       
      printf("%d ",tablica[i]);    
    }
   free(tablica); 
  }
}
int* laczenie(int *tablica,int *tablica1,int *tablica3,int rozmiar1,int rozmiar2)
{
	int i;
	for(i=0; i<rozmiar1;i++) 
	tablica3[i+rozmiar1]=tablica1[i]; 
	return tablica3;
}

int main() 
{
	
	int r1,r2;
	printf("Podaj rozmiar pierwszej tablicy ");
	scanf("%d",&r1);
	fflush(stdin);
	printf("Podaj rozmiar drugiej tablicy ");
	scanf("%d",&r2);
	fflush(stdin);
	printf("Tablica pierwsza\n");
	przegladaj(tworzenie(r1),r1);
	printf("\nTablica druga\n");  
    przegladaj(tworzenie(r2),r2);
	
	printf("\nTablica polaczona\n");
	przegladaj(laczenie(tworzenie(r1),tworzenie(r2),tworzenie(r1+r2+1),r1,r2),r1+r2+1);  
	
	return 0;
	system("pause"); 
}

0

Twój kod jest błędny - utworzone tablice nie spełniają warunków zadania. Jeśli nie chcesz skorzystać z mojego pomysłu (bardzo zmniejsza losowań - przy tablicy o mln. elementów będzie 5 losowań zamiast miliona), to zmień swój kod:

    wsk[0]=rand() % 6;
    for (i=1;i<rozmiar;i++)
     {
        wsk[i]=wsk[i-1]+(rand() % (6-wsk[i-1]));
     }
    return wsk;
0

Ja bym w ogóle nie losował liczb w tablicy. Losowałbym pozycję ostatniego zera, ostatniej jedynki,...

Nie bardzo rozumiem jak mam zrobić to losowanie. Mógłbyś mi to jakoś rozjaśnić?

0

Algorytm poniżej jest trochę inny, losuje kolejno: ile zer, ile jedynek,...,ile czwórek. Jeśli suma tych ilości jest mniejsza od rozmiaru tablicy, to na końcu piszę piątki.

    int filled = 0;
    int howMany;
    for(i=0;i<5;i++)
    {
        howMany = rand() % (rozmiar - filled);
        for(int j=filled;j<filled+howMany;j++)
        {
            wsk[j] = i;
        }
        filled+=howMany;
    }
    for(int j=filled;j<rozmiar;j++)
    {
        wsk[j] = 5;
    }

Nie znam funkcji srand, ale jeśli instrukcja srand(time(0)); jest wewnątrz funkcji tworzenie, to wylosowane tablice są identyczne. Przenieś te instrukcję do maina.

0

Algorytm losujący liczbę zer, jedynek itp. nie daje rozkładu losowego.
Wartość oczekiwaną dla poszczególnych liczb nie jest taka sama.
Na przykład zer jest zbyt dużo w stosunku do piątek.

0

Zostanę jednak przy rand(). Czy mógłby ktoś zerknąć na tą funkcję laczenie() bo coś tam w pętli jest zepsute i zwraca zupełnie coś innego.
Dzięki :)

0

O co Ci chodzi w tym wierszu?

przegladaj(laczenie(tworzenie(r1),tworzenie(r2),tworzenie(r1+r2+1),r1,r2),r1+r2+1);
  • dlaczego rozmiar połączonej tablicy to r1+r2+1, powinno być r1+r2,
  • dlaczego wywołujesz tworzenie(r1) i tworzenie(r1), utworzysz przecież nowe tablice różne od tych, które utworzyłeś i wyświetliłeś wcześniej.
0

Ok faktycznie tworze przecież nowe tablice-oczywisty błąd. Tylko w jaki sposób mam przekazać do funkcji łączenie tablice które będą wcześniej utworzone przez funkcję tworzenie- z tym mam największy problem.

0

W C++ jestem początkujący, więc kod jest pewnie naiwny i nieelegancki.

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

int* tworzenie(int rozmiar)
{
    int i;
    int* wsk = (int*)malloc(rozmiar*sizeof(int));
    if(wsk == NULL)
        printf("Alokacja nie powiodla sie/n");

    /*wsk[0]=rand() % 6;
    for (i=1;i<rozmiar;i++)
     {

        wsk[i]=wsk[i-1]+(rand() % (6-wsk[i-1]));
     }*/

    int filled = 0;
    int howMany;
    for(i=0;i<5;i++)
    {
        howMany = rand() % (rozmiar - filled);
        //printf("%d ",howMany);
        for(int j=filled;j<filled+howMany;j++)
        {
            wsk[j] = i;
        }
        filled+=howMany;
    }
    for(int j=filled;j<rozmiar;j++)
    {
        wsk[j] = 5;
    }
    return wsk;
}

void przegladaj(int *tablica , int rozmiar)
{
    int i;
    if( tablica!=NULL )
    {
        for(i=0;i<rozmiar;i++)
        {
            printf("%d ",tablica[i]);
        }
        free(tablica);
    }
}
int* laczenie(int *tab1,int *tab2,int rozmiar1,int rozmiar2)
{
    int* wsk = (int*)malloc((rozmiar1+rozmiar2)*sizeof(int));
    if(wsk == NULL)
        printf("Alokacja nie powiodla sie/n");
    int i1 = 0;
    int i2 = 0;
    int i = 0;
    while(i1 < rozmiar1 && i2 < rozmiar2)
    {
        if(tab1[i1] <= tab2[i2])
        {
            wsk[i] = tab1[i1];
            i1++;
        }
        else
        {
            wsk[i] = tab2[i2];
            i2++;
        }
        i++;
    }
    while(i1 < rozmiar1)
    {
        wsk[i] = tab1[i1];
        i1++;
        i++;
    }
    while(i2 < rozmiar2)
    {
        wsk[i] = tab2[i2];
        i2++;
        i++;
    }
    return wsk;
}

int main()
{

    int r1,r2;
    srand(time(0));
    printf("Podaj rozmiar pierwszej tablicy ");
    scanf("%d",&r1);
    fflush(stdin);
    printf("Podaj rozmiar drugiej tablicy ");
    scanf("%d",&r2);
    fflush(stdin);
    int* tab1 = tworzenie(r1);
    printf("Tablica pierwsza\n");
    przegladaj(tab1,r1);
    printf("\nTablica druga\n");
    int* tab2 = tworzenie(r2);
    przegladaj(tab2,r2);

    printf("\nTablica polaczona\n");
    przegladaj(laczenie(tab1,tab2,r1,r2),r1+r2);

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1