aqui el codigo para validar rut en chile
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
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
