[C] Esercizio: elevamento a potenza

di il
8 risposte

[C] Esercizio: elevamento a potenza

Ciao a tutti!

Esercizio C:

"Si realizzi un programma che, dati due valori B (numero intero, detto ‘base’) ed E (numero intero positivo, detto ‘esponente’), calcoli e stampi il valore intero di B^E (base elevato ad esponente). Non si utilizzi la funzione pow() ma si adotti il metodo delle moltiplicazionisuccessive."

Il programmino è ancora all' inizio però ci sto lavorando per arrivare alla fine. Ho inserito in tutti e tre le versioni "z=x*y" per vedere se era giusta oppure no una mia intuizione che ho avuto.

Quando c'è il "printf", dopo lo "scanf" il programma va a capo e vorrei che non lo facesse. Ho provato \r oppure \b ma non cambia nulla.

#include <stdio.h>

int x,y;
char simb='^';
int z=x*y;

int main()

{
    
 
 while(1)
 
  {
    printf("\n Moltiplicazione tra due numeri\n\n\n");
    printf("Inserisci due numeri:");
    scanf("%d",&x);
    printf("\r %c",simb);
    scanf("%d",&y);
    printf("%d",z);
  }  
    

    return 0;
}

Mi dice "initializer element is not constant"

Ho cercato su internet ed ho capito cosa sta ad indicare questo errore. Però io non capisco dove sbaglio. Io voglio che anche z, sia una variabile, che abbia anche lei all' inizio un valore assegnato (non da me), sconosciuto.
Se invece sostituiscono le tre righe di codice, dopo "include", con queste:

int x,y,z;
char simb='^';
z=x*y;
Allora mi dice anche:

warning: data definition has no type or storage class
z=x*y;
^
warning: type defaults to ‘int’ in declaration of ‘z’ [-Wimplicit-int]

#include <stdio.h>

int main()

 {
    int x,y;
    char simb='^';
    int z=x*y;
 
 while(1)
 
  {
    printf("\n Moltiplicazione tra due numeri\n\n\n");
    printf("Inserisci due numeri:");
    scanf("%d",&x);
    printf("\r %c",simb);
    scanf("%d",&y);
    printf("%d",z);
  }  
   
    return 0;
}
Ho provato 2/3 volte ma come risultato mi da zero.

#include <stdio.h>

int main()

{
    
    int x,y,z;
    char simb='^';
 
 while(1)
 
   {
      printf("\n Moltiplicazione tra due numeri\n\n\n");
      printf("Inserisci due numeri:");
      scanf("%d",&x);
      printf("\b %c",simb);
      scanf("%d",&y);
      z=x*y;
      printf("%d",z);
   }  
    

    return 0;
 }
Qui calcola in modo giusto "z".

