|
|
- ## 3 Salasanageneraattori
-
- **Tehtävä:**
-
- Luvun kolmas tehtävä on jälleen eräänlainen hyötyohjelma. Tällä kertaa tarkoituksena on luoda ohjelma, joka luo uusia sanasalasanoja, jotka muodostuvat yhdeksästä satunnaisesta kirjaimesta.
-
- Ohjelmaa varten on luotu tiedosto 7-3_tiedosto.txt, jossa on 1000 satunnaista kirjain- ja numeromerkkiä. Tee seuraavaksi ohjelma, joka pyytää käyttäjältä 9 lukua väliltä 0-999 muodossa "Anna X. luku väliltä 0-999: ". Tämän jälkeen tee ohjelma, joka hakee tiedostosta lukua vastaavan merkin, eli jos käyttäjä antaa arvon 0, haetaan tiedoston ensimmäinen merkki, jos 876, haetaan merkki joka on tiedoston 876. paikalla.
-
- Toimiessaan oikein ohjelma tulostaa seuraavaa:
-
- Example output:
-
- ```
- Luodaan salasana.
- Anna 1. luku väliltä 0-999: 234
- Anna 2. luku väliltä 0-999: 22
- Anna 3. luku väliltä 0-999: 1
- Anna 4. luku väliltä 0-999: 76
- Anna 5. luku väliltä 0-999: 45
- Anna 6. luku väliltä 0-999: 23
- Anna 7. luku väliltä 0-999: 27
- Anna 8. luku väliltä 0-999: 87
- Anna 9. luku väliltä 0-999: 3
- Ohjelma loi salasanan cf5HAsu66
- ```
-
- **Vastaus**
-
- ```
- #!/usr/bin/env ruby
- # coding: utf-8
-
- require 'securerandom'
-
- merkkiTiedosto = "7-3_tiedosto.txt"
-
- def luoTiedosto(tiedosto)
-
- if (!File.exists?(tiedosto))
- begin
- File.open(tiedosto, File::RDWR|File::CREAT, 0644)
- rescue
- warn "Tiedostoon #{tiedosto} ei voida kirjoittaa"
- Process.exit(1)
- end
- end
- end
-
- def kirjoitaRandom(tiedosto, maara)
-
- File.open(tiedosto, "w+:UTF-8") do |f|
- f.flock(File::LOCK_EX)
- f.puts SecureRandom.urlsafe_base64(maara)
- end
-
- end
-
- luoTiedosto(merkkiTiedosto)
- kirjoitaRandom(merkkiTiedosto, 1000)
-
- ##################################################
-
- def salasanaGeneraattori(tiedosto, merkkimaara, lukuvali)
-
- merkit = []
- i = 0
- salasana = ""
-
- if lukuvali.length != 2
- warn "Lukuvälin täytyy koostua alarajasta ja ylärajasta, jotka annetaan kokonaislukuina."
- return
- end
-
- if (File.readable?(tiedosto))
- File.foreach(tiedosto) do |line|
- merkit += line.chomp.split("")
- end
- end
-
- if merkit.length < lukuvali[1]
- warn "Annettu yläraja #{lukuvali[1]} on suurempi kuin merkkien määrä tiedostossa (#{merkit.length})."
- warn "Sallittu yläraja asetetaan arvoon #{merkit.length}."
- end
-
- puts "Luodaan salasana."
-
- while i < 9
- begin
- print "Anna #{i+1}. luku väliltä #{lukuvali[0]}-#{lukuvali[1]}: "
- valinta = Integer(gets.chomp)
- salasana += merkit[valinta].to_s
- rescue
- warn "Et antanut kokonaislukua. Yritä uudelleen."
- next
- end
- i += 1
- end
-
- puts "Ohjelma loi salasanan #{salasana}"
-
- end
-
- salasanaGeneraattori(merkkiTiedosto, 9, [0,999])
- ```
|