Премини към съдържанието
  • Добре дошли!

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

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

     

Помощ за задачи на C/C++ (merged)


TyRsEn
 Сподели

Препоръчан отговор

Не, хайде малко математика. Как от сума и брой дни ще получим дневна сума?

Хаха ами като разделим дните от сумата

Линк към коментара
Сподели в други сайтове

Хаха ами като разделим дните от сумата

добре. А какво ще стане ако разделим две цели числа, като по-малкото не е точен множител на голямото? Примерно 7 делено на 2

Линк към коментара
Сподели в други сайтове

добре. А какво ще стане ако разделим две цели числа, като по-малкото не е точен множител на голямото? Примерно 7 делено на 2

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

Линк към коментара
Сподели в други сайтове

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

Не. ключова дума: цели числа! Проверете в учебниците какво става при деленето

Линк към коментара
Сподели в други сайтове

Не. ключова дума: цели числа! Проверете в учебниците какво става при деленето

Добре,разбрах,че няма да ми помогнете,наистина ми е трудно,щяхте да ми помогнете да видя как става.Ако можех да отговоря на вс въпроси и сама щях да се справя :) Приятна вечер

Линк към коментара
Сподели в други сайтове

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

Ако сама не искате да си помогнете никой няма да може. http://www.l11cppint.hit.bg/ http://thecodeistrueorfalse.wordpress.com/2013/11/30/%D1%80%D0%B0%D0%B7%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%B0-%D0%BC%D0%B5%D0%B6%D0%B4%D1%83-%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BE-%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5/

Линк към коментара
Сподели в други сайтове

Не. ключова дума: цели числа! Проверете в учебниците какво става при деленето

Питаш я много странни неща, като това си е направо холивудска класика - в 9 от 10 филма парите са в размерност центове ( стотинки ) ,  а остатъка от деленето отива в сметката "и аз съм човек" примерно в  Office Space (1999)

Линк към коментара
Сподели в други сайтове

Питаш я много странни неща, като това си е направо холивудска класика - в 9 от 10 филма парите са в размерност центове ( стотинки ) ,  а остатъка от деленето отива в сметката "и аз съм човек" примерно в  Office Space (1999)

Във филмите е едно, в математиката и програмирането доста по-различно :)

Линк към коментара
Сподели в други сайтове

Здравейте! Скоро започнах да уча програмиране от учебника на ас. Бисерка Йовчева и  стигнах до следната задача:

Разполагаме с В1 банкноти по 1лв., В2 – по 2лв. и В5 – по 5лв. Да се състави програма MONEY.CPP, която въвежда от клавиатурата последователно броя на копюрите от всеки вид – B1, B2, B5 и сума Р, и извежда на екрана всички възможни начини, по които може да се представи сумата  Р лева с възможните банкноти.

Примерен вход

3 5 2 18 

Примерен изход 

0 4 2 

2 3 2  

3 5 1

 

Това е моето решение( На Code::Blocks):

 #include<iostream>

#include<iomanip>
 
using namespace std;
 
int main()
{
    int B1=1, B2=2, B5=5, P;
    cin>>P;
    for(B1=0; B1<=P/1;B1++)
        for(B2=0; B2<=P/2;B2++)
            for(B5=0; B5<=P/5;B5++)
    {
        if(B1*1 + B2*2 + B5*5 == P)
        cout<<setw(5)<<B1<<setw(5)<<B2<<setw(5)<<B5<<endl;
    }
    return 0;
}
 
Знам, че не ми я вярна задачата и ако може да ми дадете някакви насоки.Трябва аз да въведа трите вида банкноти, но по моя начин ми излизат всички възможни комбинации а не като в примера:

Примерен вход

3 5 2 18 

Примерен изход 

0 4 2 

2 3 2  

3 5 1

Потърсих в гуглето за да видя има ли я някъде решена, че да ми стане ясна, но не я намерих. В този форум търсих и тук я нямаше.
Благодаря предварително. :)
 
Линк към коментара
Сподели в други сайтове

Броя банкноти от всеки вид къде е?

 

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

#include<iostream>
 
using namespace std;

int main()
{
    int i, j, k, b1, b2, b5, P;
    cin>>b1>>b2>>b5;
    cin>>P;
    for(i=0; i<=b1; i++)
        for(j=0; j<=b2; j++)
            for(k=0; k<=b5; k++)
    {
        if(i + j*2 + k*5 == P)
        cout<<i<<' '<<j<<' '<<k<<endl;
    }
    return 0;
}
Редактирано от ined (преглед на промените)
Линк към коментара
Сподели в други сайтове

