elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Aver si encuentran el error
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Aver si encuentran el error  (Leído 3,227 veces)
krowa

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Aver si encuentran el error
« 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 :)


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Aver si encuentran el error
« Respuesta #1 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}
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


En línea

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

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Aver si encuentran el error
« Respuesta #2 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}
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!
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Aver si encuentran el error
« Respuesta #3 en: 23 Octubre 2011, 06:45 am »

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

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

Un saludo
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines