Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

thinkabout

Esquadra de polícia - Estruturas

Mensagens Recomendadas

thinkabout    0
thinkabout

Boas,

Neste momento estou com dúvidas no ponto e, agradeço sugestões não estou a ver como removo um elemento de um array.

A polícia pretende armazenar informação sobre um conjunto de criminosos. Para cada um dos

criminosos, a informação a armazenar é a seguinte: nome, altura (em cm) e peso (em Kg).

a) Crie um tipo estruturado que permita guardar a informação relativa a um criminoso;

b) Declare uma tabela que permita armazenar um máximo de 100 criminosos. A tabela deve ser

uma variável local da função main().

Após ter declarado a tabela, inicialize-a com os criminosos: {“Joao Ratao”, 175 cm, 120 Kg};

{“Gato das Botas”, 199 cm, 67 Kg}; {“Mancha Negra”, 150 cm, 80 Kg}; {“Etelvina Seabra”,

156 cm, 45 Kg}.

c) Desenvolva uma função que escreva no monitor a informação relativa a um criminoso. A

função recebe, como argumentos, um ponteiro para o início da tabela, o número de elementos

que esta contém e a posição em que se encontra a estrutura relativa ao criminoso pretendido;

d) Desenvolva uma função que procure suspeitos de um determinado crime. A função recebe,

como argumentos, um ponteiro para o início da tabela, o número de elementos que esta

contém, o peso aproximado e a altura aproximada do suspeito. Deve percorrer a tabela e

escrever no monitor a informação relativa a criminosos cuja diferença de peso e de altura não

seja superior a 10% dos valores indicados como argumento.

e) Desenvolva uma função que permita retirar da tabela a informação relativa a uma pessoa. A

função recebe, como argumentos, um ponteiro para o início da tabela, o número de elementos

que esta contém e o nome da pessoa a retirar. Se existir alguém com esse nome na tabela a

sua estrutura deve ser eliminada. Devolve como resultado o número de elementos que

ficaram na tabela após a eliminação.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

typedef struct
{
char *nome;
int altura;
float kg;
}CRIMINOSO;

void imprimifichacriminoso(CRIMINOSO *listacriminosos,int numerodecriminosos, char fichapedida)
{


printf("O sujeito tem o nome de %s com uma altura de %d e pesa %.1f Kilos, \n" , listacriminosos[fichapedida].nome, listacriminosos[fichapedida].altura, listacriminosos[fichapedida].kg);
}

void retirapessoa (CRIMINOSO *listacriminosos,int numerodecriminosos, const char *nome)
{
// Falta-me eliminar o criminoso.

 for (i = 0; i < numerodecriminosos; i++)
{
 // printf("Tentativa nr %d \n", i); debug
  if (listacriminosos[i].nome == nome)
 {
 puts("BOOOM"); // Achei o criminoso
 }
}


}
void main()
{
CRIMINOSO listacriminosos[4] = {{"Joao Ratao", 175, 120 }, {"Gato das Botas", 199 , 67 }, {"Mancha Negra", 150, 80}, {"Etelvina Seabra", 156, 45}};
// imprimifichacriminoso(&listacriminosos[0],4,1);
retirapessoa(&listacriminosos[0],4,"Etelvina Seabra");
}
Editado por thinkabout

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
waza    1
waza

podes fazer um array auxiliar na funçao, e fazer um ciclo que quando estivesse a copiar para o array auxiliar saltasse a "casa" que pretendes eliminar, acho que seria uma hipotese !

Editado por waza

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    96
pmg

Nao e possivel eliminar um elemento dum array em C.

Para "imitar" esse processo, o que se pode fazer é copiar os elementos subsequentes uma posicao para tras; por exemplo, para apagar o elemento 3 dum array que tinha os elementos {1, 2, 3, 4, e 5}

copia o {4} para tras: {1, 2, 4, 4, 5}

copia o {5} para tras: {1, 2, 4, 5, 5}

Se quiseres "apaga" o elemento 5 escrevendo la zero {1, 2, 4, 5, 0}, mas como sabes quantos elementos tem o array isso nao é necessario. O array {1, 2, 4, 5, 5} com 4 elementos é o mesmo que o array {1, 2, 4, 5, 0} com 4 elementos :)

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

como o @pmg disse, o processo normal é "mover" os registos sobrepondo os removidos.

no entanto, o processo descrito por ele, se bem que válido, é o mais ineficiente porque requere que cries um ciclo para mover elemento a elemeno.

eu sei que ele sabe, no entanto deverá não ter referenciado para não complicar, o uso da função memmove.

esta função move-te (copia para um outro local) um bloco de memória sem a necessidade de te preocupares com o destino sobrepor a origem dos dados (algo que a função memcpy não contempla).

