Título: Aver si encuentran el error Publicado por: krowa en 23 Octubre 2011, 05:32 am Bueno, hice un progrma usando is<conjunto>, en el cual vos introducis caracteres hasta que se pulse "&".
Cuenta de todo con contadores, todo bien.. El tema es que cuenta espacios tambien y si abris el programa e introducis una frase, por ejemplo: "Pedro maneja autos" Deberia contar: 2 ESPACIOS. -Hasta aca todo bien. El programa nos pregunta si queremos volver a introducir una frase.. Le ponemos que si.. e introducimos "Jorge"(sin las comillas obvio..) Nos deberia dar.. espacio: 0- EL ERROR ES QUE ME DA 1 !!! - y si en ves de "Jorge" ponemos "Pablo come" nos va a dar ESPACIO: 2, OSEA SUMA UNO MAS, nose por que revise el codigo mil veces y no encuentro el error espero qe lo encuentren :) ACA VA EL CODIGO: #include <iostream> #include <cstdio> //LA NESESITO PARA GETCHAR #include <cctype> //LA NESESITO PARA EL CONJUNTO IS #include <windows.h> //LA NESESITO PARA SLEEP using namespace std; int main(){ char yn; do{ system("cls"); system("color 0a"); char c; int consonante=0, vocal=0, digitos=0, signos_de_puntuacion=0, mayusculas=0, minusculas=0,espacios=0; cout<<endl<<endl<<endl<<endl; cout<<"Introduzca frase, se leeran caracteres hasta que se pulse ' & '"<<endl<<endl; while ((c=getchar()) != '&'){ //MIENTRAS C SEA DISTINO DE "&" .. (DONDE C ES LO PRESIONADO EN EL TECLADO if(isalpha(c)){ //SI LA FUNCION ISALPHA(QUE EVALUA SI ES UNA LETRA) ES DISTINTA DE 0.. if(isupper(c)) mayusculas++; else minusculas++; switch(tolower(c)){ case 'a': case 'e': case 'i': case 'o': case 'u': vocal++; break; default: consonante++; } } else if(isdigit(c))digitos++; else if(ispunct(c))signos_de_puntuacion++; else if(isspace(c))espacios++; } system("cls"); //BORRA PANTALLA system("color 0d"); // COLOR.. cout<<endl<<endl<<endl<<endl<<endl; //ESPEACIOS ENTER.. for(int j=0;j!=40;j++){ //BUCLE PARA, PARA HACER " UNA BARRA DE CARGA " Sleep(1*1000/40); //1 SON LOS SEGUNDOS QUE QUEREMOS, 1000 LOS MILISEGUNDOS, Y 40 cout<<"= "; //POR QUE ES LA MITAD DE 80 , QUE ES EL ANCHO DE LA CONSOLA QUE SE HABRE } cout<<endl<<endl; cout<<" Consonantes: "<<consonante<<endl; cout<<" Vocales: "<<vocal<<endl; cout<<" Digitos: "<<digitos<<endl; cout<<" Signos de puntuacion: "<<signos_de_puntuacion<<endl; cout<<" Mayusculas: "<<mayusculas<<endl; cout<<" Minusculas: "<<minusculas<<endl; cout<<" Espacios: "<<espacios<<endl; cout<<endl<<endl; for(int j=0;j!=40;j++){ Sleep(1*1000/40); cout<<"= "; } cout<<endl<<endl<<endl; system("pause"); system("cls"); system("color 0f"); cout<<endl<<endl<<endl; cout<<"Desea introducir otra frase?"<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<"Escriba 'y'o 'Y' seguido de ENTER, o presione otra tecla para salir: ";cin>>yn; } while (yn=='y' || yn=='Y'); //MIENTRAS yn SEA 'y' o 'Y' ...(en este caso va a repetir el programa en casi de qe sea 'y' o 'Y' } ----- Y otra cosa ya que estamos ^^, A lo ultimo en el while.. como podria poner para que si se presiona la "y" directamente arranque denuevo sin tener que poner enter.. o si se presiona otra tecla directamente salga. se que es con getchar, pero no lo tengo muy en claro. Gracias :) Título: Re: Aver si encuentran el error Publicado por: rir3760 en 23 Octubre 2011, 06:13 am Es un error logico.
Tu programa procesa el principio de una linea hasta encontrar el caracter '&', bueno, imagina que se teclea: Código: abcde&{ENTER} Esa siguiente iteracion lo contabiliza como el espacio extra que comentas ya que la funcion isspace retorna verdadero si el caracter es espacio blanco (espacio, tabulador o avance de linea, entre otros). Para solucionarlo debes descartar el resto de linea, esto es, los caracteres despues del '&'. Un saludo Título: Re: Aver si encuentran el error Publicado por: krowa en 23 Octubre 2011, 06:19 am Es un error logico. Tu programa procesa el principio de una linea hasta encontrar el caracter '&', bueno, imagina que se teclea: Código: abcde&{ENTER} Esa siguiente iteracion lo contabiliza como el espacio extra que comentas ya que la funcion isspace retorna verdadero si el caracter es espacio blanco (espacio, tabulador o avance de linea, entre otros). Para solucionarlo debes descartar el resto de linea, esto es, los caracteres despues del '&'. Un saludo , podrias poner como seria el codigo correcto asi veo mas especificamente el error ?, gracias! Título: Re: Aver si encuentran el error Publicado por: rir3760 en 23 Octubre 2011, 06:45 am Justo despues del bucle que procesa el principio de la linea debes colocar este otro:
Código
Sin embargo si estas programando en C++ deberias tratar de utilizar su biblioteca estandar (y no la de C). Un saludo |