Zdravim, za hodinu odevzdavam semestralni praci.. nevim jak ej to mozne, ale predevcirem po doprogramovani mi vse chodilo.. dnes to chci spustit a ujistit se a hle - nefunguje a vubec netusim proc (resp. tusim, ale nejsem sto najit spravne reseni)
Mam program ktery mi ma cist cisla po radcich ze souboru "vstup.txt", vypocitavat z nich posloupnost a tuto posloupnost zapsat do souboru "vystup.txt" - toto cele jen pokud je na prikazove radce uveden parametr vstup. txt (tzn. java mujprogram vstup.txt) , ale hazi mi to tohle
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at ukoly2012.babica.zapsaniDoPole(babica.java:92)
at ukoly2012.babica.main(babica.java:423)
problem bude ve scanneru, ze ho tam ma dvakrat.. ale jak to mohu predelat tak, aby mi tohle nevyhazovalo
pokud parametr na prikaz.radce zadan neni, program si vyzada vstupni hodnotu z klavesnice, to funguje uplne skvele, ale s tim parametrem ne a ne to spustit i kdyz mi to fungovalo jeste predevcirem. Hodim sem cely kod, diky za pripadnou radu
package ukoly2012;
/**
* Program generuje pseudonahodnou posloupnost podle zadaneho algoritmu, pote posloupnost seradi.
* Zadani startovaci hodnoty bud z klavesnice a vystup do console + vizualizuje posl. v DrawingTool.
* Pokud existuje soubor "vstup.txt", tak je vstup presmerovan na tento soubor, ktery obsahuje
* dvouciferna cisla po radcich
*/
import java.util.*;
import java.io.*;
//import ppa1.*;
import java.awt.*;
/**
* @author Miroslav Svetly
*
*/
public class babica {
public static final int vyska = 420; //vyska platna
public static final String jmeno = "vstup.txt"; //jmeno vstupniho souboru
//static private Scanner sc = new Scanner(System.in);
//static private FileReader fr = new FileReader(jmeno);
//static private Scanner sca = new Scanner(fr);
/**
* Zkouma, jestli soubor "vstup.txt" existuje.
* Pokud existuje, metoda main presmeruje vstup na vstupni soubor.
* Pokud neexistuje, metoda main presmeruje vstup na rucni zadani start.hodnoty.
* @return boolean false nebo true
*/
public static boolean rozhodniSe() {
boolean klavesnice = true;
try {
File f = new File(jmeno);
if (f.exists()) {
klavesnice = false;
}
else {
klavesnice = true;
}
}
catch (Exception e) {
e.printStackTrace();
}
return klavesnice;
}
/**
* smaze soubor "vystup.txt"
* @throws IOException
*/
public static void smazVystup() throws IOException {
File f = new File("vystup.txt"); //smazani souboru "vystup.txt"
RandomAccessFile raf = new RandomAccessFile(f, "rw");
raf.setLength(0);
raf.close();
}
/**
* v pripade vstupu z klavesnice nacte startovaci hodnotu zadanou uzivatelem
* @param a
* @return startovaci hodnotu zadanou uzivatelem
*/
public static int scanner(int a) {
Scanner sc = new Scanner(System.in);
System.out.println("Zadej startovaci hodnotu: ");
a = sc.nextInt();
return a;
}
public static int[] zapsaniDoPole() throws IOException {
int [] cisla = new int[40];
int [] kopie = null; //kopie pole "cisla"
int iterace = -1;
FileReader fr = new FileReader(jmeno);
Scanner sca = new Scanner(fr);
while(sca.hasNextLine()) { //zapisuje vstupni hodnoty ze souboru do pole
iterace++;
kopie = new int[iterace + 1];
cisla[iterace] = sca.nextInt();
System.arraycopy(cisla, 0, kopie, 0, iterace + 1 );
}
return kopie;
}
/**
* Metoda cte hodnoty ze souboru "vstup.txt" a postupne je uklada do pole.
* Pote se pro jednotlive prvky pole vypocitava posloupnost podle zadaneho algoritmu.
* Tato posloupnost se uklada do pole.
* Overuje jestli ve vygenerovanem poli jiz neni stejna hodnota.
* Po nalezeni shodneho cisla metoda cte dalsi cislo z pole vstupnich hodnot.
* Po posledni vstupni hodnote a nalezeni shodneho cisla metoda konci.
* @return pole posloupnosti
* @throws IOException
*/
public static int [] vygenerujZeSouboru(int [] kopie) throws IOException {
kopie = zapsaniDoPole();
/*
int [] cisla = new int[40];
int [] kopie = null; //kopie pole "cisla"
int iterace = -1;
FileReader fr = new FileReader(jmeno);
Scanner sca = new Scanner(fr);
while(sca.hasNextLine()) { //zapisuje vstupni hodnoty ze souboru do pole
iterace++;
kopie = new int[iterace + 1];
cisla[iterace] = sca.nextInt();
System.arraycopy(cisla, 0, kopie, 0, iterace + 1 );
} */
int [] pole = null;
int [] pole2 = new int [40];
for(int g = 0; g < kopie.length; g++) {
pole = null;
pole2 = new int [40];
boolean shoda = false; //shodnost prvku pole v posloupnosti
int prubezne; // prubezne kvuli poli
double vysledek;
int vysledek2; //pretypovani "vysledek" zpet na int
pole2[0] = kopie[g]; //nulty prvek vzdy vstupnim cislem
for (int i = 0; shoda != true; i++ ) {
pole = new int[i + 1];
if (i == 0) {
vysledek = Math.pow(kopie[g], 2);
if (vysledek >= 1000) {
vysledek = Math.floor(vysledek / 100);
}
else {
vysledek = Math.floor(vysledek / 10);
}
vysledek2 = (int) vysledek + 1;
pole2[i + 1] = vysledek2;
System.arraycopy(pole2, 0, pole, 0, 1 );
}
else {
prubezne = pole2[i];
vysledek = Math.pow(prubezne, 2);
if (vysledek >= 1000) {
vysledek = Math.floor(vysledek / 100);
}
else {
vysledek = Math.floor(vysledek / 10);
}
vysledek2 = (int) vysledek + 1;
}
if (i > 0) {
for (int index=0; index<pole2.length; index++){
if (vysledek2 == pole2[index]){ //overuje zdali prvek jiz v posloupnosti neni obsazen
shoda = true;
System.arraycopy(pole2, 0, pole, 0, i + 1);
break;
}
}
if (shoda == false) {
pole2[i + 1] = vysledek2;
System.arraycopy(pole2, 0, pole, 0, i + 1);
}
}
}
seradPosloupnost(pole);
}
return pole;
}
/**
* Metoda generuje posloupnosti podle zadaneho cisla z klavesnice.
* Udela z nej posloupnost podle zadaneho algoritmu a ulozi ji do pole.
* Overuje jestli ve vygenerovanem poli jiz neni stejna hodnota.
* Po nalezeni shodneho cisla metoda konci.
* @return pole posloupnosti
*/
public static int [] vygenerujPosloupnost() {
int a = 0;
int startovaci = 0; // startovaci hodnota
startovaci = scanner(a);
int [] pole = null;
int [] pole2 = new int [40];
int prubezne; // prubezne kvuli poli
double vysledek;
int vysledek2;
boolean shoda = false;
pole2[0] = startovaci; //nulty prvek pole vzdy startovaci hodnota
for (int i = 0; shoda != true; i++ ) {
pole = new int[i + 1];
if (i == 0) {
vysledek = Math.pow(startovaci, 2);
if (vysledek >= 1000) {
vysledek = Math.floor(vysledek / 100);
}
else {
vysledek = Math.floor(vysledek / 10);
}
vysledek2 = (int) vysledek + 1;
pole2[i + 1] = vysledek2;
System.arraycopy(pole2, 0, pole, 0, 1 );
}
else {
prubezne = pole2[i];
vysledek = Math.pow(prubezne, 2);
if (vysledek >= 1000) {
vysledek = Math.floor(vysledek / 100);
}
else {
vysledek = Math.floor(vysledek / 10);
}
vysledek2 = (int) vysledek + 1;
}
if (i > 0) {
for (int index=0; index<pole2.length; index++){ //overuje zdali prvek jiz v posloupnosti neni obsazen
if (vysledek2 == pole2[index]){
shoda = true;
System.arraycopy(pole2, 0, pole, 0, i + 1);
break;
}
}
if (shoda == false) {
pole2[i + 1] = vysledek2;
System.arraycopy(pole2, 0, pole, 0, i + 1);
}
}
}
return pole;
}
/**
* Pole posloupnosti tato metoda seradi pomoci algoritmu InsertSort.
* Pokud je zadavana hodnota z klavesnice, pak tyto pole zobrazi do console.
* Pokud jsou hodnoty cteny ze souboru, pak tyto pole zapise do souboru "vystup.txt".
* @param pole neserazene pole
* @return neserazene pole
* @throws IOException
*/
public static int[] seradPosloupnost(int []pole) throws IOException {
int[] neserazene = new int[pole.length];
System.arraycopy(pole, 0, neserazene, 0, pole.length);
boolean ptej = rozhodniSe(); //presmerovani vstupu
for (int i=0; i<pole.length; i++) { //seradi pole posloupnosti
int tmp = pole[i];
int j = i;
while((j>0) && (pole[j-1] > tmp)) {
pole[j]=pole[j-1];
j--;
}
pole[j]=tmp;
}
if(ptej == false) { //pokud ze souboru
try {
PrintWriter vystup = new PrintWriter(new FileWriter("vystup.txt", true));
vystup.println(pole.length + Arrays.toString(neserazene));
vystup.println(pole.length + Arrays.toString(pole));
vystup.println();
vystup.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
return neserazene;
}
/**
* Procedura vizualizace posloupnosti v pripade zadani hodnoty klavesnice.
* Vypsani poli do console
* @param pole serazene pole
* @param neserazene neserazene pole
* @param vyska vyska vykreslovaneho platna
*/
public static void grafPosloup(int [] pole, int [] neserazene, int vyska) {
System.out.println(pole.length + Arrays.toString(neserazene));
System.out.println(pole.length + Arrays.toString(pole));
int sirka = 0;
if(pole.length > 5) { //sirka platna
sirka = (pole.length- 1)*(24) + 4;
}
else {
sirka = 120; //kvuli minimalni siri platna 100px
}
DrawingTool dt = new DrawingTool(sirka, 420, Color.gray);
int temp = -23;
for(int i = 0; i < neserazene.length; i++) { //vykresleni neserazeneho pole
temp += 23;
for(int j = 0; j <= 20; j++) {
dt.line(temp + (j + 2),vyska,(temp) + (j + 2), vyska - 2* (neserazene[i]));
}
}
int temp2 = -23;
for(int i = 0; i < pole.length; i++) { //vykresleni serazeneho pole
temp2 += 23;
for(int j = 0; j <= 20; j++) {
dt.line(temp2 + (j + 2),200,(temp2) + (j + 2), 200 - 2* (pole[i]));
}
}
int nasobek = (vyska -20) / 20;
for (int i = 20; i > 0; i--) { //deleni osy Y carami
dt.setColor(Color.red);
if (i != 10) {
dt.line(0, nasobek * i, sirka, nasobek * i);
}
else if (i == 10) {
dt.setColor(Color.green);
dt.line(0, nasobek * i, sirka, nasobek * i);
dt.line(0, (nasobek * i) + 1, sirka, (nasobek * i) + 1);
}
if (i == 11) {
dt.setColor(Color.blue);
dt.line(0, nasobek * i, sirka, nasobek * i);
//dt.line(0, (nasobek * i) + 1, sirka, (nasobek * i) + 1);
}
}
}
/**
* Rozhoduje o presmerovani vstupu.
* Vola metody, proceduru.
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
if (args.length == 0) //pokud vstup z klavesnice
{
int[] pole = vygenerujPosloupnost();
int[] neserazene = seradPosloupnost(pole);
grafPosloup(pole, neserazene, vyska);
}
else if(args.length != 0){ //pokud zadan parametr
smazVystup();
int[] kopie = zapsaniDoPole();
vygenerujZeSouboru(kopie);
}
}
}