Tablice dwuwymiarowe (macierze)

0

Witam
Napisałem program, który generuje tablice dwuwymiarowa typu String, wymiary wpisywane są z klawiatury, oraz później wyświetlane, nie potrafie sobie poradzić z paroma nowymi modyfikacjami takimi jak :

a) chciałbym żeby rozmiar mojej nowej macierzy wybierany był tylko w zakresie od 2-12
b) chciałbym żeby program sumował liczby czyli tylko te znaki, które są cyframi
c) obliczył ile jest liter w macierzy

Prosiłbym o pomoc ponieważ nie mogę sobie z tym poradzić. To co zrobiłem dotychczas:


package javaapplication1;
import java.util.*;

/**
 *
 * @author Bartek
 */
public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        
        Scanner scanner = new Scanner(System.in);        
        System.out.println("Podaj pierwszy wymiar:");
        int pierwsza = scanner.nextInt();
        System.out.println("Podaj drugi wymiar:");
        int druga = scanner.nextInt();
        scanner.nextLine();
        String [][] m = new String[pierwsza][druga];
        System.out.println("Wypełnij macierz:");
        for (int i = 0; i < pierwsza; i++) {
            for (int j = 0; j < druga; j++) {
                m[i][j] = scanner.nextLine();
                
            }
            
            
        }
        System.out.println("Wyświetlenie macierzy:");
        for ( String[] rząd : m) {
            for ( String pole : rząd) {
                System.out.print(pole + " ");
            }
            System.out.println();
        
        }
     
    }
}
     
0

a) Czytaj rozmiary w pętli.
b) Niejasno opisałeś problem, jeżeli użytkownik wybrał rozmiar 1X1 i wpisał "3456.678", to co chcesz uzyskać?
c) Wykorzystaj metody toCharArray() i isLetter().

0

Co do przykładu b) to w tablice będzie wpisywany tylko 1 znak, dokładnie chce żeby tablica sama się wypełniała przez losowe generowanie ale chce się skupić na razie na tych przykładach co podałem, czy mogę prosić o krótki kod jak powinna taka pętla wyboru 2-12 wyglądać ? powinna być umieszczana przed pobraniem wymiaru ?

0

Jeżeli jesteś pewien, że użytkownik wpisze liczbę typu int, to wystarczy takie coś.

        int pierwsza = 1;
        System.out.println("Podaj pierwszy wymiar (z przedzialu [2,12]):");
        while(true)
        {
            pierwsza = scanner.nextInt();
            if(pierwsza>=2 && pierwsza<=12)
            {
                break;
            }
        }

Bezpieczniej zrobić tak:

        int pierwsza = 1;
        String line = "";
        System.out.println("Podaj pierwszy wymiar (z przedzialu [2,12]):");
        while(true)
        {
            line = scanner.nextLine();
            try
            {
                pierwsza = Integer.parseInt(line);
            }
            catch(Exception e)
            {
            }
            if(pierwsza>=2 && pierwsza<=12)
            {
                break;
            }
        }
0

Dziękuje bardzo zmodyfikowałem pierwszym sposobem również drugą zmienną:


package javaapplication1;
import java.util.*;

/**
 *
 * @author Piotr
 */
public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        Scanner scanner = new Scanner(System.in);   
                       
        int pierwsza = 1;
        System.out.println("Podaj pierwszy wymiar z przedzialu 2-12 :");
        while(true)
        {
            pierwsza = scanner.nextInt();
            if(pierwsza>=2 && pierwsza<=12)
            {
                break;
            }
        }
                            
        int druga = 1;
        System.out.println("Podaj drugi wymiar z przedzialu 2-12):");
        while(true)
        {
            druga = scanner.nextInt();
            if(druga>=2 && druga<=12)
            {
                break;
            }
        }
        scanner.nextLine();
        
        String [][] m = new String[pierwsza][druga];
       
        System.out.println("Wypełnij macierz:");
        for (int i = 0; i < pierwsza; i++) {
            for (int j = 0; j < druga; j++) {
                m[i][j] = scanner.nextLine();
                           }
                    }
               
        System.out.println("Wyświetlenie macierzy:");
        for ( String[] rząd : m) {
            for ( String pole : rząd) {
                System.out.print(pole + " ");
            }
            System.out.println();
                }
     
    }
    
}

