Domanda Conversione da base N a base 10 c++

Stato
Discussione chiusa ad ulteriori risposte.

Vitt0138

Utente Bronze
10 Gennaio 2017
7
3
0
24
Ciao a tutti. Quasi mi vergogno a porre questo problema di programmazione elementare tra questi problemi che sembrano molto più avanzati:ehm::ehm:. Sto facendo (o meglio sto provando a fare) un problema di conversione di basi su c++; devo portare un qualsiasi numero da qualsiasi base N a base 10. Purtroppo non so nemmeno dove iniziare, io sono messo un po' male in informatica, non tanto perché mi manca la volontà, anzi, ma perché nella mia classe, col prof che cambia di continuo, non si riesce a capire molto. Spero mi possiate aiutare, grazie in anticipo.
 
Io consiglio sempre di partire dalle basi di un linguaggio, prova a cercare guide e definite le prime variabili, usare operatori e giocare con cicli per capirli.
Una volta fatto per risolvere un problema devi sapere cosa fare prima di partire a mettere giù il codice. Con dello pseudo codice crei uno schema con i vari passaggi che devi fare per esempio per passare da base 2 a base 10.

Per esempio: l'utente mi da questo numero 100101
Bene come devo procedere?
Ci sono 6 bit che vuole dire da 0 a 5, ma sappiamo che un numero binario si legge al contrario quindi sarebbe 5 4 3 2 1 0
Per convertirla in decimale quindi basta prendere il bit acceso (1) ed elevare la base cioè 2 al numero della posizione e sommarle tra loro
2^5 = 32
2^2 = 4
2^0 = 1

32+4+1 = 37
 
Ok, ho capito come fare, solo che non so come fare con i bit. Faccio un esempio: abbiamo 234 in base 5. Ora io so che per convertirlo in base 10 devo fare 2*5^2+3*5^1+4*5^0= 50+15+4=69. Il punto è che nel mio programma il numero varia, e non so come scriverlo. Posso usare la tecnica di mettere una variabile per ogni unità (base=5, bit0=4*base^0, bit1=3*base^1, bit2=2*base^2), ma non posso mettere "bit" all'infinito. Volendo posso anche scrivere 1232354131324... in base 6, non posso usare questa tecnica. Mi ci vorrebbe tipo un qualcosa che, posto dall'inizio del programma il numero di bit del numero da convertire, mi da esattamente il numero di bit che mi serve, ma non ho idea di come fare.
 
Documentati su cosa sono i vettori e come si usano.

Una volta capito crea una stringa detto anche vettore di caratteri, ogni cifra viene inserita in una cella del vettore, quando ne hai bisogno la utilizzi indicando l'indice in cui si trova.

int dimensione = 100;
char numero[dimensione];

cin >> numero;

A questo punto avrai il tuo numero da convertire e fai

numero[0]*5^2+numero[1]*5^1+numero[2]*5^0
 
Ho provato a capire qualcosa dei vettori, ma non sono capace, tuttavia sono riuscito a pensare a un metodo alternativo. Ho fatto il programma, in teoria dovrebbe funzionare, ma non so perché non va. Non ci sono errori, lo esegue, ma non finisce il ciclo
[HASHTAG]#include[/HASHTAG] <iostream>
[HASHTAG]#include[/HASHTAG] <stdlib.h>
[HASHTAG]#include[/HASHTAG] <cmath>

using namespace std;

int main ()
{
char somma, esponente, base, bit, bitlavorato, stop, limite;

somma=0 ;

esponente=0;

stop=0;

cout << "Inserisci la base di partenza /n";

cin >> base;

cout << "Inserisci l'esponente piu' alto nella notazione esponenziale del tuo numero /n";

cin >> limite;

do {
cout << "Inserisci i bit uno ad uno, dal piu' alto al piu' basso /n";

cin >> bit ;

bitlavorato=bit*base^esponente;

somma=somma+bitlavorato;

esponente=esponente+1;

stop=stop+1;

}while (stop=limite);

cout << "Il numero in base 10 e:'" << somma ;

system ("PAUSE");
return 0;
}

