Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Задача на C++

Featured Replies

Привет! Имам затруднение със следната задача и ще се радвам някой да помогне, ако може.

Това е условието:

Първите две числа от ред на Фибоначи са 1 и 1. Всяко следващо число се образува като сума от предходните две числа. От клавиатурата се въвежда естествено число N. Да се състави цикличен алгоритъм за извеждане стойност на N-тото число от ред на Фибоначи.

А това е каквото измислихме с колегата, с който сме екип за курсовия проект, но нещо не се получава както трябва:

 

#include <iostream>
 
using namespace std;
 
int main()
{
    int a=1,b=1,c,N,i;
    do
    {
        cout<<"N(1..45)=";cin>>N;
    }
    while(N<1||N>45);
    if(N<3) cout<<"F("<<N<<")="<<1<<endl;
    else
    {
        for(i=3;i<=N;i++)
        {
            c=a+b;
            a=b;
            b=c;
        }
        cout<<"F("<<N<<")="<<c<<endl;
    }
    cout<<endl;
    return 0;
}
 
Благодаря предварително на отзовалите се.
  • Отговори 63
  • Прегледи 9,4k
  • Създадено
  • Последен отговор

А това е каквото измислихме с колегата, с който сме екип за курсовия проект, но нещо не се получава както трябва:

Ами и да бяхте казали, какво точно "не се получава както трябва"...

Според мен, програмата ще си работи.

Редактирано от flare (преглед на промените)

Ето така е правилно. Както сте го написали не е логично и няма как да тръгне.
 
#include <iostream>
 
using namespace std;
 
int main()
{
    int a,b,c,N,i;
    do
    {
        cout<<"N(1..45)=";cin>>N;
        if (N>=1&&N<=45)
        {
           a=1;
           b=1;
           if(N<3) cout<<"F("<<N<<")="<<1<<endl;
           else
           {
               for(i=3;i<=N;i++)
               {
                   c=a+b;
                   a=b;
                   b=c;
               }
               cout<<"F("<<N<<")="<<c<<endl;
            }
         }
         cout<<endl;
    }
    while (N>=1&&N<=45);
    return 0;
}

Редактирано от Реджеп Иведик (преглед на промените)

Както сте го написали не е логично и няма как да тръгне.

Мхм.

:lol6:

 

Редактирано от flare (преглед на промените)

 

Ето така е правилно. Както сте го написали не е логично и няма как да тръгне.
...

Т.е. смятате, че е логично една програма да работи постоянно до момента в който умишлено я "замърсим" с лоши данни и я потрошим с невалидни стойности ... 

 

Един вид, за да спра и сляза от колата, трябва да я блъсна в някоя стена или да причиня катастрофа, за да спре, че да мога да изскоча от нея ...

 

Нищо лично, но съм твърдо несъгласен с приложения от Вас код. Програмата си е доста праволинейна, за да се опитваме умишлено да я усложняваме или да я разписваме в достатъчно неприложима форма ...

Редактирано от soundtracker (преглед на промените)

Т.е. смятате, че е логично една програма да работи постоянно до момента в който умишлено я "замърсим" с лоши данни и я потрошим с невалидни стойности ... 

 

Един вид, за да спра и сляза от колата, трябва да я блъсна в някоя стена или да причиня катастрофа, за да спре, че да мога да изскоча от нея ...

 

Нищо лично, но съм твърдо несъгласен с приложения от Вас код. Програмата си е доста праволинейна, за да се опитваме умишлено да я усложняваме или да я разписваме в достатъчно неприложима форма ...

 

Вие пуснахте ли на компютъра програмите, за да разберете какво прави първата и какво прави втората ?

 

1. Колегата се е опитвал да декларира числа, които уж след това ще интерпретира като константи, но ги интерпретира като променливи, което е грешно

 

2. Освен това е оставил вън от цикъла "ду уайл" основните действия, които се изискват по условие и те въобще не се изпълняват.

 

3. В предложеният от мен код, програмата работи съгласно изискванията на условието, докато потребителят въвежда числа в затвореният интервал от 1 до 45, а в противен случай се излиза от програмата.

 

4. Потребителят може да излезе от програмата, или умишлено като въведе число извън интервала, или ако по погрешка въведе такова. 

Мхм.

:lol6:

 

 

Не разбирам подигравателното ви отношение. Кодът на колегата действително е нелогичен. Не може да се поставят извън тялото на цикъла основните действия, които следва да се извършат по условие. Освен това, обърнете внимание, че интерпретира някои стойности ту като константи, ту като променливи, което неминуемо води до грешки.

Вие сте погледнали доста повърхностно, за да не забележите очевидните грешки на съставителя на темата.

 

