Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Un clasico problema

Estas en el tema de Un clasico problema en el foro de C/C++ en Foros del Web. Ula, Necesito un pequeño empujoncito, el tema es que necesito hacer un programa que valide el rut (chileno), osea que el numero verificador...(eso no es ...
  #1 (permalink)  
Antiguo 22/10/2007, 15:12
Avatar de Jona_than  
Fecha de Ingreso: noviembre-2005
Ubicación: Chile
Mensajes: 155
Antigüedad: 19 años, 1 mes
Puntos: 0
Un clasico problema

Ula,

Necesito un pequeño empujoncito, el tema es que necesito hacer un programa que valide el rut (chileno), osea que el numero verificador...(eso no es el problema).

El problema se genera que yo leo el rut de inmediatamente y con la función gets(); lo almaceno en el vector char rut[7];, y luego verifico si es bajo 10 millones repociono los valores en otro vector char rutvalidado[7].

Ejemplo: rut 1.000.000, en el vector rut queda 1.000.000, y en el vector rutvalidado queda 01.000.000 (lo cual es la forma correcta.

Llendo al grano es que mis datos son de tipo char, entonces necesito multiplicador estos datos por una variable que sea int, como puedo realizar eso???...existe algun tipo de conversión o en C++ se llama casting...

Esto llevo:
Código:
main(void)
{
//declaración de variables
char rut[7];
char rutvalidado[7];
int totalvalidado=0;
int i;
int total=0;

//fin declaración de variables
printf("Ingrese el rut que desea validar: ");
gets(rut);
total=strlen(rut);
printf("Total: %d\n", total);
getchar();
          if(total<=7) {
                      for(i=0;i<=7;i++) {
                                        if(rut[0]=rut[i]) {
                                                          rutvalidado[0]='0';
                                                          rutvalidado[i+1]=rut[0];
                                                          }
                                        else              {
                                                          rutvalidado[i+1]=rut[i];
                                                          }
                                        }
                      }
          else        {
                      for(i=0;i<=7;i++) {
                                        rutvalidado[i]=rut[i];
                                        }
                      }


getchar();
getchar();
}

Tau.
  #2 (permalink)  
Antiguo 22/10/2007, 23:39
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
Re: Un clasico problema

atoi() .
  #3 (permalink)  
Antiguo 23/10/2007, 08:40
Avatar de Jona_than  
Fecha de Ingreso: noviembre-2005
Ubicación: Chile
Mensajes: 155
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Un clasico problema

Lo solucione de otra forma, como se sabe a un numero char el restamos -48, para transformarlo en entero. Y funciona!...de igual manera anotare el codigo, para que les sirva a alguien por ahí.

Código:
//Validación del rut
//Alumno: Jonathan Ramírez
//Fecha: 23 Octubre 2007
//UTFSM Informatica
#include <stdio.h>
#include <string.h>
int main()
{
//declaracion de variables
char rut[7];
char rutvalidado[7];
int total=0;
int a,b,c;
int contador=3;
int acumulador=0;
int resto=0;
int digito=0;
//fin declaracion de variables
printf("*** CALCULO DEL DIGITO VERIFICADOR RUT (CHILE) ***");
printf("\n\n");
printf("Ingrese el rut que ejecutar: ");
gets(rut);
total=strlen(rut);
                  if(total<=7) {
                               for(a=0;a<=7;a++) {
                                                 if(rut[0]==rut[a]) {
                                                                    rutvalidado[0]='0';
                                                                    rutvalidado[a+1]=rut[0];
                                                                    }
                                                 else               {
                                                                    rutvalidado[a+1]=rut[a];
                                                                    }
                                                 }                                                 
                               }
                  else         {
                               for(b=0;b<=7;b++) {
                                                 rutvalidado[b]=rut[b];
                                                 }
                               }
for(c=0;c<=7;c++) {
                  if(contador==2) {
                                  acumulador=acumulador+((rutvalidado[c]-48)*contador);
                                  contador=8;
                                  }
                  else            {
                                  acumulador=acumulador+((rutvalidado[c]-48)*contador);
                                  }
                  contador=contador-1;
                  }
digito=(11-(acumulador%11));
if(digito>=10) {
               if(digito==10) {
                              printf("\nEl digito verificador de su rut es: K");                              }
               else           {
                              printf("\nEl digito verificador de su rut es: 0");
                              }
               }
else           {
               printf("\nEl digito verificador de su rut es: %d", digito);
               }
getchar();
getchar();
}
Saludos.
__________________
- Fasecreativa
- Twitter @jonyram

Última edición por Jona_than; 23/10/2007 a las 09:03
  #4 (permalink)  
Antiguo 23/10/2007, 11:58
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
Re: Un clasico problema

Cita:
Iniciado por Jona_than Ver Mensaje
Lo solucione de otra forma, como se sabe a un numero char el restamos -48, para transformarlo en entero. Y funciona!...de igual manera anotare el codigo, para que les sirva a alguien por ahí.
¿"Como se sabe"? No deberías asumir que restando -48 a un char lo convierte en su número equivalente.

De hecho, dicha conversión sólo te vale para un char (atoi() sirve para una cadena), sólo te vale para números de un dígito (atoi() para cadenas que representen números de tamaño int) y ya no te digo si resulta que tu char tiene una representación interna distinta a la que supones (no ASCII), o tenga otro rango de valores (no sabes si es signed o unsigned), o estás en una arquitectura en la que un char sean más de 8 bits, etc.

Última edición por MaxExtreme; 23/10/2007 a las 12:04
  #5 (permalink)  
Antiguo 23/10/2007, 12:35
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Re: Un clasico problema

Cita:
Iniciado por MaxExtreme Ver Mensaje
¿"Como se sabe"? No deberías asumir que restando -48 a un char lo convierte en su número equivalente.

De hecho, dicha conversión sólo te vale para un char (atoi() sirve para una cadena), sólo te vale para números de un dígito (atoi() para cadenas que representen números de tamaño int) y ya no te digo si resulta que tu char tiene una representación interna distinta a la que supones (no ASCII), o tenga otro rango de valores (no sabes si es signed o unsigned), o estás en una arquitectura en la que un char sean más de 8 bits, etc.
atoi es para cadenas?
Ahora si me hiciste dudar.... pense que tambien solo funcionaba para caracteres. tendre que repasar esos aspectos.
Saludos
  #6 (permalink)  
Antiguo 23/10/2007, 13:54
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 18 años, 7 meses
Puntos: 28
Re: Un clasico problema

Cita:
Función atoi ANSI C

int atoi(const char *numPtr);

Convierte la porción inicial de la cadena apuntada por numPtr a una representación de int.
Saludos!
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #7 (permalink)  
Antiguo 24/10/2007, 12:05
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Re: Un clasico problema

Cierto.
Es lo que veia en libro del estandar de C.

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:28.