Program który będzie grupował 'cos' nie działa prawidłowo

0

Witam chciałem stworzyć program który będzie grupował 'cos'. To 'cos' mieści się w 3 kolumnach w 1 wierszu, tych 'cos' możne być kilka, w kolumnie 0 znajduje się id, w 1 są losowe wartości, 2 są losowe wartości , funkcja join(0,2) przesuwamy do wiersza w którym jest to 'cos' z id 0, 'cos' z id 2. Mam problem z 3 rzeczami :

  • funkcja setSize wysypuje program po wpisaniu liczby (nie można nic wpisać i nic się nie pokazuje, jakby się zaciął). Wiem mogę to ustawić seterem ale jestem ciekawy dlaczego to nie działa
  • nrWiersza=i cały czas zapisuje do nrWiersza i, a ja chce zęby zrobił to tylko raz i potem już tego nie robił
  • j*=3 w pętli nie działa. Powinno działać tak ze j jest mniejsze od długości pętli która jest dzielona na 3 i teraz to j * 3 czyli np 03, 13 ,2*3

jeśli widzicie jeszcze jakieś błędy to uciesze się jak mi je wskażecie

	Scanner scanner = new Scanner(System.in);
	Random r = new Random(); 
	int tabSize=3;
	int tab[][] = new int [tabSize][tabSize*3];
	int nrWiersza;
	int ostatniaKolumna1;
	int ostatniaKolumna2;
	
	public void tabSize(){
		System.out.println("Set the tab size");
		tabSize = scanner.nextInt();
	}
	
	public void uzupelnianieTab(){
		
		for(int i=0; i<tab.length; i++){
			for(int j=0; j<tab[i].length; j++){
				tab[i][j] = 0;
			}
		}
		for(int i=0; i<tab.length; i++){
			//ID
			tab[i][0]=i;
			//MASA
			tab[i][1] = r.nextInt(101)+1;
			//IQ
			tab[i][2] = r.nextInt(101)+1;
		}
	}
	
	public void join(int pierwsza, int druga){
		
		nrWiersza=0;

		for(int i=0; i<tab.length; i++){
			for(int j=0; j<tab[i].length/3; j*=3){
				
				
					if(tab[i][j]==pierwsza){

						ostatniaKolumna1=0;
						
						for(int x=0; x<tab[i].length; x++){
							
							if(tab[i][x]!=0){
								ostatniaKolumna1=x;
							}
							else{
								nrWiersza=i;
								break;
							}			
						}
					}
					
					
					
					if(tab[i][j]==druga){
						
						ostatniaKolumna2=0;
						
						for(int a=0; a<tab[i].length; a++){
							
							if(tab[i][a]!=0){
								ostatniaKolumna2=a;

							}
							else{
								for(int z=0; z<=ostatniaKolumna2; z++){
									tab[nrWiersza][ostatniaKolumna1+z+1] += tab[i][z];
								}
								for(int z=0; z<=ostatniaKolumna2; z++){
									tab[i][z] = 0;
								}
								break;
							}
							
						}	
					}
			}
		}
	}
		KolonieModel model = new KolonieModel();
		
		model.tabSize();
		model.uzupelnianieTab();
		model.pokazTab();
		model.join(0,2);
		model.pokazTab();
		
1
  1. Z pytaniem dlaczego nie działa funkcja setSize udaj się do wróżki - nie zamieściłeś kodu.
  2. Przypisanie nrWiersza = ... zrób poza pętlą.
  3. Nie rozumiem problemu.
0
bogdans napisał(a):
  1. Z pytaniem dlaczego nie działa funkcja setSize udaj się do wróżki - nie zamieściłeś kodu.
  2. Przypisanie nrWiersza = ... zrób poza pętlą.
  3. Nie rozumiem problemu.
  1. Mój błąd, pomyliłem nazwę, chodziło o tabSize()
public void tabSize(){
        System.out.println("Set the tab size");
        tabSize = scanner.nextInt();
    }
  1. Zrobiłem poza pętla x ale dalej to samo, i jest mi potrzebne żeby zapisać numer wiersza aby potem móc przenieść do tego wiersza inne wartości
