21 Востаннє редагувалося koala (21.11.2019 10:48:54)

Re: Проблема з функцією

ur_naz написав:

Чи літали б ви літаком для якого ПЗ написано ось такими?

ur_naz написав:

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

Спершу нарікаєте, що код учня не відповідає вимогам до ПЗ літаків, а потім радите качати код з інтернету? Серйозно?

22

Re: Проблема з функцією

ur_naz написав:
koala написав:
grinyuk309 написав:

Мій перший код з функціями

ur_naz написав:

Це ж такий сором, бо тут навіть глибоких знань не треба

А тут ще жодних знань немає, це перша функція в житті людини.
І скажіть чесно: оцей ваш допис - він кому взагалі допоможе? Можливо, вам - відчути свою перевагу. Але без допису ви її і так відчували. І? Кому ще?

мені здається, ща просто глузувати з дурня не є етичним.
Але неможливо допомогти, якщо немає розуміння задачі, тобто структур даних і алгорітму.
я дав йому вірний заголовок функції, але він все одно продовжує своє.
Можна б було написати йому увесь код, але нащо? Чи літали б ви літаком для якого ПЗ написано ось такими?

Його біда в тому, що ві зразу взявся за написання коду і навіть не розібрав завдання. Тому він, як сліпе кошеня тикається об стіну. Якщо йому не забракло клепки скачати Visual Studio, тоді має вистачити розуму на розуміння нащо та функція is_prime і на те, щоб не видумувати велосипедів а взяти її з інету.

Я ще не вивчав буде ві змінні і не маю права виконувати лабораторну використовуючи тип bool, тепер вам стало зрозуміло чому я продовжую своє??

23

Re: Проблема з функцією

"Я ще не вивчав буде ві змінні і не маю права виконувати лабораторну використовуючи тип bool, тепер вам стало зрозуміло чому я продовжую своє??"

тоді ти не можеш виконати це завдання! Бо число може або бути простим, або не бути простим. Лише два значення в діапазоні, тобто треба використовувати саме тип bool.

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

На останок якби ти все ж пошукав в інтернеті, то знайшов би таке:
тип int можна використовувати як тип bool (0 = false, інше = true), тому функція is_prime може мати заголовок
int is_prime(int n);
але ніяк не float, бо спіймати 0 є нетривіальна задача.

далі
от твій код:

 printf("Введiть n=");
    scanf_s("%i", &n);
    for (int i = 1;i <= n;i++)
    {
        printf("Введiть a%d =", i);
        scanf_s("%d", &a);
    }

ти n  разів пишеш в змінну а і потім дивуєшся що

що функція застосовується тільки до останньої веденої "а"

в тебе каша в голові. ти те, що повинно бути в функції main, переніс в is_simple, тобто ти не розумієш взагалі, що відбувається в твоєму алгоритмі!
а повинно бути так:

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

виводимо суму простих поділену на кількість простих // середнє арифметичне

невже це так складно?

24

Re: Проблема з функцією

ur_naz, скажіть, ви давно почали програмування вчити? І що, одразу з C++? Так, вивчати програмування - це складно, особливо з поганим учителем і без нормальної літератури.

25

Re: Проблема з функцією

ur_naz написав:
koala написав:
grinyuk309 написав:

Мій перший код з функціями

ur_naz написав:

Це ж такий сором, бо тут навіть глибоких знань не треба

А тут ще жодних знань немає, це перша функція в житті людини.
І скажіть чесно: оцей ваш допис - він кому взагалі допоможе? Можливо, вам - відчути свою перевагу. Але без допису ви її і так відчували. І? Кому ще?

мені здається, ща просто глузувати з дурня не є етичним.
Але неможливо допомогти, якщо немає розуміння задачі, тобто структур даних і алгорітму.
я дав йому вірний заголовок функції, але він все одно продовжує своє.
Можна б було написати йому увесь код, але нащо? Чи літали б ви літаком для якого ПЗ написано ось такими?

Його біда в тому, що ві зразу взявся за написання коду і навіть не розібрав завдання. Тому він, як сліпе кошеня тикається об стіну. Якщо йому не забракло клепки скачати Visual Studio, тоді має вистачити розуму на розуміння нащо та функція is_prime і на те, щоб не видумувати велосипедів а взяти її з інету.

Я не вивчав булеві змінні і не маю права їх використовувати, тепер вам зрозуміло чому я продовжую своє, а не взяв вашу функцію?