ined Респект БРАТО. Знам, че задачата не е кой знае какво, но ми станаха ясни някои работи. Надявам се някой ден да започна да мисля като програмист и аз да поствам решенията на задачите. :) Благодаря.
Линк към коментара
Сподели в други сайтове

Здравейте отново! :) 
Решавам следната задача:
Да се състави програма, която въвежда от клавиатурата последователност  от точки в равнината, зададени със своите координати и отпечатва координатите на тази от тях, която е най-близо до центъра на координатната система.
Да се коригира задачата така, че отпечатва боря на точките от I, II , III и IV квадрант.

Задачата  ми е перфектна и не виждам абсолютно никаква грешка, НО след като въведа 1 нула(или на "а" или "б") и тя спира !?!? Програмата трябва да спре при две въведени нули. Ако може някой да помогне и да ми каже къде бъркам. Програмата е написана на Code::Blocks. Благодаря предварително.

 

#include<iostream>
#include<math.h>
 
using namespace std;
 
int main()
{
    double a, b, XA, XB, I=0, II=0, III=0 , IV=0, abcisa=0 ,M=2000000, kvadratResult, PravougalnikResult ;
    while(a!=0 && b!=0)
    {
        cout<<" Vuvedete A: ";
        cin>>a;
        cout<<" Vuvedete B: ";
        cin>>b;
 
//----------------------------------------------------------------------------------------------
// IZ4ISLQWA V KOI KVADRANT SE NAMIRA TO4KATA
        if(a > 0 && b > 0 )
        {
            I++;
        }
        if(a < 0 && b > 0 )
        {
            II++;
        }
        if(a < 0 && b < 0 )
        {
            III++;
        }
        if(a > 0 && b < 0 )
        {
            IV++;
        }
        if(a==0 && ( b>0 || b<0))
        {
            abcisa++;
        }
        if(b==0 && ( a>0 || a<00))
        {
            abcisa++;
        }
//---------------------------------------------------------------------------------------------
      // POKAZWA NAI-BLIZKATA TO4KA DO CENTURA
        a = XA = fabs(a);
        b = XB = fabs(b);
        if(a==b)
        {
            kvadratResult  = a *  sqrt ( 2);
            if(kvadratResult < M )
            {
                    M=kvadratResult;
            }
        }
        if(a!=b)
        {
            PravougalnikResult = pow(a, 2) +  pow(b, 2);
            PravougalnikResult = sqrt(PravougalnikResult);
            if(PravougalnikResult<M)
            {
                M=PravougalnikResult;
            }
        }
    }
//----------------------------------------------------------------------------------------------
    cout<<" Kvadrant I: " << I<< endl;
    cout<<" Kvadrant II: " << II<< endl;
    cout<<" Kvadrant III: " << III<< endl;
    cout<<" Kvadrant IV: " << IV<< endl;
    cout<<" Na Abcisata: " <<abcisa<<endl;
    cout<<" Nai-blizko do centura: "<<M<<endl;
 
    return 0;
}
 
Линк към коментара
Сподели в други сайтове

Здрасти,

 

while(a!=0 && b!=0) -> докато А е различно от 0 или Б е различно от 0 -> с други думи щом едната стойност е 0 и излизаш от цикъла. Трябва да оправиш условието while(a!=0 && b!=0).

 

Поздрави!

Линк към коментара
Сподели в други сайтове

Здрасти,

 

while(a!=0 && b!=0) -> докато А е различно от 0 или Б е различно от 0 -> с други думи щом едната стойност е 0 и излизаш от цикъла. Трябва да оправиш условието while(a!=0 && b!=0).

 

Поздрави!

Е нали знака "&&" означава "И" а не "ИЛИ"? И мисля, че и така както съм го написал двете условия трябва да са изпълнени за да спре цикъла а не само едното.

 
 
 

&& OPERATOR (and)

a           b          a && b

true       true      true

true       false     false

false      true      false

false      false     false

 

Редактирано от Talic (преглед на промените)
Линк към коментара
Сподели в други сайтове

Извинявам се, не се изразих правилно.

 

while(a!=0 && b!=0) - Нека рагледаме случая А=0 и Б=4

a!=0 -> false

b!=0 -> true

 

тогава имаме (a!=0 && b!=0) -> (false && true) -> false и цикълът приключва

Линк към коментара
Сподели в други сайтове

Извинявам се, не се изразих правилно.

 

