Archief - [JAVA] Programmaatje simplifieren.

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Phil

Legacy Member
Hallo,

Ik ben onlangs begonnen met te leren programmeren en meer bepaald te leren programmeren in Java.

In mijn vrije tijd pruts ik nogal veel rond met Java en probeer ik van alle kleine nutteloze programmaatjes te schrijven.

Iets waar ik me vandaag met heb bezig gehouden is om een klein "scriptje" te schrijven waarmee ik kan zeggen welke dag en datum het is als ik de dag van het jaar invul. bvb vandaag, de 55ste dag van het jaar geeft me: "Today is Wednesday the 24th of February."

Compleet nutteloos natuurlijk, maar wel een leuke oefening denk ik zo.

Het is nog verrevan perfect, ge moet handmatig de volgorde van de 1ste week van het jaar ingeven en ik houd nog geen rekening met schrikkeljaren (al is dat, mits een verdubbeling van het aantal tekens, niet zo moeilijk).

Dit is het
PHP:
package random;

public class WeekdayBisBis {


	public static void main(String[] args) {
		int dayNum = 55;
	
		if (dayNum > 0 && dayNum <= 365){
			System.out.print("Today is");
			switch (dayNum%7){
				case 4:
					System.out.print(" Monday");
					break;
				case 5:
					System.out.print(" Tuesday");
					break;
				case 6:
					System.out.print(" Wednesday");
					break;
				default:
					System.out.print(" Thursday");
					break;
				case 1:
					System.out.print(" Friday");
					break;
				case 2:
					System.out.print(" Saturday");
					break;
				case 3:
					System.out.print(" Sunday");
					break;
			}
			int feb = 31;
			int mar = 59;
			int apr = 90;
			int may = 120;
			int jun = 151;
			int jul = 181;
			int aug = 212;
			int sep = 243;
			int oct = 273;
			int nov = 304;
			int dec = 334;
			int date =0;
			int x = 0;
			
			if (dayNum <= feb){		
				date = dayNum;
				x = date;
				System.out.print(" the ");
					System.out.print(x);
					if (x%10 == 1 && x != 11){
						System.out.print("st ");
					}
					else if (x%10 == 2 && x != 12){
						System.out.print("nd ");
					} 
					else if (x%10 == 3 && x != 13 ){
						System.out.print("rd ");
					}
					else {
						System.out.print("th ");
					}
				System.out.print("of January");
				
			} else if (dayNum <= mar){
				date = dayNum - feb;
				x = date;
				System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
				System.out.print("of February");
			} else if (dayNum <= apr){
				date = dayNum - mar;
				x = date;
				System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
				System.out.print("of March");
			} else if (dayNum <= may){
				date = dayNum - apr;
				x = date;
				System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
				System.out.print("of April");
			} else if (dayNum <= jun){
				date = dayNum - may;
				x = date;
				System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
				System.out.print("of May");
			} else if (dayNum <= jul){
				date = dayNum - jun;
				x = date;
				System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
				System.out.print("of June");
			} else if (dayNum <= aug){
				date = dayNum - jul;
				x = date;
				System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
				System.out.print("of July");
			} else if (dayNum <= sep){
				date = dayNum - aug;
				x = date;
				System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
				System.out.print("of August");
			} else if (dayNum <= oct){
				date = dayNum - sep;
				x = date;
				System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
				System.out.print("of Septembre");
			} else if (dayNum <= nov){
				date = dayNum - oct;
				x = date;
				System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
				System.out.print("of Octobre");
			} else if (dayNum <= dec){
				date = dayNum - nov;
				x = date;
				System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
				System.out.print("of Novembre");
			} else if (dayNum <= 365){
				date = dayNum - dec;
				x = date;
				System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
				System.out.print("of Decembre");
			} else {
				System.out.print("Invalid date");
			}
			System.out.print(".");
		}
	}
}


Maar het lijkt met allemaal zo extreem lang met erg veel dubbele syntax.

Ik neem aan dat ge dat met een extra class/object makkelijk kunt versimpelen. Maar ik kan er niet echt opkomen hoe ik dat simpel kan doen.

Ik vermoed dat ik ten 1ste dit al makkelijk met een method kan simplifieren, juist?

PHP:
System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}

Ik dacht dat dan bvb dit zou volstaan

PHP:
public void printDate(){
System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
}

Maar dat werkt langs geen kanten :)