if(tab[i][j]==pierwsza){

	ostatniaKolumna1=0;
	nrWiersza=i;

	for(int x=0; x<tab[i].length; x++){
							
		if(tab[i][x]!=0){
			ostatniaKolumna1=x;
		}
		else{
								
			break;
		}			
	}
}
  1. pętla się sypie ( iteruje w nieskończoność, j jest równe 0 i i jest równe 0) wtedy gdy używam ** j*=3 **
 for(int j=0; j<tab[i].length/3; j*=3)
1
  1. Działa, może w kodzie, którego nie podałeś, zamykasz Scanner. Swoją drogą, ta funkcja nie ma żadnego wpływu na działanie programu. Tablica tab ma zawsze rozmiar 3x9.
  2. Nie wiem gdzie chcesz wpisać wartość zmiennej nrWiersza, jeśli do tablicy tab to nie wiem po co chcesz ją wpisywać.
for(int j=0; j<tab[i].length/3; j+=3)
0
bogdans napisał(a):
  1. Działa, może w kodzie, którego nie podałeś, zamykasz Scanner.
  2. Nie wiem gdzie chcesz wpisać wartość zmiennej nrWiersza, jeśli do tablicy tab to nie wiem po co chcesz ją wpisywać.
for(int j=0; j<tab[i].length/3; j+=3)
  1. Funkcja nie zapisuje wartości do zmiennej. Nie zamykam Scannera.

  2. Funkcja join(0,2) model.join(0,2) służy do tego aby to 'cos' z id 2 przenieść do wiersza w którym znajduje sie 'cos' z id 0, pierwsze 2 pętle

