Ir ao conteúdo
  • Cadastre-se

C Pilha em C - Main não executa do-while


PimpolhoJack

Posts recomendados

Estou estudando estrutura de dados e logo nas primeiras aulas o professor passou uma atividade para desenvolver um sistema com pilhas estáticas, coisa pra exercitar a implementação. O exercício deveria permitir que o usuário incluisse um registro, calculasse o total de reais por cada registro baseado em uma regra ou sair, mas quando executo a função main não inicia o do-while. Como poderia resolver?

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <stdbool.h>
#define MAXTAM 10

typedef struct {
	int horaIni, minIni, horaFim, minFim;
} TSONECA;


typedef struct{
	int topo;
	TSONECA sone[MAXTAM];
} TPilha;

void TPilha_Init(TPilha *p){
	p -> topo = -1;
}

bool TPilha_Empty(TPilha *p){
	if(p->topo == -1){
		return true;
	} else{
		return false;
	}
}

bool TPilha_Full(TPilha *p){
	if(p->topo == MAXTAM-1){
		return true;
	} else{
		return false;
	}
}

bool TPilha_Push(TPilha *p, TSONECA sone){
	if(TPilha_Full(p)){
		printf("Pilha cheia!\n");
		return 0;
	} else {
		p->topo++;
		p->sone[p->topo] = sone;
		return 1;
	}
}

TSONECA TPilha_Pop(TPilha *p){
	TSONECA aux;
	if(!TPilha_Empty(p)){
		aux = p->sone[p->topo];
		p->topo--;
		return aux;
	} else {
		printf("ERRO: Pilha Vazia! \n");
	}
}

// ================SONECA================
void lerSoneca(TSONECA *sone){
	printf("Hora de entrada:\n");
	scanf("%d",&sone->horaIni);
	printf("Minuto de entrada: \n");
	scanf("%d",&sone->minIni);
	printf("Hora de saída:\n");
	scanf("%d",&sone->horaFim);
	printf("Minuto de saída: \n");
	scanf("%d",&sone->minFim);
}

float calcValor(TSONECA *sone){

	float ax,ax2;
	ax = (sone->horaIni*60) + sone->minIni;
	ax2 = (sone->horaFim*60) + sone->minFim;
	ax2 -=ax;

	return ax2*0.5;
}


void calcTotal(TPilha *p){
	float total;
	TSONECA s;
	int i;
	for(i=p->topo;i>=0;i--){
        s = p->sone[i];
      	total += calcValor(&s);
	}
	printf("O total dos valores registrados é: %.2f", total);
}

int main(){
	setlocale(LC_ALL,"");
	TPilha p;
	TSONECA sone;
	int ax;

	do{
		printf("Escolha:\n1-Registrar soneca \n2-Totalizar e visualizar sonecas\n3- Sair");
		scanf("%d",&ax);
		switch(ax){
			case 1:
			    lerSoneca(&sone);
				TPilha_Push(&p,sone);
				break;
			case 2:
				calcTotal(&p);
				break;
			case 3:
				break;
			default:
				printf("Opção inexistente!\n");
				break;
		}
	}while(ax!=3);

	return 0;
}

 

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Olá, todos bem!

 

 

Então, o código funciona com esperado. Fiz apenas umas mudanças na endentação e no nomes das funções, da maneira que gosto. Fora essas questões de gosto, não fiz mais nada e funciona. Eu não tive a mesma impressão que @devair1010 e que você @PimpolhoJack

 

 

Ok!? Tchau.

adicionado 3 minutos depois

 

PS.: ... Agora olhando bem, percebo que você não iniciou a pilha com a função.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Em 02/09/2018 às 16:36, PimpolhoJack disse:

Estou estudando estrutura de dados e logo nas primeiras aulas o professor passou uma atividade para desenvolver um sistema com pilhas estáticas, coisa pra exercitar a implementação. O exercício deveria permitir que o usuário incluisse um registro, calculasse o total de reais por cada registro baseado em uma regra ou sair, mas quando executo a função main não inicia o do-while. Como poderia resolver?


#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <stdbool.h>
#define MAXTAM 10

typedef struct {
	int horaIni, minIni, horaFim, minFim;
} TSONECA;


typedef struct{
	int topo;
	TSONECA sone[MAXTAM];
} TPilha;

void TPilha_Init(TPilha *p){
	p -> topo = -1;
}

bool TPilha_Empty(TPilha *p){ // o tipo da variavel e inteiro , é melhor  definir aqui na  assinatura e assim  vale para todas as funçoes para empilhar e desempilhar*/
                             
	if(p->topo == -1){
		return true; // tratando  aqui um valor literario ? Mas nao e  numerico = 1 ?
	} else{
		return false;// valor numerico  e  igual  0
	}
}