For the record, ik ben echt nog maar net bezig. Een 4tal weken nu tegen een avondschool tempo, dus als ik hier echt compleet de bal missla, sorry :)

Phil

Legacy Member
Nja, dat die class bestaat, dat wist ik :)

Daar gaat het hem niet om :p

Is maar een scriptje als oefening :), kweet dat het compleet nutteloos is :)

Hetgeen me vooral interesseert is hoe ik het korter kan maken, niet bepaald efficienter of correcter. Gewoon al de herhalingen eruithalen enzo.

Parnakra

Legacy Member
Steek die feb t.e.m. dec in een tabel en overloop die i.p.v. die if...else if...else if...else if...else constructie.

Als je die printDate() als methode wil implementeren, zal je je x als parameter moeten doorspelen.

NeverwinterX

Legacy Member
Phil zei:
Ik dacht dat dan bvb dit zou volstaan

PHP:
public void printDate(){
System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
}

Maar dat werkt langs geen kanten :)


Je gebruikt in die methode een variabele x die nergens vandaan komt. Je wilt vermoedelijk die x als parameter meegeven:
public void printDate(int x) {... }
en dan oproepen met:
printDate(x);

Ik weet dat het als oefening is, maar dit is misschien interessant:
SimpleDateFormat (Java Platform SE 6)

Messias.

Legacy Member
Phil zei:
PHP:
public void printDate(){
System.out.print(" the ");
				System.out.print(x);
				if (x%10 == 1 && x != 11){
					System.out.print("st ");
				}
				else if (x%10 == 2 && x != 12){
					System.out.print("nd ");
				} 
				else if (x%10 == 3 && x != 13 ){
					System.out.print("rd ");
				}
				else {
					System.out.print("th ");
				}
}

Probeer je code op z'n minst op te delen in kleine, opzichzelfstaande methodes. Dat maakt testen een pak gemakkelijker. Je kan nog een stap verder gaan door de methode toe te kennen aan een klasse waarmee ze functioneel een logisch geheel vormt.

De methode die instaat voor het omzetten van getallen naar rangtelwoorden, bijvoorbeeld, hoort dan toe aan de klasse die alle methodes voor verbuiging groepeert. Dat zou er zo kunnen uitzien:

PHP:
public class Inflector {

    public static String ordinalize(int n) {
        String ordinal = String.valueOf(n);

        if ((n % 100) >= 11 && (n % 100) <= 13) {
            ordinal += "th";
        } else {
            switch (n % 10) {
                case 1: ordinal += "st"; break;
                case 2: ordinal += "nd"; break;
                case 3: ordinal += "rd"; break;
                default: ordinal += "th";
            }
        }
        return ordinal;
    }
}

Van zodra elk opzichzelfstaand stuk code z'n methode heeft gekregen wordt het ook eenvoudiger om na te gaan of ze juiste resultaten produceren. Aan de hand van unit-test kan je de betrouwbaarheid van je methodes testen. Maak er een gewoonte van om tests schrijven, zelfs nog voor je aan het echte werk begint. Ze zetten je aan om problemen gradueel te tackelen. Een test voor bovenstaande code zou er als volgt kunnen uitzien:

PHP:
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class InflectorTest {
    Map<Integer, String> numbers;

    @Before
    public void initialize() {
        numbers = new HashMap<Integer, String>();
        numbers.put(1, "1st");
        numbers.put(2, "2nd");
        numbers.put(3, "3rd");
        numbers.put(4, "4th");
        numbers.put(100, "100th");
    }

    @Test
    public void testOrdinals() {
        for(Entry<Integer, String> pair : numbers.entrySet()) {
            String actual = Inflector.ordinalize(pair.getKey());
            assertEquals(pair.getValue(), actual);
        }
    }
}

Voor de unit-tests heb je JUnit nodig. Neem zeker de tijd om JUnit te bestuderen, je bent er tenslotte zo mee weg…

Phil

Legacy Member
Bedankt. Heb het al heel wat simpeler kunnen maken met de beperkte syntax die ik ken.

Ziet er nu zo uit
PHP:
package random;

