2011-05-16 10 views
5

Un programa que imprime su entrada una palabra por línea.No se ha podido averiguar el error lógico en el programa C

int main() { 

    int c; 

    while ((c=getchar()) != EOF) { 

     if (c== ' ' || c== '\n' ||c == '\t') 
       putchar('\n'); 
     else { 
      putchar(c); 
     } 
    } 
    return 0; 
} 

El programa anterior imprime el resultado correctamente, una palabra por línea. Después de cambiar la condición en consecuencia, esperaba que el programa a continuación también imprimiera una palabra por línea. Sin embargo, no estoy obteniendo el resultado correcto. ¿Estoy cometiendo un error tonto o algo está mal?

int main() { 

    int c; 

    while ((c=getchar()) != EOF) { 

     if (c != ' ' || c != '\n' || c != '\t') 
      putchar(c); 
     else { 
      putchar('\n'); 
     } 
    } 

    return 0; 

} 

Respuesta

16

el cambio correcto de la condición es:

if (!(c == ' ' || c == '\n' || c == '\t')) 

o

if (c != ' ' && c != '\n' && c != '\t') 

Descubre De Morgan's law

+2

+1 para el enlace a la Ley de De Morgan –

+0

@Paul R. y anónimo - gracias;) – MByD

+0

@che - gracias. Pensé en ello, pero era demasiado perezoso para editarlo :) – MByD

3

Es necesario cambiar las || s a && s, es decir, cambiar

 if (c != ' ' || c != '\n' || c != '\t') 

a

 if (c != ' ' && c != '\n' && c != '\t') 

es decir, "si C no es igual a espacio y C no es igual a regresar y C no es igual a la pestaña ENTONCES ..."

1

Se podría hacer lo que dijo MByD, o puede cambiar su o de (||) a y (& &).

0

El error está en su expresión condicional. Cuando cambia el signo de la primera expresión

!(c== ' ' || c== '\n' ||c == '\t') 

que se obtiene:

c!= ' ' && c!= '\n' &&c != '\t' 

y no se ha definido en su pregunta.

Recuerde:

(A & & B) es lo mismo que (! A || B)

0

Lo contrario de A or B or C es not A and not B and not C, a fin de utilizar:

if(c != ' ' && c != '\n' && c != '\t') 
2

Recuerde sus clases de programación lógica:

!(A || B) == (!A && !B) 
!(A && B) == (!A || !B) 

En otras palabras: su condición tiene que leer como esto:

if (c != ' ' && c != '\n' && c != '\t') 
0

Es necesario estudiar un poco más en DeMorgan's Laws. No es suficiente cambiar los operadores de combinación de "||" para "& &", también debe negar todos los elementos que se combinan para obtener el mismo conjunto de soluciones.

4

Has obtenido varias respuestas a tu pregunta original, pero me siento obligado a agregar un pequeño detalle: tanto la versión original como la modificada adolecen de algunos de los problemas que consideraría.Primero, realmente no detectan el espacio en blanco correctamente (p. Ej., Ignoran las pestañas verticales y cualquier otro espacio en blanco según lo define la configuración regional), y producen líneas en blanco si las palabras están separadas por más de un carácter de espacio en blanco .

Para el primer problema, utilizaría isspace en lugar de comparar directamente con los caracteres de espacios en blanco que conoces (por cierto, eliminando el origen del problema que encontraste). Para el segundo, podría agregar algo de lógica para omitir todos los caracteres de espacio en blanco consecutivos cuando encuentre el primero, o podría agregar un indicador para escribir una nueva línea si y solo si el carácter actual es un espacio y el el personaje anterior que escribiste no era una nueva línea.

Como alternativa, puede leer palabras usando scanf con la conversión %s:

char buffer[256]; 

while (scanf("%255s", buffer)) 
    printf("%s\n", buffer); 

Este enfoque, sin embargo, impone un límite superior en el tamaño de una sola palabra. En circunstancias normales, eso rara vez es un problema, pero dependiendo de la naturaleza de la entrada, puede/puede ser.

+0

Gracias por compartiendo los problemas con el programa. Lo intentaré también. – bornfree

Cuestiones relacionadas