bool TPilha_Full(TPilha *p){
	if(p->topo == MAXTAM-1){
		return true;
	} else{
		return false;
	}
}

bool TPilha_Push(TPilha *p, TSONECA sone){
	if(TPilha_Full(p)){
		printf("Pilha cheia!\n");
		return 0;
	} else {
		p->topo++;
		p->sone[p->topo] = sone;
		return 1;
	}
}

TSONECA TPilha_Pop(TPilha *p){
	TSONECA aux;
	if(!TPilha_Empty(p)){
		aux = p->sone[p->topo];
		p->topo--;
		return aux;
	} else {
		printf("ERRO: Pilha Vazia! \n");
	}
}

// ================SONECA================
void lerSoneca(TSONECA *sone){
	printf("Hora de entrada:\n");
	scanf("%d",&sone->horaIni);
	printf("Minuto de entrada: \n");
	scanf("%d",&sone->minIni);
	printf("Hora de saída:\n");
	scanf("%d",&sone->horaFim);
	printf("Minuto de saída: \n");
	scanf("%d",&sone->minFim);
}

float calcValor(TSONECA *sone){

	float ax,ax2;
	ax = (sone->horaIni*60) + sone->minIni;
	ax2 = (sone->horaFim*60) + sone->minFim;
	ax2 -=ax;

	return ax2*0.5; /* esse valor do ponteiro ax2, ele nao precisa ser ponteiro e um valor de retorno; para ele poder ser ponteiro  deveria  ser definido na struct, por outro lado reaproveitando esse conceito mesmo, na hora de empilhar o valor voce vai atribuir essa variavel ax2, e não a  sone conforme  esta na case, lembrando que precisa melhor o conceito de struct porque esta totalmente vulnerável */
}


void calcTotal(TPilha *p){
	float total;
	TSONECA s;
	int i;
	for(i=p->topo;i>=0;i--){
        s = p->sone[i];
      	total += calcValor(&s);
	}
	printf("O total dos valores registrados é: %.2f", total);
}

int main(){
	setlocale(LC_ALL,"");
	TPilha p;
	TSONECA sone;
	int ax;

	do{
		printf("Escolha:\n1-Registrar soneca \n2-Totalizar e visualizar sonecas\n3- Sair");
		scanf("%d",&ax);
		switch(ax){
			case 1:
			    lerSoneca(&sone);
				TPilha_Push(&p,sone);// empilhar aqui  ax2
				break;
			case 2:
				calcTotal(&p);
				break;
			case 3:
				break;
			default:
				printf("Opção inexistente!\n");
				break;
		}
	}while(ax!=3);

	return 0;
}

/*Conclusao: Existem alguns  erros de logica na estrutura da pilha que precisa ser corrigido para poder  empilhar o dado de  forma  correta, os  devidos erros encontados são; valores literarios em meio a valor  numerico , na variavel de retorno onde  retorna o valor do  tempo de  entrada e saida esta sendo empilhada de forma confusa! E precisa  ser revisto para melhor funcionamento. */ 

 

 

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Em 05/09/2018 às 22:31, naldoP disse:

 

Segue aqui, uma solução para o problema proposto!
//Biblioteca padrão.
#include <stdio.h>
#include <stdlib.h>
#define TAM 10

//Estrutura e seus atributos(Objetos).
typedef struct Pilha
{
    int topo,horavar;
    float var;
    float vetpilha[TAM];
} Pilha;

//Prototipações das funções.
void IniciarPilha(Pilha* p);
void  Empilhar(Pilha* p,float i);
float Desempilhar(Pilha* p,Pilha* aux2);
int lerHora(Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim);
float calcValor(Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim,Pilha* v1,Pilha* v2,Pilha* r);
void  CaseMenu(Pilha* p,Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim,Pilha* v1,Pilha* v2,Pilha* r,Pilha* aux2,Pilha* resp);
void imprimirPilha(Pilha* p);
void ExibirHora(Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim,Pilha* v1, Pilha* v2,Pilha* r,Pilha* resp);

//Programa principal, iniciado apenas com funções.
int main()
{
    Pilha p,horaIni,minIni,horaFim,minFim,v1,v2,r,aux2,resp;
    IniciarPilha(&p);
    CaseMenu(&p,&horaIni,&minIni,&horaFim,&minFim,&v1,&v2,&r,&aux2,&resp);
}

//Essa função inicializa o topo da pilha com valor '0'.
void IniciarPilha(Pilha* p)
{
    p->topo=0;
}

//Essa função empilha o dado no topo pilha.
void Empilhar(Pilha* p, float i)
{
    if(p->topo==TAM-1)
    {
        printf("Pilha cheia!\n");
        return ;
    }
    p->vetpilha[p->topo] = i;
    p->topo++;
}