while(a!=0 && b!=0) - Нека рагледаме случая А=0 и Б=4

a!=0 -> false

b!=0 -> true

 

тогава имаме (a!=0 && b!=0) -> (false && true) -> false и цикълът приключва

 Прав си. :) смених го на while(a!=0 || b!=0)  и програмата върви без проблем. Благодаря за съдействието.

Линк към коментара
Сподели в други сайтове

 Прав си. :) смених го на while(a!=0 || b!=0)  и програмата върви без проблем. Благодаря за съдействието.

Това се получава, защото условието е когато И двете са различни от 0, тоест при (A=0 И Б=0) трябва да спре. Обърни внимание на скобите! За да спре при това условие, имаме вече !(A=0 И Б=0), което е равнозначно на a!=0 ИЛИ b!=0 -> a!=0 || b!=0

Линк към коментара
Сподели в други сайтове

Това се получава, защото условието е когато И двете са различни от 0, тоест при (A=0 И Б=0) трябва да спре. Обърни внимание на скобите! За да спре при това условие, имаме вече !(A=0 И Б=0), което е равнозначно на a!=0 ИЛИ b!=0 -> a!=0 || b!=0

 Явно пак ще трябва да се връщам в началото на учебника. Пак съм ги позабравил тея работи. Като бях написал while(a==0 && b==0) програмата директно спира и не ми даваше дори да въведа "A". И !(А==0 И Б==0) пак завива :)Благодаря пак за разяснението.

Редактирано от Talic (преглед на промените)
Линк към коментара
Сподели в други сайтове

  • 2 седмици по-късно...

Здравейте!Как да направя така, че индекс на масив да го присвоя на променлива.
Примерно:
От array[5] {0,1,2,3,4} не искам да присвоявам стойността на индекс 4 която е 3 а само индекс 4. Как става тоя номер да го ева, че не мога да намеря в нета.
Благодаря предварително. 

Линк към коментара
Сподели в други сайтове

Здравейте!Как да направя така, че индекс на масив да го присвоя на променлива.

Примерно:

От array[5] {0,1,2,3,4} не искам да присвоявам стойността на индекс 4 която е 3 а само индекс 4. Как става тоя номер да го ева, че не мога да намеря в нета.

Благодаря предварително. 

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

 

В противен случай отговора не е конкретен - искате да върнете индекс на масив, но с каква цел - намиране на позиция, връщане на референция ? И по - важно - по каква логика ?

- Да проверите, че масива има такъв индекс

- Да върнете индекс към дадена данна, в следствие на проверка за наличност или някаква друга логика.

 

Първия случай е нещо банално - правите метод с параметър съответния индекс и проверявате дали той е неотрицателно число, по - малко от дължината на проверявания масив:

...
int array_size = 100;
...

bool isValidIndex(int index) 
{
    return (index > -1) && (index < array_size);
}

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

int myArray[5] = {0,1,2,3,4};
int array_size = 5;
...

int doSomething(int targetData) 
{
    for (int i = 0; i < array_size; i++)
    {
        if (<CONDITION>) //myArray[i] <relation> targetData
        {
            return i;
        } 
    }
    return <CONSTANT_VALUE_FOR_NO_MATCH_CONDITION>;
}

<CONDITION> трябва да бъде израз/извикване на метод, връщащ тип, който може да се интерпретира правилно от условния оператор - bool, int и т.н. 

Това може да е израз от типа 

if (myArray[i] == targetData)
Или
if (myArray[i]) и т.н.

или резултат от извикването на метод.

 

Всичко зависи какво точно се опитвате да направите.

 

P.S. Стойността на данната в примерния масив, намираща се под индекс 4 си е 4. Индексите си вървят от 0 до size-1, докато позициите са си от 1 до size :).

Редактирано от soundtracker (преглед на промените)
Линк към коментара
Сподели в други сайтове

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

 

В противен случай отгорова не е конкретен - искате да върнете индекс на масив, но с каква цел - намиране на позиция, връщане на референция ? И по - важно - по каква логика ?

- Да проверите, че масива има такъв индекс

- Да върнете индекс към дадена данна, в следствие на проверка за наличност или някаква друга логика.

 

Първия случай е нещо банално - правите метод с параметър съответния индекс и проверявате дали той е неотрицателно число, по - малко от дължината на проверявания масив:

...
int array_size = 100;
...

bool isValidIndex(int index) 
{
    return (index > -1) && (index < array_size);
}

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

int myArray[5] = {0,1,2,3,4};
int array_size = 5;
...

