import java.io.PrintStream ;
import java.math.BigDecimal ;
import java.math.RoundingMode ;
import java.nio.charset.StandardCharsets ;
import java.util.Locale ;
public class Main {
private static final class TuitionPlan {
private final int lessonMinutes;
private final int numberOfWeeks;
TuitionPlan(
int lessonMinutes,
int numberOfWeeks) {
this .hourlyRateGbp = hourlyRateGbp;
this .lessonMinutes = lessonMinutes;
this .lessonsPerWeek = lessonsPerWeek;
this .numberOfWeeks = numberOfWeeks;
}
void validate( ) {
if ( hourlyRateGbp.
compareTo ( BigDecimal .
ZERO ) <= 0 ) { "Hourly rate must be greater than zero."
) ;
}
if ( lessonMinutes < 15 || lessonMinutes > 180 ) {
"Lesson length must be between 15 and 180 minutes."
) ;
}
if ( lessonsPerWeek.
compareTo ( BigDecimal .
ZERO ) <= 0 ) { "Lessons per week must be greater than zero."
) ;
}
if ( numberOfWeeks < 1 || numberOfWeeks > 52 ) {
"Number of weeks must be between 1 and 52."
) ;
}
}
return hourlyRateGbp
.divide (
2 ,
RoundingMode.HALF_UP
) ;
}
return lessonCost( )
.multiply ( lessonsPerWeek)
.setScale ( 2 , RoundingMode.HALF_UP ) ;
}
return lessonCost( )
.multiply ( lessonsPerWeek)
.setScale ( 2 , RoundingMode.HALF_UP ) ;
}
}
}
public static void main
( String [ ] args
) { // Ensure that the pound sign is printed correctly.
true ,
StandardCharsets.UTF_8
)
) ;
/*
* Edit these four values before running:
*
* 30 = hourly rate in pounds
* 60 = lesson length in minutes
* 1 = lessons per week
* 12 = number of weeks
*/
TuitionPlan plan = new TuitionPlan(
60 ,
12
) ;
plan.validate ( ) ;
System .
out .
println ( "ONLINE TUITION BUDGET EXAMPLE" ) ; System .
out .
println ( "-" .
repeat ( 36 ) ) ;
"Hourly rate: %s%n" ,
money( plan.hourlyRateGbp )
) ;
"Lesson length: %d minutes%n" ,
plan.lessonMinutes
) ;
"Lessons per week: %s%n" ,
plan.lessonsPerWeek .toPlainString ( )
) ;
"Selected period: %d weeks%n" ,
plan.numberOfWeeks
) ;
"Cost per lesson: %s%n" ,
money( plan.lessonCost ( ) )
) ;
"Four-week example: %s%n" ,
money( plan.fourWeekCost ( ) )
) ;
"Period total: %s%n" ,
money( plan.periodCost ( ) )
) ;
System .
out .
println ( "Before booking, confirm:" ) ;
"the tutor's current live rate and lesson length" ,
"subject, level and exam-board experience" ,
"normal availability and cancellation terms" ,
"how progress and homework will be handled" ,
"the online platform and safeguarding arrangements"
} ;
for ( int i = 0 ; i < prompts.length ; i++ ) {
System .
out .
printf ( "%d. %s%n" , i
+ 1 , prompts
[ i
] ) ; }
"One UK directory using a pay-as-you-go model:"
) ;
"https://l...content-available-to-author-only...n.com/find-a-tutor"
) ;
"Live profiles and current terms are the source of truth."
) ;
}
}
aW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CmltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKaW1wb3J0IGphdmEubWF0aC5Sb3VuZGluZ01vZGU7CmltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CmltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwoKcHVibGljIGNsYXNzIE1haW4gewoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFR1aXRpb25QbGFuIHsKICAgICAgICBwcml2YXRlIGZpbmFsIEJpZ0RlY2ltYWwgaG91cmx5UmF0ZUdicDsKICAgICAgICBwcml2YXRlIGZpbmFsIGludCBsZXNzb25NaW51dGVzOwogICAgICAgIHByaXZhdGUgZmluYWwgQmlnRGVjaW1hbCBsZXNzb25zUGVyV2VlazsKICAgICAgICBwcml2YXRlIGZpbmFsIGludCBudW1iZXJPZldlZWtzOwoKICAgICAgICBUdWl0aW9uUGxhbigKICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwgaG91cmx5UmF0ZUdicCwKICAgICAgICAgICAgICAgIGludCBsZXNzb25NaW51dGVzLAogICAgICAgICAgICAgICAgQmlnRGVjaW1hbCBsZXNzb25zUGVyV2VlaywKICAgICAgICAgICAgICAgIGludCBudW1iZXJPZldlZWtzKSB7CgogICAgICAgICAgICB0aGlzLmhvdXJseVJhdGVHYnAgPSBob3VybHlSYXRlR2JwOwogICAgICAgICAgICB0aGlzLmxlc3Nvbk1pbnV0ZXMgPSBsZXNzb25NaW51dGVzOwogICAgICAgICAgICB0aGlzLmxlc3NvbnNQZXJXZWVrID0gbGVzc29uc1BlcldlZWs7CiAgICAgICAgICAgIHRoaXMubnVtYmVyT2ZXZWVrcyA9IG51bWJlck9mV2Vla3M7CiAgICAgICAgfQoKICAgICAgICB2b2lkIHZhbGlkYXRlKCkgewogICAgICAgICAgICBpZiAoaG91cmx5UmF0ZUdicC5jb21wYXJlVG8oQmlnRGVjaW1hbC5aRVJPKSA8PSAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAiSG91cmx5IHJhdGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAobGVzc29uTWludXRlcyA8IDE1IHx8IGxlc3Nvbk1pbnV0ZXMgPiAxODApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICJMZXNzb24gbGVuZ3RoIG11c3QgYmUgYmV0d2VlbiAxNSBhbmQgMTgwIG1pbnV0ZXMuIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxlc3NvbnNQZXJXZWVrLmNvbXBhcmVUbyhCaWdEZWNpbWFsLlpFUk8pIDw9IDApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICJMZXNzb25zIHBlciB3ZWVrIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG51bWJlck9mV2Vla3MgPCAxIHx8IG51bWJlck9mV2Vla3MgPiA1MikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiB3ZWVrcyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNTIuIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgQmlnRGVjaW1hbCBsZXNzb25Db3N0KCkgewogICAgICAgICAgICByZXR1cm4gaG91cmx5UmF0ZUdicAogICAgICAgICAgICAgICAgICAgIC5tdWx0aXBseShCaWdEZWNpbWFsLnZhbHVlT2YobGVzc29uTWludXRlcykpCiAgICAgICAgICAgICAgICAgICAgLmRpdmlkZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwudmFsdWVPZig2MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91bmRpbmdNb2RlLkhBTEZfVVAKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgQmlnRGVjaW1hbCBmb3VyV2Vla0Nvc3QoKSB7CiAgICAgICAgICAgIHJldHVybiBsZXNzb25Db3N0KCkKICAgICAgICAgICAgICAgICAgICAubXVsdGlwbHkobGVzc29uc1BlcldlZWspCiAgICAgICAgICAgICAgICAgICAgLm11bHRpcGx5KEJpZ0RlY2ltYWwudmFsdWVPZig0KSkKICAgICAgICAgICAgICAgICAgICAuc2V0U2NhbGUoMiwgUm91bmRpbmdNb2RlLkhBTEZfVVApOwogICAgICAgIH0KCiAgICAgICAgQmlnRGVjaW1hbCBwZXJpb2RDb3N0KCkgewogICAgICAgICAgICByZXR1cm4gbGVzc29uQ29zdCgpCiAgICAgICAgICAgICAgICAgICAgLm11bHRpcGx5KGxlc3NvbnNQZXJXZWVrKQogICAgICAgICAgICAgICAgICAgIC5tdWx0aXBseShCaWdEZWNpbWFsLnZhbHVlT2YobnVtYmVyT2ZXZWVrcykpCiAgICAgICAgICAgICAgICAgICAgLnNldFNjYWxlKDIsIFJvdW5kaW5nTW9kZS5IQUxGX1VQKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1vbmV5KEJpZ0RlY2ltYWwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdChMb2NhbGUuVUssICLCoyUsLjJmIiwgdmFsdWUpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcG91bmQgc2lnbiBpcyBwcmludGVkIGNvcnJlY3RseS4KICAgICAgICBTeXN0ZW0uc2V0T3V0KAogICAgICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKAogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LAogICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZENoYXJzZXRzLlVURl84CiAgICAgICAgICAgICAgICApCiAgICAgICAgKTsKCiAgICAgICAgLyoKICAgICAgICAgKiBFZGl0IHRoZXNlIGZvdXIgdmFsdWVzIGJlZm9yZSBydW5uaW5nOgogICAgICAgICAqCiAgICAgICAgICogMzAgPSBob3VybHkgcmF0ZSBpbiBwb3VuZHMKICAgICAgICAgKiA2MCA9IGxlc3NvbiBsZW5ndGggaW4gbWludXRlcwogICAgICAgICAqIDEgID0gbGVzc29ucyBwZXIgd2VlawogICAgICAgICAqIDEyID0gbnVtYmVyIG9mIHdlZWtzCiAgICAgICAgICovCiAgICAgICAgVHVpdGlvblBsYW4gcGxhbiA9IG5ldyBUdWl0aW9uUGxhbigKICAgICAgICAgICAgICAgIG5ldyBCaWdEZWNpbWFsKCIzMCIpLAogICAgICAgICAgICAgICAgNjAsCiAgICAgICAgICAgICAgICBuZXcgQmlnRGVjaW1hbCgiMSIpLAogICAgICAgICAgICAgICAgMTIKICAgICAgICApOwoKICAgICAgICBwbGFuLnZhbGlkYXRlKCk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT05MSU5FIFRVSVRJT04gQlVER0VUIEVYQU1QTEUiKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0iLnJlcGVhdCgzNikpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigKICAgICAgICAgICAgICAgICJIb3VybHkgcmF0ZTogICAgICAgJXMlbiIsCiAgICAgICAgICAgICAgICBtb25leShwbGFuLmhvdXJseVJhdGVHYnApCiAgICAgICAgKTsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoCiAgICAgICAgICAgICAgICAiTGVzc29uIGxlbmd0aDogICAgICVkIG1pbnV0ZXMlbiIsCiAgICAgICAgICAgICAgICBwbGFuLmxlc3Nvbk1pbnV0ZXMKICAgICAgICApOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigKICAgICAgICAgICAgICAgICJMZXNzb25zIHBlciB3ZWVrOiAgJXMlbiIsCiAgICAgICAgICAgICAgICBwbGFuLmxlc3NvbnNQZXJXZWVrLnRvUGxhaW5TdHJpbmcoKQogICAgICAgICk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKAogICAgICAgICAgICAgICAgIlNlbGVjdGVkIHBlcmlvZDogICAlZCB3ZWVrcyVuIiwKICAgICAgICAgICAgICAgIHBsYW4ubnVtYmVyT2ZXZWVrcwogICAgICAgICk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigKICAgICAgICAgICAgICAgICJDb3N0IHBlciBsZXNzb246ICAgJXMlbiIsCiAgICAgICAgICAgICAgICBtb25leShwbGFuLmxlc3NvbkNvc3QoKSkKICAgICAgICApOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigKICAgICAgICAgICAgICAgICJGb3VyLXdlZWsgZXhhbXBsZTogJXMlbiIsCiAgICAgICAgICAgICAgICBtb25leShwbGFuLmZvdXJXZWVrQ29zdCgpKQogICAgICAgICk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKAogICAgICAgICAgICAgICAgIlBlcmlvZCB0b3RhbDogICAgICAlcyVuIiwKICAgICAgICAgICAgICAgIG1vbmV5KHBsYW4ucGVyaW9kQ29zdCgpKQogICAgICAgICk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQmVmb3JlIGJvb2tpbmcsIGNvbmZpcm06Iik7CgogICAgICAgIFN0cmluZ1tdIHByb21wdHMgPSB7CiAgICAgICAgICAgICAgICAidGhlIHR1dG9yJ3MgY3VycmVudCBsaXZlIHJhdGUgYW5kIGxlc3NvbiBsZW5ndGgiLAogICAgICAgICAgICAgICAgInN1YmplY3QsIGxldmVsIGFuZCBleGFtLWJvYXJkIGV4cGVyaWVuY2UiLAogICAgICAgICAgICAgICAgIm5vcm1hbCBhdmFpbGFiaWxpdHkgYW5kIGNhbmNlbGxhdGlvbiB0ZXJtcyIsCiAgICAgICAgICAgICAgICAiaG93IHByb2dyZXNzIGFuZCBob21ld29yayB3aWxsIGJlIGhhbmRsZWQiLAogICAgICAgICAgICAgICAgInRoZSBvbmxpbmUgcGxhdGZvcm0gYW5kIHNhZmVndWFyZGluZyBhcnJhbmdlbWVudHMiCiAgICAgICAgfTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9tcHRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlZC4gJXMlbiIsIGkgKyAxLCBwcm9tcHRzW2ldKTsKICAgICAgICB9CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKICAgICAgICAgICAgICAgICJPbmUgVUsgZGlyZWN0b3J5IHVzaW5nIGEgcGF5LWFzLXlvdS1nbyBtb2RlbDoiCiAgICAgICAgKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly9sLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5uLmNvbS9maW5kLWEtdHV0b3IiCiAgICAgICAgKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCiAgICAgICAgICAgICAgICAiTGl2ZSBwcm9maWxlcyBhbmQgY3VycmVudCB0ZXJtcyBhcmUgdGhlIHNvdXJjZSBvZiB0cnV0aC4iCiAgICAgICAgKTsKICAgIH0KfQ==