Zdravím,
včera jsem napsal program, který vytváří fraktálové řetězce. Program funguje, ale bylo třeba jedné drobné úpravy, která tak trochu narušila moje chápání běhu programů :D Mohli byste se podívat na tento kód (obě jeho verze) a potvrdit nebo vyvrátit to, jak jsem to pochopil ? Děkuju
public class fraktalytrida {
// promenne:
private String retezec1;
private String retezec2;
public int cykly;
public char znak1;
private char znak2 = '*';
private static int loop =0;
// konstruktor:
public fraktalytrida(int cykly, String retezec1) {
this.cykly= cykly;
this.retezec1 = retezec1;
znak1 = this.retezec1.charAt(0);
this.findchars();
}
//metody:
public void findchars() {
for (int j=1; j<retezec1.length();j++) {
if (retezec1.charAt(j) != znak1) {
znak2 = retezec1.charAt(j);
break;
}
} }
public void zobrazfraktaly() {
while (loop<cykly) {
for (int i=0; i<retezec1.length(); i++ ) {
if (retezec1.charAt(i) == znak1) {
retezec2 += "" +znak1 + znak2;
} else { retezec2 += "" +znak1;}
}
loop++;
System.out.println(retezec2);
retezec1 =retezec2;
retezec2="";
}
} }
Tohle je třída a tady je první, nefunkční verze programu, který ji využívá:
public class pouzititridyfraktalu {
public static void main (String [] args) {
int poccykl;
String pocatecnistring;
Scanner vstup = new Scanner(System.in);
System.out.print("urci pocet cyklu: ");
poccykl = vstup.nextInt();
System.out.println();
System.out.print("zadej pocatecni sekvenci: ");
pocatecnistring = vstup.nextLine();
fraktalytrida A = new fraktalytrida(poccykl, pocatecnistring);
A.zobrazfraktaly();
}
}
Tato verze vyhodi tuto chybu : Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
Zjistil jsem, že problém je v pořadí zadávání dat (poctu cyklu a pocatecni frekvence) a tak jsem to obrátil :
public class pouzititridyfraktalu {
public static void main (String [] args) {
int poccykl;
String pocatecnistring;
Scanner vstup = new Scanner(System.in);
System.out.print("zadej pocatecni sekvenci: ");
pocatecnistring = vstup.nextLine();
System.out.println();
System.out.print("urci pocet cyklu: ");
poccykl = vstup.nextInt();
fraktalytrida A = new fraktalytrida(poccykl, pocatecnistring);
A.zobrazfraktaly();
}
}
Tato verze už funguje, ale jak už jsem říkal, trochu mě zmátlo, že program pracoval právě takhle, respektive nebyl schopný pracovat bez sekvence na prvním místě. Když jsem problem vyřešil prohozením zadávání dat, napadlo mě, že program nejspíš hned při zadání počtu cyklů provede část kódu třídy, uloží mezivýsledky a pokračuje k příjímaní dalších dat, které pak dosadí k mezivýsledkům. Původně jsem si ale myslel, že program postupuje po řádcích, a tak s vyhne tomu, aby pracoval bez kompletních dat.
Podobný problem nastal, když jsem vyzkoušel upravit samotnou třídu a to takhle :
public class fraktalytrida {
// promenne:
private String retezec1;
private String retezec2;
public int cykly;
public char znak1 =retezec1.charAt(0); /* zde jsem určil hodnotu proměnné ještě před vytvořením instance (objektu) /**
private char znak2 = '*';
private static int loop =0;
// konstruktor:
public fraktalytrida(int cykly, String retezec1) {
this.cykly= cykly;
this.retezec1 = retezec1;
this.findchars();
}
//metody:
public void findchars() {
for (int j=1; j<retezec1.length();j++) {
if (retezec1.charAt(j) != znak1) {
znak2 = retezec1.charAt(j);
break;
}
} }
public void zobrazfraktaly() {
while (loop<cykly) {
for (int i=0; i<retezec1.length(); i++ ) {
if (retezec1.charAt(i) == znak1) {
retezec2 += "" +znak1 + znak2;
} else { retezec2 += "" +znak1;}
}
loop++;
System.out.println(retezec2);
retezec1 =retezec2;
retezec2="";
}
} }
Budu vděčný za jakékoliv připomínky a rady :)
PS: veselé vánoce :D