K&R Ejercicio 1-9 (C)

5 minutos de lectura

“Escriba un programa para copiar su entrada a su salida, reemplazando cada cadena de uno o más espacios en blanco por un solo espacio en blanco”.

Supongo que con esto se refiere a introducir algo como…

Nosotros(en blanco)(en blanco)(en blanco)Vamos(vacío)a(en blanco)(en blanco)(en blanco)la(vacío)¡centro comercial!

… y salida como:

Nosotros(vacío)Vamos(vacío)a(vacío)la(vacío)¡centro comercial!

Esto es probablemente más fácil de lo que estoy haciendo, pero aún así, parece que no puedo resolverlo. Realmente no quiero el código… más aún pseudocódigo.

Además, ¿cómo debería mirar esto? Estoy bastante seguro de que cualquier programa que escriba necesitará al menos uno variablea while bucle, un par if declaraciones, y utilizará tanto el getchar() y putchar() funciones… pero además de eso estoy perdido. Realmente no tengo un tren de pensamiento de programadores todavía, así que si pudieras darme algún consejo sobre cómo debería considerar los “problemas” en general, sería increíble.

(Y por favor no menciones elseno he llegado tan lejos en el libro, así que ahora mismo eso está fuera de mi alcance).

  • +1 por buen estado mental mientras aprendes.

    – Alejandro C.

    22 de julio de 2010 a las 10:59

  • no tengas miedo de else. else es tu amigo. En realidad, todas las construcciones del lenguaje son tus amigos. Excepto los punteros. Ten miedo a los punteros.

    – Zano

    22 de julio de 2010 a las 11:43

  • y teme al goto. Solo el mejor de sus trabajos sabe cuándo realmente hay un punto en el que usar goto sería apropiado.

    – dhein

    2 de noviembre de 2015 a las 13:20

  • Bueno, puede desarrollar un programa de forma iterativa y experimental: primero cree un programa trivial y luego agréguele funcionalidad. Otro enfoque es más sistemático: piense en los diferentes estados que encuentra su programa (en este caso: qué entrada actual y qué entrada anterior) y qué hará entonces. Usted puede estar interesado en diagramas de transición de estadoaunque más como una actitud.

    – Peter – Reincorporar a Mónica

    29 de febrero de 2020 a las 21:23

avatar de usuario
carpintero mate

pseudocódigo

while c = getchar:
    if c is blank:
        c = getchar until c is not blank
        print blank
    print c

C

Puede sustituir el uso de isblank aquí si lo deseas. No se especifica qué caracteres se crean en blanco o qué valor en blanco se imprimirá en lugar de otros.

Después de muchos puntos hechos por Matthew en los comentarios a continuación, esta versión y la que contiene isblank son lo mismo.

int c;
while ((c = getchar()) != EOF) {
    if (c == ' ') {
        while ((c = getchar()) == ' ');
        putchar(' ');
        if (c == EOF) break;
    }
    putchar(c);
}

  • Simplemente pregunte si desea esto en sintaxis C.

    – Matt Carpintero

    22 de julio de 2010 a las 4:18

  • Una cosa que podría ayudar: este podría ser un buen momento para aprender sobre ctype.h si aún no lo sabes. ctype.h contiene funciones para determinar el “tipo” de un char. Es decir, puede usarlo para ver si un char es una letra, un número, un espacio en blanco, etc. Si es demasiado para asimilar ahora, simplemente tome nota mental para más adelante para que no pierda el tiempo reinventando la rueda.

    – Miguel

    22 de julio de 2010 a las 4:23


  • Emitirá un carácter basura (EOF) si el último carácter está en blanco.

    – Mateo Flaschen

    22 de julio de 2010 a las 4:40

  • @ Mateo: ¡Gracias! ¡Buena atrapada!

    – Matt Carpintero

    22 de julio de 2010 a las 4:48

  • @ssbrewster: Funciona porque el interior while declaración quema el exceso de espacios, antes de imprimir un solo espacio.

    – Matt Carpintero

    28 de noviembre de 2012 a las 15:35

Esto es lo que conseguí:

while ch = getchar()
   if ch != ' '
      putchar(ch)
   if ch == ' '
      if last_seen_ch != ch
         putchar(ch)
   last_seen_ch = ch

  • Este es el algoritmo más fácil aquí IMO. ¡Bravo!

    –Nick Rameau

    14 de julio de 2016 a las 10:28

  • reemplazar if ch == ' ' por elseya que solo puede ser espacio debido a la condición inversa anterior

    – Jean-François Fabre

    22 de marzo de 2020 a las 20:23

avatar de usuario
Ino

Misma explicación con Matt Joiner, pero este código no usa break.

int c;

while ((c = getchar()) != EOF)
{
    if (c == ' ') /* find a blank */
    {
        putchar(' '); /* print the first blank */
        while ((c = getchar()) == ' ') /* look for succeeding blanks then… */
            ; /* do nothing */
    }

    if (c != EOF) /* We might get an EOF from the inner while-loop above */
        putchar(c);
}

  • Este es el algoritmo más fácil aquí IMO. ¡Bravo!

    –Nick Rameau

    14 de julio de 2016 a las 10:28

  • reemplazar if ch == ' ' por elseya que solo puede ser espacio debido a la condición inversa anterior

    – Jean-François Fabre

    22 de marzo de 2020 a las 20:23

avatar de usuario
patas de rana

Trabajé muy duro para encontrar una solución que usara solo el material que ya se cubrió en la primera parte del primer capítulo del libro. Aquí está mi resultado:

#include <stdio.h>

/* Write a            program         to copy its input to       its output, replacing             each string of one         or more blanks by a single blank. */

main()
{
    int c;

    while ((c = getchar()) != EOF){
        if (c == ' '){
            putchar(c);
            while ((c = getchar()) == ' ')
                ;
        }
        if(c != ' ')
            putchar(c);
    }
}

  • La segunda sentencia if puede ser reemplazada por un ‘else’, ya que si la primera condición es falsa, se sigue que c != ‘ ‘ es verdadera.

    – Teo

    19 mayo 2018 a las 17:20


  • No, no puede por una razón sutil: la llamada getchar() en el ciclo while interno habrá consumido el primer carácter que no esté en blanco al probar la condición del ciclo por última vez. Si no marca c antes de volver al ciclo while externo, perderá el primer carácter después de los espacios en blanco consecutivos.

    – chisaipete

    30 mayo 2018 a las 21:31

¿Ha sido útil esta solución?