Jump to content
thinkabout

Esquadra de polícia - Estruturas

Recommended Posts

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");
}
Edited by thinkabout

Share this post


Link to post
Share on other sites
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 !

Edited by waza

Share this post


Link to post
Share on other sites
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 :)

Edited by 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!

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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)

Edited by thinkabout

Share this post


Link to post
Share on other sites
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;
}

  • Vote 1

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

Share this post


Link to post
Share on other sites
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.

Edited by thinkabout

Share this post


Link to post
Share on other sites
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.

Edited by thinkabout

Share this post


Link to post
Share on other sites
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);
 }
}
}

Edited by thinkabout

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.