26 Востаннє редагувалося wander (21.11.2019 11:41:33)

Re: Проблема з функцією

ur_naz написав:

Чи літали б ви літаком для якого ПЗ написано ось такими?

ur_naz написав:

щоб не видумувати велосипедів а взяти її з інету

Якби ось такі писали, то точно б не літав.
Але на щастя ПЗ для літаків пишуть розумні люди.

27

Re: Проблема з функцією

grinyuk309 написав:

Я не вивчав булеві змінні і не маю права їх використовувати, тепер вам зрозуміло чому я продовжую своє, а не взяв вашу функцію?

читай уважно пов. 23 там є все, що тобі потрібно

28

Re: Проблема з функцією

Koala написав:

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

(звідси)

29

Re: Проблема з функцією

ur_naz написав:
koala написав:
grinyuk309 написав:

Мій перший код з функціями

ur_naz написав:

Це ж такий сором, бо тут навіть глибоких знань не треба

А тут ще жодних знань немає, це перша функція в житті людини.
І скажіть чесно: оцей ваш допис - він кому взагалі допоможе? Можливо, вам - відчути свою перевагу. Але без допису ви її і так відчували. І? Кому ще?

мені здається, ща просто глузувати з дурня не є етичним.
Але неможливо допомогти, якщо немає розуміння задачі, тобто структур даних і алгорітму.
я дав йому вірний заголовок функції, але він все одно продовжує своє.
Можна б було написати йому увесь код, але нащо? Чи літали б ви літаком для якого ПЗ написано ось такими?

Його біда в тому, що ві зразу взявся за написання коду і навіть не розібрав завдання. Тому він, як сліпе кошеня тикається об стіну. Якщо йому не забракло клепки скачати Visual Studio, тоді має вистачити розуму на розуміння нащо та функція is_prime і на те, щоб не видумувати велосипедів а взяти її з інету.

Я не вивчав булеві змінні і не маю право поки що їх використовувати у лабораторних

30

Re: Проблема з функцією

grinyuk309 написав:

Я не вивчав булеві змінні і не маю право поки що їх використовувати у лабораторних

Ви вже 3 рази про це написали.
Це вам вчителька таке сказала ? "Не маєте права" ?
Якщо так, то вас ввели в оману, зверніться до юриста, він пояснить.

31

Re: Проблема з функцією

читай уважніше пов.23. І не треба повторювати одне й те ж тричі. вже і так зрозуміло, що булев тип ви не вивчали.

32

Re: Проблема з функцією

koala написав:

У мене таке враження, що ви неправильно сприймаєте поняття змінної в програмуванні. Змінна — це приблизно як шматочок дошки, де можна написати якесь число, а можна стерти та написати нове. Старі значення змінна не пам'ятає. Кожен scanf знищує попереднє значення.
І хто вам порадив використовувати static?

Я переробив все і получився такий результат, вроді рахує правильно, а ви що скажете?

#include "pch.h"
#include <iostream>
int is_simple(int x)
{
    int num = 0, k = 0;
    for (int i = 1;i <= x;i++)
    {
        int a, is_prime = 1;
        printf("Введiть a%i =", i);
        scanf_s("%i", &a);
        for (int j = 2;j < a;++j)
            if (a%j == 0)
                is_prime = 0;
        if (is_prime == 1)
        {
            k++;
            num += a;
        }
    }
    return num / k;
}    
int main()
{    
    unsigned int n,a;
    setlocale(LC_CTYPE, "ukr");
    printf("Введiть n=");
    scanf_s("%i", &n);    
    printf("Середнє арифметичне простих=%i",is_simple(n));
    return 0;
}

Результат:
Введiть n=5
Введiть a1 =3
Введiть a2 =5
Введiть a3 =7
Введiть a4 =6
Введiть a5 =3
Середнє арифметичне простих=4

33

Re: Проблема з функцією

leofun01 написав:
grinyuk309 написав:

Я не вивчав булеві змінні і не маю право поки що їх використовувати у лабораторних

Ви вже 3 рази про це написали.
Це вам вчителька таке сказала ? "Не маєте права" ?
Якщо так, то вас ввели в оману, зверніться до юриста, він пояснить.

Сорі в мене чомусь не оновлювалась дана тема і не було жодних повідомлень два дні, я думав, що в мене нічого не відправляється через проблеми з інтернетом, тому написав 3 рази, але зараз вже все впорядку

34

Re: Проблема з функцією

А тепер дивіться, як працює декомпозиція. Покроково:

