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

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

Kaldata.com - Форуми

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

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

Добре дошли!

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

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

 

Задача на C++

Featured Replies

да бе ама не бяха два боя ами цели десет :) :) :)

Важното е да се учат нещата. А дано някой да разбере нещичко от тая тема :P

  • Отговори 63
  • Прегледи 9,4k
  • Създадено
  • Последен отговор

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

Tака е, но темите не са персонални, затова не се и трият след като се отговори. Много от тези, които търсят помощ тук, ще се изненадат много ако поразгледат в раздела назад. Естествено, те ако имаха мерак да търсят решения, щяха да се справят и сами с проблемите, вместо да пишат нови теми. Това важи за повечето раздели, не само за този. Та изказването ми беше с надежда че някой като го прочете ще разбере нещичко и за константите - в случая - правилно е да ползвате const, обаче не се изненадвайте, ако някои хора ползват, че дори и предпочитат #define за да си ги декларират.

Tака е, но темите не са персонални, затова не се и трият след като се отговори. Много от тези, които търсят помощ тук, ще се изненадат много ако поразгледат в раздела назад. Естествено, те ако имаха мерак да търсят решения, щяха да се справят и сами с проблемите, вместо да пишат нови теми. Това важи за повечето раздели, не само за този. Та изказването ми беше с надежда че някой като го прочете ще разбере нещичко и за константите - в случая - правилно е да ползвате const, обаче не се изненадвайте, ако някои хора ползват, че дори и предпочитат #define за да си ги декларират.

 

Аз мисля, че на уиндоус const е променлива, която се съхранява в секшън с флаг readable вдигнат и флаг writeable спуснат. В другите ОС май е нещо подобно.  define е декларация пред предпроцесора за промяна на значението на написаните символи. В смисъл предпроцесора като срещне определените символи, да ги замени с другитe символи, които са след интервала на define. И ако символите са число, се получава илюзията за константа. Ние всъщност не ползваме константата пи, а ползваме числото 3,14..., написано със символите PI примерно, но оставаме с илюзията, че ползваме константата пи. То не че има голяма разлика между илюзия и действителност в случая. Но има, при инструкциите на асемблер, които компилатора генерира, адресирането е различно.

Аз мисля, че на уиндоус const е променлива, която се съхранява в секшън с флаг readable вдигнат и флаг writeable спуснат. В другите ОС май е нещо подобно.  define е декларация пред предпроцесора за промяна на значението на написаните символи. В смисъл предпроцесора като срещне определените символи, да ги замени с другитe символи, които са след интервала на define. И ако символите са число, се получава илюзията за константа. Ние всъщност не ползваме константата пи, а ползваме числото 3,14..., написано със символите PI примерно, но оставаме с илюзията, че ползваме константата пи. То не че има голяма разлика между илюзия и действителност в случая. Но има, при инструкциите на асемблер, които компилатора генерира, адресирането е различно.

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

#include <iostream>
int main() {
    #define a 5          // вариант 1
    //const int a = 5;   // вариант 2
    //int a = 5;         // вариант 3
    std::cout << a + 3 << std::endl;
    return 0;
}

генерира абсолютно един и същи код при включени оптимизации (пробвано с gcc), независимо кой от трите реда е откоментиран. Просто компилаторът си вижда, че а не може да не е 5 и никъде другаде не се ползва съответно няма никакъв смисъл да прави секция за нея, независимо дали е константа или променлива. В асемблера пише направо 8, събирането става още при компилация. Преди няколко години правихме опит и даже корен квадратен си смяташе компилаторът, въпреки, че е през функция. По принцип, ако не успее да изоптимизира, например ако подаваш const по адрес към някаква външна функция, примерно библиотечна, наистина ще я постави в такава секция. Само че, какво мислиш, че става със стойност декларирана като #define в подобен (не можеш да я предаваш по адрес все пак) случай? Нали и тя трябва да се съхранява все някъде? Пак си има секция. Така, че обикновено за генерирания код има малка или никаква разлика (при правилна употреба естествено). Виж за програмиста има. const могат да се дефинират за определен блок или namespace, по този начин избягваш дублирания и контролираш употребата, притежават тип, със всичките предимства, които това ти дава, може да дефинираш константи от по-сложни структури и така нататък. #define ги нямат тия работи, но ако константата значи някаква генерална разлика - примерно версия на хардуера и т.н може да #ifdef-неш кои функции ти трябват и останалите изобщо да не се компилират.

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

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