1. Не може да променяте стойности, които ще се използват като константи. Ако искате да ги променяте, трябва след това отново да ги инициализирате.

 

2. Не може това, което следва да се изпълни, да се поставя извън тялото на работният цикъл и да не се изпълнява въобще.

Вие пуснахте ли на компютъра програмите, за да разберете какво прави първата и какво прави втората ?

Да. Не, че е необходимо...

1. Колегата се е опитвал да декларира числа, които уж след това ще интерпретира като константи, но ги интерпретира като променливи, което е грешно

Глупости. В C++ си има пределно ясен синтаксис за деклариране на константи и също такъв за инициализиране на променливи по време на декларация. Останалото са твои измишльотини.

2. Освен това е оставил вън от цикъла "ду уайл" основните действия, които се изискват по условие и те въобще не се изпълняват.

Пак глупости. Цикълът do-while в горния код се ползва за валидация на входа и я върши перфектно. По условие трябва да се намери число на Фибоначи с цикъл, а не рекурсивно, което и става - във for-a.

3. В предложеният от мен код, програмата работи съгласно изискванията на условието, докато потребителят въвежда числа в затвореният интервал от 1 до 45, а в противен случай се излиза от програмата.

Никъде не пише, че потребителят трябва да въвежда числа многократно. "Цикличен алгоритъм" се отнася за метода за намиране на съответният елемент.

4. Потребителят може да излезе от програмата, или умишлено като въведе число извън интервала, или ако по погрешка въведе такова.

И как му го съобщаваш това?

 

Реджеп, сбъркал си раздела...

Редактирано от flare (преглед на промените)

Ами и да бяхте казали, какво точно "не се получава както трябва"...

Според мен, програмата ще си работи.

Програмата твърдо няма да си работи колега.

Вие не сте я пуснали на компютъра

@flare - за 1 мин ме изпревари :D.

 

Абсолютно съгласен с мнението на @flare, като ще допълня, че константите като замисъл не се въвеждат от потребителя.

Освен това, "цикличен" в случая е споменат, защото алгоритъма за намиране на N-тото число на Фибоначи има и рекурсивна реализация. И понеже тя е адски тромава и тежка, дори за неголеми N, условието допълнително подсказва да се подходи с итеративен алгоритъм. А не, че програмата ще цикли неопределено време, докато изчислява една камара числа на Фибоначи ...

 

P.S. Умишлено подчертавам и удебелявам реда, относно цикличността, защото ми се струва, че пак спора се върти около интерпретациите на думите ...

 

Поздрави !

 

 

Програмата твърдо няма да си работи колега.

Сериозно ?! Този приятел е на друго мнение ...

 

P.S. В полето "STDIN Input" въведете N и натиснете compile & execute ...

Редактирано от soundtracker (преглед на промените)

@flare - за 1 мин ме изпревари :D.

 

Абсолютно съгласен с мнението на @flare, като ще допълня, че константите като замисъл не се въвеждат от потребителя.

Освен това, "цикличен" в случая е споменат, защото алгоритъма за намиране на N-тото число на Фибоначи има и рекурсивна реализация. И понеже тя е адски тромава и тежка, дори за неголеми N, условието допълнително подсказва да се подходи с итеративен алгоритъм. А не, че програмата ще цикли неопределено време, докато изчислява една камара числа на Фибоначи ...

 

P.S. Умишлено подчертавам и удебелявам реда, относо цикличността, защото ми се струва, че пак спора се върти около интерпретациите на думите ...

 

Поздрави !

 

Ама колега, програмата на питащият изобщо не работи.

 

Тя само изисква да въведеш число, след което пак изисква да въведеш число. Тя просто не прави нищо. 

 

А ако се оформи така, че да прави нещо го прави грешно след първото въвеждане, тъй като променя стойностите на константите.

Автора на темата така и не каза какво точно "не се получава както трябва"

 

като я гледам програмата си работи само възниква въпроса:"Защо до 45?" В условието няма такова изискване, с 32 битови цели числа се покриват числата до N=46, а и нищо не пречи да се използват 64 битови числа без знак където ще се покрият по-големи стойностти на N.

Автора на темата така и не каза какво точно "не се получава както трябва"

 

като я гледам програмата си работи само възниква въпроса:"Защо до 45?" В условието няма такова изискване, с 32 битови цели числа се покриват числата до N=46, а и нищо не пречи да се използват 64 битови числа без знак където ще се покрият по-големи стойностти на N.

 

Програмата не работи ако се въведе число от 1 до 45 тя иска пак да се въведе число, тъй като логиката е сбъркана. Логиката за принадлежност и непринадлежност на интервала от 1 до 45 е сбъркана. 

 

Пуснете я на компютъра и ще видите

