• Viernes 8 de Noviembre de 2024, 16:50

Autor Tema:  Validar un Ciclo EJ: For  (Leído 2068 veces)

infonet

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Validar un Ciclo EJ: For
« en: Domingo 13 de Septiembre de 2009, 08:12 »
0
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++
  1.  
  2. #include<stdio.h>
  3. #include<conio.h>
  4. #include<string.h>
  5. #include<stdlib.h>
  6. #include<ctype.h>
  7. #include <windows.h>
  8. #include <math.h>
  9. #include <dos.h>
  10. int pos, num_chars, Sigue,Tamano,Cont,PosIni,i,PosVec,j,PosParen,Error,CanTonk,Tamano2,k,Opcion;
  11. char string[150],CadenaLeida[150],Bloques[50][150],SiFor[150],Tokens[50][150],NuevaCadena[150];
  12. int EsOperador(char QueAnalizar)
  13. {if (QueAnalizar=='+')
  14.  {return(1);}
  15.  else if (QueAnalizar=='-')
  16.  {return(1);}
  17.  else if (QueAnalizar=='*')
  18.  {return(1);}
  19.  else if (QueAnalizar=='/')
  20.  {return(1);}
  21.  else if (QueAnalizar=='(')
  22.  {return(2);}
  23.  else if (QueAnalizar==')')
  24.  {return(2);}
  25.  else if (QueAnalizar=='[')
  26.  {return(2);}
  27.  else if (QueAnalizar==']')
  28.  {return(2);}
  29.  else if (QueAnalizar=='<')
  30.  {return(3);}
  31.  else if (QueAnalizar=='>')
  32.  {return(3);}
  33.  else if (QueAnalizar=='=')
  34.  {return(3);}
  35.  else if (QueAnalizar=='!')
  36.  {return(3);}
  37.  else
  38.  {return(0);}
  39. }
  40. void EsFor()
  41. {printf("nntDigite la sentencia que desea evaluar: ");
  42.  //Leer la cadena de caracteres que se va a evaluar.
  43.  scanf("%s",CadenaLeida);
  44.  //Tomar el tama¤o de la cadena.
  45.  Tamano=strlen(CadenaLeida);
  46.  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  47.  //  Recorrer los caracteres de la cadena le¡da para reconocer si es una sentencia.
  48.  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  49.  PosParen=0;
  50.  for(i=0;i<=Tamano-1;i++)
  51.  {//Si el caracter es un '('.
  52.   if(CadenaLeida[i]=='(')
  53.   {PosVec=0;
  54.    for(j=0;j<=i-1;j++)
  55.    {SiFor[PosVec]=CadenaLeida[j];
  56.     PosVec=PosVec+1;
  57.    }
  58.    PosParen=i;
  59.    break;
  60.   }
  61.  }
  62.  //-------------------------------------------------------------------------------
  63.  //Si se han producido errores.
  64.  if(PosParen!=3)
  65.  {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n FOR");
  66.   printf("ntError: %s", SiFor);
  67.  }
  68.  else if (strcmp(SiFor,"for")!=0)
  69.  {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n FOR");
  70.   printf("ntError: %s", SiFor);
  71.  }
  72.  else if (CadenaLeida[Tamano-1]!=')')
  73.  {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n FOR");
  74.   printf("ntError: %c falta par‚ntesis de cierre final", CadenaLeida[Tamano-1]);
  75.  }
  76.  else
  77.  {Cont=0;
  78.   PosIni=4;
  79.   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  80.   // Recorrer los car cteres de la cadena le¡da para reconocer los bloques del for.
  81.   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  82.   for(i=4;i<=Tamano-2;i++)
  83.   {//Si el caracter es un ';'
  84.    if(CadenaLeida[i]==';')
  85.    {PosVec=0;
  86.     //Guardar parte de la cadena en otra variable.
  87.     for(j=PosIni;j<=i;j++)
  88.     {Bloques[Cont][PosVec]=CadenaLeida[j];
  89.      PosVec=PosVec+1;
  90.     }
  91.     Cont=Cont+1;
  92.     PosIni=i+1;
  93.    }
  94.   }
  95.   //Guardar parte de la cadena en otra variable.
  96.   PosVec=0;
  97.   for(j=PosIni;j<=Tamano-2;j++)
  98.   {Bloques[Cont][PosVec]=CadenaLeida[j];
  99.    PosVec=PosVec+1;
  100.   }
  101.   //---------------------------------------------------------------------------
  102.   //Si se han producido errores.
  103.   if (Cont<2)
  104.   {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n for");
  105.    printf("ntError: faltan bloques del for 'for([init-expr];[cond-expr];[loop-expr])'");
  106.   }
  107.   else if (Cont!=2)
  108.   {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n for");
  109.    printf("ntError: hay mas de 3 bloques para el for 'for([init-expr];[cond-expr];[loop-expr])'");
  110.   }
  111.   else
  112.   {//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  113.    //Identificar los tokens existentes dentro de los bloques del for.
  114.    //Almacenar los primero Tokens.
  115.    strcpy(Tokens[0],SiFor);
  116.    Tokens[1][0]=CadenaLeida[3];
  117.    CanTonk=1;
  118.    //Recorrer todos los Bloques.
  119.    for(i=0;i<=Cont;i++)
  120.    {//Limpiar la variable NuevaCadena.
  121.     PosVec=0;
  122.     for(k=0;k<=149;k++)
  123.     {NuevaCadena[k]=0;}
  124.     //Tomar el tamano del bloque actual.
  125.     Tamano2=strlen(Bloques[i])-1;
  126.     //Buscar los Tokens del Bloque Actual.
  127.     for(j=0;j<=Tamano2;j++)
  128.     {if(EsOperador(Bloques[i][j])==0 && Bloques[i][j]!=';')
  129.      {NuevaCadena[PosVec]=Bloques[i][j];
  130.       PosVec=PosVec+1;
  131.      }
  132.      else
  133.      {if (strlen(NuevaCadena)!=0)
  134.       {CanTonk=CanTonk+1;
  135.        for(k=0;k<=PosVec;k++)
  136.        {Tokens[CanTonk][k]=NuevaCadena[k];}
  137.        //Limpiar la variable NuevaCadena.
  138.        PosVec=0;
  139.        for(k=0;k<=149;k++)
  140.        {NuevaCadena[k]=0;}
  141.       }
  142.       CanTonk=CanTonk+1;
  143.       Tokens[CanTonk][0]=Bloques[i][j];
  144.      }
  145.     }
  146.    }
  147.    if (strlen(NuevaCadena)!=0)
  148.    {CanTonk=CanTonk+1;
  149.     for(k=0;k<=PosVec;k++)
  150.     {Tokens[CanTonk][k]=NuevaCadena[k];}
  151.     //Limpiar la variable NuevaCadena.
  152.     PosVec=0;
  153.     for(k=0;k<=149;k++)
  154.     {NuevaCadena[k]=0;}
  155.    }
  156.    CanTonk=CanTonk+1;
  157.    Tokens[CanTonk][0]=41; //Ascii=')'
  158.    //---------------------------------------------------------------
  159.    printf("nntNUMERO IDENTIFICADOS");
  160.    for(i=0;i<=CanTonk;i++)
  161.    {if (strlen(Tokens[i])>0)
  162.     {printf("nt%dt%s",i+1,Tokens[i]);}
  163.     else
  164.     {printf("nt%dt%c",i+1,Tokens[i]);}
  165.     {printf("ttt OK VALIDADO..!!!");}
  166.    }
  167.   }
  168.  }
  169. }
  170. main()
  171. {Sigue=0;
  172.  do
  173.  {
  174.   system("cls");
  175.   printf("nnttttPROGRAMA    QUE    VALIDA");
  176.   printf("nntttttCICLO FORnn");
  177.   printf("nnttt1. ANALIZAR CICLO FORnnn");
  178.   printf("nnttttDIGITE OPCION: ");
  179.   scanf("%d", &Opcion);
  180.   for(i=0;i<=149;i++)
  181.   {CadenaLeida[i]=0;
  182.    SiFor[i]=0;
  183.   }
  184.   for(i=0;i<=49;i++)
  185.   {for(j=0;j<=149;j++)
  186.    {Bloques[i][j]=0;
  187.     Tokens[i][j]=0;
  188.    }
  189.   }
  190.   if(Opcion==1)
  191.   {EsFor();
  192.    printf("nnntEJECUTA EL PROGRAMA NUEVAMENTE?? [SI=1][NO=0]: ");
  193.    scanf("%d",&Sigue);
  194.   }
  195.   else
  196.   {printf("nnError digite una opci¢n valida.");}
  197.  }while(Sigue!=0);
  198. }
  199.  
  200.  
  201.  

