Урок 22. Java Програмування - Середнє арифметичне (Українською)
HTML-код
- Опубликовано: 15 апр 2017
- В цьому уроці ми напишемо програму, яка буде вираховувати середнє арифметичне із введених користувачем чисел.
Ми напишемо два варіанти тієї ж програми - одну просту - для засвоєння вивченого; і одну складнішу - де потрібно буде подумати над логікою програми.
Ми використаємо елементи/операції, вивчені в попередніх уроках (введення від користувача, цикл while, перетворення типів даних).
Д/З: створити програму, яка буде приймати довільну кількість чисел від користувача і коли користувач введе символ "!" (знак оклику) - виводити результат.
🔔 VirtuAka
⭐️ www.VirtuAka.com
🐤 / virtuaka
Підтримати проект:
💳 Raiffeisen: 4149 5001 4774 8720
💳 Приватбанк: 5168 7520 1675 9428
💰 ₿itcoin: 1KDGoPssAAzavLQeyToJUcznMGxq5JeN6Z
Партнери проекту:
🤝 www.movnyk.net
💡 дякуємо всім за підтримку, підписки, вподобаки і репости! Наука
Дуже цікаво. Дякую )
Дуже Дякую за Чудовий Урок... Окреме Спасибі за Д/З... Самостійна робота, пошук та виправлення власних помилок дуже організовує та дисциплінує...
Дякую!
Дякую за уроки! Прошло 5 років, а Ваші уроки дуже корисні
Мабуть ще років 20 будуть актуальні 😄
@@VirtuAka ще би продовження )
import java.util.Scanner;
public class English11 {
public static void main(String[] args) {
Scanner io = new Scanner(System.in);
int second = io.nextInt();
int[] array = new int[second];
int sum = 0;
int result = 0;
for(int i = 0; i < second; i++) {
System.out.println("Chislo");
array[i] = io.nextInt();
sum = sum + array[i];
}
result = sum/second;
System.out.println("result :" + result);
}
}
}
Код інший, але виконує ту саму функцію на вираховування середнього арифметичного
7:04
Не розумію пояснення на 14 хв: "Перший раз, коли программа доходить до рядка коду while вона думає що ми уже ввели число хоча насправді ми поки що нічого не ввели, вона одразу додає одиницю".
На мою думку, программа додає одиницю коли користувача вводить [.], на останньому колі циклу.
Поправте, якщо я думаю невірно.
Я також не одразу зрозумів, чому так, але ви правильно думаєте!))) :
Тому що програма бачить всі наші введення (їх було 3. Дві цифри і крапка - третє введення (тобто кінець циклу))!
Крапку, наша програма, також рахує за введений символ!)))
Тому можна написати ось так: "int kilkistChysel = -1", на початку, щоб було простіше зрозуміти, замість "int kilkistChysel = 0", тим самим одразу мінусуючи один символ (крапку), який буде введено в кінці, для завершення процесу рахування. :)
Можна і так зробити:
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int chyslo = 0, suma = 0, kilkchysel = 0;
String vvedennya = "0";
while (vvedennya.equals("f") != true){
chyslo = Integer.parseInt(vvedennya);
suma = suma + chyslo;
System.out.println("ВВедіть число або f щоб зупинитися");
vvedennya = reader.readLine();
kilkchysel++;
if(vvedennya.equals("f")){
--kilkchysel;
}
}
int serednye = suma/kilkchysel;
System.out.println("Середнє число з " + kilkchysel + " чисел = " + serednye);
}
}
А що, якщо програма бачить той "0" (там де kilkistChysel = 0), і зараховує той "0" як одне число. Відповідно, крапку вона не враховує.
Адже за ASCII "." буде дорівнювати 46
Знатоки дайте мені розяснення на 14:10 стається помилка і автор говорить що потрібно добавити декримент (serdnie = suma / --kilsistychusel;) тому що при першому запуску програма перший раз думає що ми вже щось ввели але ми іще нічого не вводили.... як мені виглядає декримент потрібен щоб програма не рахувалла введеня крапки (для завершення) як введення числа і не враховувала його, чи я помиляюсь?
Я правильно зрозумів, програма бачить команду [.] як текст? саме для того створили змінну типу String!!!
Величезне спасибі!
Маю запитання, чому, коли в мене цикл while мав такий вигляд:
{
System.out.println("Введіть будь яке число, коли захочите зупинитись введіть крапку (.)");
vvedenia=scan.nextLine();
chyslo=Double.parseDouble(vvedenia);
suma=suma+chyslo;
kilkist++;
}
- мені вибивало такі помилки, при введені крапки:
Exception in thread "main" java.lang.NumberFormatException: For input string: "."
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
at java.lang.Double.parseDouble(Unknown Source)
at dzseredniearyfm.main(dzseredniearyfm.java:15)
Адже логічно:
Спершу користувач вводить число;
Далі ми його зчитуємо за допомогою сканера;
Далі число переводимо з текстового формату в формат дабл;
і тоді вже все по порядку.
Коли зробив так як у прикладі (наступні рядки переставив над syso...):
chyslo=Double.parseDouble(vvedenia);
suma=suma+chyslo;
то все запрацювало. Але не бачу логіки...(((
Поясніть будь ласка!
Дякую! ;)
П.С.: Уроки супер! ;)
У вашому випадку, в chyslo записується символ, який ви вводите. А коли натискаєте крапку, то крапка записується в chyslo, а chyslo типу дабл. Тобто, в дабл не можна записати крапку, тому вибиває помилка. А коли запис chyslo йде перед вводом, і ми вводимо крапку, то цикл зупиняється, тому що крапка дорівнює крапці. - Я теж пробував різні варіанти, і пробував, як ви. Думаю, що це через те, що написав вище.)
@@user-cj8gr6fo1l Так цикл і в першому випадку повинен зупинятися коли ви вводете крапку і крапка не повинна присвоюватися числу так як крапка=крапці, тобто цикл має зупинятися в любому випадку коли бачить крапку. Нічого не розумію(((
Не впевнений, але мабуть дана помилка виникає тому, що змінну vvedennya ми використовуємо як в умові, так і в тілі циклу while (при чому, в першій нас цікавить ця змінна як тип String, а в другому - тип double).
Тому якщо писати програму в такому порядку, як в автора коментаря:
vvedennya=scan.nextLine();
chyslo=Double.parseDouble(vvedennya);
то отримаємо наступне:
1) Scanner scan = new Scanner(System.in); //створення сканера
2) String vvedennya = "0.0"; //створення змінної vvedennya типу String і присвоєння їй значення 0
3) while(vvedennya.equals(".") != true) //коли ця умова виконується вперше, то значення змінної vvedennya ЗАВЖДИ дорівнює 0
4) vvedennya=scan.nextLine();
// вводимо з клавіатури рядок, сканер перетворює його в тип String (бо ми написали nextLine) і присвоює дане значення змінній vvedennya
5) chyslo=Double.parseDouble(vvedennya); // програма перетворює тип з String в double і присвоює це значення змінній chyslo... але НАЙВАЖЛИВІШЕ, що і сама змінна vvedennya перетворюється на тип double
6) більше змінної vvedennya в тілі циклу ми не використовуємо, і тому він (після останнього рядка тіла) повторюється знову, але тепер ми не можемо перевірити умови, яка вказана в 3) пункті... while(vvedennya.equals(".") != true)... тому що даний рядок хоче перевірити змінну vvedennya як тип String, а вона у нас вже типу double - тому і помилка
Якщо ж спочатку робити 5) пункт, а тоді 4) - як робив автор відео, то перший раз змінна chyslo (яке б число не ввів користувач) дорівнює 0 (вона це значення бере з пункту 2)) і лише після цього ми присвоюємо змінній vvedennya нове значення, яке ввів з клавіатури користувач (при чому теж типу String).
Після цього цикл while "заходить на друге коло" і перше що робить - перевіряє знову умову (тобто чи не ввели ми "на першому колі" [.]). Якщо не ввели, то те що ввели, він перетворює з типу String в тип double і присвоює змінній chyslo і так далі по серпантину.
Вибачаюсь за велику кількість тексту - не знав як простіше описати своє бачення))
+
Дивлюсь ваші уроки в 2023 р. але зараз вас ніде не видно як айті академію. Де ви поділися, що сталося? Дуже класні уроки!
Підписуйтесь на канал, всі уроки тут