#include <iostream>
int main() {
    #define a 5          // вариант 1
    //const int a = 5;   // вариант 2
    //int a = 5;         // вариант 3
    std::cout << a + 3 << std::endl;
    return 0;
}

генерира абсолютно един и същи код при включени оптимизации (пробвано с gcc), независимо кой от трите реда е откоментиран. Просто компилаторът си вижда, че а не може да не е 5 и никъде другаде не се ползва съответно няма никакъв смисъл да прави секция за нея, независимо дали е константа или променлива. В асемблера пише направо 8, събирането става още при компилация. Преди няколко години правихме опит и даже корен квадратен си смяташе компилаторът, въпреки, че е през функция. По принцип, ако не успее да изоптимизира, например ако подаваш const по адрес към някаква външна функция, примерно библиотечна, наистина ще я постави в такава секция. Само че, какво мислиш, че става със стойност декларирана като #define в подобен (не можеш да я предаваш по адрес все пак) случай? Нали и тя трябва да се съхранява все някъде? Пак си има секция. Така, че обикновено за генерирания код има малка или никаква разлика (при правилна употреба естествено). Виж за програмиста има. const могат да се дефинират за определен блок или namespace, по този начин избягваш дублирания и контролираш употребата, притежават тип, със всичките предимства, които това ти дава, може да дефинираш константи от по-сложни структури и така нататък. #define ги нямат тия работи, но ако константата значи някаква генерална разлика - примерно версия на хардуера и т.н може да #ifdef-неш кои функции ти трябват и останалите изобщо да не се компилират.

 

Не го разбирам това. Оптимизациите не са ми ясни. 

 

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

 

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

 

ПП

Писал съм програми на С де, но не бях чел хубави книги на български. Това за секциите го знам от флат асемблер. После и от спецификацията четох. За РЕ файловете.

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

Tака е, но темите не са персонални, затова не се и трият след като се отговори. Много от тези, които търсят помощ тук, ще се изненадат много ако поразгледат в раздела назад. Естествено, те ако имаха мерак да търсят решения, щяха да се справят и сами с проблемите, вместо да пишат нови теми. Това важи за повечето раздели, не само за този. Та изказването ми беше с надежда че някой като го прочете ще разбере нещичко и за константите - в случая - правилно е да ползвате const, обаче не се изненадвайте, ако някои хора ползват, че дори и предпочитат #define за да си ги декларират.

е в крайна сметка казахте същото кат мен фларе :)

define е малко като стрингова променлива но се ползва най вече за препоцесора та за тва не дава грешки  в кода

е в крайна сметка казахте същото кат мен фларе :)

Аз оспорих възражението ти, че константи "се декларират само с const". Ако беше казал "е по-правилно да се декларират с const" още отначало, нямаше да има спор - щото това е ясно. :D

бе то понякога така пиша че.......

абе важно е да научим колегите на нещо :) то С++ ми харесва много ама най тача джавата

бе то понякога така пиша че.......

абе важно е да научим колегите на нещо :) то С++ ми харесва много ама най тача джавата

Шегичка от "нашия" раздел тогава, с невероятната песен на The Crystal Method :D

P.S. Е, малко са игрите с такъв саундтрак като Need for Speed Underground.

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

  • 1 година по-късно...

А аз предпочитам да ползвам масиви

#include <iostream>

using namespace std;

int main(){
    
int n,x; 
    
    cin>>n;
    x=1;
    int F[n-1];
    
                F[0]=1;
               F[1]=1;
    
    
    while(x<n){
               x++;
                                  

               F[x]=F[x-1]+F[x-2];
               
               }
    cout<<F[n-1];
    
    system("pause");
    return 0;
}
 

преди 14 часа, Simeon Georgiev написа:

А аз предпочитам да ползвам масиви

Всеки има право на неправилни предпочитания и последствията от тях :D

преди 23 часа, Simeon Georgiev написа:

А аз предпочитам да ползвам масиви

....

И аз, ама използвайки ги не по този начин, виж последния пост от 1 страница на темата.

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

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

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

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

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

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

Дарение

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

Бюлетин

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

Профил

Навигация

Търсене

Търсене

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

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