aqui el codigo para validar rut en chile

guillermo Sepulveda
29 de Agosto del 2004
tuve que hacer un trabajo sobres estructuras en el cual inclui la validacion de rut mediante una rutina en lenguaje c la validacion comienza desde que ingresa el rut si el rut es invalido manda el mensaje de error y pide volver a ingresar un rut .. esto lo hace hasta que el rut ingresado sea valido
el codigo es:



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


struct persona
{
char rut[12];
char nombres[50];
char apellidos[50];
int edad;
float nota[5];
};



main ()
{
int i=0,r,k2,l=5,largo=2;
int posicion_de_lista=1,posicion_de_lista_alumno=1;
float suma_notas_alum[l];
float promedio=0.0;
struct persona P[largo];


int valor_mult_rut=2, suma_rut=0, acum_mult_rut=0,valor_raya=0,largo_rut=0;
int veri_rut=1,g,contador_puntos=0,contador_guiones=0,contador_kas=0;
int transformacio_rut_ascii,acum_veri_rut_inicial=0;
char codigo_veri,valor_raya_a_char;





printf("n ********* Trabajo con Strruc (estructuras) *****************************nnn");

for(i=0;i<largo;i++,posicion_de_lista_alumno++)
{

fflush(stdin);
posicion_de_lista=1;
printf("n = Ficha alumno %d ====================================================nn",posicion_de_lista_alumno);




do
{
printf(" Ingrese rut alumno : ");
fflush(stdin);
scanf("%s",&P[i].rut);
largo_rut = strlen( P[i].rut);

valor_mult_rut=2;
suma_rut=0;
acum_mult_rut=0;
valor_raya=0;
veri_rut=1;
contador_puntos=0;
contador_guiones=0;
contador_kas=0;
acum_veri_rut_inicial=0;

for ( r=0;r<largo_rut;r++)//rebiso lo que an metido en la cadena
{
if (P[i].rut[r]=='1'||P[i].rut[r]=='2'||P[i].rut[r]=='3'||P[i].rut[r]=='4'||
P[i].rut[r]=='5'||P[i].rut[r]=='6'||P[i].rut[r]=='7'||P[i].rut[r]=='8'||
P[i].rut[r]=='9'||P[i].rut[r]=='0'||P[i].rut[r]=='-'||
P[i].rut[r]=='.'||P[i].rut[r]=='k'||P[i].rut[r]=='K')

{
acum_veri_rut_inicial++;
}

} //cierro el for ( r=0;r<largo_rut||veri_rut==0;r++)
if (largo_rut!=acum_veri_rut_inicial)
{
veri_rut=0;
}
acum_veri_rut_inicial=0;//para ocuparlo si el rut no es valido denuevo
/*****************************************************************************************/
if (veri_rut==1)
{ //inicio el if
for ( g=0;g<largo_rut;g++)
{
if(P[i].rut[g]=='.')
{
contador_puntos++;
}
if(P[i].rut[g]=='-')
{
contador_guiones++;
}
if(P[i].rut[g]=='k'||P[i].rut[g]=='K')
{
contador_kas++;
}
}//ciero el ultimo for
/* veo la cantidad de puntos y dond estn ubicados*/
if (contador_puntos > 2)
{
veri_rut=0;
}

if (veri_rut==1 && contador_puntos==1 && P[i].rut[largo_rut-6]!='.')
{
veri_rut=0;
}

if (veri_rut==1 && contador_puntos==2 && (P[i].rut[largo_rut-10]!='.'|| P[i].rut[largo_rut-6]!='.'))
{
veri_rut=0;
}

/*------- veo las rayas ----------*/

if (veri_rut==1 && contador_guiones > 1 )
{
veri_rut=0;
}
if ( veri_rut==1 && P[i].rut[largo_rut-2]!='-')
{
veri_rut=0;
}

/*------- veo las k ----------*/
if ( veri_rut==1 && contador_kas > 1)
{
veri_rut=0;
}

if (veri_rut==1 && contador_kas==1 && P[i].rut[largo_rut-1]=='k')
{
veri_rut=1;
}
else {
if(veri_rut==1 && contador_kas==1 && P[i].rut[largo_rut-1]!='K')
{
veri_rut=0;
}
}
}// cierro el primer IF (veri_rut==1)

/*****************************************************************************************************************/

/*------ Calculo la raya del rut -------- */
if (veri_rut==1)
{
largo_rut=largo_rut-3;
while(largo_rut>=0) // cuento als pocisiones desde atras de la cadena hacia adelante
{
if (valor_mult_rut > 7)
{
valor_mult_rut=2;
}
if ( P[i].rut[largo_rut]=='.')
{
largo_rut=largo_rut-1; // si es punto la pocion de la cadena me corro
} // un lugar a la izquierda

switch(P[i].rut[largo_rut])
{
case '0':transformacio_rut_ascii=0;
break;
case '1':transformacio_rut_ascii=1;
break;
case '2':transformacio_rut_ascii=2;
break;
case '3':transformacio_rut_ascii=3;
break;
case '4':transformacio_rut_ascii=4;
break;
case '5':transformacio_rut_ascii=5;
break;
case '6':transformacio_rut_ascii=6;
break;
case '7':transformacio_rut_ascii=7;
break;
case '8':transformacio_rut_ascii=8;
break;
case '9':transformacio_rut_ascii=9;
break;
}
acum_mult_rut=0;// lo dejo en cero para volver a ocuparlo en siguiente digito
acum_mult_rut= valor_mult_rut * transformacio_rut_ascii;
suma_rut=suma_rut+acum_mult_rut;
valor_mult_rut++;
largo_rut=largo_rut-1;

} //cierro el for( largo_rut=largo_rut ; largo_rut < 0 ; largo_rut=largo_rut-1)
valor_raya=11-(suma_rut%11);
if (valor_raya==11)
{
codigo_veri='0';
}
if (valor_raya==10)
{
largo_rut=strlen(P[i].rut);
if(P[i].rut[largo_rut-1]=='k')
{codigo_veri='k';}
if(P[i].rut[largo_rut-1]=='K')
{codigo_veri='K';}
if(P[i].rut[largo_rut-1]!='K'&& P[i].rut[largo_rut-1]!='k')
{codigo_veri='K';}
}
if(valor_raya==0 ||valor_raya==1 ||valor_raya==2 ||valor_raya==3 ||valor_raya==4 ||
valor_raya==5 ||valor_raya==6 ||valor_raya==7 ||valor_raya==8 ||valor_raya==9 )
{
switch(valor_raya)// devuelvo el valor de raya a char para que lo compare con
// "codigo_veri" q es variable tipo char, sino no funka
{
case 1:valor_raya_a_char='1';
break;
case 2:valor_raya_a_char='2';
break;
case 3:valor_raya_a_char='3';
break;
case 4:valor_raya_a_char='4';
break;
case 5:valor_raya_a_char='5';
break;
case 6:valor_raya_a_char='6';
break;
case 7:valor_raya_a_char='7';
break;
case 8:valor_raya_a_char='8';
break;
case 9:valor_raya_a_char='9';
break;

}//cierro el switch
codigo_veri=valor_raya_a_char;
}//cierro el if antes del switch
/**********************************************************************************************************/
// VEO QUE SI LA RAYA QUE INGRESARON COINCIDE CON LA CALCULADA

largo_rut=strlen(P[i].rut);
if(codigo_veri==P[i].rut[largo_rut-1])
{
veri_rut=1;
}
else
{
veri_rut=0;
}
} //cierro el if incicial antes del ultimo for

/*===== se genera una salida ==================================================================*/

if (veri_rut==0)
{
printf("nt::::::::::::: [Error] :::::::::::::");
printf("nt Rut Invalido o caracteres invalidos n");
}

}//cierro el do inicial del ingreso del rut
while (veri_rut==0); // del dowhile inciado con el do al principio antes de ingresar el rut y luego de no se q wa






printf(" Ingrese los nombres : ");
scanf("%s",P[i].nombres);
fflush(stdin);

printf(" Ingrese los apellidos : ");
fflush(stdin);
scanf("%s",P[i].apellidos);

printf(" Ingrese edad : ");
fflush(stdin);
scanf("%d",&P[i].edad);

posicion_de_lista=1;

// ingreso de las notas con un for*/

printf("ntt-------Ingreso de notas alumno ---------- ");
printf("nttIngrese 5 notas de formato dicimal con hasta ntt 6 decimales...no introdusca numero enteros nn");
for (k2=0;k2<5;k2++)
{
/*printf(" i= %d , k2=%d :",i,k2);*/
printf("ttIngrese nota %d :",posicion_de_lista);
fflush(stdin);
scanf("%f",&P[i].nota[k2]);
/* -------------- ERROR -------------*/
while( 0>P[i].nota[k2]|| P[i].nota[k2]>7)
{

printf("anttt -------------- ERROR -------------");
printf("nttt el sistema de evaluacion es sobre 7");
printf("nttt debe de ingresar una nota entre los");
printf("nttt valores sobre 0 y hasta 7.0 : ");
scanf("%f",&P[i].nota[k2]);
}

// printf("n%f valor de nota",P[i].nota[k2]);
suma_notas_alum[i]=suma_notas_alum[i]+P[i].nota[k2];
posicion_de_lista++;
}

} // cierro el for

posicion_de_lista=1;
printf("aannt---------- Imprimiendo datos -----------------------------------");
for(i=0;i<largo;i++,posicion_de_lista++)
{

printf("nnt. Alumno %d .................",posicion_de_lista);
printf("nntNombre: %s %s ",P[i].nombres,P[i].apellidos);

promedio=suma_notas_alum[i]/5;
printf("ntSu promedio es: %1.1f ",promedio);

}//cierro for
printf("nnnntt");
system("pause");

}// cierro el main







Bueno ojala y les sirba a alguien.. yo lo probe con todos los posibles errores y nunca se me callo ok... asi que este si funciona.. bye