[ajuda] programa de C

mrjm

Power Member
tenho andado as voltas aki com um trabalho e pah nao consigo fazê-lo se alguem me pudesse ajudar agradecia =)

o enunciado dix assim..
escreva um programa que dados dois numeros "b" e "e" a potencia de b de ordem e: b^e. Faça um refiname do seu programa para suportar expoentes nulos e negativos...

Se alguem souber e se alguem pudesse escrever num bloco de notas ou assim eu agradecia =) brigadão
 
Fazer condições if? Não me parece nada dificil. Já tens a primeira parte feita?

É só pensar:

se o expoente é positivo, fazes um ciclo for desde 1 até e onde multiplicas o b por ele proprio

se expoente é nulo, resultador = 1 (qualquer numero elevado a 0 dá 1)

se expoente nulo, resultado é o inverso do primeiro caso (p.exemplo, 2^-2 = 1/2^2 -> inverso de 2^2)
 
Última edição:
Convém notar que se e for ímpar b^e = [ b^(e/2) ]*[ b^(e/2) ]*b, no caso de ser par: b^e = [ b^(e/2) ]*[ b^(e/2) ].
Desta forma evitas estar a calcular b*b*...*b que extremamente ineficiente.

Código:
<return> <função> ( int b, int e ) {
    <resultado>, <tmp>;
    [COLOR=DarkGreen]/* Se e < 0 -> return 1/( <função>( b, -e ) ); */[/COLOR]
    [COLOR=DarkGreen]/* Se e == 0 -> <resultado> = 1 */ 
    /* Se e == 1 -> <resultado> = b */
    /* Se b == 0 -> <resultado> = 0 */[/COLOR]

    [COLOR=DarkGreen]/* b é impar -> <tmp> = <função>( b, e/2 ); <resultado> = <tmp>*<tmp>*b; */
    /* b é par    -> <tmp> = <função>( b, e/2 ); <resultado> = <tmp>*<tmp>; */[/COLOR]

   return <resultado>;
}
Acho que mais detalhado só escrevendo mesmo o código (que está praticamente aí...). Como não testei é bem possível que tenha algum erro. :p

NOTA: e/2 -> divisão inteira, isto é, 3/2 = 1.
 
É isso mesmo CoolMaster. Os portugueses e a matemática... :p

mrjm, se perceberes o que é uma função, o que é valor de retorno e o que é recursividade, percebes perfeitamente o que aí está. "Ajudar-te" mais só colocando código, e aí não estaria a ajudar. A forma como escrevi está muito próxima do que tens de escrever em C. O facto de não teres compreendido o que escrevi, indica que tens de ler primeiro sobre o assunto.

A maneira mais simples já foi referida pelo sir_atmc...
 
Eu acho que o teu problema é não estudares. Por acaso agora até resolvi esse problema aqui, mas qual é a vantagem para ti em eu colocar o código sem perceberes? Ciclos for, while, variaveis...isso diz-te alguma coisa?
 
É não estudar e não querer fazer o mínimo...Se ele não percebe nada e acha que com o código vai la...É das cenas mais fáceis encontrar o código para a potencia na net...Mas este pessoal quer a papinha toda feita...e inda vem com o "amigo"...enfim
 
Ora bem, como agora estou bonzinho (deve ser de fazer anos), coloco aqui o código (em C++, não sei C) comentado para tentares perceber. Agradecia que pusesses duvidas para ficares a perceber alguma coisa (tu é que devias agradecer, porque teres este código sem perceberes nao te serve de nada). Antes de mais, voces têm de perceber matemática. Primeiro desenha-se no papel o "projecto" dos varios casos, so depois se vai para o pc programar

Código:
#include <iostream> //cout e cin estao incluidos em iostream

using namespace std; //espaço std, para evitar uso de std::cout, std::cin, entre outros

