Премини към съдържанието
FnTsTiC

Проблем с елементарна задача

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

    FnTsTiC    2

    Наскоро почнах да уча с++. Имам да направя една задача в която се въвеждат n на брой числа, 1<n<100, и всяко число е по-голямо от 1 и може да стига до 100000000000000000. След това трябва всяко число да се провери дали съдържа цифрите 1 и 3 в себе си, и ако ги има се проверява дали поне една единица стои отляво на поне една тройка. Примерно числото 1234 отговаря на изискванията, защото има 1 и 3, и 1 е отляво на 3. Програмата трябва да изведе броя на числата, от тези които са въведени, които отговарят на това условие. Това е което съм написал досега:

     

    #include <iostream>

    using namespace std;

    long long a[101];

    unsigned int n,otg=0;

    void funkciq (long long a)

    {

        unsigned int three=0,yes=0;

        while (a>9)

        {

            if ((a%10)==3) three=1;

            if (three=1 && a%10==1)

            {

                yes=1;

                break;

            }

            a/=10;

        }

        if (a==1 && three==1) yes=1;

        if (yes==1) otg++;

    }

    int main()

    {

        cin>>n;

        for (int i=0;i<n;i++)

        {

            cin>>a;

            funkciq(a);

        }

        cout<<otg<<endl;

        return 0;

    }

     

    Значи програмата взима всяко число и го дели на 10 в while цикъл. После проверява дали последната цифра е равна на 3. Ако е, то променливата three става равна на 1. После ако намери че последната цифра е равна на 1, проверява дали променливата three е равна на 1, и ако е значи числото отговаря на условието и променливата yes става равна на 1. След като свършат проверките върху даденото число, или бъдат break-нати, се проверява дали yes е равна на 1, и ако е то променливата за отговор otg се увеличава с 1. Само че по някаква причина променливата three не иска да стане равна на 1, дори и a%10 да бъде равно на 3. Тоест редът " if ((a%10)==3) three=1; " по някаква причина не работи както трябва и не знам защо?

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

    Сподели този отговор


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

    ined    3560

    Тука си го объркал и е обратното на това което казваш 

     if (three=1 && a%10==1)

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

    Сподели този отговор


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

    Мда, тука съм изпуснал единия знак за равно. Странно защо code blocks не ми дава никаква грешка като build-на програмата?

    Сподели този отговор


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

    Защото няма грешка - по синтаксиса на С++ си е съвсем допустим израз.

    Сподели този отговор


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

    Любопитно ми е, какво точно прави "  if (a=1) ... ; "

    когато има само един знак равно вместо два?


    Сподели този отговор


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

    Любопитно ми е, какво точно прави "  if (a=1) ... ; "

    когато има само един знак равно вместо два?

     

    В променливата "а" се записва стойност 1.

    За мен е безсмислено за тази операция да ползваш директно числени типове, аз бих използвал стринг. Така ще можеш да работиш с произволно дълго "число" и ще можеш да достъпваш отделните цифри без да има нужда да делиш с остатък и след това да делиш самото число на десет.

    Сподели този отговор


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

    Любопитно ми е, какво точно прави " if (a=1) ... ; "

    когато има само един знак равно вместо два?

    В променливата "а" се записва стойност 1.

    Не само това. По-лошо - след присвояването връща стойността на "a" като резултат - тъй като е едно, условието винаги ще е изпълнено.

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

    Сподели този отговор


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

    Да, условието е изпълнено. Компилаторът на Майкрософт не предупреждава.

    Сподели този отговор


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

    Да, условието е изпълнено. Компилаторът на Майкрософт не предупреждава.

    Това, че не са нагласени предупрежденията, си е проблем на съответния потребител.

    Сподели този отговор


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

    Това, че не са нагласени предупрежденията, си е проблем на съответния потребител.

     

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

     

    А и старите грешки не са проблем. Опита и паметта са в помощ. Проблема са новите не правени грешки, а там и да има предупреждение е възможно потребителя да не може да се възползва поради незнание. Май не съм прав. То дава и реда на който е предупреждението.

     

    Все пак по добре да има предупреждение

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

    Сподели този отговор


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

    MDA1s6d.jpg

     

    Ето как да си пуснете предупрежденията за подобни грешки във Visual Studio: дясно копче в/у C++ проекта -> Properties -> Code Analysis -> General -> Enable Code Analysis On Build.

    Сподели този отговор


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

    Регистрирайте се или влезете в профила си за да коментирате

    Трябва да имате регистрация за да може да коментирате това

    Регистрирайте се

    Създайте нова регистрация в нашия форум. Лесно е!

    Нова регистрация

    Вход

    Имате регистрация? Влезте от тук.

    Вход


    ×

    Информация

    Този сайт използва бисквитки (cookies), за най-доброто потребителско изживяване. С използването му, вие приемате нашите Условия за ползване.