Salasanan arvontaongelma

Hei. Täytyisi saada toimivaksi ohjelma, joka kysyy käyttäjältä, montako merkkiä tämä haluaa salasanaansa. Tämän jälkeen ohjelma arpoo satunnaisesti valmiiksi luoduista taulukoista kyseisen määrän merkkejä ja tulostaa ne salasanana. Saan kyllä ohjelman arpomaan yhden luvun, mutten osaa laittaa sitä silleen, et arpois sen määrän jonka käyttäjä antaa. Osaisko joku neuvoa minua?
5404
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat

Käytä for lausetta ja ota aina seuraava luku nextInt() metodilla jos käytät random luokkaa.

Äänestä
  • Kiitos, mietinkin että tuo tehdään for-lauseen avulla. uutta metodia en hoksannut ajatellakaan.

    Voitko antaa palautetta, mikä tässä tökkii? en ole vielä tuonne lisännyt sitä uutta metodia ja for-lausetta mutta haluaisin varmistaa, onko tämä kyhäelmä muuten oikein.

    import javax.swing.*;
    import java.util.*;
    public class Oppimisteht2
    {
       public static void main(String args[])
       {
       String rivi = "";
       String satunnainen = "";
       String merkkimaara= "";

    // kysytään käyttäjältä kuinka monta merkkiä hän haluaa salasanaan

       merkkimaara = JOptionPane.showInputDialog("Anna haluamasi merkkimäärä");

    // käytettävissä olevat merkit
       String merkit[] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
                   "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
                   "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
                   "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
                   "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3",
                   "4", "5", "6", "7", "8", "9", "0" };


       Random rand = new Random();

    // määritellään taulukoiden koot
       int eka = rand.nextInt(15) 1;
       int toka = rand.nextInt(15) 1;


    // luodaan taulukko
       String taulu[][] = new String[eka][toka];


    // lisätään taulukkoon merkkejä toisesta taulukosta satunnaisesti
       for (int i=0; i

    Äänestä

  • samaa ongelmaa kirjoitti:

    Kiitos, mietinkin että tuo tehdään for-lauseen avulla. uutta metodia en hoksannut ajatellakaan.

    Voitko antaa palautetta, mikä tässä tökkii? en ole vielä tuonne lisännyt sitä uutta metodia ja for-lausetta mutta haluaisin varmistaa, onko tämä kyhäelmä muuten oikein.

    import javax.swing.*;
    import java.util.*;
    public class Oppimisteht2
    {
       public static void main(String args[])
       {
       String rivi = "";
       String satunnainen = "";
       String merkkimaara= "";

    // kysytään käyttäjältä kuinka monta merkkiä hän haluaa salasanaan

       merkkimaara = JOptionPane.showInputDialog("Anna haluamasi merkkimäärä");

    // käytettävissä olevat merkit
       String merkit[] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
                   "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
                   "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
                   "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
                   "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3",
                   "4", "5", "6", "7", "8", "9", "0" };


       Random rand = new Random();

    // määritellään taulukoiden koot
       int eka = rand.nextInt(15) 1;
       int toka = rand.nextInt(15) 1;


    // luodaan taulukko
       String taulu[][] = new String[eka][toka];


    // lisätään taulukkoon merkkejä toisesta taulukosta satunnaisesti
       for (int i=0; i

    import javax.swing.*;
    import java.util.*;
    import java.lang.Object;
    public class Oppimisteht2{

    public static void main(String args[]){
    int merkkimaara = 0;
    String satunnainen = "";
    String input = "";
    char taulukko[];

    // kysytään käyttäjältä kuinka monta merkkiä hän haluaa salasanaan

    input = JOptionPane.showInputDialog("Anna haluamasi merkkimäärä");
    for(int i = 0; i < input.length() ; i++){
    merkkimaara += Character.getNumericValue(input.charAt(i))*Math.pow(10,input.length()-i-1);
    }
    // Luodaan samankokoinen taulukko.
    taulukko = new char[merkkimaara];

    // käytettävissä olevat merkit
    char merkit[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
    'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
    'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
    'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3',
    '4', '5', '6', '7', '8', '9', '0' };


    //Jos ei haluta joka kerta samoja lukuja niin siemen luvun tulisi vaihdella
    //eri ajokerroilla. Otetaan siemeneksi tietokoneen kellonaika millisekunteina.
    Random rand = new Random(System.currentTimeMillis());

    /**Seuraavaksi ei tarvitse muuta tehdä kuin lukea "satunnaisesti" merkkejä
    *taulukosta salasanaan. Otetaan satunnaisluvusta jakojäännös merkkitaulukon
    *pituudelle, jolloin saadaan indeksi josta merkki otetaan.
    */

    for(int i = 0; i < merkkimaara; i++){
    taulukko[i] = merkit[Math.abs(rand.nextInt()%merkit.length)];
    }

    //Seuraavaksi luodaan String olio taulukkon merkeistä.
    satunnainen = new String(taulukko);


    // näytetään arvotut merkit
    JOptionPane.showMessageDialog(null,"Salasanasi on: " + satunnainen);



    System.exit(0);

    }
    }

    Muutin melko lailla tuota ohjelmaasi, siinä oli mielestäni paljonkin liikaa, en itse asiassa ymmärtänyt mitä teit tuolla satunnaisen kokoisella kaksiulotteisella taulukolla. Toinen huomioitava seikka on muuttujien tyypit, merkkejä on helpompi käsitellä charreina ja kokonaislukuja integereinä.

    Jatkossa olisi suotavaa tehdä käyttöliittymä ja itse ohjelma erikseen sopivasti metodeihin jaoteltuna, tämä ei siis ole hyvää tyyliä vaikka pieni ohjelma onkin.

    Äänestä

  • masa kirjoitti:

    import javax.swing.*;
    import java.util.*;
    import java.lang.Object;
    public class Oppimisteht2{

    public static void main(String args[]){
    int merkkimaara = 0;
    String satunnainen = "";
    String input = "";
    char taulukko[];

    // kysytään käyttäjältä kuinka monta merkkiä hän haluaa salasanaan

    input = JOptionPane.showInputDialog("Anna haluamasi merkkimäärä");
    for(int i = 0; i < input.length() ; i++){
    merkkimaara += Character.getNumericValue(input.charAt(i))*Math.pow(10,input.length()-i-1);
    }
    // Luodaan samankokoinen taulukko.
    taulukko = new char[merkkimaara];

    // käytettävissä olevat merkit
    char merkit[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
    'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
    'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
    'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3',
    '4', '5', '6', '7', '8', '9', '0' };


    //Jos ei haluta joka kerta samoja lukuja niin siemen luvun tulisi vaihdella
    //eri ajokerroilla. Otetaan siemeneksi tietokoneen kellonaika millisekunteina.
    Random rand = new Random(System.currentTimeMillis());

    /**Seuraavaksi ei tarvitse muuta tehdä kuin lukea "satunnaisesti" merkkejä
    *taulukosta salasanaan. Otetaan satunnaisluvusta jakojäännös merkkitaulukon
    *pituudelle, jolloin saadaan indeksi josta merkki otetaan.
    */

    for(int i = 0; i < merkkimaara; i++){
    taulukko[i] = merkit[Math.abs(rand.nextInt()%merkit.length)];
    }

    //Seuraavaksi luodaan String olio taulukkon merkeistä.
    satunnainen = new String(taulukko);


    // näytetään arvotut merkit
    JOptionPane.showMessageDialog(null,"Salasanasi on: " + satunnainen);



    System.exit(0);

    }
    }

    Muutin melko lailla tuota ohjelmaasi, siinä oli mielestäni paljonkin liikaa, en itse asiassa ymmärtänyt mitä teit tuolla satunnaisen kokoisella kaksiulotteisella taulukolla. Toinen huomioitava seikka on muuttujien tyypit, merkkejä on helpompi käsitellä charreina ja kokonaislukuja integereinä.

    Jatkossa olisi suotavaa tehdä käyttöliittymä ja itse ohjelma erikseen sopivasti metodeihin jaoteltuna, tämä ei siis ole hyvää tyyliä vaikka pieni ohjelma onkin.

    No oli aika pieni "ohjelma" ts. jonkun datanomi-opiskelijan toinen harjoitustehtävä. Teit sitten sen hänen puolestaan.

    Äänestä

  • Teukka kirjoitti:

    No oli aika pieni "ohjelma" ts. jonkun datanomi-opiskelijan toinen harjoitustehtävä. Teit sitten sen hänen puolestaan.

    Ongelmat ne on datanomillakin.

    Äänestä

Kommentoi aloitusta


mikael kirjoitti:

Hei. Täytyisi saada toimivaksi ohjelma, joka kysyy käyttäjältä, montako merkkiä tämä haluaa salasanaansa. Tämän jälkeen ohjelma arpoo satunnaisesti valmiiksi luoduista taulukoista kyseisen määrän merkkejä ja tulostaa ne salasanana. Saan kyllä ohjelman arpomaan yhden luvun, mutten osaa laittaa sitä silleen, et arpois sen määrän jonka käyttäjä antaa. Osaisko joku neuvoa minua?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu