Thread: Tabel maken in Java console
-
03-07-2012, 23:10 #1
Tabel maken in Java console
Ik moet voor een project een tabel maken met gegevens, maar ik zou niet weten hoe er aan te beginnen. Ik heb gegoogled en ben op dit uitgekomen. Maar ik wil een tabel waar alles mooi verdeeld is. Dit is hoe hij er moet uitzien: voorbeeld. En als het met System.out.printf moet, zoals op die site, kan er dan soms iemand de parameters uitleggen?
Alvast bedankt.no votes
-
-
04-07-2012, 00:42 #2
Met printf is dit inderdaad misschien iets eenvoudiger. De printf van java werkt hetzelfde als die van C en kan je hier vinden:
Complete Printf for Java Format String Specification
een iets eenvoudiger overzicht van de c versie vindt je hier: printf - C++ Reference
Er zullen wel kleine verschillen tussen de 2 zijn maar de basis is wel hetzelfde daarom is het misschien eenvoudiger op de tweede te beginnen.no votes
-
04-07-2012, 21:39 #3
Ik heb geprobeerd, maar nu moet ik altijd de lengte instellen van de parameters van printf als mijn getal korter wordt in lengte...
In de eerste kolom is dit geen probleem omdat mijn getallen maar tot 60 moeten gaan en dus een maximum lengte van 2 digits hebben, maar in de 2e kolom geeft dit een probleem omdat het start getal varieert naargelang de input van de gebruiker.Code:+--------+------------+------------+------------+------------+ | MAAND | SALDO | KAPAFLOSS | INTREST | AFLOSSING | +--------+------------+------------+------------+------------+ | 0 | 10000.00 | | | | | 1 | 9833.33 | | | | | 2 | 9666.67 | | | | | 3 | 9500.00 | | | | ..... | 54 | 1000.00 | | | | | 55 | 833.33 | | | | | 56 | 666.67 | | | | | 57 | 500.00 | | | | | 58 | 333.33 | | | | | 59 | 166.67 | | | | | 60 | 0.00 | | | |
Dus bij deze zoek ik nog altijd een oplossing.no votes
-
04-07-2012, 21:44 #4Approved 9liver
- Registered
- 23/10/03
- Location
- Oostende
- Posts
- 2,782
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
Je kunt normaal zowel links als rechts uitlijnen. Toon es wat je al hebt van code.
Notch: But let’s get one thing clear: people who think “free to play” is a great future are mostly game developers, not game players.no votes
-
04-07-2012, 22:16 #5
Dit is de code die bovenstaande tabel genereert:
Zoals je op het einde kan zien, moest ik de getallen onder 10 en boven 9 opnieuw ordenen zodat zo mooi in het midden staan.Code:public void aflVastKap(){ for (int i = 1; i <= compleetT1.length; i++){ if (i == 1 | i == 10 | i == 23 | i == 36 | i == 49){ System.out.print("+"); } else if (i == 62){ System.out.print("+"); System.out.println(); System.out.printf("%8s %8s %8s %8s %8s\n", "| MAAND |", " SALDO ", "| KAPAFLOSS |", " INTREST ", "| AFLOSSING |"); } else{ System.out.print("-"); } } for (int j = 1; j <= compleetT1.length; j++){ if (j == 1 | j == 10 | j == 23 | j == 36 | j == 49 | j == 62){ System.out.print("+"); } else{ System.out.print("-"); } } System.out.println(); for (int x = 0; x < compleetT1.length; x++){ if (x > 10){ System.out.printf("%6s %8s %2s %8s %8s\n", "| " + x + " |", " " + frmt2.format(compleetT1[x]) + " ", "| " + " |", " " + " ", "| " + " |"); } else if (x < 10){ System.out.printf("%6s %8s %2s %8s %8s\n", "| " + x + " |", " " + frmt2.format(compleetT1[x]) + " ", "| " + " |", " " + " ", "| " + " |"); } } }
compleetT1[] is de array waarin de "saldo" bedragen in opgeslaan staan.no votes
-
05-07-2012, 04:50 #6
Waarom maak je de tabelheaders "statisch" ?
Kun je niet beter ze in een string variabele steken, een functie maken a la "int getMaxLengteArray(const float[](of w/e type) & compleetT1, const string & header)" en een functie van "getLengteArrayItem(const float & kapitaal)". De string header heb je nodig voor in het geval je header dus groter is in lengte dan de gegevens in je array, zodat de headers goed blijven. & staat voor reference variable in C++, dus ik denk dat dit gewoon 'ref' is in java?
Dan kun je bijvoorbeeld met de uitlijning manueel spelen door bvb eerst de maximale lengte op te vragen en aangezien je de uitlijning rechts hebt in de voorbeeld, hoef je maar spaties toe te voegen met een loop.
Iets op het gedacht van:
Eerst de maximale lengte uit je array halen, die dan gebruiken om je headers dynamischer te maken. Bij de uitlijning van je headers kun je dan maximum lengte \ 2 (A) doen, je string ook \ 2 (B) en dan kun je eerst een loop doen van spaties tot (A-B) om dan je string te outputten.
Daarna weer een loop om de resterende spaties er te krijgen. Dan kun je ook gemakkelijker de plusjes en de verticale bars er aan toe voegen in plaats van ze statisch te plaatsen.
Dan kun je de "content" van de tabel ook gemakkelijker invullen. Door je "algemene functies" kun je de functies voor elke rij & kolom van de tabel gebruiken en die zo dynamisch aanpakken.
Geen idee of je hier iets mee bent, aangezien ik waarschijnlijk je oefening redelijk wat ingewikkelder heb gemaakt
Trouwens, let ook op in je voorbeeld: je gebruikt de bit operator |, in wat ik zie wil je || (logische OF). Wat je nog gemakkelijker kunt doen is dus het in een switch steken en die laat trapvallen
--> indien value 4 zou zijn, krijg je "4 [enter] Geen van bovenstaande waarden" in de string, omdat je het laat doorvallen.Code:string test = ""; switch(int value) { case 1: test += "1\n"; case 10: test += "10\n"; break; case 2: test += "2\n"; break; case 22: case 23: test += "Te lui om 22 of 23 apart te schrijven"; break; case 4: test += "4\n"; default: test += "Geen van bovenstaande waarden"; break; }
--> indien value 2, krijg je "2" in de string
--> indien value 1, krijg je "1 [enter] 10" in de string
--> indien value 10, krijg je "10" in de string
--> indien value 255, krijg je "Geen van bovenstaande waarden" in de string
--> indien value 23 (of 22), krijg je "Te lui om 22 of 23 apart te schrijven" in de stringLast edited by Raanº³; 05-07-2012 at 05:09.
[ Momenteel geen signature ]no votes
-
05-07-2012, 10:39 #7
De tabelheaders zijn statisch omdat die nooit hoeven te veranderen. Er blijft altijd MAAND, SALDO, KAPAFLOSS, etc... in staan. Die veranderen nooit van lengte. Kzal straks je post eens deftig lezen, want moet nu gaan werken.
EDIT:
Ik snap wat je bedoelt, maar ik denk dat het nogal moeilijk gaat zijn om dit toe te passen
Ik moet ook volgens de richtlijnen van het project, max 15 - 20 regels / methode hebben en ik zit nu al aan exact 20 voor juist de header en de 5 kolommen...en dan moet ik nog een footer ook maken, dus er moet een simpelere manier zijn.Last edited by cosmo2; 05-07-2012 at 20:24.
no votes
-
05-07-2012, 20:44 #8
Dit los je vrij simpel op door functie(s) in functie(s) te steken.
Code is in C++ geschreven, zou niet lang mogen duren voordat je deze logica in Java kunt omzetten; cout is equivalent van System.out.print
Output zal dan zijn:Code:string printBorder() { return "+-----+\n"; } string printHeaderNames() { return "| ID |\n"; } string printHeader() { string header = ""; header += printBorder(); header += printHeaderNames(); header += printBorder(); return header; } int main() { string header = printHeader(); cout << header; return 0; }
Natuurlijk zou in dit simpel voorbeeld het redelijk overbodig zijn om het zo aan te pakken, aangezien je maar 1 regel code in je functies hebt, maar eens je meerdere regels code hebt, is het (o.a.) veel overzichtelijker om het zo te doen. De logica van max. 20 regels per functie is eigelijk om bugs te vermijden en "logisch" gezien zou een functie maar 1 ding mogen uitvoeren. Daarom dien je functies in functies op te roepen.Code:+-----+ | ID | +-----+
In dit voorbeeld doet printHeader() een logische actie, namelijk je header outputten. Om een Header te outputten, moet je een border outputten en de Header zelf. printBorder() zou je in principe nog eens kunnen onderverdelen in printBorderBoundaries (welke je 2x oproept, in het begin & eind, en een '+' retourneert, en dan printBorderSpace(int <A>, char <B>) voor de (lengte -2)<A> van je kolombreedte en je token zelf<b> en dit zou je nog eens kunnen een functie kunnen gebruiken voor printBorderSpaceToken(char <B>) welke je 'token B' retourneert. ) headerNames zou je in principe ook met een parameter moeten werken (string[] oid) waarbij je dan een foreach doet etc etc...
Geen idee of dit een werkproject is of uit jezelf maar let vooral op bij magische constanten (dit zijn constanten die je 'hardcoded' erin steekt zoals bvb je i==10 op regel 3 van je voorbeeld -- er is geen 'logische' verklaring waarom i 10 moet zijn om een plusje te schrijven). Ideaal gezien gebruik je geen 'magie' in je applicatie, maar onderbouw je alles door middel van logica ;-)
Misschien kun je ook eens kijken om Object Georienteerd te werken ipv procedural. En bekijk ook eens dan informatie over Multi-Layered applicaties, de output is dus de laatste laag (Presentation layer logic); Anders kun je het best proberen met namespaces om het toch nog iets wat logisch in te kunnen delen. Zo zou je principeel gezien een namespace Border hebben, en daarin dan je functies om je Border te 'formatten' e.d.Last edited by Raanº³; 05-07-2012 at 21:32.
[ Momenteel geen signature ]no votes
-
05-07-2012, 22:00 #9
Helaas is dit inderdaad een schoolproject en kunnen er dus geen uitzonderingen gemaakt worden én mag het niet in OO gedaan worden, dat is mijn 2e project. Maar beginnen bij begin hé. Wat ik versta uit je code is eigenlijk hetzelfde als dit:
Maar dan de 3 lijnen in een verschillende methode?Code:System.out.println("+--------+------------+------------+------------+------------+"); System.out.println("| MAAND | SALDO | KAPAFLOSS | INTREST | AFLOSSING |"); System.out.println("+--------+------------+------------+------------+------------+");
Dit zou dan hetzelfde zijn als:
Dit is misschien een goede methode voor de header, maar niet echt voor de gegevens. Misschien heb je het wel uitgelegd hoe het dan moet met gegevens, maar zal erover gelezen hebbenCode:]System.out.println("+--------+------------+------------+------------+------------+\n"| MAAND | SALDO | KAPAFLOSS | INTREST | AFLOSSING |\n+--------+------------+------------+------------+------------+");
no votes
-
05-07-2012, 23:31 #10Member
- Registered
- 25/07/02
- Location
- Brussel
- Posts
- 1,001
- iTrader
- 5 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 2/2
Is het verplicht om met Java te werken?
no votes
-
05-07-2012, 23:43 #11
Je hebt er inderdaad overgelezen. Normaal gezien zou je met je eigen kennis en met mijn voorgaande 2 posts deze oefening perfect moeten kunnen maken.
Je hebt hoogst waarschijnlijk wel al geleerd hoe gegevens - algemeen gezien - dienen verwerkt te worden: invoer, verwerking en uitvoer.
Invoer staat voor alles wat de gebruiker dient in te putten; in dit geval zal dit het beginsaldo (in EUR), intrestvoet en of maandelijkse kapitaalaflossing (in EUR) of termijn (in maanden) zijn.
Verwerking (Business Logic Layer) staat voor de berekening van de maandelijkse intrest, totale aflossing, en afhankelijk van de applicatie de kapitaalaflossing.
Ideaal gezien werk je met een 2 dimensionale array: resultaat[t][n], waarvoor [t] staat voor de rij, en [n] staat voor de kolom. Wil je de aflossing weten voor de 10de maand (bijvoorbeeld), dan zou je in dit geval resultaat[10][3] kunnen opvragen. Indexen beginnen vanaf 0, dus [3] = 4de kolom. Een maand hoef je niet in de array op te slaan, aangezien deze in dit geval gelijk is aan je index.
Voor de rij index kun je ofwel [0] = 1° maand gebruiken of je gebruikt de [1] index om de eerste maand weer te geven. Dan zou je eventueel de [0] (ongebruikte) index kunnen gebruiken om essentiele gegevens van je array bij te houden (zoals bijvoorbeeld de maximum lengte van de waarden uit die kolom).
Dan kun je met een loop alle gegevens in je array invullen.
Uitvoer (Presentation Logic Layer) staat in dit geval voor het tonen van je (ingevulde) tabel. Tegen dat je hier bent, heb je alle gegevens zowiezo al verwerkt.
Dit projectje is niet zo moeilijk, maar leert je wel om orderlijk & gestructureerd te werken. Alsook kan je mogelijk tegen problemen/limitaties stuiken die later deftiger zullen behandeld worden.
Let ook op dat je geen copy/paste manieren toepast.
Als je bijvoorbeeld volgende code tegenkomt:
kun je beter eens kijken of je dit niet slimmer kunt oplossen ipv steeds dezelfde parameter mee te moeten geven. Een oplossing zou zijn om bijvoorbeeld een functie te maken die je saldo als parameter meekrijgt en die een array met de berekende waarden retourneert.PHP Code:for (int i = 0; i < resultaat.length; i++)
{
for (int j = 0; j < resultaat[0].length; j++)
{
if (j == 1)
resultaat[i][j] = berekenKapitaalAflossing(resultaat[i][0]);
if (j == 2)
resultaat[i][j] = berekenIntrest(resultaat[i][0]);
if (j == 3)
resultaat[i][j] = berekenAflossing(resultaat[i][0]);
}
}
etc etcPHP Code:float[] bereken(float Saldo)
{
float[] resultaat = new float[3];
resultaat[0] = berekenKapitaalAflossing(Saldo);
resultaat[1] = berekenIntrest(Saldo);
resultaat[2] = berekenAflossing(Saldo);
return resultaat;
}
for (int i = 0; i < resultaat.length; i++)
{
float[] resultRij = bereken(resultaat[i][0]);
// KapAflossing
compleetT1[i][1] = resultRij[0];
// Intrest
compleetT1[i][2] = resultRij[1]
// Aflossing
compleetT1[i][3] = resultRij[2];
}
}
@blackrabbit: In weze maakt het niet echt uit in welke taal het geschreven dient te worden. De logica blijft steeds dezelfde, gelijk in welke programmeertaal je ook wenst te programmeren. Heb je de logica/ gebruik van arrays/... niet door, dan zul je zelfs in een simpele taal als VB.NET sukkelen.Last edited by Raanº³; 05-07-2012 at 23:53.
[ Momenteel geen signature ]no votes
-
06-07-2012, 01:33 #12Member
- Registered
- 25/07/02
- Location
- Brussel
- Posts
- 1,001
- iTrader
- 5 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 2/2
no votes
-
09-07-2012, 15:25 #13
Bedankt Raan voor je gigantische hulp.
Heb het eindelijk voor mekaar gekregen en tziet der prachtig uit
Voor moest iemand er naar zoeken en in deze thread komen.
Hier is wat ik gedaan heb:
En dan gewoon in je tabelCode:public String uitlijning (String getal){ switch(getal.length()){ case 9: return getal + " "; case 8: return getal + " "; case 7: return getal + " "; case 6: return getal + " "; case 5: return getal + " "; case 4: return getal + " "; case 3: return getal + " "; case 2: return getal + " "; case 1: return getal + " "; } return getal; }
zetten en voilaCode:uitlijning(String)
Last edited by cosmo2; 09-07-2012 at 20:13.
no votes