public class Weekdays {
	public static void main(String[] args) {
		int dayNum = 12;
		printWeekDay(dayNum);
		int feb = 31;
		int mar = 59;
		int apr = 90;
		int may = 120;
		int jun = 151;
		int jul = 181;
		int aug = 212;
		int sep = 243;
		int oct = 273;
		int nov = 304;
		int dec = 334;
		int date;

		if (dayNum <= feb){		
			date = dayNum;
			printDate(date);
			System.out.print("of January");		
		} else if (dayNum <= mar){
			date = dayNum - feb;
			printDate(date);
			System.out.print("of February");
		} else if (dayNum <= apr){
			date = dayNum - mar;
			printDate(date);
			System.out.print("of March");
		} else if (dayNum <= may){
			date = dayNum - apr;
			printDate(date);
			System.out.print("of April");
		} else if (dayNum <= jun){
			date = dayNum - may;
			printDate(date);
			System.out.print("of May");
		} else if (dayNum <= jul){
			date = dayNum - jun;
			printDate(date);
			System.out.print("of June");
		} else if (dayNum <= aug){
			date = dayNum - jul;
			printDate(date);
			System.out.print("of July");
		} else if (dayNum <= sep){
			date = dayNum - aug;
			printDate(date);
			System.out.print("of August");
		} else if (dayNum <= oct){
			date = dayNum - sep;
			printDate(date);
			System.out.print("of Septembre");
		} else if (dayNum <= nov){
			date = dayNum - oct;
			printDate(date);
			System.out.print("of Octobre");
		} else if (dayNum <= dec){
			date = dayNum - nov;
			printDate(date);
			System.out.print("of Novembre");
		} else if (dayNum <= 365){
			date = dayNum - dec;
			printDate(date);
			System.out.print("of Decembre");
		} else {
			System.out.print("Invalid date");
		}
		System.out.print(".");
	}

	public static void printDate(int date){
		System.out.print(" the " + date); 
		if (date ==11 || date == 12 || date == 13){
			System.out.print("th ");
		} else{
			switch (date%10){
			case 1: System.out.print("st "); break;
			case 2: System.out.print("nd "); break;
			case 3: System.out.print("rd "); break;
			default: System.out.print("th "); break;
			}
		}
	}
	public static void printWeekDay(int dayNum){
		if (dayNum > 0 && dayNum <= 365){
			System.out.print("Today is");
			switch (dayNum%7){
			case 4:	System.out.print(" Monday,"); break;
			case 5:	System.out.print(" Tuesday,"); break;
			case 6:	System.out.print(" Wednesday,"); break;
			default: System.out.print(" Thursday,"); break;
			case 1:	System.out.print(" Friday,"); break;
			case 2:	System.out.print(" Saturday,"); break;
			case 3:	System.out.print(" Sunday,"); break;
			}
		}
	}
}
Al die else if toestanden om te zien welke maand het is kunnen in een Tabel gezet worden zegt Parnakra. Maar die syntax ken ik nog niet. Zal voor binnen een paar weken zijn vermoed ik. :)

Ben al blij dat ik die printDate(int x){} heb opgelost gekregen. Ge zijt allemaal al erg bedankt :)

Alleen om die st/rd/th enzo uit te werken. Die +="th" enzo werkt niet. Ik krijg daar een error. Is er een kortere manier dan altijd System.out.print("blabla") te schrijven? Of ga ik altijd die sysout moeten gebruiken in dat geval?

Messias.

Legacy Member
Probeer je code eens te herwerken zodat je maar één keer naar sysout wegschrijft. Maak bovenaan een string aan die je stapsgewijs opbouwt (in plaats van altijd print aan te roepen), die je dan op het einde in zijn geheel kan wegschrijven.

Phil

Legacy Member
Ah, dat zou moeten lukken ja. Eens proberen. Thanks


Heb het nu ook in verschillende classes opgedeeld. Zodat m'n mainclass erg kort en simpel is geworden. Is nu allemaal een stuk overzichtelijker.

NeverwinterX

Legacy Member
Messias. zei:
Probeer je code eens te herwerken zodat je maar één keer naar sysout wegschrijft. Maak bovenaan een string aan die je stapsgewijs opbouwt (in plaats van altijd print aan te roepen), die je dan op het einde in zijn geheel kan wegschrijven.

Liever een StringBuilder dan. Maar goed dat is voor later als je de taal zelf onder de knie hebt.

Messias.

Legacy Member
NeverwinterX zei:
Liever een StringBuilder dan. Maar goed dat is voor later als je de taal zelf onder de knie hebt.

Tuurlijk, maar voor een beperkt aantal concatenaties is het gebruik van een immutable string nu geen drama he.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan