Kwadraat in een for loop (Java)

Pagina: 1
Acties:
  • 5.680 views

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ample Energy
  • Registratie: Oktober 2007
  • Laatst online: 14-10 11:31
Hallo,

Ik ben bezig met mijn huiswerk (eerstejaars ICT) en ik heb een kleine opdracht gekregen. Ik ben er alleen al even mee bezig en ben zelfs al 3 x overnieuw begonnen. Niet dat dat een prestatie is met zo'n simpele opdracht, maar ik kom er gewoon niet uit..

Mijn opdracht is als volgt:
code:
1
2
3
4
5
6
7
Schrijf een programmaatje dat de volgende tabel weergeeft:
a    b   pow(a, b)
1    2   1
2    3   8
3    4   81
4    5   1024
5    6   15625


Ik denk persoonlijk dat dit met een for-loop moet, omdat ik daarmee een rijtje cijfers kan maken.

code:
1
2
3
4
5
6
7
8
9
10
11
12
public class Prac1 {

    public static void main(String[] args) {
int a, b;
for(a = 1; a < 6; a = a+1)
    System.out.print("a = " +a);
for(b = 2; b < 7; b = b+1)
    System.out.println("b = " +b);
for(a = a; a < 6; a = Math.pow(a, b))
    System.out.println(a);
    }
}


Zoals je ziet wilde ik eerst het rijtje voor a maken, daarna voor b en daarna de machtsverheffing.

Netbeans geeft dit als resultaat als ik dat programmaatje laat lopen:
code:
1
2
3
4
5
a = 1a = 2a = 3a = 4a = 5b = 2
b = 3
b = 4
b = 5
b = 6


Daar snap ik sowieso al niks van. M'n eerste 2 loops zijn precies hetzelfde, maar toch is het uiteindelijke resultaat compleet anders. Waarom zet hij a niet onder elkaar, maar b wel?

De laatste loop doet-ie gewoon niet. Ik kan er bij inkomen dat hij er niet veel van snapt, omdat ik in plaats van variabele a meteen een hele rij uitkomsten 1 voor 1 wil laten lopen, maar hoe zou ik dit dan anders moeten doen?

Overige info: Ik gebruik dus Netbeans. Bij de laatste loop zegt hij dat hij een double vind, maar het is een int. Hij is waarschijnlijk op dat idee gekomen doordat ik het eerst met doubles deed. Ook zegt hij op die regel dat ik een variabele aan zichzelf heb toegewezen. Dat klopt, maar leek mij voor de berekening niet uitmaken en ik moest iets invullen, toch?

Zou iemand mij een duwtje in de juiste richting kunnen geven? (en niet alleen dit bericht naar het Slechtste programmeervoorbeelden-topic kopiëren :+ )

Alvast bedankt!
Simon

Luister naar je onderbewustzijn. Er is een reden dat je niet wilt weten hoe je voedsel wordt geproduceerd.


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Probeer het eens met een enkele loop, waarbij telkens een hele regel van je tabel wordt weergegeven.

Acties:
  • 0 Henk 'm!

  • asfaloth_arwen
  • Registratie: Februari 2005
  • Laatst online: 14-10 14:29
code:
1
System.out.print != System.out.println

Specs


Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 01:05

The Eagle

I wear my sunglasses at night

GoT is niet bestemd voor huiswerkvragen he ;)

Ben geen (java) programmeur, maar er staat me iets bij dat java en C onderscheid maken tussen de = en de == operator. Wellicht dat je daar iets mee kunt.
Verder: waarom 3 loops, en niet 1 loop met een printline waarbij je alledrie de waarden print?
In pseudocode zou ik het ongeveer oplossen als:
code:
1
2
3
4
5
6
7
a=1
print "header_row"
for a = 1 to 6
  b = a+1
  c= a^b
  print a |' '| b |' '| c
end for;


Kortom, niet te moeilijk denken :)

[ Voor 4% gewijzigd door The Eagle op 21-11-2011 21:08 ]

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

  • Ozzie
  • Registratie: Februari 2004
  • Laatst online: 23:08
In je eerste for loop gebruik je System.out.print ipv println. Dan print die t steeds op dezelfde regel ipv de volgende.

Math.pow verwacht 2 doubles als waarde en niet twee int's daarom zeurt die daarover.

En je laatste for loop klopt ook niet.

Edit:
Sowieso maak je het idd een stuk eenvoudiger door één loop te gebruiken.

[ Voor 14% gewijzigd door Ozzie op 21-11-2011 21:10 ]

"Write code as if the next maintainer is a vicious psychopath who knows where you live."


Acties:
  • 0 Henk 'm!

  • Ample Energy
  • Registratie: Oktober 2007
  • Laatst online: 14-10 11:31