8 Risposte

  • Re: [C] Esercizio: elevamento a potenza

    Puoi usare i \t per incolonnare o gli spazi.

    Ma il problema che ti hanno dato è basato sul calcolo e non l'hai ancora risolto. Non perdere tempo sull'output ma concentrati su come risolvere.
  • Re: [C] Esercizio: elevamento a potenza

    Ma secondo te è ragionevole aspettarsi una cosa del genere? E quante istruzioni dovrebbe eseguire il povero processore a ogni ciclo?

    Al limite c'è constexpr in C++, ma X e Y devono essere note
  • Re: [C] Esercizio: elevamento a potenza

    Sono bloccato ad un punto. Vorrei che "x*x" avvenga all' infinito finchè "i!=y". Poi il risultato dev' essere assegnato alla variabile z.
    Ho provato diversi modi ma nulla da fare. Ho anche guardato la tabelline sperando di trovare uno schema comune, ma non l' ho trovato. Mi rimane di provare con il do-while, sperando di risolvere.
    Nel frattempo posto quello che ho fatto fin' ora.
    Vorrei che mi venissime in mente la soluzione
    
    #include <stdio.h>
    
    int main()
    
    {
      int x,y,i;
      int z=x*y;
      char simb='^';  
     
      while(1)
     
       {
         printf("\n\t Elevamento a potenza\n\n\n");
         printf("\tInserisci due numeri: ");
         scanf("%d",&x);
         printf("\t%c",simb);
         scanf("%d",&y);
    
    	 if (x==0 && y==0)
    	    
    	     printf("\tz=Impossibile\n\n");
    
    	 else if (x==1 && y==0)
    
    	     {
    	       z=1;
    	       printf("\tz=%d\n\n",z);
             }
    	 
    	 else if (x==0 && y==1)
    
    	     {
    	       z=0;
               printf("\tz=%d\n\n",z);
             }
    
         else if (x>=2 && y>=2)
          
    	   {
                  for (i=1;i!=y;i==y)
    
    	          { 
    	                    i++;
    			       /*printf("\ti=%d\n\n",i);*/
    			    z=x*x;
    				/*printf("\tz=%d\n\n",z);*/
    			    z=z*x;
    				/*printf("\tz=%d\n\n",z);*/
    			  		  		  
    		  }
    
    
                  printf("z=%d\n\n",z);
    	   }
          
         else
    
    	     printf("Errore");
    
       }  
        
    
        return 0;
    }
    

    oregon ha scritto:


    Puoi usare i \t per incolonnare o gli spazi.

    Ma il problema che ti hanno dato è basato sul calcolo e non l'hai ancora risolto. Non perdere tempo sull'output ma concentrati su come risolvere.
    Ti ringrazio per il suggerimento e per il consiglio ^^

    Weierstrass ha scritto:


    Ma secondo te è ragionevole aspettarsi una cosa del genere? E quante istruzioni dovrebbe eseguire il povero processore a ogni ciclo?

    Al limite c'è constexpr in C++, ma X e Y devono essere note
    Purtroppo, non so rispondere alla tue domande. Però ho voglia di imparare

    Per quanto riguarda X e Y, tramite la tastiera l' utente inserisce il valore di X ed il valore di Y. Quindi verranno resi noti. Però non ci metto la mano sul fuoco.
  • Re: [C] Esercizio: elevamento a potenza

    Guarda che è molto più semplice di quello che credi.

    Assegna 1 ad una variabile r

    Poi esegui

    r = r * base;

    in un ciclo tante volte quanto vale l'esponente.

    Risultato in r alla fine del ciclo

    Poche righe di codice
  • Re: [C] Esercizio: elevamento a potenza

    oregon ha scritto:


    Guarda che è molto più semplice di quello che credi.

    Assegna 1 ad una variabile r

    Poi esegui

    r = r * base;

    in un ciclo tante volte quanto vale l'esponente.

    Risultato in r alla fine del ciclo

    Poche righe di codice
    Avevo un po' sottovalutato questo esercizio anche perchè mi ha permesso di mettere in pausa un altro esercizio più complicato.
    Sabato avevo scritto la possibile soluzione in pseudo-codice, non so se è giusta:
    
    
    x è la base
    y è l' esponente
    
    x^y=z
    
    i; "i" è una variabile, che Serve per tenere conto delle ripetizioni del ciclo
    
    Si assegna un numero intero d x e poi anche ad y.
    
    Se (x= 0 ed y= 0) allora z=impossibile
    
    
    Se (x=1 ed y=0) allora z=1
    
    
    Se (x=0 ed y=1) allora z=0
    
    
    Se (x>=2 ed y>=2) allora:
    
        inizia un ciclo:
       
           i=2 (vale solo la prima volta)
             
           se y=i allora z=x*x allora si esce dal ciclo
          
           se y>i allora i=i+1 z=z*x ed il ciclo continua finchè y non è uguale ad i
          
        fine del ciclo
    
    Avevo letto il tuo suggerimento più volte e dopo svariati tentativi/prove senza successo, pare che il programmino faccia quello che deve fare. Non è stato semplice, però ora apprezzo ancora di più il tuo suggerimento
    
    #include <stdio.h>
    
    int main()
    
    {   
      while(1)
     
       { 
         int x,y,i;
         int r=1;
         char simb='^';  
         printf("\n\n\t Elevamento a potenza\n\n\n");
         printf("\tInserisci due numeri:\n\t");
         scanf("%d",&x);
         printf("\t%c",simb);
         scanf("%d",&y);
    
    	 if (x==0 && y==0)
    	    
    	       printf("\tr=Impossibile\n\n");
    
    	 else if (x==1 && y==0)
    
    	     {
    	       r=1;
    	       printf("\tr=%d\n\n",r);
             }
    	 
    	 else if (x==0 && y==1)
    
    	     {
    	       r=0;
               printf("\tr=%d\n\n",r);
             }
    
         else if (x>=2 && y>=2)
          
    	   {
             for (i=0;i<y;i++)
    
    	          { 
    			    /* printf("\ti=%d\n\n",i); */
    			    /* printf("\tr=%d\n\n",r); */	    
    			    r=r*x;			  		  		  
    			  }
    
    
             printf("\tr=%d\n\n",r);
    	   }
          
         else
    
    	    printf("Errore");
    
       }  
        
    
        return 0;
    }
    
    Mi sono accorto che manca il caso in cui "x>=1 && y==1". Va bene se aggiungo un altro "else if"? Poi non so c'è un modo migliore alternativo per if ed else.
    Ho provato, più di una volta con switch-case ma è un vicolo cieco.
  • Re: [C] Esercizio: elevamento a potenza

    Dai un'occhiata a questo
    
    int main()
    {
    	while (1)
    	{
    		int x, y, i;
    		int r = 1;
    		char simb = '^';
    
    		printf("\n\n\t Elevamento a potenza\n\n\n");
    		printf("\tInserisci due numeri:\n\t");
    		scanf("%d", &x);
    		printf("\t%c", simb);
    		scanf("%d", &y);
    
    		if (x == 0)
    		{
    			if (y == 0)
    				printf("\tr=Impossibile\n\n");
    			else
    				printf("\tr=0\n\n");
    		}
    		else
    		{
    			for (i = 0; i<y; i++)
    				r = r*x;
    
    			printf("\tr=%d\n\n", r);
    		}
    	}
    	
    	return 0;
    }
  • Re: [C] Esercizio: elevamento a potenza

    @cibachrome NON PERDERE TEMPO nella parte riguardante l'input da tastiera.
    E' la parte MENO UTILE.

    Concentrati SOLO sul calcolo dell'elevamento a potenza, inizialmente usando delle costanti, come 2^3, 3^4, 5^5, ecc. di cui conosci gia' il risultato, e controlla che il risultato ottenuto dal tuo programmino sia quello che ti aspetti.

    SOLO DOPO aggiungi la parte dell'input da tastiera.
  • Re: [C] Esercizio: elevamento a potenza

    Chiedo scusa per l' assenza.

    oregon ha scritto:


    Dai un'occhiata a questo
    
    int main()
    {
    	while (1)
    	{
    		int x, y, i;
    		int r = 1;
    		char simb = '^';
    
    		printf("\n\n\t Elevamento a potenza\n\n\n");
    		printf("\tInserisci due numeri:\n\t");
    		scanf("%d", &x);
    		printf("\t%c", simb);
    		scanf("%d", &y);
    
    		if (x == 0)
    		{
    			if (y == 0)
    				printf("\tr=Impossibile\n\n");
    			else
    				printf("\tr=0\n\n");
    		}
    		else
    		{
    			for (i = 0; i<y; i++)
    				r = r*x;
    
    			printf("\tr=%d\n\n", r);
    		}
    	}
    	
    	return 0;
    }
    
    Così è più compatto, efficiente ed ordinato
    Non ho capito perchè "printf("\tr=%d\n\n", r);" l' hai messo all' interno delle parentesi del ciclo for.

    migliorabile ha scritto:


    @cibachrome NON PERDERE TEMPO nella parte riguardante l'input da tastiera.
    E' la parte MENO UTILE.

    Concentrati SOLO sul calcolo dell'elevamento a potenza, inizialmente usando delle costanti, come 2^3, 3^4, 5^5, ecc. di cui conosci gia' il risultato, e controlla che il risultato ottenuto dal tuo programmino sia quello che ti aspetti.

    SOLO DOPO aggiungi la parte dell'input da tastiera.
    Ti ringrazio per il consiglio/suggerimento.
    Se invece, per il momento, utilizzo delle variabili(come 2 e 3 oppure 3 e 4 etc...) al posto delle costanti, può andare bene lo stesso?
Devi accedere o registrarti per scrivere nel forum
8 risposte