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

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

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

     

Някой който знае C++ да ми помогне да разбера този код?


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


Цитат

 int power(int baseNum, int powNum) {

      int result = 1;

      for(int i = 0; i < powNum; i++) {

       result = result * baseNum

     }
 
     return result;

     }

     int main()

    {

    cout <<power(2 , 3);

     return 0;
 

Кода е от ТОВА видео.

 

Какво точно се случва в Loopa?

Ако може някой да напише транскрипт на луповете.

Не мога да разбера от къде решава да вземе int result = 1 (ред 2),

после защо решава да е int i = 0, а не int i = 1 например?

Във видеото когато казва "Let's break it" казва, че на първия лууп резултата е едно.

Цитат

 

Обаче 1-ви лууп е 0.

Втори лууп е 1.

Трети лууп е 2.

И после става 3 < 3 и тук излиза от лууп.

 

Нали така?

Забих на този лууп и колкото и да го мисля и се мъча да разбера как точно стават изчисленията (  result = result * baseNum ) за да стигне до 8, не мога да си го обесня.

П.С: Точно започнах да уча C++ или по-скоро искам да разбера как работи.

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

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

В цикъла той никъде не ползва стойността на i, която определя само колко пъти ще се изпълни. А иначе при самото изпълнение, всеки път умножава result по baseNum като му презаписва стойността. Да кажем, ако result = 5 преди да влезе в цикъла (той от примера му е задал 1, ама аз си измилсям 5 за по-ясно пресмятане.), после 3 пъти цикли като на всеки цикъл умножава по две (примерно), става така:

baseNum = 5 умножено по 2 = 10. Понеже е дал, че си презаписва стойността, "result = result * baseNum", за втория цикъл вече ще е 10 по 2 = 20, за третия 20 по 2 и след цикъла, ако му трябва стойността, ще е 40.

преди 1 час, MisterDimchev написа:

после защо решава да е int i = 0, а не int i = 1 например?

Дава пример. Цикълът има начало и край. Конкретно for цикълът, де. Може и да не е нула, -5, или 7, или - 200 и т.н. и съответно powNum е променлива (интиджър). Та, ще цикли от тази променлива докато не стигне до зададеното за стойност i.  В смисъл, като пишеш цикъла трябва да знаеш колко пъти ти трябва да цикли. Ако му зададеш i = 5,i < powNum (да кажем има стойност 10, ще цикли 5 пъти. Ако му зададеш <= powNum, ще цикли 6 пъти.

Има вариянт да ползва i в пресмятания в цикъла, да кажем ако иска да променя стойност. да намалява и т.н. със стойността на всеки цикъл (1). Ама не е задължително. Вътре в цикъла може да си правиш каквото искаш според броя пъти които ще се "завърти".

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

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

Ето и книга на български език.

 

 

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

В случая с powNum = 0 изобщо няма да влезеш в цикъла (тъй като още отначало няма да се изпълни условието i < powNum). Объркването може да идва от там, че се презаписва една и съща променлива.

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

baseNum = 5 умножено по 2 = 10. Понеже е дал, че си презаписва стойността, "result = result * baseNum", за втория цикъл вече ще е 10 по 2 = 20, за третия 20 по 2 и след цикъла, ако му трябва стойността, ще е 40.

Много ти благодаря за подробното обяснение.

Само, защо baseNum = 5 умножено по 2 = 10 ? Не  трябва ли да е result  = 5 (result от 2-рия ред на кода) x 2 (baseNum) ?

baseNum не е ли винаги 2 (непроменливо)?

Не ми беше ясно, че си презаписва стойността.

И мерси за софтуни и книгата. Ще гледам тея видеа на Софтуни. 

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

 

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

Само, защо baseNum = 5 умножено по 2 = 10 ? Не  трябва ли да е result  = 5 (result от 2-рия ред на кода) x 2 (baseNum) ?

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


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

1 по число е него. Затова result=1.  Искаме например 2 на 3-та степен.
2*1=2^1 Записваме Result=2
След това Result=Result*2
Записваме 4 в result.
Правим трета обиколка. Result=Result*2
Става 8.
2^3=8
Връщаме 8. Защото Basenum=i, което е брояча във For цикъла
Много неефективен алгоритъм между другото. И в C++ има функция pow, която прави това
Освен това функцията е тъпа. Поне result да беше float, а не int.
С int може да прави степени само на цели числа.

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

Благодаря на всички за помощта! 

Един от недостатъците на тези Видео уроци е, че не можеш да питаш.

Радвам се, че тук има толкова знаещи хора. 

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

Каква е изобщо ползата от тези видео уроци ако след това няколко човека трябва да ти ги обяснява ред по ред?

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

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

 

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

Каква е изобщо ползата от тези видео уроци ако след това няколко човека трябва да ти ги обяснява ред по ред?

От 4 часа видео къде видя ред по ред да ми се обеснява?

И някой да те  е карал насила да ми обесняваш нещо?

Тук до колкото знам е по желание и за щастие има добри хора които помагат.

Целта е да се научиш, а където нещо не разбреш, да попиташ някой който знае повече от теб. Или ти си от родените научени?

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

Тъжна история.

Една тема имаше в която хората помагат и пак да се появи един интернет катаклизъм да развали цялата история...

преди 1 час, Raze написа:

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

 

Благодаря за съвета. 

Аз просто исках да видя как работят нещата при C++ и да науча основите. 

За да мога да правя упражнения нали все пак трябва да знам основните неща как работят.

Като цяло Видео уроците обесняват по-добре от книгите. Особенно от преведени книги, поне на мен от тях ми е трудно да ги разбирам. Предпочитам на английски.

 

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

Без самото начало структура на данни и така нататък, като нямаш основа, няма как да научиш останалите неща. Мисля, че тези книги ги има преведени и на английски. А и щом разбираш английски, по-добре търси това, което не знаеш, в гугъл, в повечето случаи на над 90% от въпросите ще си намериш отговорите, стига да знаеш точно как да ги търсиш. По същия начин търсиш и грешките при компилиране/работа и така нататък.

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

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

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

 

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

Тук не е за запълване на празно време и избиване на комплекси. 

За жалост точно в това се е превърнало. Всяка тема и всеки раздел има по няколко такива паразита които само спамят.

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

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

 

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

Решението е лесно: Админите да разкарат Спамърите като видят, че пишят само празни приказки в теми където не им е мястото.

Аз като не знам нещо и не мога да помогна, не пиша.

Още по-малко да съм толкова нищожно същество за да пиша на някой, само за да го засегна.

Както и да е. И тука става спам. Нека спрем. Ако някой има да добави нещо по темата да пише. 

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

. Ако някой има да добави нещо по темата да пише. 

Има. Помисли защо програмата, която си дал за пример е накадърна и за структура на данните. Функцията e int и връща целочислена стойност.
Аргументите й също са тип int. По този начин ако напиша 3.5 на степен 5-та, то ще ми го закръгли в най-добрия случай на 3 и ще ми даде грешен резултат.
Когато правиш нещо на C, задаваш правилния тип данни. int е целочислено число. float е с плаваща запетая. Виж, Java и още повече JavaScript са слабо типизирани езици с автоматично преобразуване на типа. Там декларираш, па каквото му подадеш то избира как да го разбира.
C++ се учи така:
1. Типове данни
2. Логически оператори
3. Декларация и инициализация
4. namespace std; - що е то;
5. Указатели;
6. Цикли
7. Итерации
8. Изброявания, структури
9. ifstream и ofstream
10. Operator overload
11. Stack и heap.
12. Динамична памет. Създаване и унищожаване на обекти.
13. Класове. Потребителски структури от данни.

Това е базата. Но чисто практически не ти стига за почти нищо. Трябва да хванеш след това алгоритми - търсене, сортиране, определяне на сложност на алгоритъма и относително време за изпълнение. Ако смяташ да го работиш, има толкова много работа, докато го можеш, че по-добре си хвани някой HTML, PHP и JavaScript. Или C#

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

Рано е още да търся проблемите сам (по-скоро да търся по-добър код).

Да, аз по принцип JavaScript и React мислех да изуча и все още мисля в най-близко бъдеще да ги започна, понеже са доста по-лесни за научаване според много хора и сайтове където съм чел. Имам и доста добри видео курсове от платени сайтове. Ще видя там как ще се получи.

C++ исках да го науча или понауча за Джейбрейк туикове (от там може би и приложения, въпреки, че с Реакт за Web приложения е по-лесно до колкото съм чел). 

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

Но C++ ми допада. 

Знам, че имам много да уча, ако искам да е професионално. Както казах аз 1 ден сам му обърнал внимание и честно казано съм доволен и изненадан колко много разбрах, при положение, че до преди 1 ден идея си нямах като гледах код, кое какво е, сега по отнякъде го разбирам. И разбирам как работят някой неща. За мен не е малко. А за напред ще видим.

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

Само от любопитство, нещо такова?

Цитат
  1. #include <iostream>  
  2. #include<cmath>  
  3. using namespace std;  
  4. int main()  
  5. {  
  6. int base=2;  
  7.   int exponent=3;  
  8.   int power=pow(base,exponent);  
  9.   std::cout << "Power of a given number is :" <<power;  
  10.   return 0;  

 

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

Само от любопитство, нещо такова?

Първо... std::cout  e безсмислено, ако използваш преди това директивата namespace std. Пространствата от имена ти дават възможност да декларираш едни и същи по име функции, но различни като съдържание. Една променлива можеш да я използваш в 1 пространство само 1 път. В случая cout e обект, клас в пространството std. Да викаш функция или обект с пълно квалифицирано име, посочвайки пространство от имена е необходимо само когато не работиш в пространството, например не си декларирал в началото, че ще ползваш namespace std. Съответно компилатора без да му подадеш std:: няма да знае какво е cout и къде да го търси.
Второто е, че функция чиито параметри задаваш предварително е безсмислена. Хайде сега използвай един cin и й подай параметри.
Третото - променлива винаги се инициализира със стойност 0. Да декларираш променлива и после да я инициализираш може и няма проблем чисто технически. Практически променливата се записва в адрес в паметта, който е според типа й. Само че на него не знаеш какво може да имало преди това и каква случайна стойност е имало. Винаги е хубаво преди употреба всичко да се инициализира с 0. Искаш да пишеш върху изчистена дъска, не да пишеш върху драсканото от някой друг, нали? А за джейлбрейк на телефони наистина ще ти трябва доста повече от базовото ниво.

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

Както казах, стъпка по стъпка...

Първо ще е добре да се върна на начален етап и от там нагоре вече.

Мерси за всички разяснения. От такива хора имат нужда тея форуми, не от онези които те отчайват, спамят, искат да покажат, че те знаят, а ти си тъп, дори без да покажат, че наистина знаят (в почето случаи едва ли е така). Ще видим докъде ще я докараме.

cin нали е точно както казваш за подаване на параметри (ръчно от човека). При положение, че имаме base и exponent зададени, защо ще са ни нужни да ги въвеждаме?

За последно, ако можеш да напишеш как ще е по-добре, поне да ги сравня и да видя как вървят нещата. Сам едва ли ще го направя в близките дни. 

 

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

cin нали е точно както казваш за подаване на параметри (ръчно от човека). При положение, че имаме base и exponent зададени, защо ще са ни нужни да ги въвеждаме

В реалния свят никога няма да имаш програма с функции, чиито параметри си набил ръчно преди това като си декларирал променливи и си ги инициализирал.
Или ще вземаш от потребителя или дори да имаш някакви начални стойности за някои, повечето ще работят с динамично подавана информация  от други функции чрез return. A някои ще са void. Само ще изобразяват резултат, без да връщат в променлива нищо.
Затова ти казах да пишеш cin. Да свикваш, че програмата е взаимодействие с потребителя.
Не знам какво искаш да сравняваш, последната част не я разбрах от въпроса ти. Утре ще я погледна.
Щом искаш да учиш, не си тъп. И да кажа, че програмирането не ми е основно занимание в момента и съм се занимавал с embedded C/C++ За gui не ме питай, а микро устройстват нямат голям капацитет. Там пестиш памет и не използваш много заемащи време и място функции - оскъдно е времето и мястото.

Линк към този отговор
Сподели в други сайтове
на 26.06.2020 г. в 11:51, MisterDimchev написа:

Не мога да разбера от къде решава да вземе int result = 1 (ред 2),

Задава се стойност 1, за да се спести някой и друг ред за проверка за случая когато powNum = 0. Т.е. всяко число повдигнато на нулева степен = 1.

Та когато powNum = 0 не се изпълнява реда result = result * baseNum  и се връща направо стойността на result, а тя е 1.

П.П. Много ми харесват такива "дребни" хитрости. Не че в случая ще се спестят 1-2 реда код, но че може да се направи и става много елегантно, и е направено.

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

Задава се стойност 1, за да се спести някой и друг ред за проверка за случая когато powNum = 0. Т.е. всяко число повдигнато на нулева степен = 1.

Та когато powNum = 0 не се изпълнява реда result = result * baseNum  и се връща направо стойността на result, а тя е 1.

П.П. Много ми харесват такива "дребни" хитрости. Не че в случая ще се спестят 1-2 реда код, но че може да се направи и става много елегантно, и е направено.

Ей в такива случаи още една променлива със значещо име може да ти спести тези обяснения. Константа, да се казва примерно zeroPowerResult, и така на кодът му е една идея по-лесно сам да се обясни без коментари.

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

В случая чрез result = 1 се постигат 2 неща. Едното е което описах по-горе при powNum = 0 и второто е за правилно първоначално изпълнение на реда result = result * baseNum.

Ако result не е 1, то няма да се получи верен резултат при първото изпъланение на result = result * baseNum.

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

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

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

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

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

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

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

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

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

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

Информация

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