Разбрах какво казвате. Дори и да не се изисква цикъл, програмата пак е грешна, тъй като е сгрешена логиката за принадлежност. Обърната е. Трябва да се направи точно обратното за да тръгне.

Програмата не работи ако се въведе число от 1 до 45 тя иска пак да се въведе число, тъй като логиката е сбъркана. Логиката за принадлежност и непринадлежност на интервала от 1 до 45 е сбъркана. 

 

Пуснете я на компютъра и ще видите

Пробвахте ли да изпълните кода на запитващия на компилатора, който цитирах в последния си пост ? 

Освен това, Вие не казвате на каква среда сте постигнали този резултат и по какъв начин. При положение, че 3-ма човека получаваме едни и същи резултати, не мисля, че проблема ще е в "телевизорите" на всички ни.

Освен това, кода на запитващия е изпълняван на 2 OS платоформи и с различни компилатори. И резултата си е както се очаква - запитването за число е до момента, в който се въведе валидно N. 

 

EDIT: Условието за do/while цикъла си е правилно в кода, изначално приложен от запитващия, защото има смисъл на валидация - докато потребителя не въведе число между 1 и 45, цикъла ще иска пак да се въведе N. В случай, че се въведе число за N от 1 до 45, запитването за въвеждане приключва и работата продължава с изчислението на въпросното N-то число.

Редактирано от soundtracker (преглед на промените)

Ама колега, програмата на питащият изобщо не работи.

Тя само изисква да въведеш число, след което пак изисква да въведеш число. Тя просто не прави нищо.

А ако се оформи така, че да прави нещо го прави грешно след първото въвеждане, тъй като променя стойностите на константите.

Пак казвам сбъркал си раздела.
  • do-while ще повтаря, само докато въведеното число e по-малко от 1 или по-голямо от 45.
  • Това не са константи, а променливи В C++ константи се декларират с const или с #define.

Автора на темата така и не каза какво точно "не се получава както трябва"

като я гледам програмата си работи само възниква въпроса:"Защо до 45?" В условието няма такова изискване, с 32 битови цели числа се покриват числата до N=46, а и нищо не пречи да се използват 64 битови числа без знак където ще се покрият по-големи стойностти на N.

Не са се сетили вероятно :)

Програмата не работи ако се въведе число от 1 до 45 тя иска пак да се въведе число, тъй като логиката е сбъркана. Логиката за принадлежност и непринадлежност на интервала от 1 до 45 е сбъркана. 

 

Пуснете я на компютъра и ще видите

Разбрах какво казвате. Дори и да не се изисква цикъл, програмата пак е грешна, тъй като е сгрешена логиката за принадлежност. Обърната е. Трябва да се направи точно обратното за да тръгне.

Реджеп. За последно. Във втора поред тема те умолявам да помислиш, преди да спориш. За твое сведение, още веднага след като прегледах кода и реших, че ще работи, все пак я компилирах, да видя да не би някаква синтактична грешка да има. И едва тогава отговорих на човека.

А ти пусна ли я, че спориш? И как да не се изисква цикъл, за какво е тоя for там...

#include <iostream>
 
using namespace std;
 
int main()
{
    int a=1,b=1,c,N,i;
    do
    {
        cout<<"N(1..45)=";cin>>N;
    }
    while(N<1&&N>45);
    if(N<3) cout<<"F("<<N<<")="<<1<<endl;
    else
    {
        for(i=3;i<=N;i++)
        {
            c=a+b;
            a=b;
            b=c;
        }
        cout<<"F("<<N<<")="<<c<<endl;
    }
    cout<<endl;
    return 0;
}               

Ето това искате вие. Забелязвате ли разликата в логиката. Не е ор а е анд правилно и действително тръгва, но без цикъл. 

 

Ще го редактирам да е червено

 

Редактирах го. Там му е грешката на питащият.

 

Глупост написах, да не се брои

Редактирано от Реджеп Иведик (преглед на промените)

while(N<1&&N>45);

Уж беше последно... Кажи ми, о Реджеп, кое е това число което е едновременно по-малко от 1 и по-голямо от 45?

Тъй като въпросът е риторичен и тука стана близо 1 и половина след полунощ аз мисля да спя.

Редактирано от flare (преглед на промените)

Пак казвам сбъркал си раздела.

  • do-while ще повтаря, само докато въведеното число e по-малко от 1 или по-голямо от 45.
  • Това не са константи, а променливи В C++ константи се декларират с const или с #define.
Не са се сетили вероятно :)

Реджеп. За последно. Във втора поред тема те умолявам да помислиш, преди да спориш. За твое сведение, още веднага след като прегледах кода и реших, че ще работи, все пак я компилирах, да видя да не би някаква синтактична грешка да има. И едва тогава отговорих на човека.

