Ir ao conteúdo

C Como fazer Potenciação usando a estrutura de DO-WHILE ??


Ir à solução Resolvido por Lucca Rodrigues,

Posts recomendados

Postado

Como fazer um programa que , dados dois numeros inteiros A e B, com A, B ≥ 1, que representam a base e o exponente respectivamente,utiliza a estrutura DO-WHILE  para  imprimir a potenciação.

ENTRADA DO PROGRAMA Na mesma linha haverá dois inteiros A e B, separados por um espaço, representando a base e o exponente, respectivamente.

SAIDA: Na saıda devera ser impresso o resultado da potenciação

  • Curtir 1
Postado

@Ary_job Qual sua dificuldade?

É só entrar com a base e com o expoente, fazer potenciação = potenciação * base enquanto n + 1 for menor que o expoente, sendo que n inicialmente é 0 e potenciação = base, daí é só incrementar 1 no n dentro do loop, tipo assim:

n = 0;
pot = base;

do {
  pot = pot * base;
  n += 1;
} while(n + 1 < expoente);

Isso sem contar com os casos de expoente 1, 0 ou negativo, daí tem que incrementar o algoritmo, mas comece a pensar por isso daí.

  • Curtir 1
Postado

@Lucca Rodrigues não consigo fazer a logica esta errada

 

 

#include <stdio.h>
#include <stdlib.h>

int potencia(int A,int B);
int main(){
int A,B,result;
scanf("%d %d",&A,&B);

 printf("%d",A);
 printf("%d",B);

  do{
     int potencia(int A,int )



    if ((A >= 1 && B >= 1))
    result = potencia(A,B);
    printf("%d %d :%d\n",A,B,result);

  }


 while(result*=A);{

        B--;
 }
   

return result;
}


 

 

  • Curtir 1
  • Solução
Postado

@Ary_job Lembre de comentar seu programa, assim todos podem entender o que se passa nele, e é ainda mais útil para descobrir onde se quer chegar.

Seguindo o que eu disse anteriormente, você consegue desenvolver um algoritmo?

adicionado 48 minutos depois

Tente interpretar esse algoritmo, e desenvolva o seu próprio a partir dele.

Segue a mesma lógica que eu havia mencionado, está bem mal otimizado kkk, tente encurtá-lo.

//Potenciação

#include "stdio.h"
#include "locale.h"

int main() {
    
    double base, pot;
    int expoente, n;
    char novamente;
    
    setlocale(LC_ALL,"Portuguese");
    printf("Bem-vindo(a) à calculadora (totalmente não otimizada) de potenciação!\n");
    
    do{
        printf("Entre com a base: ");
        scanf("%lf", &base);
        printf("Entre com o expoente: ");
        scanf("%d", &expoente);
        n = 0;
        pot = base;
        //3 casos: expoente = 0, < 0 e > 0, nesses 2 últimos podendo ser = 1 ou = -1
        if (expoente == 0){
            //Qualquer número elevado a 0 é 1
            printf("O resultado da potenciação é: 1");
        }
        else
            if (expoente > 0){
                //Fazer pot * base o tanto de vezes que corresponde ao expoente
                do {
                    pot = pot * base;
                    n += 1;
                } while(n + 1 < expoente);
                
                if (expoente == 1){
                    //Qualquer número elevado a 1 é ele mesmo
                    printf("O resultado da potenciação é: %.4lf", base);
                }
                else {
                    printf("O resultado da potenciação é: %.4lf", pot);
                }
            }
            else
                if (expoente < 0){
                    //Mesma mecânica para expoente > 0, mas inverte-se pot no final
                    expoente = -expoente;
                    do {
                        pot = pot * base;
                        n += 1;
                    } while(n + 1 < expoente);
                    
                    if (expoente == 1){
                        //Qualquer número elevado a -1 é 1/ele mesmo
                        printf("O resultado da potenciação é: %.4lf", 1/base);
                    }
                    else {
                        printf("O resultado da potenciação é: %.4lf", 1/pot);
                    }
                }
        printf("\n\nQuer calcular novamente (s/n)? ");
        scanf("%s", &novamente); //Teste para calcular novamente
    } while (novamente == 's');
    
    return 0;
}

 

  • Curtir 1
