lunes, 29 de octubre de 2007

Problema 3.5

.
Enunciado

1 - Desarrollar una función stringToNum que permita convertir un string numérico (en cualquier base) a un longint (decimal). El prototipo de la función debe ser:

long stringToNum(char *; int);

Ejemplo:

a=stringToNum("1101",2); // retorna 13
b=stringToNum("543",8); // retorna 355
c=stringToNum("ABC",16); //retorna 2748

2 – Desarrollar las siguientes funciones:
  • long binToDec(char*);
  • long octToDec(char*);
  • long hexToDec(char*);

Veamos el código y luego analizaremos lo que corresponda.

problema3.5.c
   1:
2:#include<stdio.h>
3:
4:// defino aqui los headers de las funciones que voy
5:// a programar. Quiza, mas prolijo hubiera sido
6:// poner estas lineas en un .h
7:long potencia(int, int);
8:long stringToNum(char*, int);
9:long binToDec(char *s);
10:long octToDec(char *s);
11:long hexToDec(char *s);
12:
13:
14:long potencia(int x, int y)
15:{
16: long res=1;
17: int i;
18:
19: for( i=0; i<y; i++ )
20: {
21: res*=x;
22: }
23: return res;
24:}
25:
26:long stringToNum(char *s, int base)
27:{
28: int di;
29: int i;
30: long sum=0;
31:
32: // en C se numera desde cero por este motivo
33: // la posicion del ultimo caracter del string s
34: // (la mas a la derecha) es strlen(s)-1. Es decir:
35: // strlen("Hola") es 4, pero los caracteres estan
36: // numerados de 0 a 3.
37: int n=strlen(s)-1;
38:
39: for( i=n; i>=0; i-- )
40: {
41: if( s[i]<='9' )
42: {
43: // en C los caracteres son valores enteros
44: // que coinciden con el codigo ASCII del
45: // caracter.
46: di=s[i]-'0';
47: }
48: else
49: {
50: di=s[i]-'A'+10;
51: }
52:
53: sum=sum+di*potencia(base,(n-i));
54: }
55: return sum;
56:}
57:
58:// aqui van las otras funciones
59:long binToDec(char *s)
60:{
61: return stringToNum(s,2);
62:}
63:
64:long octToDec(char *s)
65:{
66: return stringToNum(s,8);
67:}
68:
69:long hexToDec(char *s)
70:{
71: return stringToNum(s,16);
72:}
73:
74:// y el programa principal
75:int main()
76:{
77: printf("%d\n",hexToDec("ABF5"));
78: printf("%d\n",octToDec("7521"));
79: printf("%d\n",binToDec("1101101"));
80: printf("%d\n",stringToNum("1101101",2));
81:}
82:

Las diferencias con Pascal son mínimas. En la línea 37 tuvimos que restar 1 a strlen(s). Esto es porque en C los strings (o lo que es lo mismo: los arrays) se numeran desde cero. Si un string tiene 4 caracteres, estos estarán numerados desde 0, 1, 2 y 3.

Como necesitamos recorrer el string s desde el último caracter (el más a la derecha) resulta que su numeración coincidirá en uno menos que la longutid del string.

En la línea 46 hacemos una "resta entre caracteres". Lo que sucede es que en C los caracteres (de tipo char) son valores numéricos enteros que coinciden con el código ASCII del caracter.

En la tabla ASCII el caracter '0' (cero) vale 48. Por lo tanto, si s[i] llegase a ser cero, su valor numérico será 48 y al restarle '0' (lo que es lo mismo que restarle 48) el valor resultante será cero. Pero si s[i] llegase a ser '1' entonces su valor ASCII será 49, que al restarle '0' dará como resultado 1.





.

No hay comentarios: