Mikkel Bundgaard <doesnt.work@spam.filter.invalid> wrote:
> On Mon, 17 Nov 2003 07:36:57 +0100, Per Rønne wrote:
>
> > Mikkel Bundgaard <doesnt.work@spam.filter.invalid> wrote:
> >
> >> On Sun, 16 Nov 2003 21:19:35 +0100, Per Rønne wrote:
> >>
> >> > Findes der en funktionalitet i Java, hvorved man kan få omformet en
> >> > streng s1 af længde l1 til en streng s2 af længden l2 > l1? På en sådan
> >> > måde at s1 bliver højrestillet i s2.
> <SNIP>
> > Tak for hjælpen, især da jeg ser du bruger funktionaliteter der ikke
> > omtales i den litteratur jeg er i besiddelse af.
> Det hele står i apien, som jeg altid kigger i, da jeg ikke roder så ofte
> med java mere (så er det svært at huske alle metoderne
).
>
> > Det fungerer nu som:
> >
> > public static String addSpaces (String arg, int num){
> > // if num < 0 then raise error
> > char[] res = new char[arg.length() + num];
> > System.arraycopy(arg.toCharArray(),0,res,num, arg.length());
> > java.util.Arrays.fill (res,0,num,' ');
> > return String.valueOf(res);
> > }
> > public static String round(double d, int i){
> > double t = Math.round(d);
> > String s1=""+t;
> > int j = (i>=s1.length())? i - s1.length(): s1.length();
> Er der ikke en fejl i ovenstående linje ????
> Hvis længden af s1 er større end i, så sætte du længden af s1 foran. Så
> vidt jeg forstod dit oprindelige spørgsmål skulle linjen være:
> int j = (i>=s1.length())? i - s1.length(): 0;
Du har ret.
> > String s2=addSpaces(s1,j);
> > return s2;
> > };
> Lige en lille side kommentar til String s1=""+t; som jeg ikke bryder mig
> så meget om
. Udover det ligner et hack, så generer den også ineffektiv
> bytekode, selvom det ikke betyder så meget, hvis funktionen kun kaldes et
> par gange.
Jeg bruger Java [med Eclipse] til at undervise htx-elever i faget
Programmering, der er på C-nivaeu. Jeg har ikke tidligere arbejdet med
Java, og har kun Rogers Cadenheads »Java 2 bogen« og en af mig
downloadet pdf-bog »Linux -friheden til at programmere i Java«. Eleverne
har også den pågældende Java-bog, ligesom pdf-bogen er fotokopieret til
dem. Ingen af dem synes at indeholde fulde beskrivelser af metoder til
standardklasserne, og String.valueOf nævnes i hvert fald ikke.
Funktionerne skal benyttes som på samme måde som det der kendes fra
Pascal ved udskrivning af integers og reals:
program att (input, output);
var i: integer; r: real;
begin
...
writeln(output,'i: ',i:7,' r: ', r:10:2);
...
end.
Jeg har også et gymnasiehold i datalogi, og her benyttes Delphi, og i
øvrigt de to bøger som kan ses omtalt på:
www.tolstrupdata.dk
- samt i øvrigt en gammel Pascal-bog fra Borgen Data:
»Pascal-programmering« af Beck, Monrad og Salomon. Alle beregnet for
gymnasieskolen. Pascal-udgaven er i øvrigt objektorienteret.
Det er mine erfaringer at selv om Pascal er forældet, så er det stadig
lettere for begyndere at lære. Samtidig viser al erfaring at det
sværeste at lære er det første sprog; derefter skal der grundlæggende
ikke så meget læres nye /begreber/, men derimod /hvordan man gør
dit-og-dat i det nye sprog/.
Derudover findes der gode skolebøger på dansk, beregnet på
gymnasienivaeuet, til Pascal/Delphi. Jeg har ikke kendskab til noget
tilsvarende for Javas vedkommende.
Jeg kan tilføje at hvad der volder problemer er det dynamiske i
tildelingssætninger (!) og løkker. Og prøv så lige at sammenligne
følgende sprog:
for (i=1;i<=10;i++){
...
}
med:
for i:= 1 to 10 do begin
...
end
> To eksempler:
>
> public static String test1(double d){
> String s1=""+d;
> return s1;
> };
>
> public static String test2(double d){
> String s1=String.valueOf(d);
> return s1;
> };
>
> Giver følgende bytekode:
> Method java.lang.String test1(double)
> 0 new #6 <Class java.lang.StringBuffer>
> 3 dup
> 4 invokespecial #7 <Method java.lang.StringBuffer()>
> 7 ldc #13 <String "">
> 9 invokevirtual #11 <Method java.lang.StringBuffer append(java.lang.String)
> 12 dload_0
> 13 invokevirtual #14 <Method java.lang.StringBuffer append(double)>
> 16 invokevirtual #12 <Method java.lang.String toString()>
> 19 astore_2
> 20 aload_2
> 21 areturn
>
> Method java.lang.String test2(double)
> 0 dload_0
> 1 invokestatic #15 <Method java.lang.String valueOf(double)>
> 4 astore_2
> 5 aload_2
> 6 areturn
>
> Som det måske kan læses af bytekoden, så opretter test1 et StringBuffer
> objekt, som den appender "" til, hvorefter den appender d til resultatet,
> for til sidst at kalde toString på StringBufferen.
Og nu ser de to rutiner altså således ud:
public class StringKlasse {
private static String addSpaces (String arg, int num){
// if num < 0 then raise error
char[] res = new char[arg.length() + num];
System.arraycopy(arg.toCharArray(),0,res,num, arg.length());
java.util.Arrays.fill (res,0,num,' ');
return String.valueOf(res);
}
public static String round(double d, int i){
String s1= String.valueOf(Math.round(d));
int j = (i>=s1.length())? i - s1.length(): 0;
return addSpaces(s1,j);
};
}
--
Per Erik Rønne