[Enunciado] O programa abaixo administra uma coleção de números digitados pelo usuário. (A coleção pode conter mais de uma cópia de um mesmo número.) O usuário pode
A coleção é armazenada em ordem crescente.
// Este programa administra uma coleção de números.
// Digite
// i 222
//
// para inserir 222 na coleção. Digite
//
// r 333
//
// para remover 333 da coleção. Digite qualquer
// caractere diferente de 'i' e 'r' para sair.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void insere (int k, int x, int n, int v[]);
void remove (int k, int n, int v[]);
#define MAX 100
int main (void)
{
int v[MAX];
int n = 0;
while (true) {
// a coleção está em v[0..n-1], em ordem crescente
char str[2], op;
int k, x;
printf ("\nOperação? ");
scanf ("%s", str);
op = str[0];
switch (op) {
case 'i': if (n >= MAX) return EXIT_FAILURE;
scanf ("%d", &x);
for (k = 0; k < n && v[k] < x; ++k) ;
n = insere (k, x, n, v);
break;
case 'r': if (n <= 0) return EXIT_FAILURE;
scanf ("%d", &x);
for (k = 0; k < n && v[k] < x; ++k) ;
if (k < n && v[k] == x)
n = remove (k, n, v);
break;
default: return EXIT_SUCCESS;
}
printf ("Temos: ");
for (k = 0; k < n; ++k)
printf (" %d", v[k]);
printf ("\n");
}
}
O código de operação digitado pelo usuário é armazenado em str[0]; o vetor str tem um elemento adicional para acomodar o byte nulo que marca o fim da string.
O programa é interrompido se o espaço alocado a v estiver esgotado e o usuário tentar inserir mais um elemento. O programa também é interrompido se o usuário tentar remover um elemento de uma coleção vazia.