int main()
{
    double b, e, counter; //declaração de variaveis do tipo double
    double resultado = 0;

    cout << "Base: "; //output
    cin >> b; //input. Le o que é introduzido no ecra e guarda na variavel b

    cout << endl << "Expoente: "; //endl -> nova linha.
    cin >> e;

    if (e == 1) //se o expoente for 1
        resultado = b; //resultado toma o valor da base

    else if (e == 0) 
        resultado = 1;

    else
    {
        if (e > 0) //se o expoente for maior que 0
        {
            resultado = b; //resultado toma o valor de b
            counter = --e; //counter toma o valor decrementado do expoente (devido ao facto de b^1 já estar na variavel resultado
        
            while (counter > 0) //enquanto o counter for maior que 0
            {
                resultado *= b; //resultado = resultado * b
                --counter;
            }

            /*exemplo:
            imaginando que base = 2; expoente = 3;
            o resultado toma o valor da base, resultado = 2 (2^1);
            o counter toma o valor do expente decrementado, ou seja, 3-1 = 2;
            como counter = 2, ou seja, > 0
            multipla o resultado por b (neste momento ja vamos em b ao quadrado)
            e o valor do counter é decrmentado: counter = 2-1 = 1;
            como o counter continua a ser maior que 0, o ciclio while volta a correr
            resultado = resultado * b = b^2 * b = b^3 (neste momento resultado ja vai em b ao cubo (que é o valor do expoente))
            decrementa-se o valor do counter: counter = 1-1 = 0
            como counter = 0, ja não verifica a condição counter > 0, logo nao vai correr o ciclo while
            como dentro do if (e > 0) já não tem mais nada, sai da condição e como não verifica mais nenhuma das condições seguintes apresenta o resultado
            */
        }

        else if (e < 0) // e expoente menor que 0, faz o mesmo, excepto que em vez de decrementar o counter vai incrementar
            /* ex: se expoente = -2, ele vai incrementar aé 0: -2, -1, 0 */
        {
            resultado = 1 / b; //neste caso o resultado é o inverso da anterior: 2^-2 = 1/(2^2) -> inverso de 2^2
            counter = ++e;

            while (counter < 0)
            {
                resultado *= 1 / b;
                ++counter;
            }
        }        

    }

    cout << "Resultado: " << resultado << endl << endl; //output do resultado

    getchar();
    return 0;
}
Fiz isto um bocado à pressa, nem precisava do counter para nada, mas foi o que saiu na altura.
Farto de programar C++ já ando eu :lol:

EDIT: já agora, olha para os operadores << e >> que estão depois de cin e cout e vê se consegues perceber qual a função daquilo. Alias, até já está lá escrito o que acontece no cin. (Olha para os sentidos das "setas").

Espero que tires proveito da ajuda que te estou a dar.

EDIT2: repara no que eu escrevi int main() {..... return 0;}

O que é isto? é uma função. Qualquer programa tem de ter uma função main, quer seja int, void ou whatever. Um programa pode ter mais que uma função (se avançares na materia vais reparar que vai ter muitas), mas tem de ter sempre esta. agora int porque? o facto de ser int main() quer dizer que vai retornar um valor inteiro. Se tivesses uma função double main(), iria retornar um valor do tipo double. (ok, eu sei que ninguem faz funções double main(), mas é só para perceberes o que significa aquele int). Se for do tipo void main(), não retorna nenhum valor.

Agora imagina que tens uma função que faz a soma

Código:
int soma(int x, int y)
{
     return x + y;
}
E depois chamas esta função dentro do main (nao esquecer de por sempre a função main()

int main()
{
int z = soma (5,6);

std::cout << z;
}

(nao esquecer de fazer os includes)

Aqui já tens duas funções, a main (que eu nao escrevi toda mas ja tens la em cima como é), e função soma. A função soma recebe dois argumentos, um inteiro x e um inteiro y. No caso da função main que está lá em cima, não recebe nenhum argumento, o que faz com que dentro dos parentises não apareça nada -> int main()
No caso da soma tens dois argumentos soma (int x, int y)
(Mas também podem existir funções sem ser o main que não tenham argumentos)
Para chamar a função soma, basta chamar com dois inteiros: soma (5,6);
Neste caso coloquei 5,6 como default, mas podia ser um numero qualquer introduzido pelo utilizador atraves de cin (era interessante até fazeres isso, mas vai acompanhando o ritmo das aulas)

EDIT3: esquece lá essa cena dos couts e cin's porque tu tens C e não C++, esqueci-me.
 
Última edição:
Back
Topo