int doSomething(int targetData) 
{
    for (int i = 0; i < array_size; i++)
    {
        if (<CONDITION>) //myArray[i] <relation> targetData
        {
            return i;
        } 
    }
    return <CONSTANT_VALUE_FOR_NO_MATCH_CONDITION>;
}

<CONDITION> трябва да бъде израз/извикване на метод, връщащ тип, който може да се интерпретира правилно от условния оператор - bool, int и т.н. 

Това може да е израз от типа 

if (myArray[i] == targetData)
Или
if (myArray[i]) и т.н.

или резултат от извикването на метод.

 

Всичко зависи какво точно се опитвате да направите.

 

P.S. Стойността на данната в примерния масив, намираща се под индекс 4 си е 4. Индексите си вървят от 0 до size-1, докато позициите са си от 1 до size :).

Благодаря за изчерпателния отговор, но явно не съм обяснил както трябва. :) Задачата ми е това:

б) отпечатва броя на платформите в масива. (платформа е последователност от равни елементи – в условието на задачата платформата може да бъде зададена като последователност от елементи, които изпълняват определено свойство);

в) отпечатва началния и крайния индекс на най-дългата платформа в масива;

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

 

int platforma(int a)
{
    int i, brPlat=0, N2=0, N1=0;
    for(i=0; i<=n-1; i++)
    if(A==A[i-1])
    {
        brPlat++;
    }

До тук стигам и не мога да разбера как да отпечатам началния и крайния индекс на най-дългата платформа в масива. Благодаря предварително и Благодаря пак за бързия отговор Soundtracker :) Моя е грешката, че не написах условието на задачата.

Линк към коментара
Сподели в други сайтове

така написано не отговаря изобщо на условието защото на практика не брои платформите, а и при i=0 излизаш от границите на масива с това a[i-1], 

Линк към коментара
Сподели в други сайтове

...

Значи обикновено когато се търси екстремум в някаква поредица трябват 2 (или 2 комплекта) работни променливи. Едната (да я наречем "временна") да държи текущо "изследваната" част, другата (да я наречем "резултат") да държи екстремума който до момента най-добре отговаря на условието. Ако стигнем до момент в който "временната" надмине "резултата" го подменяме с нея.

В случая трябва да съхраняваш 2 неща (начален и краен индекс или начален индекс и дължина - очевидно са аналогични) тоест ти трябват 2 комплекта от две променливи. Тъй и тъй дължината ни трябва - защото е условието, правиш си променливи временен_индекс, временна_дължина(в твоя код това е brPlat в момента), резултат_индекс, резултат_дължина.

Инициализираш ги - временната дължина на 1 - защото това е най-малката възможна, временния индекс на началния индекс на търсената зона от масива(и той 0 ако търсиш в целия), другите 0. И започва въртенето. Точно както си направил горе, докато два поредни елемента са еднакви, увеличаваш с 1 временната дължина. Трикът идва когато срещнем различен елемент. Тогава правиш следното. Проверяваш дали временната дължина е по-голяма от резултата - ако да, правиш резултатите равни на съответните временни. След което правиш временния индекс на текущо достигнатия (т.е. на брояча на цикъла обикновено) и временната дължина 1 - защото започваме нова поредица.

и това е. след края на цикъла ще имаш в резултатите индекса и дължината на най-голямата поредица. Ако има две еднакво дълги, в случая ще върнем първата, но условието ти не уточнява коя трябва. крайния индекс не мисля че трябва да ти обяснявам как да го намериш :)

Редактирано от flare (преглед на промените)
Линк към коментара
Сподели в други сайтове

 

Благодаря за изчерпателния отговор, но явно не съм обяснил както трябва. :) Задачата ми е това:

б) отпечатва броя на платформите в масива. (платформа е последователност от равни елементи – в условието на задачата платформата може да бъде зададена като последователност от елементи, които изпълняват определено свойство);

в) отпечатва началния и крайния индекс на най-дългата платформа в масива;

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

 

int platforma(int a)
{
    int i, brPlat=0, N2=0, N1=0;
    for(i=0; i<=n-1; i++)
    if(A==A[i-1])
    {
        brPlat++;
    }

До тук стигам и не мога да разбера как да отпечатам началния и крайния индекс на най-дългата платформа в масива. Благодаря предварително и Благодаря пак за бързия отговор Soundtracker :) Моя е грешката, че не написах условието на задачата.

 