А ти пусна ли я, че спориш? И как да не се изисква цикъл, за какво е тоя for там...

 

 

Ами пуснах я колега. Не работи. Дадох вече и къде му е грешката, по вашата интерпретация. Повдигнал съм я в червено.

 

Вие сте този, който не е проверил как работи програмата на компютъра.

...

Реджеп. За последно. Във втора поред тема те умолявам да помислиш, преди да спориш. За твое сведение, още веднага след като прегледах кода и реших, че ще работи, все пак я компилирах, да видя да не би някаква синтактична грешка да има. И едва тогава отговорих на човека.

А ти пусна ли я, че спориш? И как да не се изисква цикъл, за какво е тоя for там...

 

/OFF Един мой познат казваше така "Всеки може да спори ако знае че е прав ама аз най-обичам да споря когато знам че не съм прав, особенно ако успея и да убедя опонента си че той греши макар да знам че това не е така." 

 

Както вече се досетихте въпросния ми познат е с професия адвокат.

Уж беше последно... Кажи ми, о Реджеп, кое е това число което е едновременно по-малко от 1 и по-голямо от 45?

Тъй като въпросът е риторичен и тука стана близо 1 и половина след полунощ аз мисля да спя.

 

Прав си. Тук греша. Програмата прави това, което искате вие. Извинявам се.

 

Остава обаче въпросът какво иска питащият

Аз си помислих, че иска цикъл, и това, което предложих първият път си е коректно. Пак го тествах.

 

А ми остана в главата, че не работи, защото не зацикля докато се въвеждат числа в интервала.

/OFF Един мой познат казваше така "Всеки може да спори ако знае че е прав ама аз най-обичам да споря когато знам че не съм прав, особенно ако успея и да убедя опонента си че той греши макар да знам че това не е така." 

 

Както вече се досетихте въпросния ми познат е с професия адвокат.

 

Проблема е отношението на Флеър. Виждам, че сгреших на края, но защото се ядосах. Разбрах и какво имате предвид.

 

Но предложението ми не е лошо. Работи си. И е по удобно. С нищо не усложнявам нещата. Има само едно повторение на проверката, което не се сетих как да избегна без да използвам оператора "goto"

Редактирано от Реджеп Иведик (преглед на промените)

Ами пуснах я колега. Не работи. Дадох вече и къде му е грешката, по вашата интерпретация. Повдигнал съм я в червено.

 

Вие сте този, който не е проверил как работи програмата на компютъра.

Изпуснал съм темата, но започвайки да чета - първото нещо беше да копирам кода от първия пост в CodeBlocks. Еми - тръгна си от раз.

 

И аз се чудя - какво точно пита питащия?

Изпуснал съм темата, но започвайки да чета - първото нещо беше да копирам кода от първия пост в CodeBlocks. Еми - тръгна си от раз.

 

И аз се чудя - какво точно пита питащия?

 

Работи. Ако се иска това. Не съм очаквал, че може да е толкова лесно. Това за кой курс е ?

 

 

Сега пък било лесно, ми айде да го усложним тогава малко. Същото условие но N да е от 1 до 1000.

Ми кво - махам проверката за диапазона и си смята.

дали? Това че е голямо не значи, че не може да се сметне.

#include <iostream>
#include <iomanip>
 
#define MIL 1000000000000000000ull  // 10^18
#define MX 15
 
using namespace std;
 
unsigned long long a[MX], b[MX]={0}, c[MX];
int ix;
 
void fibb() {
     unsigned long long op=0;
     for (int i=0; i<ix; i++) {
         c[i]=a[i]+b[i]+op;
         if (c[i]>MIL) { op=1; c[i]-=MIL;}
         else op=0;
     }
     if (op) {
         c[ix]=1;
         ix++;
     }
     for (int i=0; i<ix; i++) {
         a[i]=b[i];
         b[i]=c[i];
     }
}
 
void printf() {
     cout<<c[ix-1];
     if (ix>1) {
         cout<<setfill('0');
         for (int i=ix-2; i>=0; i--) 
             cout<<setw(18)<<c[i];
         cout<<setfill(' ');
     }
}
 
int main()
{
    int N;
    
    a[0]=1;
    b[0]=1;
    ix=1;
    
    do {
        cout<<"N(1..1000)=";
        cin>>N;
    }
    while(N<1||N>1000);
    
    if(N<3) cout<<"F("<<N<<") = 1";
    else {
        for(int i=3;i<=N;i++) fibb();
        cout<<endl<<"F("<<N<<")=";
        printf();
    }
    cout<<endl;
    system("pause");
    return 0;
}

Редактирано от ined (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.