asfaloth_arwen schreef op maandag 21 november 2011 @ 21:06:
code:
1
System.out.print != System.out.println
Oh, wat stom van me. Dat ik dat niet heb gezien.
The Eagle schreef op maandag 21 november 2011 @ 21:07:
GoT is niet bestemd voor huiswerkvragen he ;)

Ben geen (java) programmeur, maar er staat me iets bij dat java en C onderscheid maken tussen de = en de == operator. Wellicht dat je daar iets mee kunt.
Verder: waarom 3 loops, en niet 1 loop met een printline waarbij je alledrie de waarden print?
In pseudocode zou ik het ongeveer oplossen als:
code:
1
2
3
4
5
6
7
a=1
print "header_row"
for a = 1 to 6
  b = a+1
  c= a^b
  print a |' '| b |' '| c
end for;


Kortom, niet te moeilijk denken :)
Het sticky zegt wat anders en naar mijn mening voldoe ik aan de eisen.

Reden dat ik 3 loops heb is dat ik niet wist dat het in 1 kon. Ik moet dus nu eerst even proberen hoe dat gaat. Voorlopig heb ik alleen nog exceptions gehad (uncompilable source code).

Verder zou ik graag niet moeilijk denken, maar ik word alweer panisch als ik je voorbeeld zie.. :) Ik moet eigenlijk elk onderdeel daarvan nog opzoeken, want behalve je eerste regel heb ik dat allemaal nog nooit gezien.


Bedankt voor de reacties. Eerst maar eens zoeken hoe ik er 1 loop van maak.

Luister naar je onderbewustzijn. Er is een reden dat je niet wilt weten hoe je voedsel wordt geproduceerd.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
spoiler:
Laat ik je huiswerk even voor je maken. Iets als dit?
System.out.print("a b pow(a, b)\n1 2 1\n2 3 8\n3 4 81\n4 5 1024\n5 6 15625");
/flauw
Siempie schreef op maandag 21 november 2011 @ 20:56:
Netbeans geeft dit als resultaat als ik dat programmaatje laat lopen:
Hoe kan Netbeans output geven als je een programma hebt dat niet compileert?! :? Het resultaat van Math.pow is een double, en in java is er een cast nodig om daar een int van te maken, anders dan compileert het normaal gesproken niet... In Eclipse kan ik dit dan ook niet reproduceren, ik vraag me af wat er in Netbeans anders is.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Ample Energy
  • Registratie: Oktober 2007
  • Laatst online: 14-10 11:31
pedorus schreef op maandag 21 november 2011 @ 21:25:
spoiler:
Laat ik je huiswerk even voor je maken. Iets als dit?
System.out.print("a b pow(a, b)\n1 2 1\n2 3 8\n3 4 81\n4 5 1024\n5 6 15625");
/flauw



[...]

Hoe kan Netbeans output geven als je een programma hebt dat niet compileert?! :? Het resultaat van Math.pow is een double, en in java is er een cast nodig om daar een int van te maken, anders dan compileert het normaal gesproken niet... In Eclipse kan ik dit dan ook niet reproduceren, ik vraag me af wat er in Netbeans anders is.
Haha, dat is nu ook weer niet de bedoeling.

Hij compileerde m'n poging in de TS wel, maar hij compileert m'n pogingen om van 2 loops 1 loop te maken niet. Ik denk toch dat het voor mij handiger is om meerdere loops te maken, want ik raak het overzicht weer kwijt en ben voor m'n gevoel op het verkeerde aan het focussen.

Zo heb ik nu dit:
for(a = 1; a < 6; a = a+1; b = 2; b < 7; b = b+1)

Maar de int is naar double aangepast. Ik dacht dat Netbeans met 'found double, int required' bedoelde dat hij een double in mijn code had gevonden en dat hij in een int nodig had.

Luister naar je onderbewustzijn. Er is een reden dat je niet wilt weten hoe je voedsel wordt geproduceerd.


Acties:
  • 0 Henk 'm!

  • Ozzie
  • Registratie: Februari 2004
  • Laatst online: 23:08
Je moet proberen alle andere getallen in de opdracht te berekenen aan de hand van getal a.

De waarde van b is altijd a + 1, de waarde van c is altijd a ^ b (Math.pow(a,b)). Die kan je dus allemaal berekenen met de waarde van a die er onstaat uit je eerste for-lus.

Je kan geen for-lus maken zoals jij die wil waarin je meerdere parameters gebruikt.

edit:
Als het een schoolopdracht is heb je neem ik aan wel een boek? Daarin staat vast duidelijk uitgelegd hoe je goed gebruik kunt maken van for lussen.