За първата подточка, не е нужно да пазите и връщате индекси. Тъй като Вие искате на намерите броя на платформите, а не точно откъде до къде са те, можете спокойно да минете само с една променлива brPlat. Тогава алгоритъма Ви ще придобие следния вид:

countPlatforms(array, arraySize)
     set brPlat 0;
     for each i, i < arraySize - 1 do// Ще видите защо е до този индекс ...
           set currElem array[i]
           if currElem == array[i+1] then   //Поради това - не бихме искали да излезем от масива 
                   brPlat = brPlat + 1 
                   while currElem == array[i+1] && i < arraySize - 1 do
                        i = i + 1    //Пропусни всички елементи, които са равни.
                   end while
           else 
              i = i + 1 // Няма съседен равен елемент, премини на следващия.
           end if
     end for
     return brPlat
end

Нарочно маркирах в червено част от кода Ви, тъй като разписан по този начин, ще получите грешка още при първата проверка, когато се опитате да намерите елемента под индекс -1 в масива.

 

ЕДИТ: Колегата @ined ме изпревари и Ви написа проблема 2 поста по - нагоре.

 

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

 

За втората подточка, ще се наложи да се следят индекси. 

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

 

Като псевдокод, това ще прилича на следното:

printLongestPlatform (array, arraySize)
    set resultStartIndex = 0, resultEndIndex = 0, resultCount = 1 
    for each i from 0 to i < arraySize - 1 do
        set tempStartIndex = i, tempEndIndex = i, tempCount = 1
        set currElem = array[i]
        if currElem == array[i+1] then 
            while currElem == array[i+1] do
                tempCount = tempCount + 1
                i = i + 1
                tempEndIndex = i
            end while
        else
            i = i + 1
        end if
        if tempCount > resultCount then 
            resultCount = tempCount
            resultStartIndex = tempStartIndex
            resultEndIndex = tempEndIndex
        end if
    end for
    for each k between resultStartIndex and resultEndIndex (inclusive => k принадлежи на [resultStartIndex, resultEndIndex]) do
        cout << array[i] << " ";
    end for
end 

Тук важните моменти са, че в цикъла за "пропускане" на повторенията (while - цикъла), все пак следим броя на елементите и крайния индекс на платформата. Допълнението в края на метода ще провери дали текущо обработената платформа е по - голяма от тази, която досега сме намерили и ако да, то новата платформа ще бъде решението до момента. 

 

Следвайки мнението на колегата @flare, гореописания алгоритъм ще върне първата платформа, ако имаме няколко платформи с еднаква дължина. Ако условието изисква, алгоритъма може да се модифицира да връща или последната платформа или тази с най - голяма стойност на елементите, а с още допълнения по кода, може да се връщат всички платформи с еднаква максимална дължина.

 

Поздрави !

Редактирано от soundtracker (преглед на промените)
Линк към коментара
Сподели в други сайтове

Благодаря момчета за оказаното съдействие :) 
Написах кода:
 

//F-F------------------------------------------------------------------------------------
int broiPlatformi(int a)
{
    int i, brPlat=0, kurElement, b=0;
    for(i=0; i<n-1 ;i++)
    {
        kurElement=A[i];
        if(kurElement==A[i+1])
        {
            brPlat++;
            while(kurElement==A[i+1] && i < n-1)
            {
                i++;
            }
        }

    }
    cout<<brPlat<<endl; 
}
// F+F+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// F+F+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int naiGolqmaPlatforma(int a)
{
       int i,k, indexStart=0, indexEnd=0, resultCout=0,kurElement, tempStartindx,
       tempcout, tempEndindx;
         for(i=0;i<n-1;i++)
         {
            tempEndindx=i; tempStartindx=i; tempcout=1;
            kurElement=A[i];
            if(kurElement==A[i+1])
                while(kurElement==A[i+1])
            {
                tempcout++;
                i++;
                tempEndindx=i;
            }
            if(tempcout>resultCout)
            {
                resultCout=tempcout;
                indexStart=tempStartindx;
                indexEnd=tempEndindx;
            }

         }
         for(k=indexStart; k<=indexEnd; k++)
         cout<<"Nai-golqmata platforma se namira ot index N: " <<indexStart<<" do indexN: " << indexEnd<<endl;
}
//F-F--------------------------------------------

Функцията за платформата извежда първата най-голяма ако е повече от една. Сега сам ще се опитам последната точка от задачата да реша. :) 
Благодаря отново. Живи и здрави.
Поздрави!!!

Линк към коментара
Сподели в други сайтове

Добавете отговор

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

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.

 Сподели

×
×
  • Добави ново...

Информация

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