int main()
{
    /*ввести кількість чисел*/
    for(/*ще треба вводити числа*/){
        /*ввести чергове число*/
        if(/*число просте*/)
        {
              /*збільшуємо суму і кількість*/
        }
    }
    /*вивести середнє = сума/кількість*/
}

Програма має працювати десь так, правильно?
Тепер уточнюємо:

#include<stdio.h> /* (1) */

int main()
{
    /*ввести кількість чисел*/
    int n;
    printf("n="); /*тут бачимо, що в нас немає stdio, повертаємося і дописуємо  (1) */
    scanf("%d",&n);

    float sum = 0.;               /* (2) */
    int primes_count = 0.;  /* (2) */


    for(int i=0; i<n /*ще треба вводити числа*/; i++){
        /*ввести чергове число*/
        int a;
        printf("a%i=",i);
        scanf("%d",&a);
        if(is_prime(a)==1) //цієї функції ще немає, але ми можемо уявити, що вона у нас є
        {
              /*збільшуємо суму і кількість*/
              /*ось тут помічаємо, що сума і кількість знадобляться нам після циклу; повертаємося на (2) і додаємо змінні*/
              sum += a;
              primes_count++;
        }
    }
    /*вивести середнє = сума/кількість*/
    printf("Answer: %f\n",sum/primes_count); 
}

Лишилася одна проблема: немає функції is_prime.

int is_prime(int x)/*визначає, чи є число x простим*/
{
    for(int i=2;i<=x/2;i++) /*якщо число більше за x/2, то на нього навряд чи поділиться, правда?*/
    {
        if(x%i==0) /*число точно не просте*/
        {
              return 0;
        }
    }
     return 1;/*якщо всередині циклу ми не вийшли з функції, то число просте*/
}

Мушу зізнатися, що я пішов на хитрість: проголосив sum як число з рухомою комою (float), а не ціле, щоб ділення в останньому рядку main було з рухомою комою, а не цілим. Ніби все правильно.

Загальна порада: не треба у функціях вводити і одразу обробляти числа. Ні, іноді доводиться і так робити, але краще робити саме так, як у мене: окремо вводимо і передаємо в функцію, що знаходить потрібні значення.

Подякували: ReAl, leofun01, grinyuk3093

35

Re: Проблема з функцією

ахха, в коали терпець увірвався *JOKINGLY*
лишилось задекларувати ту дивну функцію
та згадати про приведення типів і чому не треба його виконувати в циклі, а треба зробити лише раз, коли це потрібно...

printf("Answer: %f\n",sum/(float)primes_count); 

36

Re: Проблема з функцією

Серйозно? Тобто sum(a)/2 ділень у циклі - нормально, а n приведень - не треба?
Оптимізувати треба те, що час витрачає, а не побиратися по крихтах.

37

Re: Проблема з функцією

О(1) vs O(n) хммм...

int primes_count = 0.;  /* (2) */

:|

if(is_prime(a))

 Тобто sum(a)/2 ділень у циклі - нормально

поясніть, бо я зранку ще сплю

38

Re: Проблема з функцією

koala написав:
Koala написав:

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

(звідси)

Вав, я так подумав, що використання функціональної декомпозиції справді колосально допомагає в вирішенні задач,є тільки одне питання

 
float sum = 0.; //перший раз бачу таке, крапочки в кінці обов'язкові?
int primes_count = 0.;

39

Re: Проблема з функцією

grinyuk309 написав:
 
float sum = 0.; //перший раз бачу таке, крапочки в кінці обов'язкові?
int primes_count = 0.;

В другому випадку - ні, навпаки, це помилка, випадково лишилося. Я це все сходу писав і особливо не вивіряв.
Загалом тут таке: цілі числа (як int) і з рухомою комою (як float) представлені по-різному і їх треба перетворювати, це не миттєва операція (хоч і не така вже й дорога як порівнювати з множенням чи діленням), тому варто чітко розрізняти, де які числа.
Запис 0. означає те саме, що й .0, 0e0 і 0.0 - число з рухомою комою зі значенням нуль; ціле, очевидно, буде без крапки.
В принципі, компілятор перетворює літерали під час компіляції, тому програма в результаті від цього повільнішою не стане. Але щоб не плутатися, бажано писати літерали тих же типів, що й змінні:

int a = 10;//ціле
double f = 5.0;//чи 5.
unsigned int u = 20u;//так, тут теж є окремий спосіб запису
Подякували: leofun011