Ir ao conteúdo
  • Cadastre-se

Estruturas consultar e atualizar indice


TicoZL

Posts recomendados

O exercicio é este:

1 – O Exército Brasileiro (EB) pretende fazer um Cadastro Nacional de Recrutas ao

Exército (CaNaREx) o qual manterá um cadastro de 500 recrutas, número máximo do

contingente, do próximo ano. O CaNaREx deve ser implementado através de uma lista,

onde serão armazenados todos os dados dos alistados para o serviço militar obrigatório.

Os dados a serem obtidos do jovem alistado são os seguintes: Nome, Identificação, Data

de Nascimento, Endereço Residencial, Altura em metros, Peso em quilogramas,

Quantidade de Irmãos, Nome da progenitora, Identificação da progenitora e Data de

Nascimento da progenitora.

Como o EB é “pé no chão”, a lista de recrutas deve ser ordenada pela Identificação do

Recruta. O CaNaREx deve contar com a seguintes funções:

• Alistar Recruta, que deve ser pedir todos os dados do Recruta e averiguar se ele

está realmente da idade do serviço militar obrigatório;

• Excluir Recruta, dado o número de identificação do recruta, ele será

exterminado da lista;

• Atualizar Recruta, dado o número de identificação do recruta, seus dados serão

apresentados em tela e a opção de atualizar campo a campo será dada ao

operador do sistema; e

• Consultar Recruta, dado o número de identificação do recruto, buscará seus

dados e os apresentará na tela.

Além disso, o EB pediu duas funções secretas, uma que retorna o recruta mais alto e o

mais baixo alistado e outra que retorna o mais velho e o mais novo recruta alistado.

Codigo elaborado ate o momento


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

#define TAM 5

struct tDados
{
char nome[100];
int identificacao;
int dia;
int mes;
int ano;
char estado[100];
char rua[100];
int numero;
int cep;
float altura;
float peso;
int qdt_irmaos;
char nome_Progenitora[100];
int ident_Progenitora;
int dia_Progenitora;
int mes_Progenitora;
int ano_Progenitora;
};

struct tCadastro
{
struct tDados lista[TAM];
int quantidade;
};

void Alistar(struct tCadastro *cadastro)
{
int i=0, j, achei=0;
struct tDados *novo;
system("cls");

if(cadastro->quantidade < TAM)
{
novo = (struct tDados*) malloc(sizeof(struct tDados));

printf("Informe o numero de identificao: ");
scanf("%d", &novo->identificacao);

printf("Informe o nome do recruta: ");
setbuf(stdin, NULL);
gets(novo->nome);

printf("Informe o dia de nascimento: ");
scanf("%d", &novo->dia);

printf("Informe o mes: ");
scanf("%d", &novo->mes);

printf("Informe o ano: ");
scanf("%d", &novo->ano);

printf("Informe o estado em que mora: ");
setbuf(stdin, NULL);
gets(novo->estado);

printf("Informe a rua: ");
gets(novo->rua);

printf("Informe o numero da casa: ");
scanf("%d", &novo->numero);

printf("Informe o cep: ");
scanf("%d", &novo->cep);

printf("Informe a altura (metros): ");
scanf("%f", &novo->altura);

printf("Informe o peso (Kg): ");
scanf("%f", &novo->peso);

printf("Informe o numero de irmão(s): ");
scanf("%d", &novo->qdt_irmaos);

printf("Informe o nome da progenitora: ");
setbuf(stdin, NULL);
gets(novo->nome_Progenitora);

printf("Informe o numero de identificacao da progenitora: ");
scanf("%d", &novo->ident_Progenitora);

printf("Informe o dia de nascimento da progenitora: ");
scanf("%d", &novo->dia_Progenitora);

printf("Informe o mes de nascimento da progenitora: ");
scanf("%d", &novo->mes_Progenitora);

printf("Informe o ano de nascimento da progenitora: ");
scanf("%d", &novo->ano_Progenitora);

if(cadastro->quantidade == 0) // lista vazia
{
cadastro->lista[0] = *novo;
cadastro->quantidade++;
}
else
{
/*Procurando a posicao correta para inserir o item novo*/
while(i<cadastro->quantidade && !achei)
{
if(cadastro->lista[i].identificacao >= novo->identificacao)
{
if(cadastro->lista[i].identificacao == novo->identificacao)
{
printf("\nRecruta numero: %d já existe no cadastro!\n", novo->identificacao);
system("pause");
return;
}
else
{
achei=1;
}
}
else
{
i++;
}
}
if(achei) // achei a posicao (i) para inserir o elemento no meio da lista
{
/* Deslocando para posicao j+1 (da frente) o elemento j*/
for(j=cadastro->quantidade-1; j>=i; j--)
{
cadastro->lista[j+1] = cadastro->lista[j];
}
cadastro->lista[i] = *novo;
cadastro->quantidade++;
}
else /* nao achou ninguem maior ou igual*/
{
/*é o maior elemento da lista, insere no final*/
cadastro->lista[i] = *novo;
cadastro->quantidade++;
}
}
}
else
{
printf("\nA lista esta cheia!\n");
system("pause");
}
}