//Essa função desempilha o dado do topo da pilha.
float Desempilhar(Pilha* p, Pilha* aux2)
{
    if(p->topo ==0)
    {
        printf("\nA pilha esta vazia ");
        return;
    }
    p->topo--;
    p->vetpilha[p->topo];
    aux2->var = p->vetpilha[p->topo];
    printf("\nValor desempilhado com sucesso! %.1f\n",aux2->var);
}

//Essa função exibe na tela o dado empilhado  no topo da pilha.
void imprimirPilha(Pilha* p)
{
    int i=0;
    for(i=p->topo-1; i>=0; i--)
    {
        printf("\n\n\nValor empilhado com sucesso! \n\n\n\t%.1f\n\n",p->vetpilha[i]);
    }

    printf("\t(P1)\t");
}

//Essa função mostra na tela, os calculos dos dados aplicado pelo usuário.
void ExibirHora(Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim,Pilha* v1, Pilha* v2,Pilha* r,Pilha* resp)
{
    v1->var = (horaIni->horavar*60) + minIni->horavar;
    v2->var = (horaFim->horavar*60) + minFim->horavar;
    resp->var = v2->var;
    v2->var -=v1->var;
    r->var = v2->var*0.5;

    printf("\tHora Inicio = %d: Minuto Inicio = %d\n",horaIni->horavar,minIni->horavar,r->var );
    printf("\tHora fim  = %d: Minuto fim = %d\n",horaFim->horavar,minFim->horavar);
    printf("\tHora Inicio hora * 60 + minuto = %.1f\t\n",v1->var);
    printf("\tHora Fim hora * 60 + minuto = %.1f\t\n",resp->var);
    printf("\tHora Fim - Hora Inicio = %.1f\n",v2->var);
    printf("\tCalculo total Hora fim * 0.5  fim = %.1f",r->var);
}

//Essa função captura  os dados aplicado pelo usuário.
int lerHora(Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim)
{
    printf("Hora de entrada:\n");
    scanf("%d",&horaIni->horavar);
    printf("Minuto de entrada: \n");
    scanf("%d",&minIni->horavar);
    printf("Hora de saida:\n");
    scanf("%d",&horaFim->horavar);
    printf("Minuto de saida: \n");
    scanf("\n\n\n%d",&minFim->horavar);
    return horaIni->horavar,minIni->horavar,horaFim->horavar,minFim->horavar;
}

//Essa função calcula os dados aplicado pelo usuário.
float calcValor(Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim,Pilha* v1,Pilha* v2, Pilha* r)
{
    v1->var = (horaIni->horavar*60) + minIni->horavar;
    v2->var = (horaFim->horavar*60) + minFim->horavar;
    v2->var -=v1->var;
    r->var = v2->var*0.5;
    return r->var;
}

//essa função e o menu, que recebe as funções aplicada pelo usuário.
void   CaseMenu(Pilha* p,Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim,Pilha* v1,Pilha* v2,Pilha* r,Pilha* aux2,Pilha* resp)
{
    int ax,i;

    do
    {
        printf("\n\nEscolha:\n1-Registrar Hora \n2-Calcular e mostrar na tela  \n3-Empilhar \n4-Desempilhar \n5-Sair\n\n");
        scanf("%d",&ax);
        switch(ax)
        {
        case 1:
            lerHora(horaIni,minIni,horaFim,minFim);
            break;
        case 2:
            ExibirHora(horaIni,minIni,horaFim,minFim,v1,v2,r,resp);
            break;
        case 3:
            calcValor(horaIni,minIni,horaFim,minFim,v1,v2,r);
            Empilhar(p,r->var);
            imprimirPilha(p);
            break;
        case 4:
            Desempilhar(p,aux2);
            imprimirPilha(p);
            break;
        case 5:
            system("exit");
            break;
        default:
            printf("Opção inexistente!\n");
            break;
        }
    }
    while(ax!=5);

}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 12/09/2018 às 22:45, naldoP disse:

Segue aqui, uma solução para o problema proposto!
//Biblioteca padrão.
#include <stdio.h>
#include <stdlib.h>
#define TAM 10

//Estrutura e seus atributos(Objetos).
typedef struct Pilha
{
    int topo,horavar;
    float var;
    float vetpilha[TAM];
} Pilha;

//Prototipações das funções.
void IniciarPilha(Pilha* p);
void  Empilhar(Pilha* p,float i);
float Desempilhar(Pilha* p,Pilha* aux2);
int lerHora(Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim);
float calcValor(Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim,Pilha* v1,Pilha* v2,Pilha* r);
void  CaseMenu(Pilha* p,Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim,Pilha* v1,Pilha* v2,Pilha* r,Pilha* aux2,Pilha* resp);
void imprimirPilha(Pilha* p);
void ExibirHora(Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim,Pilha* v1, Pilha* v2,Pilha* r,Pilha* resp);

//Programa principal, iniciado apenas com funções.
int main()
{
    Pilha p,horaIni,minIni,horaFim,minFim,v1,v2,r,aux2,resp;
    IniciarPilha(&p);
    CaseMenu(&p,&horaIni,&minIni,&horaFim,&minFim,&v1,&v2,&r,&aux2,&resp);
}

//Essa função inicializa o topo da pilha com valor '0'.
void IniciarPilha(Pilha* p)
{
    p->topo=0;
}

//Essa função empilha o dado no topo pilha.
void Empilhar(Pilha* p, float i)
{
    if(p->topo==TAM-1)
    {
        printf("Pilha cheia!\n");
        return ;
    }
    p->vetpilha[p->topo] = i;
    p->topo++;
}

//Essa função desempilha o dado do topo da pilha.
float Desempilhar(Pilha* p, Pilha* aux2)
{
    if(p->topo ==0)
    {
        printf("\nA pilha esta vazia ");
        return;
    }
    p->topo--;
    p->vetpilha[p->topo];
    aux2->var = p->vetpilha[p->topo];
    printf("\nValor desempilhado com sucesso! %.1f\n",aux2->var);
}

//Essa função exibe na tela o dado empilhado  no topo da pilha.
void imprimirPilha(Pilha* p)
{
    int i=0;
    for(i=p->topo-1; i>=0; i--)
    {
        printf("\n\n\nValor empilhado com sucesso! \n\n\n\t%.1f\n\n",p->vetpilha[i]);
    }

    printf("\t(P1)\t");
}

//Essa função mostra na tela, os calculos dos dados aplicado pelo usuário.
void ExibirHora(Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim,Pilha* v1, Pilha* v2,Pilha* r,Pilha* resp)
{
    v1->var = (horaIni->horavar*60) + minIni->horavar;
    v2->var = (horaFim->horavar*60) + minFim->horavar;
    resp->var = v2->var;
    v2->var -=v1->var;
    r->var = v2->var*0.5;

    printf("\tHora Inicio = %d: Minuto Inicio = %d\n",horaIni->horavar,minIni->horavar,r->var );
    printf("\tHora fim  = %d: Minuto fim = %d\n",horaFim->horavar,minFim->horavar);
    printf("\tHora Inicio hora * 60 + minuto = %.1f\t\n",v1->var);
    printf("\tHora Fim hora * 60 + minuto = %.1f\t\n",resp->var);
    printf("\tHora Fim - Hora Inicio = %.1f\n",v2->var);
    printf("\tCalculo total Hora fim * 0.5  fim = %.1f",r->var);
}

//Essa função captura  os dados aplicado pelo usuário.
int lerHora(Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim)
{
    printf("Hora de entrada:\n");
    scanf("%d",&horaIni->horavar);
    printf("Minuto de entrada: \n");
    scanf("%d",&minIni->horavar);
    printf("Hora de saida:\n");
    scanf("%d",&horaFim->horavar);
    printf("Minuto de saida: \n");
    scanf("\n\n\n%d",&minFim->horavar);
    return horaIni->horavar,minIni->horavar,horaFim->horavar,minFim->horavar;
}

//Essa função calcula os dados aplicado pelo usuário.
float calcValor(Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim,Pilha* v1,Pilha* v2, Pilha* r)
{
    v1->var = (horaIni->horavar*60) + minIni->horavar;
    v2->var = (horaFim->horavar*60) + minFim->horavar;
    v2->var -=v1->var;
    r->var = v2->var*0.5;
    return r->var;
}

//essa função e o menu, que recebe as funções aplicada pelo usuário.
void   CaseMenu(Pilha* p,Pilha* horaIni, Pilha* minIni, Pilha* horaFim, Pilha* minFim,Pilha* v1,Pilha* v2,Pilha* r,Pilha* aux2,Pilha* resp)
{
    int ax,i;

    do
    {
        printf("\n\nEscolha:\n1-Registrar Hora \n2-Calcular e mostrar na tela  \n3-Empilhar \n4-Desempilhar \n5-Sair\n\n");
        scanf("%d",&ax);
        switch(ax)
        {
        case 1:
            lerHora(horaIni,minIni,horaFim,minFim);
            break;
        case 2:
            ExibirHora(horaIni,minIni,horaFim,minFim,v1,v2,r,resp);
            break;
        case 3:
            calcValor(horaIni,minIni,horaFim,minFim,v1,v2,r);
            Empilhar(p,r->var);
            imprimirPilha(p);
            break;
        case 4:
            Desempilhar(p,aux2);
            imprimirPilha(p);
            break;
        case 5:
            system("exit");
            break;
        default:
            printf("Opção inexistente!\n");
            break;
        }
    }
    while(ax!=5);

}

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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!