Baixe o app para aproveitar ainda mais
Prévia do material em texto
03/11/12 Campus Virtual Estácio 1/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… 2012.3-EAD - ESTRUTURA DE DADOS (CCT0174/1242205) 9002 - Fórum de Discussão Aulas 6 a 10 Criado pelo(a) Professor (a) .PRODUÇÃO EAD em 05/08/2012 00:29:01 Caros Alunos, Esse é o espaço destinado para discussão dos conteúdos e conceitos abordados nas aulas 6 a 10. Contribua com suas anotações, dúvidas e pontos de vista, visto que sua nota de participação será apurada por meio da colaboração nas discussões desse tópico. Além disso, o (a) tutor (a) a distância irá lançar questionamentos para interação de todos. Professor (a) ALEXANDRE SOARES ALVES respondeu a 39 dias atrás Assita a aula 6 e poste aqui uma aplicação para pilha sequencial, mostre também a implementação em C++ da aplicação escolhida. Abcs Alexandre Aluno (a) WELLINGTON PEREIRA DE OLIVEIRA respondeu a 35 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Essa aplicação converte um numero decimal em binário #include <iostream> using namespace std; int main() { int pilha=0; int n,j,quo,resto, op; int vet[30]; do{ system( "cls" ); cout <<" 1 - Entrar no programa \n 0 - Sair"<<endl << endl; cin >> op; if ((op>1) || (op<0)) cout << "NAO EXISTE ESTA OPÇÃO! POR FAVOR, DIGITE NOVAMENTE A opção: "; else if (op == 1) { cout <<"\t\tTRANSFORME NUMERO DECIMAL PARA BINARIO!!!"<<endl << endl; cout <<"Digite um numero: "; cin>> n; do { quo=n/2; resto=n%2; vet[pilha]=resto; pilha++; n=quo; } while (n!=0); cout<<"\n\nO numero em binario e': "; for (j=pilha-1;j>=0;j--) cout << vet[j]; cout<<endl<<endl; system( "pause" ); cout<< endl; } }while(op != 0); cout<< "voce saiu do programa!!\n"; } 03/11/12 Campus Virtual Estácio 2/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… Professor (a) ALEXANDRE SOARES ALVES respondeu a 35 dias atrás Comentário da postagem de WELLINGTON PEREIRA DE OLIVEIRA Oi Wellington, A aplicação que apresentou sobre pilha, apesar de ser clássica está correta. Porém não apresentou a implementação completa, onde estão as funções de inserção e remoção de dados na pilha? Melhore sua postagem, se quiser tente imaginar alguma outra aplicação para a pilha, veja esta é uma estrutura que guarda a ordem reversa dos dados armazenados, sendo assim pode buscar várias aplicações que necessitem deste conceito. []s Alexandre Aluno (a) WELLINGTON PEREIRA DE OLIVEIRA respondeu a 33 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES /* O Estacionamento do seu Mário contém uma única passagem por onde os carros devem entrar e sair e por onde passa somente um carro de cada vez. Se chegar um cliente para retirar um carro que não seja o mais próximo da saída, todos os carros bloqueando seu caminho sairão do estacionamento. O carro do cliente será manobrado para fora do estacionamento, e os outros carros voltarão a ocupar a mesma sequência inicial. Para retirar algum carro, é necessário primeiro retirar o carro que se encontra na frente. Para o cadastro será pedido a placa, o tempo, o preço. O total a ser pago será gerado automáticamente A capacidade do Estacionamento é para guardar até cinco carros. */ #include <stdio.h> #include <stdlib.h> #include <string.h> // Número maximo de chars nas vars #define MAX 8 // Número maximo de vagas #define BOX 05 void opcao_menu() { int i; char *banner[] = { "--------------------------", "Programa Estacionamento", "(1)Listar vagas", "(2)Estacionar", "(3)Retirar", "(4)Sair do programa", "--------------------------", "> " }; for(i=0; i<=7; i++) printf( "%s\n",banner[i]); } // estrutura usada typedef struct vaga { char placa[MAX]; int tempo; float valor; } vaga; //pegando entrada do usuário e retorna com os mesmos vaga adiciona_vaga() { vaga p; printf( "informe alguns dados\n" ); printf( "o Placa: \n" ); fgets(p.placa, sizeof(p.placa), stdin); p.placa[strlen(p.placa)-1] = '\0'; printf( "A quantidade de tempo:\n" ); scanf( "%d",&(p.tempo)); // maximo de tempo por vaga é 12 setamos isso aqui numa condição simples p.tempo=(p.tempo>12)?12:p.tempo; printf( "O preco:\n" ); scanf( "%f",&(p.valor)); return p; } int main(int args, char * arg[]) { int x,y,op=0; float total; // ponteiro da nossa estrutura vaga *cad; y=0; // alocamos dados na memória cad=(vaga *)calloc(BOX,sizeof(vaga)); while(op!=4) { opcao_menu(); scanf( "%d",&op); getchar(); if(op==1) { // Mostra a lista de vagas printf( "\n Placa Tempo Preco Total\n" ); 03/11/12 Campus Virtual Estácio 3/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… printf( "\n Placa Tempo Preco Total\n" ); for(x=y-1; x>=0; x--) printf( " %6s %8d %12.2f %7.2f\n", cad[x].placa, cad[x].tempo, cad[x].valor, total=cad[x].tempo*cad[x].valor); } // Adiciona uma vaga e chama a função "adiciona vaga" if(op==2) { cad[y]=adiciona_vaga(); y++; } // remove vaga,subtrai o apontador da proxima adição de dados substitui o dado pelo // Escolhido if(op==3) y--; } free(cad); return 0; } Professor (a) ALEXANDRE SOARES ALVES respondeu a 33 dias atrás Comentário da postagem de WELLINGTON PEREIRA DE OLIVEIRA Oi Wellington O conceito está correto, mas o exemplo que apresentou é uma implementação de uma pilha encadeada. Ainda não estudamos este tipo de estrutura. Aqui a tarefa é tentar aplicar o conceito de pilha sequencial, cuja implementação é feita através de um vetor. Deve imaginar alguma aplicação e desenvolver por si só um programa em C++ que implemente seu exemplo. ( Implementação do exemplo que apresentou está em C e não em C++) []s Alexandre Aluno (a) TÉRCIO MARTINS DUARTE respondeu a 33 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Editado por TÉRCIO MARTINS DUARTE em 30/09/2012 18:39 Resposta ao questionamento 01: Professor, levando em conta a lista dada, sobre a implementação de um programa que converta decimal em binário, implementei a pilha da seguinte maneira: o usuário digita o numero escolhido em decimal para conversão em qualquer base desejada (de 2 a 9): #include <iostream> #define tam 30 using namespace std; void push(int[],int&,int&); int pop(int[],int&); int b; int main() { int topo=-1, n, r[tam]; cout<<"\n\nDigite o numero decimal: "; cin>>n; do { cout<<"\n\nDigite a base desejada(entre 2 e 9): "; cin>>b; }while (b<2 || b>9); int inicio=n; do { push(r,n,topo); }while(n!=0); system( "cls" ); cout<<"\n\nO numero "<<inicio<<" na base "<<b<<" eh "; do { cout<<pop(r,topo); }while(topo!=-1); cout<<"\n\n"; system( "pause" ); return 0; } void push(int r[],int &n, int &topo) { topo++; r[topo]=n%b; n=n/b; } int pop(int r[],int &topo) { topo--; return r[topo+1]; } Abraço 03/11/12 Campus Virtual Estácio 4/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… Abraço Professor (a) ALEXANDRE SOARES ALVES respondeu a 33 dias atrás Comentário da postagem de TÉRCIO MARTINS DUARTE Excelente Tércio, Você mostrouque realmente aprendeu o conceito de pilha, pois além de conseguir imaginar uma aplicação para o conceito conseguiu também construir uma implementação em C++ para sua aplicação, conforme pedia o exercício. Agora para que todos possam compreender bem a sua implementação, responda: Por que está passando por referência a variável topo, na função int pop(int r[],int &topo) e também na função void push(int r[],int &n, int &topo) ? []s Alexandre Aluno (a) TÉRCIO MARTINS DUARTE respondeu a 32 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Olá professor. A passagem por referência da variável topo nas funções supracitadas é necessária, pois já que usei o conceito de pilha, ao se incluir um elemento na pilha (função push) o topo da pilha será alterado, o mesmo acontecendo para o desempilhamento (função pop). Para que isso aconteça, ao ser enviado como parâmetro para afunção e ser alterado ao voltar à função main, ela precisa ser passada por referência (o tratado será o endereço da variável). Abraço. Professor (a) ALEXANDRE SOARES ALVES respondeu a 32 dias atrás Comentário da postagem de TÉRCIO MARTINS DUARTE Oi Tércio, Muito bem, acho que agora ficou bem claro para que seus colegas possam entender o seu código completamente. Agora assista apróxima aula e aguarde, logo estarei postando a próxima tarefa para discussão. Continue participando e interagindo com seus colegas. []s Alexandre Aluno (a) EDSON JUNIOR SANTOS respondeu a 20 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Editado por EDSON JUNIOR SANTOS em 14/10/2012 14:43 Tutor, Tércio fez uma implementação com as funções push e pop o valores serão por referência. ok. ficou claro. Isso porque todos os parâmetros precisam ter seus endereços passados porque serão alterados dentro da função. O que eu não entendi é porque as funções abaixo não acontecem a mesma coisa. Por que somente a função desempilha todas as passagens terão serão por referência "&" e na de empilhar a variável "v" não acontece isso? void empilha(int p[], int &t, int v); // porque a passagem aqui não é por referência? int desempilha(int p[], int &t, int &v); Professor (a) ALEXANDRE SOARES ALVES respondeu a 19 dias atrás Comentário da postagem de EDSON JUNIOR SANTOS Oi Edson, Na função empilhar será empilhado o conteúdo da variável v, portanto este será copiado para dentro da pilha não é necessário alterar o valor da variável. Enquanto que a variável que representa o indexador de topo da pilha sempre que um valor for empilhado ou desempilhado seu conteúdo deve ser alterado, por isto é passado a referência, para que as modificações ocorram no conteúdo desta variável []s Alexandre Aluno (a) EDSON JUNIOR SANTOS respondeu a 19 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES 03/11/12 Campus Virtual Estácio 5/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… ok, grato pelos esclarecimentos. Professor (a) ALEXANDRE SOARES ALVES respondeu a 19 dias atrás Comentário da postagem de EDSON JUNIOR SANTOS Oi Edson, Espero que tenha esclarecido, mas qualquer dúvida me avise. Agora aproveite e visite as demais postagens de seus colegas existem muitas postagens interessantes, que estão contribuindo bastante para enriquecer nosso fórum. []s Alexandre Aluno (a) DANILO CHIQUETTI respondeu a 30 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Boa noite a todos! minha aplicação foi pensada em um empilhamento de produtos em um pallet. Se fosse mais complexo, poderia ser utilizado para controle de estoque em uma central de abastecimentos, para saber onde os produtos estão localizados. Para fazer, adaptei um dos exemplos da aula. #include <iostream> #define TAM 10 using namespace std; void empilha(int p[], int &t, int v); int desempilha(int p[], int &t, int &v); void ultMaterial(int p[], int &t); void situacaoPilha(int p[], int &t); int main() { int op, val, topo= -1, pilha[TAM],resp; do { system( "cls" ); system( "color f0" ); cout<<"\nCONTROLE DE EMPILHAMENTO LIFO - Last In - First Out\n\n"; cout<<"\n1- EMPILHAR MATERIAL"; cout<<"\n2- DESEMPILHAR MATERIAL"; cout<<"\n3- ULTIMO MATERIAL EMPILHADO"; cout<<"\n4- MOSTRAR SITUACAO DA PILHA"; cout<<"\n5- SAIR"; cout<<"\nOpcao: "; cin>>op; system( "cls" ); switch(op) { case 1: cout<<"Digite o codigo do produto a ser empilhado: "; cin>>val; empilha(pilha, topo, val); break; case 2: resp=desempilha(pilha,topo,val); if(resp==0) cout<<"\nATENCAO. Pilha Vazia\n"; else cout<<"\nproduto removido: "<<val; break; case 3: ultMaterial(pilha,topo); break; case 4: situacaoPilha(pilha,topo); break; case 5: cout<<"\nOBRIGADO POR USAR O PROGRAMA\n"; break; default: cout<<"\nOPCAO INVALIDA\n"; } cout<<"\n\n";system( "pause" ); }while(op!=5); } //inserir material void empilha(int p[], int &t, int v) { if(t == TAM-1) cout<<"\nATENCAO! PALLET CHEIO\n"; else { t++; p[t]=v; } } //remover material int desempilha(int p[], int &t, int &v) { if(t == -1) return 0; else { v=p[t];//guarda o valor do topo t--; //atualiza o topo return 1; } } // Mostra o último material void ultMaterial(int p[], int &t) 03/11/12 Campus Virtual Estácio 6/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… void ultMaterial(int p[], int &t) { if(t == -1) cout<<"\nATENCAO! PALLET VAZIO\n"; else cout<<"\nCÓDIGO DO PRODUTO QUE ESTÁ NO TOPO: "<<p[t]; } // Mostrar situacao da Pilha void situacaoPilha(int p[], int &t) { if(t == -1) cout<<"\nATENCAO! PALLET VAZIO\n"; else if (t == TAM - 1 ) cout<<"\nATENCAO! PALLET CHEIO!\n"; else { cout<<"\nTOTAL DE PRODUTOS NO PALLET: "<<t+1<<"\n"; cout<<"\n\nESPACO DISPONIVEL NO PALLET: "<<TAM-(t+1)<<"\n"; } } Professor (a) ALEXANDRE SOARES ALVES respondeu a 30 dias atrás Comentário da postagem de DANILO CHIQUETTI Oi Danilo, Vejo que entendeu bem o conceito de Pilha, sua implementação está muito boa, pois a aplicação utiliza o algoritmo LIFO, atingindo o objetivo desta tarefa. Visite as postagens de seus colegas e se quiser pode fazer algum comentário, em seguida assista a aula 7 e faça a segunda tarefa do fórum. []s Alexandre Aluno (a) SANDRO ROBERTO GOMES respondeu a 14 dias atrás Comentário da postagem de DANILO CHIQUETTI Boa noite Danilo, sua aplicação ficou ótima tirei algumas dúvidas com ele muito obrigado. Professor (a) ALEXANDRE SOARES ALVES respondeu a 14 dias atrás Comentário da postagem de SANDRO ROBERTO GOMES Oi Sandro, Parabéns, por estar utilizando o fórum de maneira correta, isto é visitando as postagens de seus colegas e conseguindo aprender com elas, esse é um dos objetiovos de nosso fórum. []s Alexandre Aluno (a) FELIPE VACCARI BARBOSA respondeu a 27 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Boa tarde, a todos. Pensei numa aplicação para que o gerente de uma loja possa visualizar quantas peças foram vendidas em sua ultima negociação. Dessa forma ele saberá se seus vendedores estão fazendo um bom trabalho. Estruturei também para que, no momento da consulta, ele possa visualizar a pilha inteira, ter acesso à quantidade de atendimentos e ter acesso também à quantidade de itens que foram vendidos somando todos os atendimentos. #include <iostream> #define TAM 10 using namespace std; void push(int p[], int &t, int v); int pop(int p[], int &t, int &v); void mostraTopo(int p[], int &t); void situPilha(int p[], int &t); int main() { int op, valor, topo= -1, pilha[TAM], resp; do { system( "cls" ); cout<<"\nControle de Vendas\n\n"; cout<<"\n1- Empilhar quantidade de itens vendidos na ultima transacao."; cout<<"\n2- Desempilhar ultima quantidade de itens vendidos."; cout<<"\n3- Consultar a quantidade de itens vendidos na ultima transacao."; cout<<"\n4- Mostrar situacao da pilha"; cout<<"\n5- Fechar"; cout<<"\nOpcao: "; cin>>op; system( "cls" ); 03/11/12 Campus Virtual Estácio 7/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… system( "cls" ); switch(op) { case 1: cout<<"Quantos itens foram vendidos na ultima transacao? ----> "; cin>>valor; push(pilha, topo, valor); break; case 2: resp=pop(pilha,topo,valor); if(resp==0) cout<<"\nATENCAO: Pilha vazia!\n"; else cout<<"\nQuantidade '"<<valor<<"' removida do topo da pilha."; break; case 3: mostraTopo(pilha,topo); break; case 4: situPilha(pilha,topo); break; case 5: cout<<"\nEste foi o sistema de PILHA (LIFO).\n\n\nObrigado por testar o programa."; break; default: cout<<"\nOpcao invalida.\n"; } cout<<"\n\n";system( "pause" ); }while(op!=5); } //empilhar void push(int p[], int &t, int v) { if(t == TAM-1) cout<<"\nATENCAO: Pilha cheia!\n"; else { t++; // atualiza o topo p[t]=v; // pilha RECEBE o valor cout<<"\n\nAdicionado com sucesso, confira abaixo!\n\n"; for(int x=t;x>-1;x--)cout<<"\nPosicao "<<x+1<<": "<<p[x]; } } //remover int pop(int p[], int &t, int &v) { if(t == -1) return 0; else { v=p[t];// GUARDA o valor do topo t--; // atualiza o topo return 1; } } // Mostrar valor do topo e 'visualizacao' da pilha void mostraTopo(int p[], int &t) { int aux=0; if(t == -1) cout<<"\nAtencao! Pilha vazia\n"; else cout<<"\nQuantidade de itens vendidos na ultima transacao [topo]: "<<p[t]; cout<<"\n\nVisualize abaixo como esta sua pilha:\n\n"; for(int x=t; x>-1; x--) cout<<"\nPosicao "<<x+1<<": "<<p[x]; for(int y=0; y<=t; y++) aux = aux + p[y]; cout<<"\n\nTotal de itens vendidos: "<<aux; } // Mostrar situacao da Pilha void situPilha(int p[], int &t) { { if(t == -1) cout<<"\nATENCAO: Pilha vazia!\n"; else if (t == TAM - 1 ) cout<<"\nATENCAO: Pilha cheia!\n"; else { cout<<"\nQuantidade de vendas na pilha: "<<t+1<<"\n"; cout<<"\n\nEspaco disponivel: "<<TAM-(t+1)<<"\n"; } } ------- Abraços Professor (a) ALEXANDRE SOARES ALVES respondeu a 27 dias atrás Comentário da postagem de FELIPE VACCARI BARBOSA Oi Felipe, Ficou excelente sua aplicação, mostrou que entendeu bem o conceito de pilha sequencial e já consegue até utilizá-lo em uma aplicação. Agora adiante para a próxima tarefa do fórum, qualquer dúvida me avise. não se esqueça de visitar as postagens de seus colegas, sempre há algo interessante a se aprender e/ou a comentar. []s Alexandre Aluno (a) SANDRO ROBERTO GOMES respondeu a 25 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Boa tarde Professor, Conforme solicitado na lista de exercícios nº 6 fiz um programa para realizar a conversão binária entre dois números: #include <iostream> #define tam 50 using namespace std; void push(int[],int&,int&); int pop(int[],int&); int x; int main() { int topo=-1, n, r[tam]; cout<<"\n\nEntre com o Número decimal: "; cin>>n; do { cout<<"\n\nInforme a base desejada(Entre 3 e 15): "; cin>>x; } while (x<3 II b>15); int inicio=n; do { push(r,n,topo); } while(n!=0); system( "cls" ); cout<<"\n\nO número "<<inicio<<"Na base"<<x<<" = "; do { cout<<pop(r,topo); 03/11/12 Campus Virtual Estácio 9/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… cout<<pop(r,topo); } while(topo!=-1); cout"\n\n"; system( "pause" ); return 0; } void push(int r[], int &n, int &topo) { topo++; r[topo]=n%x; n=n/x; } int pop(int r[], int &topo) { topo--; return r[topo+1]; } --------------------------------------------- Fim. Professor (a) ALEXANDRE SOARES ALVES respondeu a 25 dias atrás Comentário da postagem de SANDRO ROBERTO GOMES Oi Sandro, Apesar de ser uma aplicação clássica de pilha, vejo que consegue utilizar em um programa a estrutura de dados estudada. Agora adiante para a 2a tarefa e qualquer dúvida me avise. []s Alexandre Aluno (a) ALBERT DAVID NOGUEIRA DE OLIVEIRA respondeu a 23 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Cadastro de usuários com nome e idade: #include<iostream> #define MAX 3 #define MAXNOME 10 using namespace std; typedef struct candidato{ char nome[MAXNOME]; int idade; // VARIÁVEIS PARA ARMAZENAR DADOS DO CADASTRO }Tcandidato; typedef struct Pilha{ int topo; // VARIÁVEL PARA CONTROLAR O TOPO DA PILHA Tcandidato candidato[MAX]; }TPilha; int menu(); void iniciapilha (TPilha *p); int pilhavazia(TPilha *L); int pilhacheia(TPilha *L); void empilha(Tcandidato p, TPilha *L); //PROTÓTIPOS DA FUNÇÕES void topo(TPilha *ptr); void imprimirpilha(TPilha *L); void desempilhar(TPilha *L); int menu(){ int opcoes; cout<<"1 - Cadastrar Candidato\n"; cout<<"2 - Apagar Ultimo Candidato\n"; cout<<"3 - Mostrar Ultimo Candidato\n"; //MENU DE OPÇÕES cout<<"4 - Mostrar Todos Os Candidatos\n"; cout<<"5 - Reiniciar Cadastro\n"; cout<<"0 - Sair\n"; cin>>opcoes; return opcoes; 03/11/12 Campus Virtual Estácio 10/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… return opcoes; } int main () { TPilha Pilha; TPilha * EPilha=&Pilha; iniciapilha (&Pilha); Tcandidato cand; int opcoes; do{ opcoes = menu(); switch(opcoes){ case 1: if(pilhacheia(&Pilha)==1) cout<< "JA ATINGIMOS O LIMITE MAXIMO DE CADASTROS"; else { cout <<"INFORME O NOME E A IDADE DO CANDIDATO ==> EX: ANTONIO 29\n"; // ADICIONAR DADOS A PILHA cin>>cand.nome; cin>>cand.idade; empilha(cand, &Pilha); } break; case 2: if (pilhavazia) desempilhar(EPilha); // RETIRAR DADOS DA PILHA break; case 3: topo (EPilha); // EXIBIR TOPO break; case 4: imprimirpilha(EPilha); // EXIBIR TODOS OS DADOS DA PILHA break; case 5: iniciapilha (EPilha); // RESETAR PILHA break; } }while(opcoes != 0); return 0; } void iniciapilha(TPilha *L) { L->topo = 0; } int pilhavazia(TPilha *L){ if(L->topo == 0 ) return 1; else return 0; } int pilhacheia(TPilha *L){ if (L->topo == MAX) return 1; else return 0; } void empilha(Tcandidato p, TPilha *L){ if (pilhacheia(L)) cout<< "LIMITE MAXIMO DE CADASTROS ATINGIDO!\n\n"; else { L->candidato[L->topo]=p; L->topo++; } } void topo(TPilha *L){ if(L->topo == 0) cout<<"AINDA NAO POSSUIMOS CADASTROS!\n"; else{ cout<<"Nome: ",L->candidato[L->topo-1].nome; cout<<"Idade: \n",L->candidato[L->topo-1].idade; } } void imprimirPilha(TPilha *L){ if(L->topo == 0) cout<<"NAO HA CANDIDATOS CADASTRADOS!\n"; else{ int i; for(i=0; i<L->topo; i++){ cout<<"Nome: ",L->candidato[i].nome; cout<<"Idade: \n",L->candidato[i].idade; } } } void desempilhar(TPilha *L){ if (L->topo == 0) cout<<"\n NAO HA CADASTROS ATE O MOMENTO!!!\n"; else L->topo--; } 03/11/12 Campus Virtual Estácio 11/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… } Professor (a) ALEXANDRE SOARES ALVES respondeu a 23 dias atrás Comentário da postagem de ALBERT DAVID NOGUEIRA DE OLIVEIRA Oi Albert As estruturas de dados são utilizadas para simplificar ou viabilizar os algoritmos. Por isto a nossa tarefa é tentar construir uma aplicação em que esta seja útil. Veja, no caso de pilhas sequenciais, estas estruras armazenam dados e fornecem a ordem reversa em que estes dados. Gostaria que discutisse de que modo a estrutura auxilia a sua aplicação. []s Alexandre Aluno (a) ALBERT DAVID NOGUEIRA DE OLIVEIRA respondeu a 23 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Olá professor, Pensei em uma situação onde, por exemplo, tivessemos 3 pessoas que passaram por um processo de seleção e ficaram em um banco de espera para 3 vagas dentro de uma empresa X e foram cadastrados por ordem decrescente (baseado em suas notas). Porém havia um risco de não existirem essas 3 vagas e sim apenas 1 vaga ou 2 vagas. Assim se o número de vagas na empresa de fato for reduzido descadastramos o candidato de menor pontuação (topo) e deixamos em nossa pilha apenas o(s) candidato(s) que obtiveram maior pontuação para conquistar as vagas existentes. Professor (a) ALEXANDRE SOARES ALVES respondeu a 22 dias atrás Comentário da postagem de ALBERT DAVID NOGUEIRA DE OLIVEIRA Oi Albert, Posso ver que entendeu bem o conceito de uma pilha e já consegue inclusive utilizar as características de uma pilha para auxiliar o desenvolvimento de uma aplicação. Agora adiante para a próxima tarefa e qualquer dúvida me avise. []s Alexandre Aluno (a) BRUNO DOMINGOS DE OLIVEIRA respondeu a 23 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES #define StackSize 100 Class Pilha { private: int Topo; char Itens[ StackSize ]; public: pilha ( ) { topo=-1 } int isempty ( ) { if (topo == -1) return 1; else return 0; } void push( int x, int &erro) { if (topo==StackSize-1) erro = 1; else { erro = 0; topo++; Itens[topo] = x; } } 03/11/12 Campus Virtual Estácio 12/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115…void pop( int &x, int &erro) { if (topo == -1 ) erro = 1; else { erro = 0; x = Itens[ topo ]; topo--; } } Pilha P; { aloca memória para a pilha P, alocação estática } Professor (a) ALEXANDRE SOARES ALVES respondeu a 23 dias atrás Comentário da postagem de BRUNO DOMINGOS DE OLIVEIRA Oi Bruno, O principal aqui é entender que as estruturas de dados são utilizadas para simplificar ou viabilizar os algoritmos. Por isto a nossa tarefa não é apresentar simplesmente o código de uma estrutura de dados, mas sim tentar construir uma aplicação em que esta seja útil. Veja, no caso de pilhas sequenciais, a nossa 1a tarefa, estas estruras armazenam dados e fornecem a ordem reversa em que estes dados. Sendo assim em qualquer aplicação que este fenômeno seja útil deve se usar uma pilha. Como exemplo de aplicação pode-se citar a conversão de base numérica pelo processo de divisão sucessivas, pois após empilhar os restos das divisões ao desempilhar estes na sua ordem reversa, o número estará convertido naturalment. []s Alexandre Aluno (a) RICARDO FELISBINO respondeu a 22 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Não consigo execultar diz que tem erro mas não encontrei quem sabe vocês podem me ajudar a arrumar... #include <iostream> #define TAM 5 using namespace std; void AdicionaValor(int p[], int &t, int v); int RemoveValor(int p[], int &t, int &v); void VerUltimoValor(int p[], int &t); void VerEspacosLivres(int p[], int &t); void VerNumeroDeValores(int p[], int &t); int main() { int op, val, topo=-1, pilha[TAM],resp; do { system( "cls" ); cout<<"\nPILHA\n\n"; cout<<"\n1- Adicionar um Valor"; cout<<"\n2- Remover um Valor"; cout<<"\n3- Ver Ultimo Valor"; cout<<"\n4- Ver Espacos Livres"; cout<<"\n5- Numero de itens na PILHA"; cout<<"\nOpcao: "; cin>>op; system( "cls" ); switch(op) { case 1: cout<<"Digite o valor para adicionar: "; cin>>val; AdicionaValor(pilha, topo, val); break; case 2: resp=RemoveValor(pilha,topo,val); if(resp==0) cout<<"\nATENCAO. Pilha Vazia\n"; else cout<<"\nValor removido: "<<val; break; case 3: VerUltimoValor(pilha,topo); break; case 4: VerEspacosLivres(pilha,topo); break; case 5: VerNumeroDeValore(pilha,topo); break; default: cout<<"\nOPCAO INVALIDA\n"; } cout<<"\n\n";system( "pause" ); }while(op!=5); } /* Adiciona Valor */ void AdicionaValor(int p[], int &t, int v) { if(t == TAM-1) //verifica se pilha esta cheia cout<<"\nATENCAO. Pilha Cheia\n"; 03/11/12 Campus Virtual Estácio 13/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… cout<<"\nATENCAO. Pilha Cheia\n"; else { t++; //adiciona um valor p[t]=v; // pilha recebe valor } } /* Remove valor */ int RemoveValor(int p[], int &t, int &v) { if(t == -1) //verifica se está vazia return 0; else { v=p[t];//guarda o valor do topo t--; //remove um valor return 1; } } /* Ver Ultimo Valor */ void VerUltimoValor(int p[], int &t) { if(t == -1) cout<<"\nATENCAO. Pilha Vazia\n"; else cout<<"\nUltimo valor adicionado: "<<p[t]; } /* Ver Espacos Livres */ void VerEspacosLivres(int p[], int &t) { if(t == -1) cout<<"\nATENCAO. Pilha Vazia sao"<<TAM-(t+1)<<" espacos\n"; else if (t == TAM ) cout<<"\nATENCAO. Pilha Cheia\n"; else cout<<"\n\nEspaco disponivel na pilha: "<<TAM-(t+1)<<"\n"; } /* Ver Numero de Valore */ void VerNumeroDeValore(int p[], int &t) { if(t == -1) cout<<"\nATENCAO. Pilha Vazia\n"; else if (t == TAM ) cout<<"\nATENCAO. Pilha Cheia\n"; else cout<<"\nTotal de elementos na pilha: "<<t+1<<"\n"; } Professor (a) ALEXANDRE SOARES ALVES respondeu a 22 dias atrás Comentário da postagem de RICARDO FELISBINO Oi Ricardo, Já está funcionando , você estava errando pois chamava VerNumeroDeValore, mas o correto é VerNumeroDeValores . Veja o código: #include #define TAM 5 using namespace std; void AdicionaValor(int p[], int &t, int v); int RemoveValor(int p[], int &t, int &v); void VerUltimoValor(int p[], int &t); void VerEspacosLivres(int p[], int &t); void VerNumeroDeValores(int p[], int &t); int main() { int op, val, topo=-1, pilha[TAM],resp; do { system( "cls" ); cout<<"\nPILHA\n\n"; cout<<"\n1- Adicionar um Valor"; cout<<"\n2- Remover um Valor"; cout<<"\n3- Ver Ultimo Valor"; cout<<"\n4- Ver Espacos Livres"; cout<<"\n5- Numero de itens na PILHA"; cout<<"\nOpcao: "; cin>>op; system( "cls" ); switch(op) { case 1: cout<<"Digite o valor para adicionar: "; cin>>val; AdicionaValor(pilha, topo, val); break; case 2: resp=RemoveValor(pilha,topo,val); if(resp==0) cout<<"\nATENCAO. Pilha Vazia\n"; else 03/11/12 Campus Virtual Estácio 14/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… else cout<<"\nValor removido: "< break; case 3: VerUltimoValor(pilha,topo); break; case 4: VerEspacosLivres(pilha,topo); break; case 5: VerNumeroDeValores(pilha,topo); break; default: cout<<"\nOPCAO INVALIDA\n"; } cout<<"\n\n"; system( "pause" ); }while(op!=5); } /* Adiciona Valor */ void AdicionaValor(int p[], int &t, int v) { if(t == TAM-1) //verifica se pilha esta cheia cout<<"\nATENCAO. Pilha Cheia\n"; else { t++; //adiciona um valor p[t]=v; // pilha recebe valor } } /* Remove valor */ int RemoveValor(int p[], int &t, int &v) { if(t == -1) //verifica se está vazia return 0; else { v=p[t];//guarda o valor do topo t--; //remove um valor return 1; } } /* Ver Ultimo Valor */ void VerUltimoValor(int p[], int &t) { if(t == -1) cout<<"\nATENCAO. Pilha Vazia\n"; else cout<<"\nUltimo valor adicionado: "<} /* Ver Espacos Livres */ void VerEspacosLivres(int p[], int &t) { if(t == -1) cout<<"\nATENCAO. Pilha Vazia sao"< else if (t == TAM ) cout<<"\nATENCAO. Pilha Cheia\n"; else cout<<"\n\nEspaco disponivel na pilha: "<} /* Ver Numero de Valore */ void VerNumeroDeValores(int p[], int &t) { if(t == -1) cout<<"\nATENCAO. Pilha Vazia\n"; else if (t == TAM ) cout<<"\nATENCAO. Pilha Cheia\n"; else cout<<"\nTotal de elementos na pilha: "<} Aluno (a) RICARDO FELISBINO respondeu a 21 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES professora tenho uma duvida, se eu quizer fazer mas de 3 critérios em uma função, devo fazer assim? para 1 condição if (valor==1) comando1 else comando2 para 2 condições if (valor==1) { comando1 } else { if (valor==2) comando2 else comando3 } } para 3 condições if (valor==1) { comando1 } else { if (valor==2) comando2 else { if (valor==3) comando3 else comando4 } } Professor (a) ALEXANDRE SOARES ALVES respondeu a 21 dias atrás Comentário da postagem de RICARDO FELISBINO Oi Ricardo, Você tem sempre a opção de cascatear o comando if, criando uma gama de opções. Mas ainda pode usar o comando switch(). Sugiro que revise a aula sobre o comando escolha (switch()). []s Alexandre Aluno (a) RICARDO FELISBINO respondeu a 17 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES era ai que eu gostaria de chegar, ehehhee pensei que o comando switch() não poderia ser usado dentro de uma função, mas me enganei... eu sempre programa em HTML e PHP, agoro que estou começando minha vida no C++ Professor (a) ALEXANDRE SOARES ALVES respondeu a 16 dias atrás Comentário da postagem de RICARDO FELISBINO Oi Ricardo, Fico contente que tenha aproveitado o fórum para adquirir um novo conhecimento. Sempre que praticar, terá oportunidade decriar dúvidas e poderá sanar aqui. Desta forma terá crescimento de conhecimento. []s Alexandre Aluno (a) FRANÇOÁ CORREIA GONÇALVES respondeu a 19 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Professor, desenvolvi um programa que converte decimal em hexadecimal, utilizando o conceito de pilha. obs: posso também utilizar a própria função 'desempilha' para desempilhar e já imprimir os valores. Tem a vantagem de não precisar do trecho do programa que chama tal função, além da passagem por referência "&V".Porém, a função ficará bem maior do que a atual. #include <iostream> #define TAM 40 using namespace std; void empilha(int p[], int &t, int v); int desempilha(int p[], int &t, int &v); int main() { float n; int num,resto,pilha[TAM],sinal,topo=-1; system( "color f1" ); cout<<"\n*************************************************************"; cout<<"\n* converte numero da base decimal para a base hexadecimal *"; cout<<"\n* digite numeros ou operadores *"; cout<<"\n* digite s para sair *"; cout<<"\n****************************************************"; cout<<"\ndigite numero positivo ate 2147483520. Qualquer outro numero, sai: "; cin>>n; if(n>2147483520 || n<-2147483520) exit(0); 03/11/12 Campus Virtual Estácio 16/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… exit(0); else num=(int)n; //converte real para inteiro; while(num>=0) { do//inicio do trecho que empilha os restos que irão gerar o numero hexadecimal { resto=num%16; empilha(pilha,topo,resto); num/=16; }while(num>0);//fim do trecho de empilhamento cout<<"\nconvertido para binario: "; sinal=desempilha(pilha,topo,resto);//inicio do trecho que desempilha todos while(sinal==1)//os restos que irão exibir os numeros hexadecimais - note: se o tetorno for 1 então sinal==1 { switch(resto) { case 10: cout<<"A"; break; case 11: cout<<"B"; break; case 12: cout<<"C"; break; case 13: cout<<"D"; break; case 14: cout<<"E"; break; case 15: cout<<"F"; break; default: cout<<resto; } sinal=desempilha(pilha,topo,resto); }//fim do trecho desempilhamento topo=-1; cout<<"\n\ndigite numero positivo ate 2147483520.Qualquer outro, sai: "; cin>>n; if(n>2147483520 || n<-2147483520) exit(0);//maximo permitido else num=(int)n; } cout<<"\n\n"; system( "pause" ); } void empilha(int p[], int &t, int v) { t++;//atualiza o topo p[t]=v;//pilha recebe valor } int desempilha(int p[], int &t, int &v) { char A; if(t==-1)//testa se a pilha está vazia return 0; else { v=p[t];//guarda o valor do topo t--;//atualiza o topo return 1; } } Professor (a) ALEXANDRE SOARES ALVES respondeu a 19 dias atrás Comentário da postagem de FRANÇOÁ CORREIA GONÇALVES Oi Françoá Vejo que entendeu bem o conceito de pilha, pois já pode inclusive usá-lo em sua aplicação. Agora gostaria que discutisse, de que modo a estrutura pilha contribui para sua aplicação, isto é, de que modo o algoritmo LIFO caracterísco de uma pilha contribui para sua aplicação. []s Alexandre Aluno (a) FRANÇOÁ CORREIA GONÇALVES respondeu a 19 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Uma vez que a PILHA só pode ser acessada por uma única extremidade, no caso, pelo último elemento inserido no topo, dessa forma, essa característica pecular da pilha torna-o adequado a minha aplicação. Lembro que quando fazemos as divisões de números, seja para binário, decimal, hexadecimal ou para qualquer outra base, os restos são sempre armazenados na ordem inversa da impressão dos mesmos, para o caso de utilizarmos pilha. Essa característica peculiar permite que utilizemos a PILHA para armazenarmos tais números e, emseguida, desempilharmos para serem mostrados tal como devem ser mostrados. Professor (a) ALEXANDRE SOARES ALVES respondeu a 19 dias atrás Comentário da postagem de FRANÇOÁ CORREIA GONÇALVES Oi Françoá, É exatamente isto, as pilhas são uteis nesta aplicação pois os restos das divisões devem ser recuperados na ordem reversa de seu armazenamento. []s Alexandre 03/11/12 Campus Virtual Estácio 17/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… Aluno (a) ANDRÉIA FERREIRA BARRETO respondeu a 18 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Ola bom dia, A ideia é que esta implementação faça o armazenamento das matriculas de todos os alunos que passam por esse local, por exemplo, pode ser um programa implementado em uma biblioteca que para saber quantos e quais alunos passaram por lá ela cadastra na chegada do aluno o seu numero de matricula e mostra no final do dia, o total de alunos. Este é um código baseado no modelo da aula. #include <iostream> #define TAM 5 using namespace std; void cadastrar(int p [ ], int &t, int v); int removerCadastro(int p[ ], int &t, int &v); void ultimoCadastro(int p [ ], int &t); void situacaoCadastro(int p[ ], int &t); int main() { Int op, m, topo= -1, pilha[TAM], resp; do {system(“cls”); System(“color f0”); cout<<"\nCadastro de matricula\n\n"; cout<<"\n1- Digite o numero da matricula a ser inserida"; cout<<"\n2- Remover uma matricula"; cout<<"\n3- Mostrar a última matricula"; cout<<"\n4- Mostrar situação do cadastro"; cout<<"\n5- Sair"; cout<<"\nDigite o numero da opção escolhida: "; cin>>op; system(“cls”); switch(op) { case 1: cout<<" Digite o numero da matricula a ser inserida: "; cin>>m; empilha(pilha, topo, m); break; case 2: resp=desempilha(pilha, topo, m); if(resp==0) cout<<"\nNão há matricula a ser removida!\n"; else cout<<"\nMatricula removida com sucesso: "<<m; break; case 3: ultimoCadastro(pilha,topo); break; case 4: situacaoCadastro(pilha,topo); break; case 5: cout<<"\nPrograma Cadastro Matricula\n"; break; default: cout<<"\nOpção inexistente, escolha uma das opções acima.\n"; } cout<<"\n\n";system( "pause" ); }while(op!=5); } /* Insere */ void cadastrar(int p[], int &t, int v) { if(t == TAM-1) cout<<"\nATENCAO. Cadastro Cheio\n"; else { t++; //atualiza o topo p[t]=v; // pilha recebe valor } } /* Remove */ int removerCadastro(int p[], int &t, int &v) { if(t == -1) return 0; else { v=p[t];//guarda o valor do topo t--; //atualiza o topo return 1; } } /* Mostra o topo */ void ultimoCadastro(int p[], int &t) { if(t == -1) cout<<"\nATENCAO. Cadastro Vazio\n"; else cout<<"\nUltima matricula cadastrada: "<<p[t]; } 03/11/12 Campus Virtual Estácio 18/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… } /* Mostra situacao da Pilha */ void situacaoCadastro(int p[], int &t) { if(t == -1) cout<<"\nAtenção! Cadastro Vazio\n"; else if (t == TAM - 1 ) cout<<"\nATENCAO. Cadastro Cheio\n"; else { cout<<"\nTotal de matriculas cadastradas: "<<t+1<<"\n"; cout<<"\n\nEspaco disponivel para cadastro: "<<TAM-(t+1)<<"\n"; } } Como o professor falou que este codigo está correto mas não tem uma aplicação específica em pilha vou postar outro em que tentei adaptar um modelo da aula para criar uma calculadora no modo notação polonesa. até + Aluno (a) ANDRÉIA FERREIRA BARRETO respondeu a 18 dias atrás Comentário da postagem de ANDRÉIA FERREIRA BARRETO O outro código ao qual me referi professor... Eu não estou conseguindo executar ele, quando chega na parte da definição da função ele trava e não vai mais... já conferi com o exemplo que utilzei e aparentemente está tudo correto, o professor ou algum colega pode dar uma conferida e ver o que está faltando, já testei várias vezes, apaguei a linha e digitei novamente, mas não consigo solucionar... #include <iostream> #include <cstdlib>#define TAM 20// só para exemplificar using namespace std; void push(float p[], int &t, float v); float pop(float p[], int &t); int main() { int t = -1; float v1, v2, p[TAM]; char s[10]; cout<<”\nCALCULOS NO MODO NOTAÇÃO POLONESA”; cout<<”\nDigite primeiro o operador e em seguida os números”; cout<<”\nDigite s para sair”; do { cout<<”: “; cin>>s; switch(s[0]) { case ‘+’: v1 = pop(p, t); v2 = pop(p, t); cout<<”\n”<< v1+v2<<”\n”; push(p, t, v1+v2); break; case ‘-’: v1 = pop(p, t); v2 = pop(p, t); cout<<”\n”<< v1-v2<<”\n”; push(p, t, v1-v2); break; case ‘*’: v1 = pop(p, t); v2 = pop(p, t); cout<<”\n”<< v1*v2<<”\n”; push(p, t, v1*v2); break; case ‘/’: v1 = pop(p, t); v2 = pop(p, t); if(v1==0) cout<<”\ndivisao por 0\n”; else { cout<<”\n”<< v2/v1<<”\n”; push(p, t, v2/v1); break; defaut: push(p, t, atof(s)); } } while (s[0] != ‘s’); system(“pause”); } //definição das funções void push(float p[], int &t, float v) { if(t==TAM-1) cout<<”\nPilha cheia\n”; else { t++; p[t]=v 03/11/12 Campus Virtual Estácio 19/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… p[t]=v } } float pop(float p[], int &t) { float v; if(t == -1) { cout<<”\nPilha vazia\n”; return 0; } else { v=p[t]; t--; return v; } } Professor (a) ALEXANDRE SOARES ALVES respondeu a 17 dias atrás Comentário da postagem de ANDRÉIA FERREIRA BARRETO Oi Andréia, Este código está parecendo que foi copiado e colado, pois o problema no código são as aspas duplas e simples que estão com um formato diferente, se substituir todas as aspas, redigitando-as, o código funciona. []s Alexandre Aluno (a) ANDRÉIA FERREIRA BARRETO respondeu a 17 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Oi professor, eu digitei ele no dev e copiei para colar aqui... e a parte que ele para é quando chega na definição, ele não acusa na de digitação errada, mas vou tentar novamente... Professor (a) ALEXANDRE SOARES ALVES respondeu a 16 dias atrás Comentário da postagem de ANDRÉIA FERREIRA BARRETO Bem depois de experimentar e consertar as aspas duplas e simples, poste aqui o código corrigido para que outros alunos possam experimentar. []s Alexandre Professor (a) ALEXANDRE SOARES ALVES respondeu a 17 dias atrás Comentário da postagem de ANDRÉIA FERREIRA BARRETO Oi Andréia, A implementação de sua aplicação está correta e também vejo que utiliza uma pilha sequencial. Porém gostaria que explicasse o porquê do uso de uma pilha na sua aplicação. Qual o principal benefício de se usar uma pilha nesta implementação? Para finalidade da sua aplicação é realmente necessário o uso de uma pilha? Por que não usar uma lista ou uma fila? []s Alexandre Aluno (a) ANDRÉIA FERREIRA BARRETO respondeu a 17 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Ola, boa noite. Eu utilizei a pilha nesta aplicação mais pela questão do exercício mesmo, a nível de exemplificação. Como o professor já havia me dito via e-mail, ela não teria que necessariamente ser feita utilizando a pilha, poderia usar a fila ou lista, mas como na maioria dos exemplos dos colegas é utilizado a conversão de números eu não quis fazer outro igual. A implementação não será utilizada para a sua real função que é ir acumulando e buscando os números novamente quando necessário, mas ela possibilitará nesta minha implementação voltar a matricula anterior caso seje necessário por algum motivo. Professor (a) ALEXANDRE SOARES ALVES respondeu a 16 dias atrás Comentário da postagem de ANDRÉIA FERREIRA BARRETO Veja o código que implementa as estruturas de dados são quase que padronizados, ou seja, não há muito o que alterar numa implementação para fila ou pilha, mas o mais importante é perceber qeu estas estruturas foram desenvolvidas com o propósito de facilitar, otimizar ou mesmo viabilizar a implementação de programas ou aplicações que executam tarefas para diferentes propósitos. Por isto a minha proposição tem o intuito de que os alunos possam praticar o uso das estruturas estudadas em programas que venham produzir. Afinal, este é a principal razão de se estudar estas estruturas de dado. 03/11/12 Campus Virtual Estácio 20/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… razão de se estudar estas estruturas de dado. []s Alexandre Aluno (a) TÉRCIO MARTINS DUARTE respondeu a 15 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Professor, este fórum ficará aberto até qual data? Professor (a) ALEXANDRE SOARES ALVES respondeu a 15 dias atrás Comentário da postagem de TÉRCIO MARTINS DUARTE Oi Tércio, Todos os fórum temáticos relativos as aulas 6 a 10 ficarão abertos até dia 01 de novembro. Qualquer dúvida posterior ao fechamento do fórum poderá ser resolvida no fórum de dúvidas para AV2 que já estará aberto, ou mesmo pela caixa de mensagens. []s Alexandre Aluno (a) NATAN RODRIGUES DA SILVA respondeu a 11 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Editado por NATAN RODRIGUES DA SILVA em 23/10/2012 08:11 Bom dia Professor.... O meu código realiza uma conversão de decimal para binária: (Não sei se esta certo professor, rodando aqui no DEV C++ deu certinho) #include <iostream> #define tam 40 using namespace std; void push(int[],int&,int&; int pop(int[],int&; int x; int main() { int topo=-1, n, r[tam]; cout<<"\n\nEntre com o Número decimal: "; cin>>n; do { cout<<"\n\nInforme a base desejada(Entre 3 e 15): "; cin>>x; } while (x<3 II b>15); int inicio=n; do { push(r,n,topo); } while(n!=0); system( "cls" ); cout<<"\n\nO número "<<inicio<<"Na base"<<x<<" = "; do { cout<<pop(r,topo); } 03/11/12 Campus Virtual Estácio 21/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… while(topo!=-1); cout"\n\n"; system( "pause" ); return 0; } void push(int r[], int &n, int &topo) { topo++; r[topo]=n%x; n=n/x; } int pop(int r[], int &topo) { topo--; return r[topo+1]; } Professor (a) ALEXANDRE SOARES ALVES respondeu a 11 dias atrás Comentário da postagem de NATAN RODRIGUES DA SILVA Oi Natan, A sua aplicação está boa , mas porque acha a estrutura mais adequada para sua aplicação, isto é de que maneira a estrutura está contribuindo para a sua aplicação. Não usamos estrutura de dados apenas por usar, elas devem contribuir de alguma maneira para a tarefa principal. []s Alexandre Aluno (a) NATAN RODRIGUES DA SILVA respondeu a 5 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Já que utilizei o conceito de pilha, será necessária a passagem por referência da varíavel nas funções, quando um elemento for incluso na pilha. Achei interessante por ser um método mais rápido de denvolvimento, o processamento da pilha também será mais rápido. Professor (a) ALEXANDRE SOARES ALVES respondeu a 5 dias atrás Comentário da postagem de NATAN RODRIGUES DA SILVA As estruturas de dados tem características bem específicas e os algoritmos se aproveitam destas. Veja uma estrutura de dados do tipo fila, adota o algoritmo do primeiro a entrar é o primeiro a sair, como em uma fila de banco o primeiro da fila será o primeiro a ser atendido. Então, por exemplo, quando o sistema operacional gerencia o uso da CPU, ele armazena os pedidos de uso numa fila de processos, e para isto usa uma estrutura de dados tipo fila, assim a única preocupação é incluir na fila e retirar da fila, pois a ordem já está garantido pela própria natureza da estrutura de dados. Bem, agora que enendeu bem os conceitos e já apresentou sua aplicações aproveit e visite as postagens de seus colegas, existem várias informações interessantes. []s Alexandre Aluno (a) NATAN RODRIGUES DA SILVA respondeu a 3 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Ok. Pode se dizer intão que na minha aplicação, o usuário irá adicionar os números a serem convertidos, e por se tratar de umapilha, as entradas do usuário já estarão ordenadas, facilitando assim o processamento das informações, que seria a conversão das bases. Professor (a) ALEXANDRE SOARES ALVES respondeu a 3 dias atrás Comentário da postagem de NATAN RODRIGUES DA SILVA Agora que entendeu bem os conceitos e já apresentou sua aplicações aproveite e visite as postagens de seus colegas, existem várias informações interessantes. []s Alexandre 03/11/12 Campus Virtual Estácio 22/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… Aluno (a) NATAN RODRIGUES DA SILVA respondeu a 67 horas atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Tudo bem professor, estarei comentando as outras postagens. Obrigado! Professor (a) ALEXANDRE SOARES ALVES respondeu a 52 horas atrás Comentário da postagem de NATAN RODRIGUES DA SILVA Oi Natan, Aproveite bem as informações de seus colegas. []s Alexandre Aluno (a) ANTONIO HENRIQUES PEREIRA respondeu a 6 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Professor, desenvolvi um código para o armazenamento de produtos perecíveis onde o funcionário digita o dia de vencimento e o programa organiza os dias digitados. Peguei os conceitos das aulas 4 e 6. Segue: #include <iostream> #define TAM 5 using namespace std; void empilha(int p[], int &t, int v); int desempilha(int p[], int &t, int &v); void acessoTopo(int p[], int&t); void situacaoPilha( int p[], int &t); void selecao(int p[], int tam); int main() { int op, val, topo=-1, pilha[TAM], resp; do { system( "cls" ); system( "color f0" ); cout<<"\nPilha(LIFO - Last In - First Out)\n\n"; cout<<"\n1- Inserira o dia de vencimento"; cout<<"\n2- Remover ultimo dia"; cout<<"\n3- Mostrar ultimo dia"; cout<<"\n4- Mostrar a situacao da pilha"; cout<<"\n5- Organiza a pilha"; cout<<"\n6- Sai"; cout<<"\nOpcao: "; cin>>op; system( "cls" ); switch(op) { case 1: cout<<"Digite o dia do vencimento: "; cin>>val; empilha(pilha, topo, val); break; case 2: resp=desempilha(pilha, topo, val); if(resp==0) cout<<"\nAtencao, Pilha Vazia\n" ; else cout<<"\nValor removido: "<<val; break; case 3: acessoTopo(pilha, topo); break; case 4: situacaoPilha(pilha, topo); break; case 5: selecao(pilha,topo); break; case 6: cout<<"\nPrograma basico da Pilha\n"; break; default: cout<<"\nOpcao Invalida\n"; } cout<<"\n\n"; system ( "pause" ); }while (op!=6); } void selecao(int p[], int tam) { int j,i,aux,a,temp; for(i=0;i<tam;i++) { cout<<"\nOrganizando a partir de "<<i<<"\t"; for(a=0; a<TAM;a++) cout<<p[a]<<"\t"; aux=i; for(j=i+1;j<=tam;j++) if(p[aux]>p[j]) aux=j; temp=p[aux]; 03/11/12 Campus Virtual Estácio 23/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… temp=p[aux]; p[aux]=p[i]; p[i]=temp; } } /* Insere */ void empilha(int p[], int &t, int v) { if(t==TAM-1) cout<<"\nAtencao. Pilha Cheia\n"; else { t++; //Atualiza o topo p[t]=v; //pilha recebe o valor } } /*Remove */ int desempilha (int p[], int &t, int &v) { if(t==-1) return 0; else { v=p[t]; t--; return 1; } } /*Mostra o Topo */ void acessoTopo(int p[], int &t) { if( t==-1) cout<<"\nAtencao. Pilha Vazia\n"; else cout<<"\nelemento do Topo da Pilha: "<<p[t]; } /*Mostra situacao da Pilha */ void situacaoPilha(int p[], int &t) { if(t==-1) cout<<"\nAtencao. Pilha Vazia\n"; else if (t==TAM -1) cout<<"\natencao. Pilha Cheia\n"; else { cout<<"\nTotal de elementos na Pilha: "<<t+1<<"\n"; cout<<"\nEspaço disponivel na Pilha: "<<TAM-(t+1)<<"\n"; } } Professor (a) ALEXANDRE SOARES ALVES respondeu a 6 dias atrás Comentário da postagem de ANTONIO HENRIQUES PEREIRA Sua aplicação está boa e a implementação correta. Mas gostaria que discutisse o porquê do uso desta estrutura para a aplicação, isto é qual a vantagem que a estrutura traz para o desenvolvimento da aplicação. []s Alexandre Aluno (a) ANTONIO HENRIQUES PEREIRA respondeu a 5 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Professor, boa tarde. Antes gostaria de perguntar se está de todo correto implementarmos uma organização em estruturas pilhas, ou este tipo de estrutura é mais conveniente deixar sem organização já que é pilha (LIFO)? Outra pergunta, com esse código podemos desenvolver um grande Banco de Dados? A estrutura permite incerção de dados, remoção, verificação de situação dos dados, ou seja, com pouco código temos um grande numero de ferramentas dentro do programa. Professor (a) ALEXANDRE SOARES ALVES respondeu a 5 dias atrás Comentário da postagem de ANTONIO HENRIQUES PEREIRA As estruturas de dados tem características bem específicas e os algoritmos se aproveitam destas. Veja uma estrutura de dados do tipo fila, adota o algoritmo do primeiro a entrar é o primeiro a sair, como em uma fila de banco o primeiro da fila será o primeiro a ser atendido. Então, por exemplo, quando o sistema operacional gerencia o uso da CPU, ele armazena os pedidos de uso numa fila de processos, e para isto usa uma estrutura de dados tipo fila, assim a única preocupação é incluir na fila e retirar da fila, pois a ordem já está garantido pela própria natureza da estrutura de dados. Bancos de daodos são implementados com outro tipo de estrutura, normalmente são organizados em árvores. []s 03/11/12 Campus Virtual Estácio 24/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… Alexandre Aluno (a) ANTONIO HENRIQUES PEREIRA respondeu a 68 horas atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Ok professor. Então isso siginifica que basicamente todas as estruturas já estão prontas e que cabe a nós apenas aproveita-las no que nos interessa. E podemos implementa-las de acordo com cada situação. Professor (a) ALEXANDRE SOARES ALVES respondeu a 52 horas atrás Comentário da postagem de ANTONIO HENRIQUES PEREIRA Você pode até implementar um código de uma estrutura com uma adaptação para o que quiser, mas normalmente as bibliotecas de linguagem já possuem implementações genéricas destas estruturas básicas para que possam ser utilizadas em desenvolvimento de aplicações. []s Alexandre Aluno (a) JOSE CANINDE DA SILVA respondeu a 32 dias atrás Mestre, tenho dúvidas no que se refere aplicação. Por exemplo, inserção, remoção, consulta são aplicações? E tipo, valor de pilha o que determina esse tipo e valor? Apos esclarecimento vou tentar resolver o exercício pedido. agradeço desde já Professor (a) ALEXANDRE SOARES ALVES respondeu a 32 dias atrás Comentário da postagem de JOSE CANINDE DA SILVA Oi José, As pilhas são estruturas de dados especiais que apresentam duas funções de manipulação de dados que garantem o comportamento LIFO, isto é o último a entrar é o primeiro a sair. Assim inserção e remoção são as funções que deve implementar. E quanto a aplicação, deve imaginar uma aplicação para implementar uma pilha, veja seu colega aqui no fórum apresentou um conversor de bases numéricas, e para isto utilizou uma pilha sequencial. []s Alexandre Aluno (a) JOSE CANINDE DA SILVA respondeu a 31 dias atrás Trecho de mprograma para inserir cadastro de clientes. Aplicação: inserir cadastro. include <iostream> using namespace std; int main ( ) void insereCad( int p[ ], int & t,int v ) { if(t==Tam -1 ) cout<<" \ n saia pcheia\n"; else { t++; // topo+1 p[t ]=v ; // inserir cad } } Professor (a) ALEXANDRE SOARES ALVES respondeu a 31 dias atrás Comentário da postagem de JOSE CANINDE DA SILVA Oi José, 03/11/12 Campus Virtual Estácio 25/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… Esá indo bem, mas ainda está incompleto seu exercício, pois postou apenas uma função genérica de inserção de dados numa pilha. Veja espero que desenvolva um exemplo completo que utilize pilha sequencial e então neste exemplo pode usar sua função de inserção, mas também desenvolva a de remoção. []s Alexandre Aluno (a) JOSE CANINDE DA SILVA respondeu a 28 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Editado por JOSE CANINDE DA SILVA em 06/10/2012 23:24 Os sistemas de transportes coletivos usando artifícios tecnólogigosemprenderam em todo país, a bilhetagem eletrônica. O usuário por sua vez dispõe de um cartão eletrônico onde é inseridos céditos mediante pagamento e quando do seu uso, este é aproximado a uma maquineta onde é debitado o valor da passagem seja, inteira, vale transporte estudante ou gratuidade ficando armazenado até o descarrego pela empresa. Este programa baseia-se nesse sistema de bilhetagem eletrônica, utilizando as aplicações empilha e desempilha e situação da pilha. # include # usingnamespace std; voidempilha(int p[ ], int valor,& int deb valor) voidempilhaPassagem(int p[ ], int valor,& int debvalor) { if(t==T-1), cout<<"\pilha cheia\n"; else { t++;//topo+1 p[ t ]=v;//receba(intvalor, int debvalor) } } int desempilha(int p[ ], intvalor,& intdebvalor) { if(t==-1) return0; else { v=p[ t ];//guarda valor topo t-1; atualiza topo return 1; void situaçãoPilha(int p[ ], int valor,& int debvalor) { if(t==-1) cout<<"\n pilha vazia else cout<<"\\pilha cheia else cout<<"\\n tot elem pilha:" } } 03/11/12 Campus Virtual Estácio 26/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… Professor (a) ALEXANDRE SOARES ALVES respondeu a 28 dias atrás Comentário da postagem de JOSE CANINDE DA SILVA Oi José, Preste atenção na sua implementação, o parâmetro t que toma conta do topo da pilha está sendo por valor e não por referência, assim sempre que for usado deveria ter seu valor alterado o que não ocorre no seu programa, pois quando se passa um parâmetro por valor o que é passado na verdade é uma cópia deste parâmetro, o que impede da variável ter seu valor real alterado. Sugiro que reveja sua postagem. []s Alexandre Aluno (a) JOSE CANINDE DA SILVA respondeu a 27 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Profº Alexandre boa tarde, Então o desenvolvimento do programa está correto, no caso o erro está no tipo da função que para este tipo deve-se usar passagem por refencia e não por valor. É essa a sua explicação?caso positivo entendi e vou corrigir. obrigado pela explicação! Professor (a) ALEXANDRE SOARES ALVES respondeu a 27 dias atrás Comentário da postagem de JOSE CANINDE DA SILVA Oi José, Com a correção que sugeri você terá conseguido implementar uma pilha sequencial, isto é uma estrutura que utiliza o algoritmo LIFO, " o último a entrar é o primeiro a sair ", para manipular os dados. Então bastará apenas pensar numa aplicação para usar esta estrutura e fazer uma adaptação no código para usá-lo em sua aplicação. []s Alexandre Aluno (a) EDSON JUNIOR SANTOS respondeu a 19 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Questionamento 1 Procedimento para inserir e apagar dígitos ao serem discados em uma chamada telefônica, num total de 8 dígitos. Gostaria de ter feito uma aplicação em que o usuário pudesse acompanhar na tela as inserções e remoções dos dígitos, mas não consegui fazer isso. Quem souber, me auxilie por favor. Optei por não adicionar a função topo da pilha, não achei necessário neste contexto. #include <iostream> //inserção e remoção de 8 dígitos no aparelho telefonico # define MAX 8 using namespace std; void push(int p[], int &t, int v); int pop(int p[], int &t, int &v);// & porque serão alterados void situacaoPilha(int p[], int &t); int main() { int op, digito, topo= -1, pilha[MAX], resp; do { system( "cls" ); cout<<"\nDIGITOS INSERIDOS PARA DISCAGEM\n\n"; cout<<"\n1- Inserir digitos."; cout<<"\n2- Apagar digitos."; cout<<"\n3- Quantos numeros foram digitados"; cout<<"\n4- Sair"; cout<<"\nOpcao: "; cin>>op; system( "cls" ); 03/11/12 Campus Virtual Estácio 27/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… switch(op) { case 1: cout<<"Insira os numeros a serem discados?"; cin>>digito; push(pilha, topo, digito); break; case 2: resp=pop(pilha,topo,digito); if(resp==0) cout<<"\nATENCAO: Nenhum digito inserido!\n"; else cout<<"\nApaguei '"<<digito<<"' ultimo digito inserido por voce."; break; case 3: situacaoPilha(pilha,topo); break; case 4: cout<<"\nGrato por testar!\n"; break; default: cout<<"\nOpcao invalida.\n"; } cout<<"\n\n";system( "pause" ); }while(op!=4); } //inserir dígito void push(int p[], int &t, int v) { if(t == MAX-1) cout<<"\nATENCAO! Voce ja inseriu o numero maximo de digitos\n"; else { t++; p[t]=v; } } int pop(int p[], int &t, int &v) { if (t==-1) return 0; else { v=p[t]; t--; return 1; } } // Mostrar numeros digitados no celular void situacaoPilha(int p[], int &t) { if(t == -1) cout<<"\nATENCAO: Voce nao inseriu nenhum valor!\n"; else if (t == MAX - 1 ) cout<<"\nATENCAO: Voce ja digitou os 8 numeros solicitados!\n"; else { cout<<"\nTotal de digitos em tela: "<<t+1<<"\n"; cout<<"\n\nFalta inserir na tela: "<<MAX-(t+1)<<"\n"; } } Professor (a) ALEXANDRE SOARES ALVES respondeu a 19 dias atrás Comentário da postagem de EDSON JUNIOR SANTOS Oi Edson, Vejo que entendeu bem o conceito de pilha, pois já pode inclusive usá-lo em sua aplicação. Agora gostaria que discutisse, de que modo a estrutura pilha contribui para sua aplicação, isto é, de que modo o algoritmo LIFO caracterísco de uma pilha contribui para sua aplicação. []s Alexandre Aluno (a) EDSON JUNIOR SANTOS respondeu a 19 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES A aplicação permite ao usuário digitar um sequência númerica a qual corresponde o número do telefone a ser discado. Agora entendi por qual motivo a variável "v" não é passada por referência já que na função push não ocorre alteração de valores na pilha, sua função é apenas inserir os dígitos do telefone sem quaisquer alteração. inserir os dígitos do telefone sem quaisquer alteração. Já na função pop todos precisam ser por referência já que os valores serão alterados. O exemplo mostra que só podemos alterar o último número inserido. Caso o segundo número da fila for digitado for o errado o usuário deverá desempilhar a fila até que faça a correção deste número. Existem aplicações que permitem a correção direta no número errado, como acontece na tela de nossos celulares, só que a função pilha não dá suporte a esta necessidade. Achei esta aula excelente!!! Professor (a) ALEXANDRE SOARES ALVES respondeu a 19 dias atrás Comentário da postagem de EDSON JUNIOR SANTOS Oi Edson, Veja já está descobrindo como é importante o desenvolvimento das tarefas do fórum e a participação interagindo com os colegas, sempre se aprende algo novo, além é claro, de ter possibilidade de experimentar na prática o que está estudando. []s Alexandre Professor (a) ALEXANDRE SOARES ALVES respondeu a 30 dias atrás 2ª Tarefa Assita a aula7 e poste aqui uma aplicação para fila sequencial, mostre também a implementação em C++ da aplicação escolhida. Abcs Alexandre Aluno (a) TÉRCIO MARTINS DUARTE respondeu a 27 dias atrás Comentário da postagemde Corpo Docente: ALEXANDRE SOARES ALVES Resposta ao questionamento 02: Professor, pensei no seguinte: um programa para um restaurante que possui 10 mesas e um programa que cadastre a mesa a ser atendida por ordem de chegada. O programa oferece um menu onde pode ser incluído o próximo pedido, excluir o pedido conforme a ordem de chegada, listar os pedidos faltantes e a o proximo pedido a ser artendido. O programa cadastra até 5 atedimentos. Utiliza o conceito de fila sequencial circular. #include <iostream> #include <cstring> #define tamF 5 #define tamM 10 using namespace std; struct fila { int fill[tamF],in, fim, total; }; void enqueue(fila&,int); int dequeue(fila&); int consultaC(fila&); int consultaV(fila&); int main() { int cont, i, op, mesa; fila f; f.in=0; f.fim=0; f.total=0; int a=1; cout<<"\MENU\n\n1 - Incluir pedido\n2 - Excluir pedido atendido\n3 - Listar pedidos faltantes de atendimento\n4 - Listar proximo pedido a ser atendido\n5 - Sair: "; cin>>op; do { switch(op) { case 1: a=consultaC(f); if(a) { cout<<"\n\nDigite mesa a ser atendida: "; cin>>mesa; if(mesa<=0||mesa>tamM) cout<<"\n\nMesa inexistente.\n "; else enqueue(f,mesa); } system( "pause" ); system( "cls" ); break; case 2: a=consultaV(f); if(a) { cout<<"\n\nMesa numero "<<dequeue(f)<<" foi atendida e o pedido foi excuido.\n\n"; 03/11/12 Campus Virtual Estácio 29/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… cout<<"\n\nMesa numero "<<dequeue(f)<<" foi atendida e o pedido foi excuido.\n\n"; system( "pause" ); system( "cls" ); } break; case 3: a=consultaV(f); if(a) { if(f.in<f.fim) { cout<<"\n\nOs pedidos a serem atendidos sao "; for(i=f.in;i<f.fim;i++) cout<<f.fill[i]<<" "; cout<<"\n"; } else { cont=f.in; cout<<"\n\nOs pedidos a serem atendidos sao "; while(cont<tamF) { cout<<f.fill[cont]<<" "; cont++; } i=0; while(i<f.fim) { cout<<f.fill[i]<<" "; i++; } cout<<"\n"; } } system( "pause" ); system( "cls" ); break; case 4: a=consultaV(f); if(a) { cout<<"\n\nO proximo pedido a ser atendido eh a mesa "; if(f.in==0) cout<<f.fill[tamF-1]<<"\n\n\n"; else cout<<f.fill[f.in]<<"\n\n\n"; } system( "pause" ); system( "cls" ); break; case 5: cout<<"\n\nSair.\n\n"; break; default: cout<<"\n\nValor invalido.\n\n"; break; } if(op!=5) { cout<<"\MENU\n\n1 - Incluir pedido\n2 - Excluir pedido atendido\n3 - Listar pedidos faltantes de atendimento\n4 - Listar proximo pedido a ser atendido\n5 - Sair: "; cin>>op; } }while(op!=5); system( "pause" ); return 1; } void enqueue(fila &f, int mesa) { f.fill[f.fim]=mesa; f.fim++; f.total++; if(f.fim==tamF) f.fim=0; } int dequeue(fila &f) { int v; f.in++; v=f.fill[f.in-1]; f.total--; if(f.in==tamF) f.in=0; return v; system( "pause" ); } int consultaC(fila &f) { if(f.total==tamF) { cout<<"\n\nNao ha mesas disponiveis\n"; return 0; } else { return 1; } } system( "pause" ); system( "cls" ); } int consultaV(fila &f) { if(f.total==0) { cout<<"\n\nNao ha pedidos a serem atendidos\n\n"; return 0; } else { return 1; } system( "pause" ); system( "cls" ); } Professor (a) ALEXANDRE SOARES ALVES respondeu a 27 dias atrás Comentário da postagem de TÉRCIO MARTINS DUARTE Oi Tércio, Excelente sua aplicação para usar a estrutura fila sequencial, visto que no problema das reservas de mesa é prioritário a ordem direta do cadastramento. Agor me diga, as estruturas de fila sequencial apresentam o problema de esgotamento de memória, como podemos resolver tal problema. []s Alexandre Aluno (a) TÉRCIO MARTINS DUARTE respondeu a 26 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Professor, a fila circular (conforme usado no programa) resolve o problema de esgotamento de posições, mas em relação ao esgotamento de memória (ou seja, não tendo mais espaços de memória para alocação de nodos da fila), teremos que usar alocação dinâmica, ou seja, durante a execução do programa alocar dinamicamente espaços da memória livre com o o uso do operador new e new[], e consequente desalocação com o operador delete e delete[] e o uso concomitante de ponteiros. Professor (a) ALEXANDRE SOARES ALVES respondeu a 26 dias atrás Comentário da postagem de TÉRCIO MARTINS DUARTE Oi Tércio, Seu programa apresenta a implementação de uma fila circular, pois numa fila circular, após algumas inserções e remoções os indexadores fim e ini, podem levar o que chamamos de esgotamento de memória, já que em cada inserção o indexador fim é incrementado e em cada remoção o indexador ini é incrementado, se um destes chegar ao último campo do vetor base que está servindo de implementação para a fila, esta não poderá receber mais nenhum elemento. A menos que se use algum artifício que faça que após chegar a última posição do vetor, estes indexadores sejam atualizados para a posição inicial, como se esta fosse consecutiva a última, isto que dá o efeito circular. Aliás a solução apresentada por você poderia ser melhorada se usa-se o segunite código: fim=(fim++)%TAM; e ini=(ini++)%TAM; onde TAM é o tamanho do vetor que inplementa a fila : int fila [TAM]; Veja com este recurso sempre que chegar na última posição os indexadores serão atualizados para zero. Mas este não é o único problema das filas sequenciais, aliás um grande problema de qualquer estrutura sequencial, seja fila, pilha ou lista é que estas são implementadas a partir de vetores e estes são estruturas de alocação estática, isto é devem ter seus tamanhos definidos antes da execução ( chamamos em tempo de compilação). neste caso a solução é a criação de estruturas encadeadas onde seus tamanhos são definidos de acordo com a demanda em tempo execução, mas este assunto estudaremos mais adiante. []s Alexandre Aluno (a) TÉRCIO MARTINS DUARTE respondeu a 21 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Olá professor. Gostei da dica sobre a inicialização dos indexadores ini e fin. Obrigado Professor (a) ALEXANDRE SOARES ALVES respondeu a 21 dias atrás Comentário da postagem de TÉRCIO MARTINS DUARTE OI Tercio, Fico contente de você ter aproveitado o fórum para incrementar seu conhecimento. Assim, vocês perceberão que é muito importante as discussões no nosso fórum. Continue participando. []s 03/11/12 Campus Virtual Estácio 31/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… []s Alexandre Aluno (a) RICARDO FELISBINO respondeu a 22 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Montei modelo de fila que você pode escolher se vai inserir um valor pelo inicio ou pelo final e também há opcão de ver o primeiro e o ultimo valor: #include <iostream> #define TAM 5 using namespace std; //variavel global struct queue { float f[TAM]; int inicio,fim; }; void enfileirafinal(queue &fil); void enfileirainicio(queue &fil); void valordofinal(queue &fil); void valordoinicio(queue &fil); int main() { char resp[10]; int op; queue fila; //declara a fila // Inicializa a fila fila.inicio = 0; fila.fim = -1; do { system( "cls" ); cout<<"\nFILA\n\n"; cout<<"\n1- Inserir um valor no final da fila"; cout<<"\n2- Inserir um valor no inicio da fila"; cout<<"\n3- Ver o valor no final da fila"; cout<<"\n4- Ver o valor no inicio da fila"; cout<<"\n5- Sai"; cout<<"\nOpcao: "; cin>>resp; op=atoi(resp); system( "cls" ); switch(op) { case 1: enfileirafinal(fila); break; case 2: enfileirainicio(fila); break; case 3: valordofinal(fila); break; case 4: valordoinicio(fila); break; case 5: cout<<"\nSaindo do programa\n"; break; default: cout<<"\nOPCAO INVALIDA\n"; } cout<<"\n\n";system( "pause" ); }while(op!=5); } void enfileirafinal(queue &fil) { float valor; if (fil.fim == TAM -1) //verificando se a fila está cheia cout<<"\n\n\tATENCAO, Fila cheia\n"; else { cout<<"Digite o valor a ser enfileirado:"; cin>>valor; fil.fim++; //adiciona valor na fila fil.f[fil.fim] = valor; // guarda o valor no final da fila } } void enfileirainicio(queue &fil) { float valor; if (fil.fim == TAM -1) //verificandose a fila está cheia cout<<"\n\n\tATENCAO, Fila cheia\n"; else { cout<<"Digite o valor a ser enfileirado:"; cin>>valor; fil.inicio++; //adiciona valor na fila fil.f[fil.inicio] = valor; // guarda o valor no inicio da fila } } void valordoinicio(queue &fil) { if(fil.inicio > fil.fim) cout<<"\ATENCAO. Fila Vazia\n"; elsa 03/11/12 Campus Virtual Estácio 32/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… cout<<"\nElemento do Inicio da Fila:<<fil.f[fil.inicio]; } void valordofinal(queue &fil) { if(fil.inicio > fil.fim) cout<<"\ATENCAO. Fila Vazia\n"; elsa cout<<"\nElemento do Inicio da Fila:<<fil.f[fil.fim]; } Professor (a) ALEXANDRE SOARES ALVES respondeu a 22 dias atrás Comentário da postagem de RICARDO FELISBINO Oi RICARDO , Uma estrutura de dados tem por finalidade otimizar ou viabilizar a construção e um algoritmo. Assim existem diversas aplicações clássicas que se utilizam das características da estrutura de dados na elaboração de seus algoritmos. Podemos citar no caso de filas por exemplo o uso de fila de processo pelos sistemas operacionais, já que estes devem gerenciar o uso da CPU seguem o algoritmo LIFO, o primeiro a chegar é o primeiro que será atendido para o uso da CPU. Sendo assim gostaria que discutisse a sua aplicação sobre este aspecto. Isto é, qual a vantagem do uso de uma fila na aplicação que apresentou? []s Alexandre Aluno (a) RICARDO FELISBINO respondeu a 21 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Pois com essa aplicação podemos decidir com a prioridade da informação e direciona-la para que extremidade devemos inserir, como você falou, no exemplo da CPU será seguido a ordem da fila, mas se eu tiver uma informação mais importante e quizer inserir no inicio ou uma informação sem prioridade, com essa aplicação podemos inserir no final ou no inicio da fila, alem disso este código tambem permite que possa ser visualizado o valor mas relevante (inicio) ou o valor menos relevante (final). Professor (a) ALEXANDRE SOARES ALVES respondeu a 21 dias atrás Comentário da postagem de RICARDO FELISBINO Oi Ricardo, Estou vendo que conseguiu entender bemo conceito de fila e já está inclusive desenvolvenfo variações de estruturas de dado, basado nas estruturas que estudamos, Parabéns e continue participando de nosso fórum. []s Alexandre Aluno (a) RICARDO FELISBINO respondeu a 17 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Estou usando o programa "Dev-C++" para execultar e testar os códigos você sabe me informar se este programa é o adequado para este tipo de programação ou se exite outro? Algumas vesez ocorre erro no código e ele não sabe o que hove apenas informa que tem erro. Professor (a) ALEXANDRE SOARES ALVES respondeu a 16 dias atrás Comentário da postagem de RICARDO FELISBINO Oi Ricardo, Existem vários IDEs para desenvolvimento de programas em C++, mas os mais famosos em desenvolvimento são o Eclipse e o Visual C++, gosto muito do Visual, sugiro que experimente existe versãoe express que são grátis. []s Alexandre Aluno (a) DANILO CHIQUETTI respondeu a 19 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Boa noite Professor e colegas, minha aplicação é baseada em uma "vitrola", onde a pessoa digita o código da musica que quer ouvir, e aguarda as outras musicas que estão na fila tocar. Utilizei o código de exemplo da aula 7, modificando algumas coisas. #include <iostream> #include <cstdlib> #define TAM 10 using namespace std; //variavel global struct queue 03/11/12 Campus Virtual Estácio 33/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… struct queue { float f[TAM]; int inicio,fim; }; //declaração de métodos void addMusica(queue &fil); void excMusica(queue &fil); void primMusica(queue &fil); void filaMusicas(queue &fil); int main() { char resp[10]; int op; queue fila; //Inicializa a fila fila.inicio = 0; fila.fim = -1; do { system( "cls" ); cout<<"\nVitrola Dance - Adicione sua musica e aguarde ela tocar!\n\n"; cout<<"\n1- Inserir uma musica"; cout<<"\n2- Remover uma musica"; cout<<"\n3- Mostrar o nome da musica que esta tocando"; cout<<"\n4- Mostrar situacao da fila de espera"; cout<<"\n5- Sair"; cout<<"\nOpcao: "; cin>>resp;op=atoi(resp); system( "cls" ); switch(op) { case 1: addMusica(fila); break; case 2: excMusica(fila); break; case 3: primMusica(fila); break; case 4: filaMusicas(fila); break; case 5: cout<<"\nObrigado por utilizar a Vitrola dance\n"; break; default: cout<<"\nOPCAO INVALIDA\n"; } cout<<"\n\n";system( "pause" ); }while(op!=5); } void addMusica(queue &fil) { float valor; if (fil.fim == TAM - 1) // testando se a fila está cheia cout<<"\nATENCAO. vitrola cheia!\n"; else { cout<<"Digite o codigo da musica a ser colocado na fila de espera: "; cin>>valor; fil.fim++; //atualiza o final da fila fil.f[fil.fim] = valor; //guarda o valor no final da fila } } void excMusica(queue &fil) { if (fil.inicio > fil.fim) // testando se a fila está vazia cout<<"\nVitrola vazia...\n"; else { cout<<"\nCod. musica removida: "<<fil.f[fil.inicio]; // exibe o valor "removido" fil.inicio++; //atualiza o início da fila } } void primMusica(queue &fil) { if(fil.inicio > fil.fim) cout<<"\nVitrola vazia...\n"; else cout<<"\nCod. da musica que esta tocando: "<<fil.f[fil.inicio]; } void filaMusicas(queue &fil) { if(fil.inicio > fil.fim) cout<<"\nVitrola vazia...\n"; else { cout<<"\nTotal de musicas na vitrola: "<<fil.fim+1<<"\n"; cout<<"\n\nEspaco disponivel na vitrola: "<<TAM-(fil.fim+1)<<"\n"; } } 03/11/12 Campus Virtual Estácio 34/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… } Professor (a) ALEXANDRE SOARES ALVES respondeu a 19 dias atrás Comentário da postagem de DANILO CHIQUETTI Ótimo Danilo, Agora gostaria que discutisse, de que modo a estrutura de dados escolhida contribui para que sua aplicação execute a principal tarefa. []s Alexandre Aluno (a) DANILO CHIQUETTI respondeu a 18 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES comentando a aplicação, posso dizer que a estrutura de Fila é ideal porque sempre que for inserida uma musica, sempre terá uma primeira da fila(que estará tocando), e o restante das musicas estarão em espera, enfileiradas por ordem de inserção, sendo que as pessoas que inseriram a musica primeiro irão ouví-las primeiro. Professor (a) ALEXANDRE SOARES ALVES respondeu a 18 dias atrás Comentário da postagem de DANILO CHIQUETTI Oi Danilo, Isto mesmo, vejo que conseguiu entender bem para que serve as estruturas, no caso de sua aplicação, você aproveita a caracterísca FIFO das filas para atender os pedidos em uma ordem direta, que neste caso é o certo. []s Alexandre Aluno (a) JOSE CANINDE DA SILVA respondeu a 16 dias atrás Comentário da postagem de Corpo Docente: ALEXANDRE SOARES ALVES Profº este exemplo de fila está baseado no sistema de impressão de avisos de corte da empresa que trabalho,Caern, não sei se esta correto, mas se não estiver vou tentar acertar porque estou sentindo dificuldade no desenvolvimento desses trabalhos #include<iostream> #define TAM[30] usingnamespace std;/ //variavel global struct queue { float f[TAM]; int inicio, fim; }; void enfileira(queue&fil); void desenfileira(queue&fil); void elemPromeiro(queue&fil); void situacaofila(queue&fil); int main ( ) { charresp[10]; int op; queue fila; //declara fila //inicializa fila fila.inicio=0; fila.fim=-1; do { system( "cls" ); system( "color" ); cout<<"\nFila(FIFO-First In-Firs tOut)\n\n"; cout<<"\n1insere valor na fila"; cout<<"\n2Remove valor na fila"; 03/11/12 Campus Virtual Estácio 35/52estacio.webaula.com.br/aluno/forum/comentarios_print.asp?CodTopico=401764&CodTurma=71115… cout<<"\n3Mostra elem inicio fila"; cout<<"\n4Mostra sit da fila"; cout<<"\n5-sai"; cout<<"\Opcao:";
Compartilhar