infonet

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Validar un Ciclo EJ: For
« Respuesta #1 en: Domingo 13 de Septiembre de 2009, 08:12 »
0
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++
  1.  
  2. #include <iostream.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #include <dos.h>
  6.  
  7.  
  8. int main()
  9. {
  10.  
  11.  
  12. char string[150];
  13. char CadenaLeida[150];
  14. int pos, num_chars;
  15. for (pos = 0; pos < 80; pos++)
  16. {
  17. string[pos] =' '; //reset de string
  18. }
  19.  
  20. cout << "INGRESE UNA CADENA CON LOS CARACTERES DEL ARREGLO: ";
  21. cin.get(string,150,'n');
  22.  
  23.   int i;
  24.   int j;
  25.    
  26.    for (i = j = 0; string[i] != ''; i++)
  27.       if (string[i] != ' ')
  28.          string[j++] = string[i];
  29.          string[j] = '';
  30.          printf("texto sin espacios: %s", string);
  31.    
  32.  
  33.  
  34. strcpy(CadenaLeida, string);
  35.  
  36. printf("n Cadena Final : %s ",CadenaLeida);
  37.  
  38. getche();
  39. return 0;
  40. }
  41.  
  42.  

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Validar un Ciclo EJ: For
« Respuesta #2 en: Domingo 13 de Septiembre de 2009, 20:14 »
0
Cita de: "infonet"
Código: C
  1.  
  2.  //Leer la cadena de caracteres que se va a evaluar.
  3.  scanf("%s",CadenaLeida);
  4.  //Tomar el tama¤o de la cadena.  {printf("nnError digite una opci¢n valida.");}
  5.  }while(Sigue!=0);
  6.  
}

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

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
Re: Validar un Ciclo EJ: For
« Respuesta #3 en: Martes 15 de Septiembre de 2009, 19:42 »
0
scanf si puede leer blancos y algunas cosas más.

