C tablice dwuwymiarowe i liczby losowe

0

Witam, jako że dopiero zaczynam programować napotykam często problemy. Postanowiłem zalogować się na tym forum, gdyż sądzę, że łatwiej tu znajdę pomoc - wśród ludzi będących "w temacie".
Otóż mam napisać tablicę dwuwymiarową tablicę , gdzie liczbę wierszy podaje użytkownik, a liczba kolumn jest generowana losowo. Wszystko do tej pory jest zrozumiałe i łatwe. Teraz należy wypełnić tablicę liczbami losowymi - i wypisać ją na ekran. Tutaj zaczyna się problem. Wypisuje mi macierz składający się z tych samych liczb... Kolumny i wiersze się zgadzają, ale wypełnienie nie . Mój kod jest następujący i nie wiem gdzie szukać błędów... Jeżeli jest ktoś, kto mógłby pomóc będę wdzięczny :)

 #include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
int i,j,k,h,n,m,iloscrownan,ilosczmiennych,losowa,lsowa1;

main()
{
  srand(time(NULL));
  ilosczmiennych=rand()%10+0;
  printf("Ilosc twych zmiennych-liczba kolumn macierzy bedzie wynosila %d\n",ilosczmiennych);
  printf("Podaj ile chcesz miec rownan liniowych-liczba wierszy macierzy:");
  scanf("%d",&iloscrownan);
  printf("Ilosc rownan to %d , a ilosc zmiennych to %d ",iloscrownan,ilosczmiennych);
  int macierz[iloscrownan][ilosczmiennych];
  
  for(i=0;i<iloscrownan;i++)
  {
    for(j=0;j<ilosczmiennych;j++)
     {
      srand(time(NULL));
      losowa=rand()%10+1;
      macierz[iloscrownan][ilosczmiennych]=losowa;
     }
  }
   
   printf("Oto twoj macierz: ");
   for(k=0;k<iloscrownan;k++)
    {
      printf("\n");
      for(h=0;h<ilosczmiennych;h++)
      printf("%d",macierz[iloscrownan][ilosczmiennych]);
    }


getch();
}
0
printf("%d",macierz[k][h]);

OT, macierz jest rodzaj żeńskiego => Twoja macierz, macierz składająca się,...

0
srand(time(NULL));

robi sie raz

dlatego ze robisz to w petli, wyniki (liczby) masz takie same a nie losowe

do tego

  1. nic nie znaczace zmienne (chodzi o te i j k l mn
  2. zmienne globalne
  3. nie zainicjalizowane zmienne (przy globalnych nie ma znaczenia ale przy lokalnych tak)
0

A jak można to zapisać bez pętli? Czy da się w jakiś inny sposób sprawdzać wiersz, kolumnę i przypisywać tam losową wartość poza pętlą for?
Jeżeli tak to jak? I to samo pytanie odnośnie wypisywania macierzy. Chyba trzeba użyć 2 pętli for, aby wypisać tak zbudowany macierz. Bardzo możliwe , że się mylę , dlatego proszę o jakieś wskazówki :)

0

nie mam bladego pojecia o czym Ty piszesz...

masz

  for(i=0;i<iloscrownan;i++)
  {
    for(j=0;j<ilosczmiennych;j++)
     {
      srand(time(NULL));
      losowa=rand()%10+1;
      macierz[iloscrownan][ilosczmiennych]=losowa;
     }
  } 

masz miec

  for(i=0;i<iloscrownan;i++)
  {
    for(j=0;j<ilosczmiennych;j++)
     {
      losowa=rand()%10+1;
      macierz[i][j]=losowa;
     }
  } 

i wtedy liczby beda bardziej losowe

do reszty sie nie ustosunkuje bo nie mam bladego pojecia o co Ci chodzi

1

Słowo macierz jest rodzaju żeńskiego, zatem

tak zbudowaną macierz
.

0

A od kiedy w C można w ogóle robić tak jak tutaj?

int macierz[iloscrownan][ilosczmiennych];

To czasami nie jest UB? Tutaj powinna być przecież stała.
Żeby zrobić tablicę, której rozmiaru nie znamy podczas kompilacji trzeba ją zaalokować dynamicznie przez malloc albo calloc, a później zwolnić po niej pamięć.

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

int main(void)
{
    int x=2, y=2, i;
    int **tab = (int**)malloc(x*sizeof(int));
    for(i=0;i<x;i++){
        tab[i] = (int*)malloc(y*sizeof(int));
        free(tab[i]);
    }
    free(tab);
    return 0;
}

Przecieram oczy i zastanawiam się czy coś się zmieniło w standardzie skoro nikt tego nie komentuje :)

0
fasadin napisał(a):

nie mam bladego pojecia o czym Ty piszesz...

masz

  for(i=0;i<iloscrownan;i++)
  {
    for(j=0;j<ilosczmiennych;j++)
     {
      srand(time(NULL));
      losowa=rand()%10+1;
      macierz[iloscrownan][ilosczmiennych]=losowa;
     }
  } 

masz miec

  for(i=0;i<iloscrownan;i++)
  {
    for(j=0;j<ilosczmiennych;j++)
     {
      losowa=rand()%10+1;
      macierz[i][j]=losowa;
     }
  } 

i wtedy liczby beda bardziej losowe

do reszty sie nie ustosunkuje bo nie mam bladego pojecia o co Ci chodzi

Zmieniłem tak jak napisałeś, lecz nadal liczby generują się dokładnie w taki sam sposób. A teraz jeszcze wyjaśnię o co mi chodziło dokładniej :
Poniższy zapis :
for(i=0;i<iloscrownan;i++)
{
for(j=0;j<ilosczmiennych;j++)
{
srand(time(NULL));
losowa=rand()%10+1;
macierz[iloscrownan][ilosczmiennych]=losowa;
}
}
Moim zdaniem powinien sprawiać, że wchodząc do pętli sprawdzamy pierwszy wiersz pierwszą kolumnę i wpisujemy tam liczbę i tak dalej przeskakuje... Chciałem zapytać, czy da się to wykonać jakoś inaczej?
Co jeszcze poprawić w moim zapisie, aby losowało prawidłowo? Kolega wyżej napisał o jakimś malloc, ale całkowicie nie wiem o co z tym chodzi, lecz jeżeli jest to jakąś alternatywą to chętnie się nauczę. Pozdrawiam

0

Bo docelowo mam napisać program rozwiązujący równania metodą Gaussa... Kompletnie nie wiem jak się za to zabrać (z programistycznej strony)...

0

Ten kod:

 for(i=0;i<iloscrownan;i++)
  {
    for(j=0;j<ilosczmiennych;j++)
     {
      srand(time(NULL));
      losowa=rand()%10+1;
      macierz[iloscrownan][ilosczmiennych]=losowa;
     }
  }

jest błędny, ma być

srand(time(NULL));
for(i=0;i<iloscrownan;i++)
{
    for(j=0;j<ilosczmiennych;j++)
     {
         losowa=rand()%10+1;
         macierz[i][j]=losowa;
     }
 }
0

Niestety nadal losowane liczby nie wychodzą od siebie różne. Wszystkie są takie same.

0

Ok , działa! :) dzięki za pomoc

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