com esta função, o "remover" um elemento é feito com uma única chamada desta função.


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thinkabout    0
thinkabout

Isto deve poder ser afinado de certeza, mas isto hoje está a render para o lado do pouco.

Andei também a ver o memmove, que parece uma solução muito mais elegante mas não consegui afinar com aquilo.

void retirapessoa(CRIMINOSO *listacriminosos,int numerodecriminosos , const char *nome)
{
int i;
CRIMINOSO tirapessoa[nrcelas];
for (i = 0; i < nrcelas; i++)
{
tirapessoa[i]=listacriminosos[i];
}

for(i=0; i<numerodecriminosos && strcmp(nome, listacriminosos[i].nome)!=0; i++);
if(i==numerodecriminosos)
{
printf("O criminoso nao existe\n");
}
else
{
puts("Encontrei o sujeito e vou retira-lo da lista");

  for ( ; i < 4; i++)
  {
tirapessoa[i]=listacriminosos[i+1];
  }
}

for (i = 0; i < numerodecriminosos; i++)
{
 printf("nome %s \n", tirapessoa[i].nome);
}
}

input

nome Joao Ratao

nome Gato das Botas

nome Mancha Negra

nome Etelvina Seabra

input para teste

Gato das Botas

output

Encontrei o sujeito e vou retira-lo da lista

nome Joao Ratao

nome Mancha Negra

nome Etelvina Seabra

nome (null)

Editado por thinkabout

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

olha como simples que fica com memmove :

int retirapessoa(CRIMINOSO * lista, int n, const char *nome)
{
 int i;

 // ciclo de pesquisa
 for (i = 0; i < n; i++)
 {
   // comparação do nome do registo na posição i
   if (strcmp(nome, lista[i].nome) == 0) {
     // sobrepor os elementos seguintes para a nova posição removendo assim
     // o elemento a ser apagado.
     // é irrelevante apagar o último elemento devido à alteração do n
     memmove(&lista[i],
             &lista[i + 1],
             sizeof(CRIMINOSO) * (n - i - 1));

     // alterar o valor real de elementos na lista 
     n--;
   }
 }

 // algo que te esqueceste e está no enunciado :
 // retornar o novo núemro de elementos da lista
 return n;
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thinkabout    0
thinkabout

:( ******* não pesco mesmo nada disto...

A solução do HappyHippyHippo é 5 estrelas.

Vou ver se brinco um pouco com essa função, para começar a compreender melhor.

Editado por thinkabout

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thinkabout    0
thinkabout

Entendi tudo HappyHippyHippo graças a tua explicação, tenho é que trabalhar mais para ganhar estaleca.

Também ainda não tinha trabalhado com o sizeof apesar de já ter falado dele e saber o que era e que o teria que usar nessa função quando tinha estruturas.

Editado por thinkabout

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thinkabout    0
thinkabout

Alínea D

Desenvolva uma função que procure suspeitos de um determinado crime. A função recebe,

como argumentos, um ponteiro para o início da tabela, o número de elementos que esta

contém, o peso aproximado e a altura aproximada do suspeito. Deve percorrer a tabela e

escrever no monitor a informação relativa a criminosos cuja diferença de peso e de altura não

seja superior a 10% dos valores indicados como argumento.

----

Deve-me estar a escapar algum () ou assim, consigo por a funcionar para altura mas não para o peso.

void procurasuspeito(CRIMINOSO *listacriminosos, int numerodecriminosos, int altura, float kg)
{
int i;
double margemaltura;
double margemkilos;
// Achar os valores máximos com a margem de 10%.
margemaltura=altura*1.10;
margemkilos=kg*1.10;
// printf("A medida do criminoso esta entre %d cm e %.1f cm \n", altura, margemaltura); Debug
// printf("O peso do criminoso esta entre %.1f e %.1f kg \n\n", kg, margemkilos); Debug

for (i = 0; i < numerodecriminosos; i++)
{
 if ((listacriminosos[i].altura >= altura && listacriminosos[i].altura <= margemaltura) && (listacriminosos[i].kg >= kg && listacriminosos[i].kg <= margemkilos))
  //O peso não está a trabalhar.
 {
  printf("O %s pode ser o criminoso \n", listacriminosos[i].nome);
 }
}
}

Editado por thinkabout

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

estás a verificar somente pessoas com altura/peso superior ao dado como argumento.

o que pretendes é (caso para um valor) :

// calculo da variaçâo máxima aceite
double limit = (double)valor_dado * 0.1;

// verificação da variação
// o absoluto da diferença deverá ser igual ou inferior ao limite calculado anteriormente
if (abs((double)valor_dado - (double)suspeitos[i].valor) <= 0.1)
{
 // este gajo cheira mal ...
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.