## 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]) ```