Chciałbym nie wpisywać z klawiatury do tablicy znaków, tylko generować losowo i tylko jeden znak jeśli ma być to macierz, na pewno trzeba użyć Random ran=new Random(); muszą być też pętle, które będą wpisywać ten jeden znak i podejrzewam, że jakaś funkcja, nie wiem jak to wszystko złożyć żeby układało się w całość, uczę się a dzięki użytkownikowi ** bogdans** wiem jak ustawić zakres tablic, proszę o pomoc

0

Czy mógłby ktoś pomóc przerobić powyższy program żeby tablica została losowo wypełniona 1 znakiem ascii ?

0
int [][] m = new int[pierwsza][druga];
Random losowacz = new Random();
for (int i = 0; i < pierwsza; i++) 
{
      for (int j = 0; j < druga; j++) 
      {
            m[i][j] = losowacz.nextInt(96) + 32;
      }
}
W tablicy będą znaki o kodach ASCII od 32 do 127. Jak potrzebujesz inne to zmień stałe.
0

Dodałem powyższy kod i losuje mi tylko cyfry zamiast znaków z tablicy ASCII, podaje przykład macierzy 2x2 :


Wyświetlenie macierzy:
36 35 
165 226 

Moją intencją jest aby tablica wyświetlała 1 znak ASCII, jakiej modyfikacji trzeba dokonać ?

0
        for (int i = 0; i < pierwsza; i++)
        {
            for (int j = 0; j < druga; j++)
            {
                System.out.print((char)m[i][j]+" ");
            }
            System.out.println("");
        }
0

Rozumiem, że wcześniej wyświetlało mi tylko cyfry ponieważ tablica była typu Int, teraz gdy jest znakowa (char) wyświetla znaki z wybranego przeze mnie zakresu. Bardzo dziękuję. Chciałbym teraz dodać kod programu, który pozwoli mi na to aby sumować cyfry jeżeli w ogóle się pojawią. Czyli suma liczb - tych znaków, które są cyframi. Podejrzewam, że trzeba zrobić konwersje z typu char na int z tego co czytałem.

0

Nie trzeba robić konwersji

...
     if(Character.isDigit(m[i][j]))
     {
         suma+=m[i][j]-48;
     }
...

Kod ASCII cyfry '0' wynosi 48, cyfry '1' wynosi 49,... dlatego jest odejmowane 48.

0

Dziękuję, chciałbym jeszcze obliczyć ilość liter w macierzy, jak wykorzystać toCharArray() i isLetter() ?

0

Czy taki kod jest poprawny ?

  int litera=0;
            if(Character.isLetter(m[i][j]))
            {
                litera=litera+m[i][j];
            }
      }

Dodałem ten kod lecz źle działa, podaje przykład :


Wyświetlenie macierzy:
t N F 
C Ô µ 
Ò a } 
Suma znaków, które są cyframi = 0
Liczba liter w macierzy = 1031

0

Nie jest poprawny, myśl trochę.

   litera = litera + 1;
0

To moje początki dlatego muszę nauczyć się tego logicznego myślenia, w każdym razie dziękuje za pomoc. Trochę głupio mi tak co chwile zadawać pytania ale inaczej się nie nauczę, chciałbym teraz utworzyć słowo z głównej przekątnej macierzy i proszę o pomoc

0

Czy mógłby ktoś pomóc napisać kod, który pozwala utworzyć słowo z głównej przekątnej macierzy ?

0

A co jest główna przekątna w tablicy prostokątnej (pierwsza!=druga)? Jeżeli pierwsza == druga, to:

StringBuilder diagonal = new StringBuilder("");
for(int i=0;i<pierwsza;i++)
{
    diagonal.append(m[i][i]);
}
0

Dziękuję, mam ostatnie pytanie i będę już zbierał nabytą wiedzę do "kupy" , jak obliczyć ilość elementów większych od wprowadzonego znaku ?

0

sprawdzać po kolei i zliczać większe...

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