En esta página
Ejercicio 04: ft_is_negative
Muestra «N» si
nes negativo y «P» si es positivo o nulo.
| Dato | Valor |
|---|---|
| Carpeta | ex04/ |
| Archivo | ft_is_negative.c |
| Prototipo | void ft_is_negative(int n); |
| Funciones autorizadas | solo write |
Hecho con amor para Laura, por Bogdan.
El archivo
#include <unistd.h>
/*
** Copia local de ft_putchar: el enunciado solo permite entregar este archivo.
** Escribe un unico caracter en la salida estandar.
*/
static void put_char(char c)
{
write(1, &c, 1);
}
/*
** Muestra 'N' si n es negativo y 'P' si es positivo o cero.
** El cero entra en el else a proposito: el enunciado lo cuenta como positivo.
*/
void ft_is_negative(int n)
{
if (n < 0)
put_char('N');
else
put_char('P');
}
Línea por línea
#include <unistd.h>
Declara write, la única función de librería permitida.
static void put_char(char c)
Copia privada de ft_putchar, como en los ejercicios anteriores. Escribe un
byte en la salida estándar.
void ft_is_negative(int n)
| Parte | Significado |
|---|---|
void | no devuelve nada |
ft_is_negative | el nombre que pide el subject |
(int n) | recibe un entero |
El parámetro es int y no char porque el enunciado habla de cualquier entero,
incluidos los negativos grandes.
if (n < 0)
Una decisión. n < 0 es verdadero solo para los negativos: -1, -42,
-2147483648. El cero no entra aquí, y eso es justo lo que pide el
enunciado.
put_char('N');
Se ejecuta solo cuando n es negativo.
else
Todo lo que no entró en el if. Como el if atrapa los negativos, el else
significa «cero o positivo». No hace falta escribir n >= 0: sería repetir la
misma información.
put_char('P');
Se ejecuta para 0 y para cualquier positivo.
Por qué no hay return
La función es void: termina sola al acabar el bloque. Un return ; al final
sería correcto pero redundante; en este repositorio se omite cuando no aclara
nada.
Casos límite
| Llamada | Qué muestra | Por qué |
|---|---|---|
ft_is_negative(-2147483648) | N | es negativo |
ft_is_negative(-1) | N | es negativo |
ft_is_negative(0) | P | el cero entra en el else |
ft_is_negative(1) | P | es positivo |
ft_is_negative(2147483647) | P | es positivo |
| Detalle | Decisión |
|---|---|
| Cero | muestra P, como pide el subject |
INT_MIN | muestra N sin desbordar: aquí no se cambia el signo de nada |
| Salto de línea | no se imprime |
| Negativos | no hay que contar cuántos: basta con el signo |
Errores típicos
| Mensaje o síntoma | Causa | Solución |
|---|---|---|
el cero muestra N | usaste n <= 0 | cambia a n < 0 |
todos muestran P | comparaste con = en vez de < | if (n < 0) |
| no compila | if (n < 0) sin paréntesis | añádelos |
-Wunused-parameter | no usaste n | úsalo en la condición |
Comprobarlo
cat > /tmp/main.c <<'EOF'
void ft_is_negative(int n);
int main(void)
{
ft_is_negative(-2147483648);
ft_is_negative(-1);
ft_is_negative(0);
ft_is_negative(1);
ft_is_negative(2147483647);
return (0);
}
EOF
cc -Wall -Wextra -Werror ex04/ft_is_negative.c /tmp/main.c -o /tmp/ex04
/tmp/ex04
Salida:
NNPPP