for(int i=0; i<tab.length; i++){
			for(int j=0; j<tab[i].length; j+=3){

maja przeszukać tabele (szuka tylko po id) jeśli znajda 'cos' z id 0 to ma zapisać w jakim wierszu sie znajduje i ile kolumn zajmuje,

					if(tab[i][j]==pierwsza){

						ostatniaKolumna1=0;
						nrWiersza=i;
						System.out.print(nrWiersza);
						
						for(int x=0; x<tab[i].length; x++){
							
							if(tab[i][x]!=0){
								ostatniaKolumna1=x;
							}
							else{
								break;
							}			
						}
					}

następnie szuka 'cos' z id 2 sprawdzę ile kolumn zajmuje przenosi to co znajduje się w tym wierszu do tego co jest w wierszu gdzie jest 'cos' z id 0 i zeruje wiersz w którym znajdowało się 'cos' z id 2

					if(tab[i][j]==druga){
						
						ostatniaKolumna2=0;
						
						for(int a=0; a<tab[i].length; a++){
							
							if(tab[i][a]!=0){
								ostatniaKolumna2=a;

							}
							else{
								for(int z=0; z<=ostatniaKolumna2; z++){
									tab[nrWiersza][ostatniaKolumna1+z+1] += tab[i][z];
								}
								for(int z=0; z<=ostatniaKolumna2; z++){
									tab[i][z] = 0;
								}
								break;
							}
							
						}	
					}

wklejam cały kod. ps teraz funkcja tabSize() nazywa sie tabS()

model

package zadaniAlg;

import java.util.Random;
import java.util.Scanner;

public class KolonieModel {

	Scanner scanner = new Scanner(System.in);
	Random r = new Random(); 
	int tabSize=3;
	int tab[][] = new int [tabSize][tabSize*3];
	int nrWiersza;
	int ostatniaKolumna1;
	int ostatniaKolumna2;
	
	public void tabS(){
		System.out.println("Set the tab size");
		tabSize = scanner.nextInt();
	}
	
	public void uzupelnianieTab(){
		
		for(int i=0; i<tab.length; i++){
			for(int j=0; j<tab[i].length; j++){
				tab[i][j] = 0;
			}
		}
		for(int i=0; i<tab.length; i++){
			//ID
			tab[i][0]=i;
			//MASA
			tab[i][1] = r.nextInt(101)+1;
			//IQ
			tab[i][2] = r.nextInt(101)+1;
		}
	}
	
	public void join(int pierwsza, int druga){
		
		nrWiersza=0;

		for(int i=0; i<tab.length; i++){
			for(int j=0; j<tab[i].length; j+=3){
				
					if(tab[i][j]==pierwsza){

						ostatniaKolumna1=0;
						nrWiersza=i;
						System.out.print(nrWiersza);
						
						for(int x=0; x<tab[i].length; x++){
							
							if(tab[i][x]!=0){
								ostatniaKolumna1=x;
							}
							else{
								break;
							}			
						}
					}
					
					
					
					if(tab[i][j]==druga){
						
						ostatniaKolumna2=0;
						
						for(int a=0; a<tab[i].length; a++){
							
							if(tab[i][a]!=0){
								ostatniaKolumna2=a;

							}
							else{
								for(int z=0; z<=ostatniaKolumna2; z++){
									tab[nrWiersza][ostatniaKolumna1+z+1] += tab[i][z];
								}
								for(int z=0; z<=ostatniaKolumna2; z++){
									tab[i][z] = 0;
								}
								break;
							}
							
						}	
					}
			}
		}
	}
	
	public void pokazTab(){
		System.out.println();
		for(int i=0; i<tab.length; i++){
			for(int j=0; j<tab[i].length; j++){
				System.out.print(tab[i][j]+" ; ");
			}
		System.out.println();
		}
	}
/*	
	public void masa(int pierwsza){
		
	}
	
	public void iq_min(int pierwsza){
		
	}
	
	public void iq_max(int pierwsza){
		
	}
	
*/
	
}

controller

package zadaniAlg;

import java.util.Scanner;

public class KolonieController {

	public static void main(String[] args) {
		
		KolonieModel model = new KolonieModel();
		
		model.tabS();
		model.uzupelnianieTab();
		model.pokazTab();
		model.join(0,2);
		model.pokazTab();

	}

}

1
  1. Zapisuje do zmiennej. Ale Ty tworzysz tablicę tab przed odczytaniem tej zmiennej. Powinno być tak:
    public void tabS(){
        System.out.println("Set the tab size");
        tabSize = scanner.nextInt();
        tab = new int [tabSize][tabSize*3];
    }
0

Nie odpowiadaj w komentarzach. Nie rozumiem o co ci chodzi.

0

Jest to zadanie z tej strony http://ki.staszic.waw.pl/task.php?name=kolonie jest tam wytłumaczone na czym polega zadanie. Sposób działania programu:

-wprowadzamy na wejściu n

-tworze tablice tab[n][3n] w każdym wierszu znajduje się jedna bakteria, bakteria składa się z 3 kolumn ,w 0 znajduje się id, 1 znajduje się masa, 2 znajduje się iq, każdy wiersz to 1 bakteria, 3n w tablicy dlatego ze możne być taka możliwość ze wszystkie bakterie zostaną połączone do jednej kolonii.

-funkcja join(0,2) służy do kolonizowania bakterii, funkcja działa tak ze bakterie z id 2 przenieść do wiersza w którym znajduje się bakteria z id 0 pierwsze dwie pętle maja przeszukać tabele (szuka tylko po id) jeśli znajda bakterie z id 0 to ma zapisać w jakim wierszu się znajduje i ile kolumn zajmuje, następnie szuka bakterii z id 2 sprawdza ile kolumn zajmuje, przenosi to co znajduje się w tym wierszu do tego co jest w wierszu gdzie jest bakteria z id 0 i zeruje wiersz w którym znajdowało się bakteria z id 2

Problem polega na tym ze muszę wiedzieć gdzie znajduje się bakteria z id 0 nie wiem czy została przeniesiona czy nie, jak ją znajdę to muszę gdzieś zapisać w którym jest wierszu i robię to w ten sposób nrWiersza=i ale zamiast zapisać w którym jest ta bakteria wierszu nrWiersza zapisuje kolejne iterację pętli, powinna zapisać mi tylko wiersz w którym jest dana bakteria. Próbowałem wpisać nrWiersza++ ale to rozwiązuje mojego problemu

0

Nie wiem co się dzieje z liczbą kolonii po poleceniu JOIN. Pozostaje ona taka sama (tylko, że jedna kolonia jest pusta), czy zmniejsza się o jeden. Trzecie polecenie z przykładu (MASA 5) sugeruje pierwsze rozwiązanie.
Nie chce mi się zastanawiać nad tym nieszczęsnym nrWiersza, ja bym wybrał zupełnie inną strukturę:

  • klasa Bakteria z trzema polami: id, iq oraz masa,
  • tablica typu ArrayList<Bakteria>[], każdy element tablicy to kolonia, początkowo jednoelementowa, lub typu ArrayList<Integer>[], wtedy pamiętałbym tylko id bakterii.

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