Dlaczego wyświetlają się śmieci na końcu tablicy?

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

int main()
{
    int *tablica1, *tablica2,*tabliczka, n,m,k,i;

    printf("Podaj liczbe elementow pierwszej tablicy: ");
    scanf("%d",&n);

    printf("Podaj liczbe elementow drugiej tablicy: ");
    scanf("%d",&m);

    k = m + n;
    tablica1 = malloc(n * sizeof(int));
    tablica2 = malloc(m * sizeof(int));
    tabliczka = malloc(k * sizeof(int));

    for(i = 0; i < n; i++)
    {
        tablica1[i] = rand() % 100 + 1;
    }
    for(i = 0; i < m; i++)
    {
        tablica2[i] = rand() % 100 + 1;
    }

    printf("\nLiczby z pierwszej tablicy: ");
    for(i = 0; i < n; i++)
    {
        printf("%d ",tablica1[i]);
    }

    printf("\n\nLiczby z drugiej tablicy: ");
    for(i = 0; i < n; i++)
    {
        printf("%d ",tablica2[i]);
    }

    printf("\n\nLiczby z pierwszej i drugiej tablicy: ");
    for(i = 0; i< k; i++)
    {
        if(i == n)
        {
            tabliczka[i] = tablica2[i - n];
        }
        if(i < n)
        {
            tabliczka[i] = tablica1[i];
        }
        printf("%d ",tabliczka[i]);
    }

    return 0;



}
 

Dlaczego na koniec tablicy o nazwie tabliczka wyświetlają się śmieci ?

1

No a gdzie masz sytuację że i>n? Co się wtedy wg ciebie wypisuje? Bo wg mnie wypisujesz wtedy "śmieci" z tablicy "tabliczka"...

0

Już poprawiłem dzięki.A kod ogółem dobrze wygląda ?

0

Nie i totalnie nie rozumiem po co ci ta trzecia tablica. O braku zwolnienia pamięci nawet nie wspominam...

0

A co jest nie tak ? Chciałem dwie tablice w jedną złączyć.

0

To przydziel najpierw pamięć dla "sumarycznej" tablicy po czym wczytaj do odpowiednich jej części.

0

Nie bardzo rozumiem, można jaśniej ;p ? Bo najpierw chcę te dwie pierwsze tablice zapełnić. To jak wczytać coś do trzeciej tablicy jak jeszcze nie będzie zapełnionej drugiej i trzeciej tablicy ?

0
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main()
  {
   int *tab,*ptr,*end;
   unsigned sizeA,sizeB;
   srand(time(NULL));
   printf("Podaj liczbe elementow pierwszej tablicy: ");
   scanf("%u",&sizeA); 
   printf("Podaj liczbe elementow drugiej tablicy: ");
   scanf("%u",&sizeB);
   tab=(int*)malloc((sizeA+sizeB)*sizeof(int));
   for(ptr=tab,end=ptr+sizeA;ptr<end;++ptr) *ptr=rand()%100+1;
   for(end=ptr+sizeB;ptr<end;++ptr) *ptr=rand()%100+1;
   printf("Liczby z pierwszej tablicy: ");
   for(ptr=tab,end=ptr+sizeA;ptr<end;++ptr) printf("%d ",*ptr);
   printf("\nLiczby z drugiej tablicy: ");
   for(end=ptr+sizeB;ptr<end;++ptr) printf("%d ",*ptr);
   printf("\nLiczby z pierwszej i drugiej tablicy: ");
   for(ptr=tab,end=ptr+sizeA+sizeB;ptr<end;++ptr) printf("%d ",*ptr);
   printf("\n");
   free(tab);
   return 0;
  }
0

Dlaczego unsigned a nie int ?

Może głupie pytanie ale w pracy programiści właśnie piszą take pętle jakie Ty napisałeś ? Bo trochę ciężko je zrozumieć dla mnie.

0

Dlaczego unsigned - czy wyobrażasz sobie tablicę ujemnej długości?
Wszystko zależy gdzie, kiedy i w którym miejscu, przy wprowadzeniu lub wyświetleniu na ekran raczej nie, bo oszczędzony czas jest bardzo małym ułamkiem tego co zżerają cin/cout z tym że w pracy nie używa się cin/cout od ładnych 20 lat (jak nie więcej).

