funkcja zapełniajaca tablice losowymi liczbami z zakresu

0

Witam, mam napisać program wczytujący dwuwymiarowa dynamiczna tablice i funkcje wypelniajaca ja losowymi liczbami z zakresu, ale u mnie cala tablica zapelnia sie tylko jedna losowa liczba

// ConsoleApplication6.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

void wypelnij(int **tab, int n, int m){ //funkcja wypelniajaca tablice losowymi liczbami
	
	int zakres;		//gorny zakres liczbowy
	int y=0;		
	int licznik; //licznik ilosci licz wprowadzonych do tablicy
		cout<<"podaj gorny zakres liczbowy tablicy"<<endl<<n*m<<endl;
		cin>>zakres;
		srand( time( NULL ) );
			for(licznik=0;licznik<n*m;){
				y=rand();
				if(y>0 && y<zakres){
	
					for ( int i = 0; i < n; ++i) 
						for ( int j = 0; j < m; ++j)
						tab[i][j]=y;
						licznik++;
				}
			}
	}
  
void wyswietl(int **tab, int n, int m){ //funkcja wyswietlajaca
	for ( int i = 0; i < n; ++i) {
		for ( int j = 0; j < m; ++j){
		cout<<tab[i][j]<<endl;
		}
}
}


int _tmain(int argc, _TCHAR* argv[])
{
	
	int m,n; //liczba kolumn  i wierszy
	cout<<"podaj ilosc wierszy";
	cin>>n;
	cout<<"podaj ilolsc kolumn";
	cin>>m;

	int **tab = new int *[n]; //tworzenie tablicy
for ( int i = 0; i < n; ++i ){
   tab[i] = new int [m]; 
}
wypelnij(tab,n,m);
wyswietl(tab,n,m);
system ("pause");
	return 0;
}

 
3
                    for ( int i = 0; i < n; ++i) 
                        for ( int j = 0; j < m; ++j)
                        tab[i][j]=y;
                        licznik++;

Zła indentacja (polecam http://format.krzaq.cc ), wypełniasz całą tablicę jedną liczbą - y, więc zostaje ona tak wypełniona. Nic dziwnego.
2. używasz nagiego new i delete. To antyidiomy w nowoczesnym C++. Masz kontnery, np. std::vector
3. wypisujesz i pobierasz dane od użytkownika w funkcji wypełniającej. Tak się nie robi (SRP, jak będziesz chciał wypełnić na podstawie danych z socketa lub w programie okienkowym to ta funkcja będzie bezużyteczna)
4. używasz rand() https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful

1
void wypelnij(int **tab,size_t Y,size_t X,int zakres)
  {
   for(size_t y=0;y<Y;++y) for(size_t x=0;x<X;++x) tab[y][x]=1+rand()%(zakres+1);
  }
 
int _tmain(int argc, _TCHAR* argv[])
  {
   srand(time(0)); // tylko raz
   ...
  }
0

Pyknąłem po C++owemu; szczerze mówiąc liczyłem, że ładniej będzie.

vector<vector<int>> foo(y, vector<int>(x));

mt19937 gen{random_device{}()}; // tylko do testów
uniform_int_distribution<> dis(minVal, maxval);
for_each(foo.begin(), foo.end(), [&](auto& v){
	generate(v.begin(), v.end(), bind(dis, ref(gen)));
});

http://melpon.org/wandbox/permlink/MDOlIzpUyseTVNZG

0

Dzięki za pomoc, zaczęło działać po wpisaniu kodu od _13th_Dragon

1
alisz_090 napisał(a):

Dzięki za pomoc, zaczęło działać po wpisaniu kodu od _13th_Dragon
Ale to stanowczo za mało, masz zrozumieć to co napisał @kq i umieć to zastosować.

0

dzięki Wam za pomoc, przeanalizuję wszystko co od Was dostałem, teraz trochę mnie czas nagli, muszę się ogólnie podciągnąć z całego c++, bo dawno nie miałem z nim styczności, dzięki za pomoc

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