Programación General > C/C++

 Validar un Ciclo EJ: For

(1/2) > >>

infonet:
Estimados tengo el siguiente código fuente, que me valida el ciclo for, pero lo único que me está faltando es que me considere los espacios en blanco, me podrían orientar como lo valido…
Estaba buscando y algo encontré con isspace

Pero no me resulta, tendré que guardarlo  en un vector???



--- Código: C++ --- #include<stdio.h>#include<conio.h>#include<string.h>#include<stdlib.h>#include<ctype.h>#include <windows.h>#include <math.h>#include <dos.h>int pos, num_chars, Sigue,Tamano,Cont,PosIni,i,PosVec,j,PosParen,Error,CanTonk,Tamano2,k,Opcion;char string[150],CadenaLeida[150],Bloques[50][150],SiFor[150],Tokens[50][150],NuevaCadena[150];int EsOperador(char QueAnalizar){if (QueAnalizar=='+') {return(1);} else if (QueAnalizar=='-') {return(1);} else if (QueAnalizar=='*') {return(1);} else if (QueAnalizar=='/') {return(1);} else if (QueAnalizar=='(') {return(2);} else if (QueAnalizar==')') {return(2);} else if (QueAnalizar=='[') {return(2);} else if (QueAnalizar==']') {return(2);} else if (QueAnalizar=='<') {return(3);} else if (QueAnalizar=='>') {return(3);} else if (QueAnalizar=='=') {return(3);} else if (QueAnalizar=='!') {return(3);} else {return(0);}}void EsFor(){printf("nntDigite la sentencia que desea evaluar: "); //Leer la cadena de caracteres que se va a evaluar. scanf("%s",CadenaLeida); //Tomar el tama¤o de la cadena. Tamano=strlen(CadenaLeida); //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //  Recorrer los caracteres de la cadena le¡da para reconocer si es una sentencia. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PosParen=0; for(i=0;i<=Tamano-1;i++) {//Si el caracter es un '('.  if(CadenaLeida[i]=='(')  {PosVec=0;   for(j=0;j<=i-1;j++)   {SiFor[PosVec]=CadenaLeida[j];    PosVec=PosVec+1;   }   PosParen=i;   break;  } } //------------------------------------------------------------------------------- //Si se han producido errores. if(PosParen!=3) {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n FOR");  printf("ntError: %s", SiFor); } else if (strcmp(SiFor,"for")!=0) {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n FOR");  printf("ntError: %s", SiFor); } else if (CadenaLeida[Tamano-1]!=')') {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n FOR");  printf("ntError: %c falta par‚ntesis de cierre final", CadenaLeida[Tamano-1]); } else {Cont=0;  PosIni=4;  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  // Recorrer los car cteres de la cadena le¡da para reconocer los bloques del for.  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  for(i=4;i<=Tamano-2;i++)  {//Si el caracter es un ';'   if(CadenaLeida[i]==';')   {PosVec=0;    //Guardar parte de la cadena en otra variable.    for(j=PosIni;j<=i;j++)    {Bloques[Cont][PosVec]=CadenaLeida[j];     PosVec=PosVec+1;    }    Cont=Cont+1;    PosIni=i+1;   }  }  //Guardar parte de la cadena en otra variable.  PosVec=0;  for(j=PosIni;j<=Tamano-2;j++)  {Bloques[Cont][PosVec]=CadenaLeida[j];   PosVec=PosVec+1;  }  //---------------------------------------------------------------------------  //Si se han producido errores.  if (Cont<2)  {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n for");   printf("ntError: faltan bloques del for 'for([init-expr];[cond-expr];[loop-expr])'");  }  else if (Cont!=2)  {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n for");   printf("ntError: hay mas de 3 bloques para el for 'for([init-expr];[cond-expr];[loop-expr])'");  }  else  {//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++   //Identificar los tokens existentes dentro de los bloques del for.   //Almacenar los primero Tokens.   strcpy(Tokens[0],SiFor);   Tokens[1][0]=CadenaLeida[3];   CanTonk=1;   //Recorrer todos los Bloques.   for(i=0;i<=Cont;i++)   {//Limpiar la variable NuevaCadena.    PosVec=0;    for(k=0;k<=149;k++)    {NuevaCadena[k]=0;}    //Tomar el tamano del bloque actual.    Tamano2=strlen(Bloques[i])-1;    //Buscar los Tokens del Bloque Actual.    for(j=0;j<=Tamano2;j++)    {if(EsOperador(Bloques[i][j])==0 && Bloques[i][j]!=';')     {NuevaCadena[PosVec]=Bloques[i][j];      PosVec=PosVec+1;     }     else     {if (strlen(NuevaCadena)!=0)      {CanTonk=CanTonk+1;       for(k=0;k<=PosVec;k++)       {Tokens[CanTonk][k]=NuevaCadena[k];}       //Limpiar la variable NuevaCadena.       PosVec=0;       for(k=0;k<=149;k++)       {NuevaCadena[k]=0;}      }      CanTonk=CanTonk+1;      Tokens[CanTonk][0]=Bloques[i][j];     }    }   }   if (strlen(NuevaCadena)!=0)   {CanTonk=CanTonk+1;    for(k=0;k<=PosVec;k++)    {Tokens[CanTonk][k]=NuevaCadena[k];}    //Limpiar la variable NuevaCadena.    PosVec=0;    for(k=0;k<=149;k++)    {NuevaCadena[k]=0;}   }   CanTonk=CanTonk+1;   Tokens[CanTonk][0]=41; //Ascii=')'   //---------------------------------------------------------------   printf("nntNUMERO IDENTIFICADOS");   for(i=0;i<=CanTonk;i++)   {if (strlen(Tokens[i])>0)    {printf("nt%dt%s",i+1,Tokens[i]);}    else    {printf("nt%dt%c",i+1,Tokens[i]);}    {printf("ttt OK VALIDADO..!!!");}   }  } }}main(){Sigue=0; do {  system("cls");  printf("nnttttPROGRAMA    QUE    VALIDA");  printf("nntttttCICLO FORnn");  printf("nnttt1. ANALIZAR CICLO FORnnn");  printf("nnttttDIGITE OPCION: ");  scanf("%d", &Opcion);  for(i=0;i<=149;i++)  {CadenaLeida[i]=0;   SiFor[i]=0;  }  for(i=0;i<=49;i++)  {for(j=0;j<=149;j++)   {Bloques[i][j]=0;    Tokens[i][j]=0;   }  }  if(Opcion==1)  {EsFor();   printf("nnntEJECUTA EL PROGRAMA NUEVAMENTE?? [SI=1][NO=0]: ");   scanf("%d",&Sigue);  }  else  {printf("nnError digite una opci¢n valida.");} }while(Sigue!=0);}   