0

A jeszcze spytam czy ten mój kod jest w ogóle beznadziejny ? Zapomniałem dodać zwolnienia pamięci.

0

Ten który podałeś - nie działa.

0

Już poprawiłem pętle if i działa, nadal jest beznadziejny ? Dodałem unsigned zamiast int dla wielkości tablic.

0

Jak już niejednokrotnie mówiłem, z takimi pytaniami ... do wróżbitów, na tym forum najpierw kod , potem pytania.

0

Próbowałem teraz coś takiego, ale nie wiem czemu ale drugi warunek if nie działa:

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

int main()
{
    int *tablica1,*tablica2,*tabliczka,i;
    unsigned n,m,k;

    printf("Podaj ilosc elementow pierwszej tablicy: ");
    scanf("%u",&n);

    printf("Podaj ilosc elementow drugiej tablicy: ");
    scanf("%u",&m);
    k = n+m;
    tablica1 = (int*)malloc(n * sizeof(int));
    tablica2 = (int*)malloc(m * sizeof(int));
    tabliczka = (int*)malloc(k * sizeof(int));
    
    srand(time(NULL));
    for(i = 0;i < k;i++)
    {
        if(i < n)
        {
            if(i == 0) printf("Elementy pierwszej tablicy to: ");
            tablica1[i] = rand() % 100 + 1;
            tabliczka[i] = tablica1[i];
            printf("%d ",tabliczka[i]);
        }
        if(i >= n)
        {
            if(i == n) printf("Elementy drugiej tablicy to: ");
            tablica2[i - n] = rand() % 100 + 1;
            tabliczka[i] = tablica2[i - n];
            printf("%d ",tabliczka[i]);
        }

        return 0;
    }
}
 
0
  1. To co teraz zrobiłeś nawet tablic nie potrzebuje:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main()
  {
   unsigned n,m;
   printf("Podaj ilosc elementow pierwszej tablicy: ");
   scanf("%u",&n);
   printf("Podaj ilosc elementow drugiej tablicy: ");
   scanf("%u",&m);
   srand(time(NULL));
   printf("Elementy pierwszej tablicy to: ");
   for(i=0;i<n;++i) printf("%d ",rand()%100+1);
   printf("\n");
   printf("Elementy drugiej tablicy to: ");
   for(i=0;i<m;++i) printf("%d ",rand()%100+1);
   printf("\n");
   return 0;
  }
  1. Nie używaj i++ tam gdzie można użyć ++i bo ci ten brzydki nawyk się zemści.
0

Ale to nie jest to samo, bo ja chcę te elementy z pierwszej i drugiej tablicy wstawić do tej tablicy trzeciej. Wyświetlić zawartość pierwszej i drugiej tablicy i na koniec jeszcze tablicę trzecią wyświetlić.

0

Albo robisz co ci się do głowy wejdzie i wtedy pogódź się z tym że będziesz miał zawsze beznadziejne kody.
Albo stosuj się do zasad i nie rób to co chcesz zaś rób tylko to co w programie jest potrzebne.

0

Bo mam takie ćwiczenie,że elementy z tablicy pierwszej i drugiej wpisać do trzeciej tablicy.I nie wiem czemu mój ten ostatni kod nie działa poprawnie dla drugiego warunku.

0
  1. Wywal tą książkę bo ewidentnie nie dla ciebie
  2. Nie działa bo kompletnie nie wiesz co robisz
  3. Gdzie wsadziłeś return ?
  4. Kopiowanie o ile naprawdę w tym jest sens to wygląda następująco:
memcpy(tabJoin,tabA,countA*sizeof(*tabJoin));
memcpy(tabJoin+countA,tabB,countB*sizeof(*tabJoin));

lub za pomocą tego: http://www.cplusplus.com/reference/algorithm/copy/

copy(tabA,tabA+countA,tabJoin);
copy(tabB,tabB+countB,tabJoin+countA);

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