Ir ao conteúdo
  • Cadastre-se

problemas com struth resolvido


Hachii

Posts recomendados

Haviam vários errinhos no seu código.

1) Se você deseja aumentar o vetor de Formulários de maneira dinâmica, então deve realocar a memória para o conteúdo já existente.


p = realloc( p, qt_cadastro * sizeof( Formulario ) );

2) A sua alocação de memória tinha a variável qt_cadastro valendo 0 (zero), logo, alocaria 0 bytes.


p = (Formulario*)malloc(qt_cadastro * sizeof(Formulario)); // aloca qt suficiente de memoria

3) A alocação estava sendo feita depois de chamar uma função que faria a inserção dos dados no vetor, logo, não tinha memória disponível para armazenar os dados.


Opcao(opcao); //chama a função opcao
p = (Formulario*)malloc(qt_cadastro * sizeof(Formulario)); // aloca qt suficiente de memoria

Segue o código com as modificações:


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


void
Principal( void ); //Apresenta as opções

void
Opcao( int opcao ); //Onde ocorre a execução da Opção escolhida

void
Visualizar( int i ); // você informa o numero do cadastro pra excluir

void
Excluir( int a ); //você Informa o cadastro para ser excluido

void
Consulta( void ); // você informa o nome para localizar no cadastro

int
Testa_repeticao( char *nome ); //testa se o nome é repetido

void
Ordenar( int cont ); //recebe a quant de cadastro


typedef struct
{
char nome[60];
char cidade[60];
} Formulario;

Formulario *p;
int qt_cadastro = 1;

int
main( void )
{
int opcao = 0;

do
{

system("cls");

p = realloc( p, qt_cadastro * sizeof( Formulario ) ); // aloca qt suficiente de memoria

inicio:
Principal();
scanf("%d",&opcao);

// se opção invalida volta pra nova escolha
if ( ( opcao < 1 ) || ( opcao > 5 ) )
{
printf("Opção invalida\n");
goto inicio;
}

Opcao( opcao ); //chama a função opcao

if ( p == NULL )
{
printf("Memoria insuficiente\n");
}

printf("\n");
}
while ( opcao != 5 ); //confere se a pessoa não quer sair

return 0;
}

void
Principal( void )
{
//Apresenta as opções
printf("Escolha a opção:\n");
printf("1 - Cadastro\n");
printf("2 - Excluir\n");
printf("3 - Vizualizar\n");
printf("4 - Consultar\n");
printf("5 - Sair\n");
}

void
Opcao( int opcao )
{
char nome[60], cidade[60];
int teste = 0, i;

switch ( opcao )
{
case 1:
printf("\nNome: \n");
scanf("%s",nome);
printf("Cidade: \n");
scanf("%s",cidade);

// teste = Testa_repeticao(&nome); //funcao extra(usada somente se cod localiza repetido não for usado), testa de o nome ja existe
if ( teste == 0 )
{

strcpy( p[qt_cadastro-1].nome, nome );

strcpy( p[qt_cadastro-1].cidade, cidade );
qt_cadastro++;

Ordenar( qt_cadastro-1 );
}

break;
case 2:
printf("Digite o numero do cadastro que você quer excluir\n");
scanf("%d",&i);
Excluir(i);
break;
case 3:
printf("Digite o numero do cadastro que você quer visualizar\n");
scanf("%d",&i);
Visualizar(i);
break;
case 4:
Consulta();
break;
case 5:
printf("\nObrigado por usar nosso programa\n");
break;
}
}


// recebe a quant de cadastro
void
Ordenar( int cont )
{
int j, i, resposta;
char aux_nome[30], aux_cidade[30];
int cont_excluir = 0, P_excluir[29];

// verifica se é maior que 1, porque se não for ja esta ordenado
if ( cont > 1 )
{
for ( i = 0; i < cont; i++ )
{
for ( j = 1; j <= cont; j++ )
{
resposta = strcmp( p[i].nome, p[j].nome ); //vefica se o nome é maior,menor ou igual ao posterior

//se for maior faz a troca de posição entre eles
if ( resposta == 1 )
{
strcpy(aux_nome,p[i].nome);
strcpy(aux_cidade,p[i].cidade);
strcpy(p[i].cidade,p[j].cidade);
strcpy(p[i].nome,p[j].nome);
strcpy(p[j].cidade,aux_cidade);
strcpy(p[j].nome,aux_nome);
}

/*
// verifica se tem nome repetido(se função extra for usada não precisa)
if ( resposta == 1 )
{
cont_excluir++;
P_excluir[cont_excluir]=i; //Guarda os cadastro pra exluir;
}
*/
}
}
}

/*
//chama a funcação exclusão para excluir cada cadastro repetido
if ( cont_excluir != 0 )
{
for(i=0;i<=cont_excluir;i++){
Excluir(P_excluir[i]);
}
*/
}

//Recebe o numero do cadastro pra ser visualizado
void
Visualizar( int i )
{
printf("Nome: %s\n", p[i-1].nome);
printf("Cidade: %s\n", p[i-1].cidade);
system("pause");
}


void Excluir( int a )
{
int i;

//verifica se o cadastro é diferente do ultimo
if ( a != qt_cadastro )
{
//desloca os termos da frente pra casa anterior
for ( i = a; i < qt_cadastro; i++ )
{
strcpy(p[i].cidade, p[a+1].cidade);
strcpy(p[i].nome, p[a+1].nome);
}

}

free(p[i].nome); //limpa o ultimo termo(p)
free(p[i].cidade);
qt_cadastro--;
}

//realiza consulta por nome
void
Consulta( void )
{
char nome[60];
int resposta,i;

printf("Digite um nome\n");
scanf("%s",nome); //recebe o nome pra ser consultado

if ( qt_cadastro != 0 )
{
//verifica se existe no cadastro
for ( i = 0; i <= qt_cadastro; i++ )
{
resposta = strcmp(nome, p[i].nome);

if ( resposta == 1 )
{
printf("Cadastro %d: \n", i );
printf("Nome: %s\n", p[i].nome );
printf("Cidade:%s\n", p[i].cidade );
}
}
}
else
{
printf("Não tem cadastro pra ser comparado");
}
}

// int Testa_repeticao(char *nome){ //Testa se o nome existe

// int i,resposta
// for(i=0;i<=qt_cadastro;i++){ //verifica se existe no cadastro
// resp=strcmp(nome,p[i].nome);
// if(resposta=1){
// return(1);
// }
// }
// return(0);
// }

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!