1

Тема: Наближеність чисел

Завдання: дано натуральне число n, дійсне число k та послідовність дійсних чисел a1, a2, …, an. Знайти у заданій послідовності таке число, котре якомога наближене до числа k.
Розумію, що тут треба написати код, використовуючи епсилон і напевно треба прописати порівняння. Але не можу зрозуміти як..
Написала частину коду і хочу, щоб ви допомогли мені зрозуміти, який вираз треба дописати, щоб я могла закінчити написання програми і запустити її на відладку.. Завчасно дякую)
Та частина коду має такий вигляд:

#include <iostream>
#include <stdio.h>
int main()
{
    unsigned int i, n;
    double eps = 0.000000001, k, a;
    printf("k=");
    scanf_s("%lf", &k);
    printf("n=");
    scanf_s("%u", &n);
    
    for (i=1; i<=n; i++)
    {
        printf("a%u=", i);
        scanf_s("%f", &a);



}

В інтернеті знайшла, чому дорівнює епсилон, оскільки ми ще цього не вчили. Думаю, в коді треба цього значення

2

Re: Наближеність чисел

Ні, ви неправильно зрозуміли. Звісно, можете назвати якусь змінну "epsilon", але це вам нічого не дасть.
Спробуйте розв'язати цю задачу без програми, руками. Яке з чисел 1, 3, 8, 12 найближче до числа 7? Якщо ви бачите відповідь - спробуйте запрограмувати, як ви її шукали.
Що можу порадити - модуль числа (абсолютне значення) обчислює функція abs. Але ви, якщо знаєте базові речі в C++, маєте розв'язати задачу і без цього.
І ще - гляньте, як шукати мінімум (чи максимум) серед значень. Це теж має вам допомогти.

Подякували: Chemist-i1

3

Re: Наближеність чисел

про епсилон мені сказала моя викладачка з оп.. якщо взяти до уваги вашу задачку, то наближене значення до 7 можна обрахувати, якщо кожне значення з послідовності за допомогою abs віднімати від 7, а потім вичислити, яке значення найменше.. то число якраз і буде наближеним до 7, в нашому випадку це 8.. з вашої підказки про максимальне чи мінімальне значення я розумію, що мені треба робити якось так, як я зрозуміла вашу задачку... але тут питання.. я не можу зрозуміти, як тут прописати цей код.. можна ввести ще одну змінну "eps", тоді eps=k-a; min=eps; if (eps < min) min = eps; може це якось так?

4

Re: Наближеність чисел

аа.. я там забула дописати, що eps=abs(k)-abs(a).. там отак мало б обраховувати змінну

5

Re: Наближеність чисел

Ви що, намагаєтеся відгадати?

6

Re: Наближеність чисел

#include <iostream>
#include <stdio.h>
#include <locale>
int main()
{
    setlocale(LC_CTYPE, "ukr");
    unsigned int i, n;
    double eps, min, k, a;
    printf("k=");
    scanf_s("%lf", &k);
    printf("n=");
    scanf_s("%u", &n);
    for (i = 1; i <= n; i++)
    {
        printf("a%u=", i);
        scanf_s("%f", &a);
        eps = abs(k) - abs(a);
        min = eps;
        if (eps < min) min = eps;
        
    }
    printf("Чиcло, наближене до k = %lf", a);
    system("pause");        
    return 0;
}

Я зібрала разом все, що я зрозуміла і мій код вийшов таким.. але там в чомусь є помилка... помилка вибиває при виводі..

7

Re: Наближеність чисел

Помилка в тому, що ви не намагаєтеся сформулювати, що саме ви робите, а одразу пишете код. Причому мені здається, що ви гадки не маєте, що той код має робити, а просто берете шматки чужого коду (наприклад, показаного вам викладачем) і намагаєтеся навмання перекомбінувати, щоб вийшло, що вам треба. А так не виходить.

Давайте я вам запишу алгоритм, а ви його спробуєте запрограмувати, добре?
1. Ввести n та k
2. Проголосити змінну, в якій буде збережено поточний найкращий результат - min
3. Ввести перший елемент послідовності
4. Присвоїти min значення першого елементу послідовності (бо поки що ми не маємо кращих)
5. Ввести черговий елемент послідовності a
6. Порівняти, хто ближчий до k -  min чи a; якщо a більше підходить, присвоїти min значення a
7. Якщо послідовність не скінчилася, перейти на п.5
8. Оскільки ми порівняли всі елементи послідовності із поточним найкращим результатом, min і є відповіддю. Вивести його.

Будь ласка, не ставтеся до програмування як до магії, тут все досить просто, але треба чітко розуміти, що що означає.

Подякували: Akos_Bond1

8

Re: Наближеність чисел

https://en.cppreference.com/w/cpp/algorithm/lower_bound
Як варіант :)

