Решение на Домашно 02 от Основи на програмирането с Java - декември 2016
Това са моите решения на домашното от 10.12 + защо съм избрал да реша задачите по този начин. Темата е отрорена за дискусии, алтернативни решения и въпроси.
Задача 02-01 (2. Пресмятане на лице на квадрат):
Да се напише конзолна програма, която въвежда цяло число a и пресмята лицето на квадрат със страна a. Задачата е тривиално лесна: въвеждате число от конзолата, умножавате го само по себе си и печатате получения резултат на конзолата.
import java.util.Scanner;
//p01_SquareArea
public class Uprajnenie02_01 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("a = ");
int a = Integer.parseInt(scan.nextLine());
int area = a * a;
System.out.println("Square area = " + area);
}
}
Задача 02-02 (3. От инчове към сантиметри):
Да се напише програма, която чете от конзолата число (не непременно цяло) и преобразува числото от инчове в сантиметри. За целта умножава инчовете по 2.54 (защото 1 инч = 2.54 сантиметра).
import java.util.Scanner;
//p02_InchesToCentimeters
public class Uprajnenie02_02 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("Inches=");
double inches = Double.parseDouble(scan.nextLine());
double centimeters = inches * 2.54;
System.out.println("Centimeters = " + centimeters);
}
}
Задача 02-03 (4. Поздрав по име):
Да се напише програма, която чете от конзолата име на човек и отпечатва “Hello, <name>!”, където <name> е въведеното преди това име.
import java.util.Scanner;
//p03_Greeting
public class Uprajnenie02_03 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//System.out.print("Name: ");
String name = scan.nextLine();
System.out.printf("Hello, %s!", name);
}
}
Задача 02-04 (5. Съединяване на текст и числа):
Напишете Java програма, която прочита от конзолата име, фамилия, възраст и град и печата съобщение от следния вид: “You are <firstName> <lastName>, a <age>-years old person from <town>”.
import java.util.Scanner;
//p04_ConcatenateData
public class Uprajnenie02_04 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String firstName = scan.nextLine();
String lastName = scan.nextLine();
int age = Integer.parseInt(scan.nextLine());
String city = scan.nextLine();
System.out.printf("You are %s %s, a %d-years old person from %s.", firstName, lastName, age, city);
}
}
Задача 02-05 (6. Лице на трапец):
Напишете програма, която чете от конзолата три числа b1, b2 и h и пресмята лицето на трапец с основи b1 и b2 и височина h. Формулата за лице на трапец е (b1 + b2) * h / 2.
На фигурата по-долу е показан трапец със страни 8 и 13 и височина 7. Той има лице (8 + 13) * 7 / 2 = 73.5.
import java.util.Scanner;
//p05_TrapezoidArea
public class Uprajnenie02_05 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double a = Double.parseDouble(scan.nextLine());
double b = Double.parseDouble(scan.nextLine());
double h = Double.parseDouble(scan.nextLine());
double trArea = (a + b) * h / 2;
System.out.println("Trapezoid area = " + trArea);
}
}
Задача 02-06 (7. Периметър и лице на кръг):
Напишете програма, която чете от конзолата число r и пресмята и отпечатва лицето и периметъра на кръг / окръжност с радиус r.
import java.util.Scanner;
public class Uprajnenie02_06 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double r = Double.parseDouble(scan.nextLine());
double area = Math.PI * r * r;
double perimeter = 2 * Math.PI * r;
System.out.println("Area = " + area);
System.out.println("Perimeter = " + perimeter);
}
}
Задача 02-07 (8. Лице на правоъгълник в равнината):
Правоъгълник е зададен с координатите на два от своите срещуположни ъгъла (x1, y1) – (x2, y2). Да се пресметнат площта и периметъра му. Входът се чете от конзолата. Числата x1, y1, x2 и y2 са дадени по едно наред. Изходът се извежда на конзолата и трябва да съдържа два реда с по една число на всеки от тях – лицето и периметъра.
import java.util.Scanner;
public class Uprajnenie02_07 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double x1 = Double.parseDouble(scan.nextLine());
double y1 = Double.parseDouble(scan.nextLine());
double x2 = Double.parseDouble(scan.nextLine());
double y2 = Double.parseDouble(scan.nextLine());
double a = Double.max(x1, x2) - Double.min(x1, x2);
double b = Double.max(y1, y2) - Double.min(y1, y2);
double area = a * b;
double perimeter = (a + b) * 2;
System.out.println("Area = " + area);
System.out.println("Perimeter = " + perimeter);
}
}
Задача 02-08 (9. Лице на триъгълник):
Напишете програма, която чете от конзолата страна и височина на триъгълник и пресмята неговото лице. Използвайте формулата за лице на триъгълник: area = a * h / 2. Закръглете резултата до 2 знака след десетичната точка използвайки “%.2f“.
import java.util.Scanner;
public class Uprajnenie02_08 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double a = Double.parseDouble(scan.nextLine());
double h = Double.parseDouble(scan.nextLine());
double area = a * h / 2;
System.out.printf("Area = %.2f", area);
}
}
Задача 02-09 (10. Конзолен конвертор: от градуси °C към градуси °F):
Напишете програма, която чете градуси по скалата на Целзий (°C) и ги преобразува до градуси по скалата на Фаренхайт (°F). Потърсете в Интернет подходяща формула (fahrenheit = celsius * 1.8 + 32), с която да извършите изчисленията. Закръглете резултата до 2 знака след десетичната точка. Примери:
import java.util.Scanner;
public class Uprajnenie02_09 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double celsius = Double.parseDouble(scan.nextLine());
double fahrenheit = celsius * 1.8 + 32;
System.out.printf("Fahrenheit = %.2f", fahrenheit);
}
}
Задача 02-10 (11. Конзолен конвертор: от радиани в градуси):
Напишете програма, която чете ъгъл в радиани (rad) и го преобразува в градуси (deg). Потърсете в Интернет подходяща формула. Числото π в Java програми е достъпно чрез Math.PI. Закръглете резултата до най-близкото цяло число.
import java.util.Scanner;
public class Uprajnenie02_10 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double rad = Double.parseDouble(scan.nextLine());
double deg = Math.toDegrees(rad);
System.out.printf("deg = %.0f", deg);
}
}
Това май трябва да го напиша на ново с Math.PI и формула?
Задача 02-11 (12. Конзолен конвертор: USD към BGN):
Напишете програма за конвертиране на щатски долари (USD) в български лева (BGN). Закръглете резултата до 2 цифри след десетичната запетая. Използвайте фиксиран курс между долар и лев: 1 USD = 1.79549 BGN.
import java.util.Scanner;
public class Uprajnenie02_11 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double usd = Double.parseDouble(scan.nextLine());
double bgn = usd * 1.79549;
System.out.printf("bgn = %.2f", bgn);
}
}
Тук може да се добави променлива за курса на долара за по-лесна промяна на курса.
Задача 02-12* (13. * Конзолен междувалутен конвертор):
Напишете програма за конвертиране на парична сума от една валута в друга. Трябва да се поддържат следните валути: BGN, USD, EUR, GBP. Използвайте следните фиксирани валутни курсове:
import java.util.Scanner;
public class Uprajnenie02_12 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double cash = Double.parseDouble(scan.nextLine());
String startingCurancy = scan.nextLine().toUpperCase();
String convertToCurancy = scan.nextLine().toUpperCase();
double cashConverted = Uprajnenie02_12.CashConverter(cash, startingCurancy, convertToCurancy);
System.out.printf("%.2f %s", cashConverted, convertToCurancy);
}
public static double CashConverter(double cash, String startCurancy, String endCurancy) {
double toUsd = 1.79549;
double toEur = 1.95583;
double toGbp = 2.53405;
if (cash == 0) {
return cash;
} else {
switch (startCurancy) {
case "BGN":
break;
case "USD":
cash = cash * toUsd;
break;
case "EUR":
cash = cash * toEur;
break;
case "GBP":
cash = cash * toGbp;
}
switch (endCurancy) {
case "BGN":
break;
case "USD":
cash = cash / toUsd;
break;
case "EUR":
cash = cash / toEur;
break;
case "GBP":
cash = cash / toGbp;
}
return cash;
}
}
}
Тази задача беше забавна. Очаквайте скоро описание на какво и защо... дълго е.
Задача 02-13** (14. ** Пресмятане с дати: 1000 дни на Земята):
Напишете програма, която въвежда рождена дата във формат “dd-MM-yyyy” и пресмята датата, на която се навършват 1000 дни от тази рождена дата и я отпечатва в същия формат.
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;
public class Uprajnenie02_13 {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String bDay = scan.nextLine();
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
int add_days = 999;
LocalDate birthDay = LocalDate.parse(bDay, dateFormat).plusDays(add_days);
System.out.println(dateFormat.format(birthDay));
}
}
Поради някаква причина джъдж иска да се добавят 999 дни, което според мен е грешно. Един ден от рождението ви се навършва на следващият ден след раждането. Но все пак това е решенито за 100 точки в джъдж.
Задача 02-14* (15. *Учебна зала):
Учебна зала има правоъгълен размер w на h метра, без колони във вътрешността си. Залата е разделена на две части – лява и дясна, с коридор приблизително по средата. В лявата и в дясната част има редици с бюра. В задната част на залата има голяма входна врата. В предната част на залата има катедра с подиум за преподавателя. Едно работно място заема 70 на 120 cm (маса с размер 70 на 40 cm + място за стол и преминаване с размер 70 на 80 cm). Коридорът е широк поне 100 cm. Изчислено е, че заради входната врата (която е с отвор 160 cm) се губи точно 1 работно място, а заради катедрата (която е с размер 160 на 120 cm) се губят точно 2 работни места. Напишете програма, която въвежда размери на учебната зала и изчислява броя работни места в нея при описаното разположение.
Вход
От конзолата се четат 2 числа, по едно на ред: h (дължина в метри) и w (широчина в метри).
Ограничения: 3 ≤ h ≤ w ≤ 100.
import java.util.Scanner;
public class Uprajnenie02_14 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//dyljina na zalata
double w = Double.parseDouble(scan.nextLine());
//shirina na zalata
double h = Double.parseDouble(scan.nextLine());
while (!((3 <= h) && (h <= w) && (w <= 100))) {
w = Double.parseDouble(scan.nextLine());
h = Double.parseDouble(scan.nextLine());
}
//shirina na koridora
int koridor = 100;
//razmer na biuro + stol
int biuroW = 120;
int biuroH = 70;
//broi redove i koloni ot biuro + stol
int redove = (int) (w * 100) / biuroW;
int koloni = (int) (h * 100 - koridor) / biuroH;
//obsht broi biuro + stol
int broiBiura = redove * koloni - 3;
System.out.println(broiBiura);
}
}
Тук всичко е повече аритметика от колкото програмиране.
Задача 02-15* (16. *Зеленчукова борса):
Градинар продавал реколтата от градината си на зеленчуковата борса. Продава зеленчуци за N лева на килограм и плодове за M лева за килограм. Напишете програма, която да пресмята приходите от реколтата в евро ( ако приемем, че едно евро е равно на 1.94лв).
import java.util.Scanner;
public class Uprajnenie02_15 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//cena zelenchuci
double n = Double.parseDouble(scan.nextLine());
//cena polodove
double m = Double.parseDouble(scan.nextLine());
//BGN to EUR
double eur = 1.94;
int tegloZelenchuci = Integer.parseInt(scan.nextLine());
int tegloPolodove = Integer.parseInt(scan.nextLine());
double prihodEur = ((tegloZelenchuci * n) + (tegloPolodove * m)) / eur;
System.out.printf("%.13f", prihodEur);
}
}
Джъдж не харесва 14 символа след десетичната запетая и едната проверка не минава. Няма друга причнина да използвам "printf("%.13f".
Би ли си добавил кода, за да можем да го прегледаме и обсъдим.