Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde

Cvičení k 12. lekci OOP v Javě

Java Objektově orientované programování Cvičení k 12. lekci OOP v Javě American English version English version

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Následující 3 cvičení vám pomohou procvičit znalosti objektově orientovaného programování v Javě z minulé lekce. Ve vlastním zájmu se je pokuste vyřešit sami. Pod článkem máte pro kontrolu řešení ke stažení. Ale pozor, jakmile se na něj podíváte bez vyřešení příkladů, ztrácí pro vás cvičení smysl a nic se nenaučíte :)

Pokud si opravdu nebudete vědět rady, podívejte se raději znovu do minulého tutoriálu a pokuste se na to přijít.

Jednoduchý příklad

Naprogramujte aplikaci, která pro následujících 7 dní, včetně dnešního dne, vypíše součet cifer v jejich datu. Např. pro 24.11.2013 to bude 24+11+2013 = 2048.

Ukázka obrazovky programu:

Konzolová aplikace
Vypisuji součty cifer v datu pro následujících 7 dní
27.11.2016 - 2054
28.11.2016 - 2055
29.11.2016 - 2056
30.11.2016 - 2057
1.12.2016 - 2029
2.12.2016 - 2030
3.12.2016 - 2031

package onlineapp;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

Středně pokročilý příklad

Naprogramujte aplikaci, která pro zadaný interval datumů vypíše všechny pátky 13.

Ukázka obrazovky programu:

Konzolová aplikace
Pro zadaný interval datumů vypíše všechny pátky 13.:
Zadejte 1. datum:
1.1.2013
Zadejte 2. datum:
15.8.2015
Pátky 13.:
13.9.2013, 13.12.2013, 13.6.2014, 13.2.2015, 13.3.2015,

package onlineapp;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import java.util.Scanner;

Pokročilý příklad

Naprogramujte aplikaci, která si vyžádá od uživatele datum narození. Aplikace následně vypíše jak je uživatel starý a za kolik dnů má nejbližší narozeniny. Zamyslete se nad tím, jak vypočítat věk opravdu správně, dělení počtu dnů 365.25 není správné řešení, jelikož není přesné.

Ukázka obrazovky programu:

Konzolová aplikace
Zadej datum narození:
15.1.1989
Je ti 27 let a narozeniny máš za 52 dní.

package onlineapp;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Scanner;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Datum {
}
import java.util.Calendar;

public class Osoba {
}


 

Stáhnout

Staženo 291x (58.48 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
5 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (17)

 

 

Komentáře
Zobrazit starší komentáře (10)

Avatar
Michal H.
Člen
Avatar
Michal H.:2. března 12:54

Ahoj, furt mám pocit, že něco dělám špatně... ale funguje to no :)
1.

LocalDate datum = LocalDate.now();
ArrayList<LocalDate> listDatum = new ArrayList<LocalDate>();

for(int i =0; i < 7; i++)
{
    listDatum.add(datum.plusDays(i));
}

for(LocalDate d : listDatum)
    System.out.println(d.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM))+ " součet čísel v datu je " + (d.getDayOfMonth() + d.getMonthValue()+ d.getYear()));

2.

System.out.println("Umím najít všechny pátky třináctého v rozmezí zadaných datumů");
        Scanner sc = new Scanner(System.in, "UTF-8");

        System.out.println("Zadej první datum");
        LocalDate datum1 = LocalDate.parse(sc.nextLine(),DateTimeFormatter.ofPattern("d.M.y"));
        System.out.println("Zadej druhe datum");
        LocalDate datum2 = LocalDate.parse(sc.nextLine(),DateTimeFormatter.ofPattern("d.M.y"));
        String s ="";

        while(!datum1.equals(datum2))
        {
            if( (datum1.getDayOfWeek() == DayOfWeek.FRIDAY) && datum1.getDayOfMonth()==13)
            {
               s += String.format("%s , ", datum1.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)));
            }
             datum1 = datum1.plusDays(1);
        }
        System.out.println("Pátky 13. jsou " + s);

3.

System.out.println("Tve datum narozeni?");
LocalDate narozen = LocalDate.parse(sc.nextLine(),DateTimeFormatter.ofPattern("d.M.y"));
LocalDate dnes = LocalDate.now();

int dni = 0;
boolean shoda = false;

while(!shoda)
{
    dni++;
    dnes = dnes.plusDays(1);
    if(dnes.getMonth()==narozen.getMonth() && dnes.getDayOfMonth() == narozen.getDayOfMonth())
        shoda = true    ;
}
System.out.printf("je ti %d narozeniny za %d dní", (dnes.getYear()-narozen.getYear()), dni);

Tahle potvůrka mi dala nejvíce zabrat. Ať jsem sčítal a odčítal dny a měsíc.... tudy cesta pro mě prostě nevedla :)

 
Odpovědět 2. března 12:54
Avatar
Odpovídá na Michal H.
Roman Havelka:28. března 20:57

No nevim ale co kdyby uz narozeniny letos mel?
Co treba takhle?