9

Re: Наближеність чисел

За вашим алгоритмом в мене вийшов наступний код програми:

#include <iostream>
#include <stdio.h>
#include <locale>
int main()
{
    setlocale(LC_CTYPE, "ukr");
    unsigned int i, n;
    double k, a;
    printf("Введіть n=");
    scanf_s("%u", &n);
    printf("Введіть k=");
    scanf_s("%lf", &k);
    double min;
    printf("Ввести 1 число:");
    scanf_s("%lf", &a);
    min = a;
    for (i = 2; i <= n; i++)
    {
        printf("Ввести %i число: ", i);
        scanf_s("%lf", &a);
        if (a < min) min = a;
    }
    printf("Наближене значення: %lf", min);
    system("pause");        
    return 0;
}

Але виводить в результаті не те, що треба... наприклад, якщо я ввожу, що n=5, k=6, перше число=3, друге=5, третє=5.9, четверте=5.5, п'яте = 6, то ви водить, що наближене значення дорівнює 3.. я думаю, що помилилась у вичисленні значення, ближчого до k.. чи ні?

10

Re: Наближеність чисел

я думаю, що помилилась у вичисленні значення, ближчого до k

Абсолютна слушна думка.
Якщо у вас є два числа, x та y, як обчислити "відстань" між ними?

11

Re: Наближеність чисел

треба відняти і отримаємо відстань.. а що тут віднімати? k-m i k-n чи як?.. я вже тепер не можу тверезо оцінювати дану ситуацію..

12

Re: Наближеність чисел

Так, для початку - ви відстань між якими числами шукаєте?

13

Re: Наближеність чисел

я думаю, що шукаємо відстань від k до min, а потім від k до a.. і порівнюємо, яка відстань коротша.. я щось не можу зрозуміти, чого там в if умова в мене неправильна, в чому там помилка

Подякували: koala1

14

Re: Наближеність чисел

аа, я там зразу обчислюю, яка відстань коротша, хоча перед if треба напевно ще виразу, який буде обчислювати саму відстань

15

Re: Наближеність чисел

Абсолютно правильно про те, які саме відстані треба обчислити. Стосовно виразу - там можна і один вираз записати, можна і проміжну змінну, це виключно питання зручності. Але ви не відповіли на моє питання.

16

Re: Наближеність чисел

по вашій задачці, то між х та у, а що стосується мого коду, то (k-min)порівнюємо з (k-a) наскільки я розумію

17

Re: Наближеність чисел

Koala написав:

Якщо у вас є два числа, x та y, як обчислити "відстань" між ними?

Akos_Bond написав:

треба відняти і отримаємо відстань

Koala написав:

Але ви не відповіли на моє питання.

Вибачте, я некоректно сформулював. Ви не повністю відповіли на моє питання. Там не просто "відняти", і важливо розуміти, чому. Відстань не буває від'ємною.

18

Re: Наближеність чисел

відняти модулі чисел

19

Re: Наближеність чисел

тоді треба буде просто abs дописати, це не проблема.. але я чомусь не можу зрозуміти, як взагалі має виглядати така умова, там перед if треба ще одного виразу?

20

Re: Наближеність чисел

Ні, віднімання модулів вам нічого не дасть.
І на питання про вираз я вже відповідав.