Ir ao conteúdo

Posts recomendados

Postado

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
Postado

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
Postado
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
Postado
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
Postado
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);

}

 

 

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!