long rozdil ;
Scanner sc = new Scanner(System.in);
System.out.prin­tln("Zadej datum narozeni (d.M.y) :");
LocalDate narozky = LocalDate.parse
(sc.nextLine(),Da­teTimeFormatter­.ofPattern("d­.M.y"));
LocalDate dnes = LocalDate.now();
LocalDate letosniNarozky = narozky.withY­ear(dnes.getY­ear());
TemporalAmount vek = Period.between(na­rozky, dnes);
System.out.prin­tf("Je ti %s let\n", vek.get(Chrono­Unit.YEARS));
if (letosniNaroz­ky.isBefore(dnes)) {
letosniNarozky = letosniNarozky­.plusYears(1);
}
rozdil = letosniNarozky­.toEpochDay() - dnes.toEpochDay();

if(rozdil != 0) {
System.out.prin­tf("Do pristich narozenin zbyva : %s dni.\n",rozdil);
}
else System.out.prin­tln("Dnes mas narozeniny");

 
Odpovědět  +1 28. března 20:57
Avatar
Michal H.
Člen
Avatar
Odpovídá na Roman Havelka
Michal H.:31. března 5:53

No přičítám jeden den dokud se neshodují měsíc a den ( od LocalDate.now), tak že rok řešit nemusím.
Pravda asi jsem zbytečně napsal metodu, ale vím co se v ní děje. A pro tento případ mi to přišlo adekvátní. Pravda pokud bych z porovnání datumů měl dostat něco více, není to asi ono.

Editováno 31. března 5:54
 
Odpovědět 31. března 5:53
Avatar
Michal H.
Člen
Avatar
Odpovídá na Roman Havelka
Michal H.:31. března 6:10

:D Kruci 6 ráno není nejlepší čas na odpovědi :) Už chápu (odzkoušeno) :) no tohle jsem přehlédl díky ;)

 
Odpovědět  +1 31. března 6:10
Avatar
MiroslavP
Člen
Avatar
MiroslavP:24. srpna 23:15

Zajímavé hrátky s datumy: příklad Narozeniny:
package narozeniny;

import java.time.Duration;
import java.time.Local­Date;
import java.time.Period;
import java.time.for­mat.DateTimeFor­matter;
import java.time.tem­poral.ChronoU­nit;
import java.time.tem­poral.Tempora­lAmount;
import java.util.Scanner;

/**
*
* @author miros
*/
public class Narozeniny {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.prin­t("Zadej datum narození (DD.MM.RRRR): ");
String datumNarozeni = sc.nextLine();
LocalDate datNar = LocalDate.par­se(datumNaroze­ni, DateTimeFormat­ter.ofPattern("d­.M.y"));
LocalDate dnes = LocalDate.now();
if (dnes.isAfter(dat­Nar)) {
TemporalAmount dobaOd = Period.between(dat­Nar,dnes);
System.out.prin­tln("Jsi stár " + dobaOd.get(Chro­noUnit.YEARS)+ " let.");
int dnuDoNar = 0;
LocalDate nextNar = LocalDate.of(dnes­.getYear(),dat­Nar.getMonthVa­lue(),datNar.get­DayOfMonth());
if (nextNar.isBe­fore(dnes)) {
nextNar = LocalDate.of;
while (dnes.isBefore(nex­tNar)) {
dnuDoNar ++;
dnes = dnes.plusDays(1);
}
}
while (dnes.isBefore(nex­tNar)) {
dnuDoNar ++;
dnes = dnes.plusDays(1);
}
System.out.prin­tln("Narozeni­ny budeš mít za " + dnuDoNar + " dní.");
}
else
{
System.out.prin­tln("Nelze! Datum narození nesmí být v budoucnosti.");
}
}
}

 
Odpovědět 24. srpna 23:15
Avatar
zitekv
Člen
Avatar
zitekv:5. listopadu 13:12

Pro odevzdání jednoduchého příkladu je nutno zadat větu Vypisuji součty cifer v datu pro následujících 7 dní

 
Odpovědět 5. listopadu 13:12
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na zitekv
David Jančík:5. listopadu 13:22

Díky, opraveno.

Odpovědět  +1 5. listopadu 13:22
Čím více času dostaneš, tím méně ho máš.
Avatar
zitekv
Člen
Avatar
zitekv:6. listopadu 23:12

Ve středně pokročilém příkladu mi zkomplikovalo odevzdání odřádkování ve výpisu. Ze zadání je patrné, že tam žádné odřádkování být nemá (ale je vyžadováno).

System.out.println("Pátky 13.:");
 
Odpovědět 6. listopadu 23:12
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na zitekv
David Jančík:6. listopadu 23:48

Díky, opraveno

Odpovědět 6. listopadu 23:48
Čím více času dostaneš, tím méně ho máš.
Avatar
Michal Navrátil:18. listopadu 19:35

Ahoj!
Ve vašem řešení jsou nejspíš následující chyby (zkoušel jsem dnes 18.11.2018):

test: datum narození: 19.11.1981
výsledek: narozeniny máš za 2 dní (nemělo by být "...1 dní"?)

test: datum narození: 19.11.2018
výsledek: Je ti -1 let a narozeniny máš za 2 dní (nemělo by být "Je ti 0 let..."?)

 
Odpovědět  +1 18. listopadu 19:35
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 20. Zobrazit vše