Postado

Podemos isolar o cálculo em uma função, dessa podemos portá-lo para outro projeto sem alterar uma única linha de código:

/**
 * Realiza a operacao matematica referente a potencia.
 * Essa implementacao usa o loop for.
 *
 * @param base     Base utilizada no calculo.
 * @param expoente A qual a base sera elevada.
 *
 * @return Base elevada ao expoente.
 */
double potencia1(int base, int expoente) {
    double resultado = 1.0;

    for (int i = 0; i < abs(expoente); ++i) {
        resultado *= base;
    }

    return (expoente >= 0)
           ? resultado
           : 1.0 / resultado;
}

/**
 * Realiza a operacao matematica referente a potencia.
 * Essa implementacao usa o loop do-while.
 *
 * @param base     Base utilizada no calculo.
 * @param expoente A qual a base sera elevada.
 *
 * @return Base elevada ao expoente.
 */
double potencia2(int base, int expoente) {
    double resultado = 1.0;
    int index = 0;

    if (expoente != 0) {
        do {
            resultado *= base;
            index += 1;
        } while (index < abs(expoente));
    }

    return (expoente >= 0)
           ? resultado
           : 1.0 / resultado;
}

/**
 * Realiza a operacao matematica referente a potencia.
 * Essa implementacao usa recursividade.
 *
 * @param base     Base utilizada no calculo.
 * @param expoente A qual a base sera elevada.
 *
 * @return Base elevada ao expoente.
 */
double potencia3(int base, int expoente) {
    if (expoente > 0)
        return base * potencia3(base, expoente - 1);
    else if (expoente < 0)
        return 1.0 / base * potencia3(base, expoente + 1);
    else
        return 1.0;
}

 

  • Obrigado 1
  • Amei 1
