Aver si encuentran el error

Iniciado por krowa, 23 Octubre 2011, 05:32 AM

0 Miembros y 1 Visitante están viendo este tema.

krowa

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 :)

rir3760

Es un error logico.

Tu programa procesa el principio de una linea hasta encontrar el caracter '&', bueno, imagina que se teclea:
abcde&{ENTER}
Los caracteres "abcde" se procesan, el '&' se descarta y causa la salida del bucle y el '\n' (generado al presionar la tecla {ENTER}) se queda en el bufer de la entrada estandar para ser procesado por la siguiente iteracion.

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

krowa

Cita de: 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:
abcde&{ENTER}
Los caracteres "abcde" se procesan, el '&' se descarta y causa la salida del bucle y el '\n' (generado al presionar la tecla {ENTER}) se queda en el bufer de la entrada estandar para ser procesado por la siguiente iteracion.

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!

rir3760

Justo despues del bucle que procesa el principio de la linea debes colocar este otro:
Código (cpp) [Seleccionar]
while ((c = getchar()) != EOF && c != '\n')
; // Nada que hacer


Sin embargo si estas programando en C++ deberias tratar de utilizar su biblioteca estandar (y no la de C).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language