Por ejemplo
Código: C
  1.  
  2. scanf("%20[a-z-1-9 ]",buffer);
  3.  
  4.  

É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

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Validar un Ciclo EJ: For
« Respuesta #4 en: Martes 15 de Septiembre de 2009, 19:58 »
0
Cita de: "krnl64"
scanf si puede leer blancos y algunas cosas más.

Por ejemplo
Código: C
  1.  
  2. scanf("%20[a-z-1-9 ]",buffer);
  3.  
  4.  

É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

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

infonet

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
SOLUCIONADO
« Respuesta #5 en: Martes 15 de Septiembre de 2009, 22:34 »
0
Solucionado...
y Gracias por sus ayudas....


Código: C++
  1.  
  2.  
  3. #include<stdio.h>
  4. #include<conio.h>
  5. #include<string.h>
  6. #include<stdlib.h>
  7. #include<ctype.h>
  8. #include <windows.h>
  9. #include <math.h>
  10. #include <dos.h>
  11.  
  12. int Sigue,Tamano,Cont,PosIni,i,PosVec,j,PosParen,Error,CanTonk,Tamano2,k,Opcion;
  13. char string[150],CadenaLeida[150],Bloques[50][150],SiFor[150],Tokens[50][150],NuevaCadena[150];
  14. int pIni;
  15.  
  16. int EsOperador(char QueAnalizar)
  17. {if (QueAnalizar=='+')
  18.  {return(1);}
  19.  else if (QueAnalizar=='-')
  20.  {return(1);}
  21.  else if (QueAnalizar=='*')
  22.  {return(1);}
  23.  else if (QueAnalizar=='/')
  24.  {return(1);}
  25.  else if (QueAnalizar=='(')
  26.  {return(2);}
  27.  else if (QueAnalizar==')')
  28.  {return(2);}
  29.  else if (QueAnalizar=='[')
  30.  {return(2);}
  31.  else if (QueAnalizar==']')
  32.  {return(2);}
  33.  else if (QueAnalizar=='<')
  34.  {return(3);}
  35.  else if (QueAnalizar=='>')
  36.  {return(3);}
  37.  else if (QueAnalizar=='=')
  38.  {return(3);}
  39.  else if (QueAnalizar=='!')
  40.  {return(3);}
  41.  else
  42.  {return(0);}
  43. }
  44.  
  45. void EsFor()
  46. {printf("nntDigite la sentencia que desea evaluar: ");
  47. //Leer la cadena de caracteres que se va a evaluar.
  48. // scanf("%s",CadenaLeida);
  49. gets(string);
  50.  printf("nCadena leida Completa: %s",string);
  51.  int i;
  52.   int j;
  53.  
  54.    for (i = j = 0; string[i] != ''; i++)
  55.       if (string[i] != ' ')
  56.      string[j++] = string[i];
  57.      string[j] = '';
  58.        printf("nCadena  sin  Espacios: %s", string);
  59. strcpy(CadenaLeida, string);
  60. //printf("n Cadena Final : %s ",CadenaLeida);
  61. //getche();
  62.  //Tomar el tama¤o de la cadena.
  63.  Tamano=strlen(CadenaLeida);
  64.  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  65.  //  Recorrer los caracteres de la cadena le¡da para reconocer si es una sentencia.
  66.  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  67.  PosParen=0;
  68.  for(i=0;i<=Tamano-1;i++)
  69.  {//Si el caracter es un '('.
  70.   if(CadenaLeida[i]=='(')
  71.   {PosVec=0;
  72.    for(j=0;j<=i-1;j++)
  73.    {SiFor[PosVec]=CadenaLeida[j];
  74.     PosVec=PosVec+1;
  75.    }
  76.    PosParen=i;
  77.    break;
  78.   }
  79.  }
  80.  //-------------------------------------------------------------------------------
  81.  //Si se han producido errores.
  82.  if(PosParen!=3)
  83.  {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n FOR");
  84.   printf("ntError: %s", SiFor);
  85.  }
  86.  else if (strcmp(SiFor,"for")!=0)
  87.  {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n FOR");
  88.   printf("ntError: %s", SiFor);
  89.  }
  90.  else if (CadenaLeida[Tamano-1]!=')')
  91.  {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n FOR");
  92.   printf("ntError: %c falta par‚ntesis de cierre final", CadenaLeida[Tamano-1]);
  93.  }
  94.  else
  95.  {Cont=0;
  96.   PosIni=4;
  97.   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  98.   // Recorrer los car cteres de la cadena le¡da para reconocer los bloques del for.
  99.   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  100.   for(i=4;i<=Tamano-2;i++)
  101.   {//Si el caracter es un ';'
  102.    if(CadenaLeida[i]==';')
  103.    {PosVec=0;
  104.     //Guardar parte de la cadena en otra variable.
  105.     for(j=PosIni;j<=i;j++)
  106.     {Bloques[Cont][PosVec]=CadenaLeida[j];
  107.      PosVec=PosVec+1;
  108.     }
  109.     Cont=Cont+1;
  110.     PosIni=i+1;
  111.    }
  112.   }
  113.   //Guardar parte de la cadena en otra variable.
  114.   PosVec=0;
  115.   for(j=PosIni;j<=Tamano-2;j++)
  116.   {Bloques[Cont][PosVec]=CadenaLeida[j];
  117.    PosVec=PosVec+1;
  118.   }
  119.   //---------------------------------------------------------------------------
  120.   //Si se han producido errores.
  121.   if (Cont<2)
  122.   {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n for");
  123.    printf("ntError: faltan bloques del for 'for([init-expr];[cond-expr];[loop-expr])'");
  124.   }
  125.   else if (Cont!=2)
  126.   {printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n for");
  127.    printf("ntError: hay mas de 3 bloques para el for 'for([init-expr];[cond-expr];[loop-expr])'");
  128.   }
  129.   else
  130.   {//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  131.    //Identificar los tokens existentes dentro de los bloques del for.
  132.    //Almacenar los primero Tokens.
  133.    strcpy(Tokens[0],SiFor);
  134.    Tokens[1][0]=CadenaLeida[3];
  135.    CanTonk=1;
  136.    //Recorrer todos los Bloques.
  137.    for(i=0;i<=Cont;i++)
  138.    {//Limpiar la variable NuevaCadena.
  139.     PosVec=0;
  140.     for(k=0;k<=149;k++)
  141.     {NuevaCadena[k]=0;}
  142.     //Tomar el tamano del bloque actual.
  143.     Tamano2=strlen(Bloques[i])-1;
  144.     //Buscar los Tokens del Bloque Actual.
  145.     for(j=0;j<=Tamano2;j++)
  146.     {if(EsOperador(Bloques[i][j])==0 && Bloques[i][j]!=';')
  147.      {NuevaCadena[PosVec]=Bloques[i][j];
  148.       PosVec=PosVec+1;
  149.      }
  150.      else
  151.      {if (strlen(NuevaCadena)!=0)
  152.       {CanTonk=CanTonk+1;
  153.        for(k=0;k<=PosVec;k++)
  154.        {Tokens[CanTonk][k]=NuevaCadena[k];}
  155.        //Limpiar la variable NuevaCadena.
  156.        PosVec=0;
  157.        for(k=0;k<=149;k++)
  158.        {NuevaCadena[k]=0;}
  159.       }
  160.       CanTonk=CanTonk+1;
  161.       Tokens[CanTonk][0]=Bloques[i][j];
  162.      }
  163.     }
  164.    }
  165.    if (strlen(NuevaCadena)!=0)
  166.    {CanTonk=CanTonk+1;
  167.     for(k=0;k<=PosVec;k++)
  168.     {Tokens[CanTonk][k]=NuevaCadena[k];}
  169.     //Limpiar la variable NuevaCadena.
  170.     PosVec=0;
  171.     for(k=0;k<=149;k++)
  172.     {NuevaCadena[k]=0;}
  173.    }
  174.    CanTonk=CanTonk+1;
  175.    Tokens[CanTonk][0]=41; //Ascii=')'
  176.    //---------------------------------------------------------------
  177.    printf("nntNUMERO IDENTIFICADOS");
  178.    for(i=0;i<=CanTonk;i++)
  179.    {if (strlen(Tokens[i])>0)
  180.     {printf("nt%dt%s",i+1,Tokens[i]);}
  181.     else
  182.     {printf("nt%dt%c",i+1,Tokens[i]);}
  183.     {printf("ttOK VALIDADO..!!!");}
  184.    }
  185.   }
  186.  }
  187. }
  188.  
  189. main()
  190. {Sigue=0;
  191.  do
  192.  {
  193.   system("cls");
  194. // clrscr();
  195.   printf("nntttPROGRAMA    QUE    VALIDA");
  196.   printf("nntttCICLO FORnn");
  197.   printf("nnttt1.ANALIZAR CICLO FORnnn");
  198.   printf("nntttDIGITE OPCION: ");
  199.   scanf("%d", &Opcion);
  200. //  flushall();
  201. fflush(stdin);
  202.   for(i=0;i<=149;i++)
  203.   {CadenaLeida[i]=0;
  204.    SiFor[i]=0;
  205.   }
  206. //  for(i=0;i<=49;i++)
  207. //  {for(j=0;j<=149;j++)
  208. //   {Bloques[i][j]=0;
  209. //    Tokens[i][j]=0;
  210. //   }
  211. //  }
  212.   if(Opcion==1)
  213.   {EsFor();
  214.    printf("nnntEJECUTA EL PROGRAMA NUEVAMENTE?? [SI=1][NO=0]: ");
  215.    scanf("%d",&Sigue);
  216.   }
  217.   else
  218.   {printf("nnError digite una opci¢n valida.");}
  219.  }while(Sigue!=0);
  220. }
  221.  
  222.  
  223.