Postado
 do
{
     int potencia(int A,int )

    if ((A >= 1 && B >= 1))

...

Você declarou uma função no meio do loop? 

Qual o propósito de NÃO usar variáveis chamadas base e expoente por exemplo, para que você ou outro que viesse a ler seu programa não tivesse que perder tempo para descobrir qual variável é o que? A e B ou y ou yx ou jj ... tanto faz

  • Obrigado 1
  • 1 ano depois...
Postado

 

#include <stdio.h>

int main()  {
	
	int x, y, aux, auy;

	printf("Entre com os valores de X e Y: ");
	scanf("%d%d", &x, &y);
	aux = x;
	auy = y;

	while(auy>1)	{
		aux *= x;
		--auy;
	}
  
	printf("\n%d elevado a %d = %d", x, y, aux);
}
	

 

  • Amei 1
Postado

@Myk4my       muito boa sua solução  ,   gosyei muito mesmo  ,    só não vejo necessidade de pular várias linhas ,  pois o código fica longo e difícil de ler , me parece Que assim seria melhor ,  

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() 
{
	int basex, potenciay;
	printf("Entre com os valores de baseX e potenciaY: ");
	scanf("%d%d", &basex, &potenciay);
	printf("\n%d elevado a %d = ", basex, potenciay);
	while (potenciay > 1) 
	{
		basex *= basex;
		--potenciay;
	}
	printf("%d\n\n\n", basex);
	return 0;     // geralmente todas as funcoes do tipo int retorna algum valor
}

 

  • Curtir 1
  • Triste 1
Postado

Isso não vai dar certo:

 

	while (potenciay > 1) 
	{
		basex *= basex;
		--potenciay;
	}

 

Precisa preservar o valor de x, como em 

 

	while (potenciay > 1) 
	{
		res *= x;
		--potenciay;
	}

 

testou isso?

 

A condição de saída está errada... 

 

Deve ser

 

	while (potenciay > 0) 

 

Por exemplo, ou '>= 1'.

 

Não precisa de 

 

#define _CRT_SECURE_NO_WARNINGS

 

a menos que use Visual Studio, e nesse caso como já te disse pode deixar isso na configuração do projeto porque se estiver usando outro compilador ou Linux essa definição de nada serve e só vai confundir quem ler isso e não usar esse ambiente Windows/VS

 

	scanf("%d%d", &x, &y);

 

Teste SEMPRE o retorno de scanf. É ingênuo não testar. se o cara digitar um 'x' vai calcular mesmo assim. Mesmo para um programa de estudante é estranho passar reto pelo problema comum.

 

Atente para um possível expoente negativo: como delcaram o expoente como int e o loop é 

 

	while (potenciay > 1) 

 

Adivinhe o que vai acontecer se y for inicialmente negativo 🤔

 

Não precisa de tantas chamadas a printf...


Pode tentar algo assim:

 

#include <stdio.h>
int main(void)
{
    int x = 0;    
    unsigned y = 0;
    int z = 1;
    printf("  Calculando 'x' elevado a 'y'\n\n");
    printf("  Entre com os valores de X e Y:  ");
    int res = scanf("%d %d", &x, &y);
    while (res != 2)
    {   fgetc(stdin); // le o '\n'que terminou o scanf anterior
        printf("  Entre com os valores de X e Y:  ");
        res = scanf("%d %d", &x, &y); // tenta de novo
    }
    while (y > 0) z *= x, --y;
    printf("  x^y = %d\n", z);
    return 0;
}

 

Que mostra

 

Clube> .\p
  Calculando 'x' elevado a 'y'

  Entre com os valores de X e Y:  2 0
  x^y = 1
Clube> .\p
  Calculando 'x' elevado a 'y'

  Entre com os valores de X e Y:  2 1
  x^y = 2
Clube> .\p
  Calculando 'x' elevado a 'y'

  Entre com os valores de X e Y:  2 10
  x^y = 1024
Clube> .\p
  Calculando 'x' elevado a 'y'

  Entre com os valores de X e Y:  -3 4
  x^y = 81

 

Mas também mostra

 

  Calculando 'x' elevado a 'y'

  Entre com os valores de X e Y:  x
  Entre com os valores de X e Y:  2 q
  Entre com os valores de X e Y:  2 0
  x^y = 1

 

Quando algo errado é digitado.

 

  • Curtir 1
  • Obrigado 1
Postado
#include <stdio.h>

/* Simples simulador de Exponencial */

int main()  {

	int x, y, auy, aux;
	float auxx;
	printf("Entre com os valores de X e Y: ");
	scanf("%d%d", &x, &y);
	aux = x;
	auxx = x;
	auy = y;
	
	if(y>0)  {
		while(auy>1)	{
			aux *= x;
			--auy;
		}
		printf("\n%d elevado a %d = %d", x, y, aux);
	}

	else  {
		while(auy<-1)	{
			auxx *= x;
			++auy;
		}

		if(y<=-4)   								/* Altere o número se quiser maior precisão */
			printf("\n%d elevado a %d = %.4f", x, y, 1/auxx);		/* Altere o valor do ponto flutuante para mostrar o resultado de acordo com o valor de y */
		else
			printf("\n%d elevado a %d = %.3f", x, y, 1/auxx);
	}

return 0;

}

Código atualizado para números negativos...

  • Curtir 1
  • Amei 1
Postado
Citação

Lembre de comentar seu programa, assim todos podem entender o que se passa nele, e é ainda mais útil para descobrir onde se quer chegar

Se o programa precisa de tanto comentário é porque o código já não é muito autoexplicativo. É  bom não ter esse hábito desde cedo

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!