Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Problem] funkcja


Rekomendowane odpowiedzi

Opublikowano

#include <iostream>

#include <conio.h>

using namespace std;

 

int potega2()

{int npotega2 = 0;

for (int i = 1; i <= 10; i *=2)

npotega2 += i;

return npotega2;

}

 

int main()

{

cout << "POTEGA DWOJKI" << endl;

cout << potega2 ;

getch();

return 0;

 

}

 

 

powie mi ktoś co jest nie tak?

Opublikowano

Funkcja zawsze kończy się nawiasem okrągłym.


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

Funkcja zawsze kończy się nawiasem okrągłym.

nie bardzo rozumiem -,- mógłbyś powiedzieć w którym miejscu mam dokonać zmiany?

 

dodam że program się kompiluje ale potem zamiast potęg liczby 2, otrzymuję jedynie "1"...

Opublikowano

masz funkcję potega2, więc żeby ją wywołać wpisz potega2();

tak?

 

#include <iostream>
#include <conio.h>
using namespace std;
int potega2()
{int npotega2 = 0;
for (int i = 1; i <= 10; i *=2)
npotega2 += i;
return npotega2;
}
int main()
{
cout << "POTEGA DWOJKI" << endl;
potega2();
getch();
return 0;
}
coś nie gra dalej, może jest jakiś błąd przy pętli for?
Opublikowano

nie bardzo rozumiem -,- mógłbyś powiedzieć w którym miejscu mam dokonać zmiany?

 

Nie myślisz, nie lubie podawać gotowego kodu, chyba że ktoś mi płaci.

 

Chodzi mi o to, że potega2() to funkcja, a jak każda funkcja jest identyfikowana poprzez nawias okrągły "()". Po prostu zapomniałeś tego nawiasu dodać przy wywołaniu funkcji, już powinieneś się sam domyślić, chyba że naprawdę nie włączasz myślenia.


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

Nie myślisz, nie lubie podawać gotowego kodu, chyba że ktoś mi płaci.

 

Chodzi mi o to, że potega2() to funkcja, a jak każda funkcja jest identyfikowana poprzez nawias okrągły "()". Po prostu zapomniałeś tego nawiasu dodać przy wywołaniu funkcji, już powinieneś się sam domyślić, chyba że naprawdę nie włączasz myślenia.

tak, to rozumiem i dzięki ;)

ale nie wiem co jest błędnego jeśli chodzi o pętle...

Opublikowano

A tak btw co ma robić ten program? Potęga2 mówi mi mówi naprawdę niewiele.


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano
Opublikowano

To chyba kompletnie źle to robisz, bo wynik wypisze sie tylko raz.

Można to zrobić na kilka sposobów.

 

Najlepszym(najprostszym) będzie uczynić zmienną npotega2 statyczną (dodać static przed int) z wartością 1, pomnożyć (*=) przez 2 i zwrócić ją, a później w programie głównym tyle razy ją wykonać, ile się chce.

 

Dodam tylko tyle, że zmienne statyczne w funkcjach zachowują swoją wartość, więc bez obaw :).


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

Więc tak ... widzę , że jestes początkującym programistą ... nie będe ci tu prawił kazań ani żądać od ciebie pieniędzy jak niektórzy lubią,

jest to żałośne jeśli chodzi o problemy tego typu i fakt że to forum po to jest.

Nie jestem zwolennikiem gotowców jednak skoro się uczysz to już inna sprawa czasami łatwiej się nauczyć patrząc na przykład.

Widząc twój kod stwierdziłem ,że za dużo kombinujesz.

Błyskotliwość najlepiej się ujawnia w potrzebie. Jeśli tak owej nie ma lepiej zrobić to prosto .Skoro chodzi ci o wyplucie potęgi liczby dwa to spójż na to

Tym prostym kodem możesz ustawić sobie ile razy ma ci wywołać potęgę możesz ustawić zakres itd. Czyż nie prościej ???

Powodzenia ...

 

#include <iostream>
#include <conio.h>
using namespace std;
int potega2()
{
double a = 1;
    // i symbolizuje numer potęgi
    for(int i =0;i <= 10; i +=1)
    {
        
        //Jesli potega jest 0 to wypluwa 1
        if(i==0)
        {
            cout<< 1 <<endl;   
        }
        else
        {
            //no a tu jesli skonczyles podstawowke to wiesz o co lata
            a *= 2;
            cout << a << endl;
        }    
    }  
}
int main()
{
    //wyrzucamy nazwe by bylo wiadomo o co chodzi
    cout << "POTEGA DWOJKI" << endl;
    //wykonujemy funkcje,mozna by to zamieścic tu ale porzadek musi byc
    potega2();
    //stosujemy funkcje getch() poniewarz programy zwykle są zamykac sie po skonczeniu operacjii
    getch();
}
 

-Jestem habilitowanym profesorem,magistrem, który nie umie zawiązać sobie butów.

-A ja jestem technikiem który daje ci prace.

Opublikowano

Po co dodajesz 2 razy nagłówek iostream? I dlaczego używasz zmiennych globalnych jako argumentów funkcji? Nie lepiej ją po prostu wrzucić do środka funkcji jako zmienna statyczna?

#include <iostream>
#include <conio.h>
using namespace std;
int potega2()
{
    static int potega = 1;
    return potega*=2;
}
int main()
{
    for(int i = 0;i<10;i++)
        cout<<potega2()<<endl;
    getch();
}

Sposób 2 razy szybszy i 2 razy prostszy. Ten sam, który podałem w swoim poprzednim poście.


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

Oba wasze kody są bez sensu.

2up, zmienna globalna, ktora w dodatku da oczekiwany wynik tylko po pierwszym wywolaniu funkcji + ten niepotrzebny warunek

up dziwna metodyka i conio.h + getch

#include <iostream>
using namespace std;
unsigned int potega2(unsigned int wykladnik)
{   
    return 1>>wykladnik;
}
int main()
{  
    for(int i = 0;i<10;++i) cout << potega2(i);
}
lub

#include <iostream>
using namespace std;
void wypiszPotegiDwojki(unsigned int ilosc)
{   
    for(int i = 0;i<10;++i) cout << (1>>i);
}
int main()
{  
    wypiszPotegiDwojki(10);
}
W dodatku ZAWSZE jeśli nie ma innej potrzeby powinno się używać preinkrementacji zamiast poinkrementacji.
Opublikowano

Może masz racje, ten getch() to tylko tak o dodałem, też go nie używam. Ale jakby chciał zwrócić wartość tych potęg, to z twojej funcji raczej nie skorzysta (chodzi o tą drugą).

 

Właśnie sprawdziłem twoją metodę i mi wypisało 1 i kilka zer. Od kiedy używa się przesunięcia bitowego do potęgowania?

Kto tutaj ma dziwną metodykę :P.


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

a ta biblioteka to przypadkiem ... :P wypadek przy pracy,aczkowliek masz rację,ale się do tego nie przykladałem więc nie dziwi mnie to,a celem miało być napisanie tego jak najprościej ,ale trochę zjebałem.Głównie z tą zmienną globalną i nie potrzebny warunek.

-Jestem habilitowanym profesorem,magistrem, który nie umie zawiązać sobie butów.

-A ja jestem technikiem który daje ci prace.

Opublikowano

W dodatku ZAWSZE jeśli nie ma innej potrzeby powinno się używać preinkrementacji zamiast poinkrementacji.

Dlaczego? Różnicy w szybkości nie ma, procesor musi wykonać tyle samo instrukcji. Może i w językach wysokiego poziomu to się wydaje ze preinkrementacja jest wolniejsza(musi zapisać zmienna, zwiększyć i zwrócic zapisaną wartość) od postinkrementacji(zwiększyć i zwrócić).

Nie pomagam na PW, od tego macie forum!!!

 

#PHP-things

 

 

08FMpDu.png

 

Opublikowano

Dlaczego? Różnicy w szybkości nie ma, procesor musi wykonać tyle samo instrukcji. Może i w językach wysokiego poziomu to się wydaje ze preinkrementacja jest wolniejsza(musi zapisać zmienna, zwiększyć i zwrócic zapisaną wartość) od postinkrementacji(zwiększyć i zwrócić).

 

 

Już miałem się o to pytać :P

 

 

Co do programu, trzeba to było jeszcze w funkcję ładować?

 

Jeśli tak, to trzeba to było zrobić rekurencyjnie, a nie jeszcze jakieś for-y tworzycie...

 

(generalnie kompilator, jeśli ma ustawione stosowne opcje, a funkcja rekurencyjna jest "ogonowa" sam sobie to zamieni na for-a)

Opublikowano

Właśnie sprawdziłem twoją metodę i mi wypisało 1 i kilka zer. Od kiedy używa się przesunięcia bitowego do potęgowania?

 

Kto tutaj ma dziwną metodykę :P.

metodyka dobra tylko z tego wkurwiania się o niedziałające BBcode pomylilem >> z <<. Powinno być <<...

Chodzi w tym o to, że zamiast iteracyjnego mnożenia przez dwa wykorzystuję bit shift jako wyliczanie kolejnych potęg dwójki. Zresztą sam zobacz, tylko zamień na <<.

 

Dlaczego? Różnicy w szybkości nie ma, procesor musi wykonać tyle samo instrukcji.

przy postinkremetacji konieczne jest wykonanie kopii obiektu

http://www.tantalon.com/pete/cppopt/asyougo.htm#UsePrefixOperators

 

poprawione kody...

#include <iostream>
using namespace std;
unsigned int potega2(unsigned int wykladnik)
{  
    return 1<<wykladnik;
}
int main()
{ 
    for(int i = 0;i<10;++i) cout << potega2(i);
}
#include <iostream>
using namespace std;
void wypiszPotegiDwojki(unsigned int ilosc)
{  
    for(int i = 0;i<10;++i) cout << (1<<i);
}
int main()
{ 
    wypiszPotegiDwojki(10);
}
Opublikowano

metodyka dobra tylko z tego wkurwiania się o niedziałające BBcode pomylilem >> z <<. Powinno być <<...

Chodzi w tym o to, że zamiast iteracyjnego mnożenia przez dwa wykorzystuję bit shift jako wyliczanie kolejnych potęg dwójki. Zresztą sam zobacz, tylko zamień na <<.

 

przy postinkremetacji konieczne jest wykonanie kopii obiektu

http://www.tantalon.com/pete/cppopt/asyougo.htm#UsePrefixOperators

 

C++:

int ink = 4564;
printf("%d\n",++ink);
printf("%d\n",ink++);
printf("%d\n",ink);

ASM(wywaliłem esp checki itp):

mov     ink, 11D4h ; ink = 4564;
mov     eax, ink ; printf("%d\n",++ink);
add     eax, 1 ; 
mov     ink, eax
mov     esi, esp
mov     ecx, ink
push    ecx
push    offset Format   ; "%d\n"
call    pritnf
mov     eax, ink ; printf("%d\n",ink++);
mov     [ebp+var_D0], eax
mov     ecx, ink
add     ecx, 1
mov     ink, ecx
mov     edx, [ebp+var_D0]
push    edx
push    offset Format   ; "%d\n"
call    printf
mov     eax, ink ; printf("%d\n",ink);
push    eax
push    offset Format   ; "%d\n"
call    printf

Jednak masz racje, na innym forum mnie w błąd wprowadzili, ale i tak kompilator powinien to zrobić bez tworzenia kopii.

Nie pomagam na PW, od tego macie forum!!!

 

#PHP-things

 

 

08FMpDu.png

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...