Let er ook op dat als je binnen een for-lus meerdere acties wil doen je de code dan tussen { } moet zetten

Java:
1
2
3
4
5
6
for (int i = 0; i < 1-; i++) 
{
hier kan je;
meerdere regels;
code kwijt;
}

[ Voor 34% gewijzigd door Ozzie op 21-11-2011 21:40 ]

"Write code as if the next maintainer is a vicious psychopath who knows where you live."


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 23:47
Niet getest, ik weet dus niet of het werkt, maar de gedachte er achter is zover ik weet goed:

Java:
1
2
3
for (int i = 1; i <= 5; i++) {
    System.out.println(i + " " + (i + 1) + " " + Math.Pow(i, 2));
}


In plaats van een O(n^3) heb je nu O(n).

Tijdje geleden dat ik met Java heb gewerkt, ik weet dus niet zeker of je int zomaar in de console kunt poepen zonder ze naar een string te casten, maar dat kun je vast zelf uitvogelen :)

[ Voor 27% gewijzigd door Avalaxy op 21-11-2011 21:39 ]


Acties:
  • 0 Henk 'm!

  • BastiaanCM
  • Registratie: Juni 2008
  • Laatst online: 21:00
HVA studentje ! :P

Je hebt maar 1 for loop nodig hoor. De andere waardes en formules kun je gewoon in die for loop zetten, laat je programma lopen op de eerste kolom.

& Wat betreft je "double" probleem dat klopt wel. pow werkt geloof ik standaard, (of output) double waarden. Dit kun je veranderen door voor math.pow (int) te zetten.

[ Voor 33% gewijzigd door BastiaanCM op 21-11-2011 21:42 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Avalaxy schreef op maandag 21 november 2011 @ 21:38:
In plaats van een O(n^3) heb je nu O(n).
Code voorlepelen wordt niet gewaardeerd, en drie for-loops na elkaar is nog steeds O(n).

Acties:
  • 0 Henk 'm!

  • BastiaanCM
  • Registratie: Juni 2008
  • Laatst online: 21:00
Echt he, dan "help" je de persoon echt niet.

Iets met vis geven vs leren vissen.

Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 23:47
GlowMouse schreef op maandag 21 november 2011 @ 21:43:
[...]

Code voorlepelen wordt niet gewaardeerd, en drie for-loops na elkaar is nog steeds O(n).
Ah je hebt gelijk, ik dacht dat TS alles genest had.

Iets met de openingspost niet goed gelezen hebben...

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Siempie schreef op maandag 21 november 2011 @ 21:33:
Hij compileerde m'n poging in de TS wel, maar hij compileert m'n pogingen om van 2 loops 1 loop te maken niet.
Mijn vermoeden is eigenlijk dat je een foutmelding hebt genegeerd, en daarna een oude versie van het programma hebt gedraaid. In ieder geval is het over het algemeen toch niet handig om foutmeldingen te negeren. :p

Ik zou voor de rest het advies van GlowMouse toch ter harte nemen, en dat stukje over meerdere dingen in een for-loop zetten.
GlowMouse schreef op maandag 21 november 2011 @ 21:43:
drie for-loops na elkaar is nog steeds O(n).
Vraag is natuurlijk of Math.pow(a,b) eigenlijk O(1) is. ;) Het schijnt trouwens dat deze pow efficiënter is (algoritme), maar ik heb nu even geen zin om het te testen:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public static int pow(int a, int b)
    {
        int result = 1;

        while (b > 0)
        {
            if (b % 2 == 1)
                result *= a;
            b >>= 1;
            a *= a;
        }

        return result;
    }

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Ample Energy
  • Registratie: Oktober 2007
  • Laatst online: 14-10 11:31
Ozzie schreef op maandag 21 november 2011 @ 21:38:
Je moet proberen alle andere getallen in de opdracht te berekenen aan de hand van getal a.

De waarde van b is altijd a + 1, de waarde van c is altijd a ^ b (Math.pow(a,b)). Die kan je dus allemaal berekenen met de waarde van a die er onstaat uit je eerste for-lus.

Je kan geen for-lus maken zoals jij die wil waarin je meerdere parameters gebruikt.

edit:
Als het een schoolopdracht is heb je neem ik aan wel een boek? Daarin staat vast duidelijk uitgelegd hoe je goed gebruik kunt maken van for lussen.

Let er ook op dat als je binnen een for-lus meerdere acties wil doen je de code dan tussen { } moet zetten

Java:
1
2
3
4
5
6
for (int i = 0; i < 1-; i++) 
{
hier kan je;
meerdere regels;
code kwijt;
}
Dat is ook stom van me. b = a+1 is natuurlijk hetzelfde als een hele for-loop voor b. En bedankt voor de { } tip, ik vroeg me al af waarom die in Avalaxy's voorbeeld stond.

