PDA

View Full Version : [C] Problemi stringa intero


Ov3rLo4d
09-06-2008, 11:58
Ciao a tutti,

ho un problema con questo programma:

/* Scrivere un programma per la conversione di un numero binario puro
* in intero decimale.
* Il programma chiede in input una stringa di caratteri
*/

Il problema è che deve essere data una stringa di caratteri e poi dopo deve essere convertita in un numeri intero da binario a decimale....

Io ho provato a fare questo:


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

#define MAX 4

char carat[MAX],c;
int i=0,pos,bin;

main()
{
pos=strlen(carat)-1;
printf("Inserisci una stringa di numeri binari: ");
while((c=getchar()) != '\n')
{
carat[i++]=c;
}
for(i=0;i<strlen(carat);i++)
{
if(carat[i]=='1')
carat[i]=pow(2,pos)*1;
else
carat[i]=0;
pos--;
}
for(i=0;i<strlen(carat);i++)
{
bin=carat[i]+bin;
}
printf("il numero decimale e': %d",bin);



}


ho provato con il getchar iniziale...

ho provato anche a dare una semplice stringa in questo modo senza getchar:


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

#define MAX 4

char carat[MAX];
int i,pos,bin;

main()
{
printf("Inserisci una stringa di numeri binari: ");
scanf("%s",carat);
for(i=0;i<strlen(carat);i++)
{
pos=strlen(carat);
if(carat[i]==1)
carat[i]=(2^pos)*1;
else
carat[i]=0;
pos--;
}
for(i=0;i<strlen(carat);i++)
{
bin=carat[i]+bin;
}
printf("il numero decimale e': %d",bin);



}


Ma nulla.... non funziona nemmeno questo...

Cosa devo fare??


Grazie a tutti...

gepeppe
09-06-2008, 14:30
io avevo fatto tempo fa un programma simile...te lo mostro:

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

int pow2(int value){
int ris = 1;
int i;

for (i = 1; i <= value; i++) {
ris *= 2;
}
return ris;
}

int main(void)
{
char bin[10]; /*max 10 bit*/
int dec = 0;
int i;

printf("Inserisci il numero binario\n");
scanf("%s", bin);

for (i = 0; i <= strlen(bin) - 1; i++) {

if (bin[i] == '1') {
dec += pow2(strlen(bin) - i - 1);
}

}
printf("il numero in decimale e': %d\n", dec);

return 0;
}


Ho usato scanf per fare prima...puoi sostituirla come vuoi. Però controlla cosa salva.

La funzione pow del C l'ho usata poche volte, perchè nn riucivo a capire coe funzionava bene (mah) perciò l'ho riscritta. Dimmi se va bene.

Poi perchè usi delle variabili globali?

Volutomitra
09-06-2008, 14:43
io avevo fatto tempo fa un programma simile...te lo mostro:

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

int pow2(int value){
int ris = 1;
int i;

for (i = 1; i <= value; i++) {
ris *= 2;
}
return ris;
}

int main(void)
{
char bin[10]; /*max 10 bit*/
int dec = 0;
int i;

printf("Inserisci il numero binario\n");
scanf("%s", bin);

for (i = 0; i <= strlen(bin) - 1; i++) {

if (bin[i] == '1') {
dec += pow2(strlen(bin) - i - 1);
}

}
printf("il numero in decimale e': %d\n", dec);

return 0;
}


Ho usato scanf per fare prima...puoi sostituirla come vuoi. Però controlla cosa salva.

La funzione pow del C l'ho usata poche volte, perchè nn riucivo a capire coe funzionava bene (mah) perciò l'ho riscritta. Dimmi se va bene.

Poi perchè usi delle variabili globali?

Io sostituirei il tuo ciclo for con:


i = strlen(carat) - 1;

do
{
bin += (carat[i] == '1' ? (int)pow(2, (strlen(carat) - 1 - i)) : 0);
}
while(i--);


Quanto mi piacciono queste cose :asd:

VegetaSSJ5
09-06-2008, 22:05
Io sostituirei il tuo ciclo for con:


i = strlen(carat) - 1;

do
{
bin += (carat[i] == '1' ? (int)pow(2, (strlen(carat) - 1 - i)) : 0);
}
while(i--);


Quanto mi piacciono queste cose :asd:
anche a me piace rendere minimale il codice, però tieni presente che poi il compilatore potrebbe trasformarlo con le stesse istruzioni (se non peggiorarle) di codice macchina di una soluzione più leggibile... :O

71104
10-06-2008, 17:04
niubbi :O

#include <iostream>
#include <string>

using namespace std;


int main()
{
cout << "enter binary number: ";

string strInput;
cin >> strInput;

unsigned int nOutput = 0;

for (unsigned i = 0; i < strInput.length(); i++)
{
nOutput = nOutput * 2;
if (strInput[i] == '1')
{
nOutput++;
}
else if (strInput[i] != '0')
{
cout << "invalid input" << endl;
return 1;
}
}

cout << nOutput;
return 0;
}

gepeppe
10-06-2008, 18:04
già..peccato che lo voleva in C..."non niubbio" :asd:







skerzo è! ;)

gugoXX
10-06-2008, 18:09
strtoi dovrebbe essere standard


int res=strtoi(stringa,NULL,2);


Dove il 2 e' la base binaria
Ma forse al prof. non va bene troppo corto...
e usare almeno all'inizio un po' di matematica binaria non puo' che fare bene.

In qualsiasi caso eviterei funzioni come pow, esponenti o simili.
Meglio l'uso di << e |