void Excluir(struct tCadastro *cadastro)
{
int i, j, iden, achei=0;

system("cls");
printf("Informe a identificacao do recruta a ser excluido: ");
scanf("%d", &iden);

for(i=0; i<cadastro->quantidade && !achei; !achei?i++:i)
{
if(cadastro->lista[i].identificacao == iden)
{
achei = 1;
}
}

if(achei)
{
for(j=i; j<cadastro->quantidade-1; j++)
{
cadastro->lista[j] = cadastro->lista[j+1];
}
cadastro->quantidade--;
printf("\nItem excluido com sucesso!\n");
}
else
{
printf("\nNumero %d nao esta na lista!\n", iden);
}
system("pause");
}

void Consultar(struct tCadastro cadastro)
{
int i, j=0, iden, achei=0;
system("cls");

printf("Informe a identificacao do recruta a ser consultado: ");
scanf("%d", &iden);

for(i=0; i<cadastro.quantidade && !achei; !achei?i++:i)
{
if(cadastro.lista[i].identificacao == iden)
{
achei = 1;
}
}
if(achei)
{
for(j=i; j<cadastro.quantidade; j=i)
{
printf("Identificacao ..............: %d\n", cadastro.lista[i].identificacao);
printf("Nome .......................: %s\n", cadastro.lista[i].nome);
printf("Data de nascimento..........: %d/%d/%d\n", cadastro.lista[i].dia, cadastro.lista[i].mes, cadastro.lista[i].ano);
printf("Estado......................: %s\n", cadastro.lista[i].estado);
printf("Rua.........................: %s\n", cadastro.lista[i].rua);
printf("Numero......................: %d\n", cadastro.lista[i].numero);
printf("CEP.........................: %d\n", cadastro.lista[i].cep);
printf("Altura......................: %.2f\n", cadastro.lista[i].altura);
printf("Peso........................: %.1f\n", cadastro.lista[i].peso);
printf("Numero de irmão(s)..........: %d\n", cadastro.lista[i].qdt_irmaos);
printf("Nome Progenitora............: %s\n", cadastro.lista[i].nome_Progenitora);
printf("Identificacao Progenitora...: %d\n", cadastro.lista[i].ident_Progenitora);
printf("Data nascimento Progenitora.: %d/%d/%d", cadastro.lista[i].dia_Progenitora, cadastro.lista[i].mes_Progenitora, cadastro.lista[i].ano_Progenitora);
cadastro.quantidade = i;
}
}
else
{
printf("\nNumero %d nao esta na lista!\n", iden);
}
system("pause");
}

int menu(void)
{
int opc;
system("cls");
printf("------Cadastro Nacional de Recrutas ao Exercito------\n");
printf(" Escolha uma das opções a seguir\n");
printf(" 1 - Alistar Recruta\n");
printf(" 2 - Excluir Recruta\n");
printf(" 3 - Atualizar Recruta\n");
printf(" 4 - Consultar Recruta\n");
printf(" 5 - Finalizar Cadastramento\n");
printf(" ==>");
scanf("%d", &opc);

if(opc < 1 || opc > 5)
{
printf("\nOpcao %d invalida!\nEscolha uma opcao valida\n", opc);
system("pause");
return menu();

}
return opc;
}

int main(void)
{
int escolha;
struct tCadastro recruta;
recruta.quantidade = 0;
do
{
escolha = menu();
switch(escolha)
{
case 1: Alistar(&recruta);
break;
case 2: Excluir(&recruta);
break;
case 4: Consultar(recruta);
break;
}
}while(escolha!=5);
}
}

Meu problema...

Para atualizar não sei como fazer...

E para ordenar como fazer, queria ordenar e intão fazer uma busca binaria na hora de consultar e atualizar

Desde já agradeço pela atenção....

Link para o comentário
Compartilhar em outros sites

Eu acho que você tá complicando o problema um pouco...

Sua estrutura tá assim:

struct tCadastro {

struct tDados lista[TAM];

int quantidade;

};

Então você cria uma instância dela e inicializa quantidade em 0:

struct tCadastro recruta;

recruta.quantidade = 0;

Essa quantidade você já pode usar como um índice indicando a próxima posição na lista pra adicionar elementos na lista... Ou seja, na parte de Alistar não precisava ter aquele trabalho todo... se quer incluir alguém na lista é só ir direto em "recruta.lista[0].blablabla".

Pra atualizar a mesma coisa... número de identificação dele é X

recruta.lista[0].identificacao == X ? se sim, chama a função de mudar os dados.

se não, passa pro recruta.lista[1].identificacao e assim por diante... tudo isso num simples FOR.

Pra parte de ordenar, primeiro você vai precisar de uma função que receba dois índices da sua lista de recrutas e troque os valores das variáveis de um pelo outro.

Pra trocar os valores de duas variáveis, como faz?

x = 1;

y = 2;

temp = x;

x = y;

y = temp;

Do mesmo jeito nessa tua função você faz:

temp = recruta.lista[x].identificação

recruta.lista[x].identificação = recruta.lista[y].identificação

recruta.lista[y].identificação = temp

E faz isso pra todas aquelas variáveis lá...

Depois que tiver essa função pronta, por exemplo, "trocarCadastros()" daí você usa ela no método de ordenação que quiser.

O mais simples deles:


void ordenar(struct tCadastro cadastro) {
int x, y;

for (x=0; x < cadastro.quantidade; x++)
for (y=0; y < cadastro.quantidade; y++)
if (cadastro.lista[x].qualquercoisa > cadastro.lista[y].qualquercoisa)
trocarCadastros(x, y);
}

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...