En het boek moet uit Engeland komen. Was niet meer te krijgen in de normale studieboekenwinkel en Amazon scheelde bijna 40 euro met Bol.com. Als ze die boeken nou eens normaal prijsden had ik 'm al lang gehad. Heb wel een PDF van een oude druk.
Avalaxy schreef op maandag 21 november 2011 @ 21:38:
Niet getest, ik weet dus niet of het werkt, maar de gedachte er achter is zover ik weet goed:

Java:
1
2
3
for (int i = 1; i <= 5; i++) {
    System.out.println(i + " " + (i + 1) + " " + Math.Pow(i, 2));
}


In plaats van een O(n^3) heb je nu O(n).

Tijdje geleden dat ik met Java heb gewerkt, ik weet dus niet zeker of je int zomaar in de console kunt poepen zonder ze naar een string te casten, maar dat kun je vast zelf uitvogelen :)
Ja, een int declaren in een for-loop kan, dat had ik eerst al geprobeerd. Ik was alleen bezig met veel verschillende for-loops die ik af en toe wilde weghalen d.m.v. //, dus ik heb ze bovenaan de code declared.

De gedachte er achter is zeer goed! Alleen moest i + 1 een aparte variabele worden, b = a+1 in mijn code, omdat die nog nodig was voor de machtsverheffing. Die moest a, b zijn, in plaats van altijd een kwadraat.

Je hebt me mooi uit de penarie geholpen. Zat alweer uren depressief achter m'n pc en nu is die last gelukkig weg.

@ Bastiaan: HvA inderdaad. Jij ook? :)


Ik heb dit er van gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
public class Prac1 {

    public static void main(String[] args) {
        System.out.println("a b pow(a, b");
int a, b;
for (a = 1; a < 6; a++) {
    b = a+1;
    System.out.println(a + " " + (b) + " " + Math.pow(a, b));
    }
}
}


Resultaat:
code:
1
2
3
4
5
6
a b pow(a, b
1 2 1.0
2 3 8.0
3 4 81.0
4 5 1024.0
5 6 15625.0


Nu het gelukt is word Java leuk en nu ben ik ineens geïnteresseerd in de volgende opdracht. Moet ik dan wel veel eerder beginnen :+


Edit:
@ Pedores:
Inderdaad, maar aan 'missing ;' of iets dergelijks had ik niks, want die stond er gewoon.
En dingen combineren moest inderdaad! Dat was het belangrijkste, alleen zat ik in een compleet verkeerde hoek.
Ik ga morgen even naar die While loop met % en custom public static kijken. Bedankt.

[ Voor 5% gewijzigd door Ample Energy op 21-11-2011 22:22 ]

Luister naar je onderbewustzijn. Er is een reden dat je niet wilt weten hoe je voedsel wordt geproduceerd.


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Ik zie toch nog wel een verschil met de verwachte uitkomst van de opdracht. In een eerdere post is als aangegeven wat de reden daarvoor is.

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Ample Energy
  • Registratie: Oktober 2007
  • Laatst online: 14-10 11:31
Herko_ter_Horst schreef op maandag 21 november 2011 @ 22:22:
Ik zie toch nog wel een verschil met de verwachte uitkomst van de opdracht. In een eerdere post is als aangegeven wat de reden daarvoor is.
Je bent geweldig :P
(int) voor Math.pow gezet.

Luister naar je onderbewustzijn. Er is een reden dat je niet wilt weten hoe je voedsel wordt geproduceerd.


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 23:47
Puur didactisch: Double heeft ook een method 'intValue' die de integer representatie van je double returnt, gewoon een andere manier van dingen casten.

Tevens is het conventie in een for-loop 'i' te gebruiken als index (en kun je die gewoon in je loop zelf definiëren, dat hoeft niet voor je loop te zijn).

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:12

Creepy

Tactical Espionage Splatterer

Hmja, goed. Een schoolopdracht met (sorry hoor) niet al te veel inzet en de oplossing wordt ook nog in je schoot geworpen. Ik hoop dat je even nadenkt over de voorgekauwde oplossing en er iets van hebt opgestoken. Met een beetje debugging (zet even een breakpoint in je code en loop er stap voor stap doorheen) had je eigen vragen vrij simpel zelf kunnen oplossen.

Een schoolopdracht is niet erg, maar dan zul je meer dan bij andere topics moeten laten zien dat je er wel degelijk *echt* zelf mee bezig bent geweest en dat is iets meer dan de code posten die je hebt en aangeven dat je wil. Je wordt namelijk geacht dit zelf te kunnen maken.

[ Voor 4% gewijzigd door Creepy op 21-11-2011 22:43 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.