En esta página

El ejercicio

Rush 00: dibujar un rectángulo en la pantalla usando solo write.

DatoValor
Carpeta de entregaex00/
Archivosmain.c, ft_putchar.c, rush00.c
Función obligatoriavoid rush(int x, int y)
Funciones de libreríasolo write

Requisitos

  • rush(x, y) dibuja un rectángulo de x caracteres de ancho por y de alto.
  • Esquinas o, lados horizontales - y lados verticales |.
  • Cualquier entero debe funcionar, incluidos el cero y los negativos, sin colgarse.
  • ft_putchar.c contiene únicamente la función ft_putchar.

Los tres archivos

main.c

/* Prototipo de la funcion que vive en rush00.c. */
void    rush(int x, int y);

int main(void)
{
    rush(5, 3);
    return (0);
}

ft_putchar.c

#include <unistd.h>

/*
** Escribe un solo caracter en la salida estandar (file descriptor 1).
** Es la unica funcion permitida por el enunciado para mostrar texto.
*/
void    ft_putchar(char c)
{
    write(1, &c, 1);
}

rush00.c

/*
** rush00.c
** Dibuja un rectangulo de x caracteres de ancho por y caracteres de alto.
**
** Esquinas: 'o'
** Lados horizontales: '-'
** Lados verticales: '|'
** Interior: espacios
*/

/* Prototipo de la funcion auxiliar que vive en ft_putchar.c. */
void    ft_putchar(char c);

/*
** Imprime una fila que es borde superior o inferior.
** Para x = 1 imprime solo "o" y para x = 2 imprime "oo".
*/
static void print_horizontal_edge(int width)
{
    int column;

    column = 0;
    while (column < width)
    {
        if (column == 0 || column == width - 1)
            ft_putchar('o');
        else
            ft_putchar('-');
        column++;
    }
    ft_putchar('\n');
}

/*
** Imprime una fila del medio: bordes '|' y espacios en el interior.
** Para x = 1 imprime solo "|" y para x = 2 imprime "||".
*/
static void print_vertical_edge(int width)
{
    int column;

    column = 0;
    while (column < width)
    {
        if (column == 0 || column == width - 1)
            ft_putchar('|');
        else
            ft_putchar(' ');
        column++;
    }
    ft_putchar('\n');
}

/*
** Funcion principal del ejercicio.
** Si x o y son cero o negativos no se dibuja nada, para no imprimir
** un rectangulo imposible ni entrar en un bucle infinito.
*/
void    rush(int x, int y)
{
    int row;

    if (x <= 0 || y <= 0)
        return ;
    row = 0;
    while (row < y)
    {
        if (row == 0 || row == y - 1)
            print_horizontal_edge(x);
        else
            print_vertical_edge(x);
        row++;
    }
}

Compilar y ejecutar

cd ex00
gcc -Wall -Wextra -Werror main.c ft_putchar.c rush00.c -o rush00
./rush00

Compila con los mismos flags que usa la piscina. Si falta uno de los tres archivos, el enlazador falla con undefined reference to ft_putchar.

Casos de prueba

Los cinco casos del enunciado, verificados carácter por carácter:

rush(5, 3)

o---o
|   |
o---o

rush(5, 1)

o---o

rush(1, 1)

o

rush(1, 5)

o
|
|
|
o

rush(4, 4)

o--o
|  |
|  |
o--o

Descargar

Los archivos también están en la carpeta ex00/ del repositorio.