infonet:
TENGO ESTE CODIGO QUE ME DEJA EN "CadenaLeida" el ingreso de la sentencia sin espacio en blanco, pero al tomar esa "CadenaLeida" en el Programa anterio no me valida....

--- Código: C++ --- #include <iostream.h>#include <string.h>#include <conio.h>#include <dos.h>  int main(){  char string[150];char CadenaLeida[150];int pos, num_chars;for (pos = 0; pos < 80; pos++){string[pos] =' '; //reset de string} cout << "INGRESE UNA CADENA CON LOS CARACTERES DEL ARREGLO: ";cin.get(string,150,'n');   int i;  int j;      for (i = j = 0; string[i] != ''; i++)      if (string[i] != ' ')         string[j++] = string[i];         string[j] = '';         printf("texto sin espacios: %s", string);      strcpy(CadenaLeida, string); printf("n Cadena Final : %s ",CadenaLeida); getche();return 0;}  

betopin:

--- Cita de: "infonet" ---
--- Código: C ---  //Leer la cadena de caracteres que se va a evaluar. scanf("%s",CadenaLeida); //Tomar el tama¤o de la cadena.  {printf("nnError digite una opci¢n valida.");} }while(Sigue!=0); }
--- Fin de la cita ---

El problema reside en la manera como capturas la cadena. Con scanf no puedes capturar espacios. Lee un poco al respecto. Tendras que utilizar otros metodos como por ejemplo el comando gets().

Saludos

krnl64:
scanf si puede leer blancos y algunas cosas más.

Por ejemplo

--- Código: C --- scanf("%20[a-z-1-9 ]",buffer);  
Éste scanf lee como máximo 20 caracteres de todo lo que se teclee y además solo acepta caracteres de la a a la z
,números del 1 al 9 y espacios en blanco.

Mira esto
http://www.cplusplus.com/reference/clib ... dio/scanf/ (inglés)

betopin:

--- Cita de: "krnl64" ---scanf si puede leer blancos y algunas cosas más.

Por ejemplo

--- Código: C --- scanf("%20[a-z-1-9 ]",buffer);  
Éste scanf lee como máximo 20 caracteres de todo lo que se teclee y además solo acepta caracteres de la a a la z
,números del 1 al 9 y espacios en blanco
--- Fin de la cita ---

De la manera que tu lo propones si....de la manera que cito de la funcion del chico que busca ayuda no.
S2

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa