1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[ajuda] programa de C

Discussão em 'Programação' iniciada por mrjm, 6 de Novembro de 2007. (Respostas: 9; Visualizações: 1257)

  1. mrjm

    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
     
  2. OubeLa

    OubeLa Power Member

    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: 6 de Novembro de 2007
  3. mrjm

    mrjm Power Member

    pode ser mto facuil acredito k sim mas encalhei... da para faxeres num bloco de notas, sff?
     
  4. Consu

    Consu Power Member

    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.
     
  5. mrjm

    mrjm Power Member

    amigo eu estou muito no inicio da programaçao ainda nao dei isso lololol nao a uma maneira mais simpleS?
     
  6. CoolMaster

    CoolMaster Power Member

    O "isso" que falas é matematica... >(
     
  7. Consu

    Consu Power Member

    É 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...
     
  8. OubeLa

    OubeLa Power Member

    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?
     
  9. good_in_bed

    good_in_bed Power Member

    É 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
     
  10. OubeLa

    OubeLa Power Member

    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: 8 de Novembro de 2007

Partilhar esta Página