Cosa ho sbagliato?
 
Ho provato a capire qualcosa dei vettori, ma non sono capace, tuttavia sono riuscito a pensare a un metodo alternativo. Ho fatto il programma, in teoria dovrebbe funzionare, ma non so perché non va. Non ci sono errori, lo esegue, ma non finisce il ciclo
[HASHTAG]#include[/HASHTAG] <iostream>
[HASHTAG]#include[/HASHTAG] <stdlib.h>
[HASHTAG]#include[/HASHTAG] <cmath>

using namespace std;

int main ()
{
char somma, esponente, base, bit, bitlavorato, stop, limite;

somma=0 ;

esponente=0;

stop=0;

cout << "Inserisci la base di partenza /n";

cin >> base;

cout << "Inserisci l'esponente piu' alto nella notazione esponenziale del tuo numero /n";

cin >> limite;

do {
cout << "Inserisci i bit uno ad uno, dal piu' alto al piu' basso /n";

cin >> bit ;

bitlavorato=bit*base^esponente;

somma=somma+bitlavorato;

esponente=esponente+1;

stop=stop+1;

}while (stop=limite);

cout << "Il numero in base 10 e:'" << somma ;

system ("PAUSE");
return 0;
}

Cosa ho sbagliato?
 
Senza vettori diventa difficile programmare, soprattutto perché ti permettono di rendere un problema il più generale possibile, adattabile a tutte le situazioni.
Qui ti metto una soluzione fatta da me, ho messo più commenti possibili per farti capire cosa ho fatto.
Spiegandotelo a parole ho chiesto in input il numero che ho messo dentro il vettore e la base (binario, ottale, esadecimale ecc.), a questo punto utilizzo una funziona chiamata strlen() per sapere la lunghezza del vettore, uso un ciclo for per scorrere ogni numero che si trova dentro le celle del vettore da [0] a [strlen(vettore)].

C++:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <cmath>
using namespace std;

int main() {
    char numero[100]; // dichiaro il numero da convertire
    int base; // dichiaro la base
    int convertito = 0; // dichiaro il numero convertito

    // input numero da convertire
    cout << "Inserisci il numero: ";
    cin >> numero;
    // input base
    cout << "Inserisci la base: ";
    cin >> base;

    // lunghezza del vettore
    int len = strlen(numero);
    // variabile utilizzata per la posizione
    // inizializzata con la lunghezza del vettore meno uno (len-1)
    // se abbiamo 6 numeri il vettore sarà [0][1][2][3][4][5] perciò deve iniziare da 5
    int k = len-1;
    // creo un ciclo for
    for(int i=0; i<len; i++) {
        // converto un carattere in intero
        int n = (int) numero[i]-48;
        // aggiungo il valore a convertito
        // bit * base * esponente
        convertito += n*pow(base, k);
        // decremento indice che parte dal numero massimo e arriva a 0
        k--;
    }
    cout << "Il numero convertito e': ";
    cout << convertito << endl;
    system("PAUSE");
    return 0;
}

C++:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <cmath>
using namespace std;

int main() {
    char numero[100];
    int base;
    int convertito = 0;

    cout << "Inserisci il numero: ";
    cin >> numero;
    cout << "Inserisci la base: ";
    cin >> base;

    int len = strlen(numero);
    int k = len-1;
    for(int i=0; i<len; i++) {
        int n = (int) numero[i]-48;
        convertito += n*pow(base, k);
        k--;
    }
    cout << "Il numero convertito e': ";
    cout << convertito << endl;
    system("PAUSE");
    return 0;
}

Inoltre per spiegarti come ho utilizzato gli indici i e k ti ho fatto questo schema


Se hai domande su qualcosa che non capisci chiedi pure.
 
  • Mi piace
Reazioni: killaemo
Stato
Discussione chiusa ad ulteriori risposte.