Lógica, perguntado por evertonapolinario3l, 9 meses atrás

Todo dispositivo digital, internamente, trabalha com dados formatados em estruturas específicas para resolver problemas particulares. Na vida profissional de um desenvolvedor, frequentemente, ele irá se deparar com situações nas quais é preciso identificar qual estrutura de dados é a mais adequada para determinada função.
Tomando por base as pilhas, pode-se realizar diversas operações para solucionar problemas. Uma dessas operações é a inversão dos dados de uma lista. Para se inverter a ordem dos dados de uma fila, vetor ou arquivo, basta desempilhar os seus valores e empilhá-los na ordem em que eles foram desempilhados. Ou seja, no mesmo momento em que se desempilha um elemento, deve-se empilha-lo em um novo local para que, ao final, repetindo esse processo, todos os elementos se invertam.
INSTRUÇÕES:
No caso das pilhas, as prerrogativas são as seguintes:
1 – A inserção de novos elementos é feita sempre ao final da pilha.
2 – A remoção de elementos também é feita somente no fim da pilha.
Assim, dizemos que a pilha opera ao estilho Last In, First Out (LIFO), ou seja, o último a entrar é o primeiro a sair.

Você deverá desenvolver um programa em Linguagem C que execute os seguintes passos:
1 - Preencher uma pilha com os números do seu R.A.;
2 - Imprimir a pilha na ordem em que os elementos foram inseridos (iniciando pela base, e finalizando pelo topo);
3 – Desempilhar todos os elementos, inserindo-os em uma segunda estrutura de dados do tipo pilha;
4 - Imprimir a nova pilha na ordem em que os elementos foram inseridos (iniciando pela base, e finalizando pelo topo).
Observação importante: seu código-fonte deve declara duas estruturas de dados tipo pilha distintas. A primeira impressão dos dados que seu programa deve fazer está relacionada ao conteúdo da primeira pilha (itens 1 e 2 do passo a passo apresentado acima). Já a segunda impressão dos dados que seu programa fará, está relacionada aos dados que foram inseridos na segunda pilha.
O resultado da execução do seu algoritmo, supondo que seu R.A. é igual ao número 12345678, deverá ser algo parecido com o seguinte:



Método de entrega: enviar o código fonte (arquivo.c) nomeando o arquivo com seu nome completo. Exemplo: Pietro_Martins_de_Oliveira.c

Soluções para a tarefa

Respondido por DrNet
11

//Código abaixo em DEV C++.

// A formatação aqui fica feia mas é só colar no DEV C que fica bom.

// 18/05/2020

//-----------------------------

// CRIA A ESTRUTURA DA PILHA

// ---------------------------  

struct pilha {

  int  elemento[101];  // vetor que irá armazenar os elementos da pilha

  int  elementos;  // indicador do tamanho da pilha  

};

//----------------------------

// DECLARA AS FUNÇÕES

// ---------------------------

bool empilha(int valor,pilha *mystack );   // insere elementos na pilha

int desempilha(struct pilha *mystack );   // retira elemento da pilha

void imprimepilha(pilha *mystack );    // imprime a pilha

//----------------------------

// INICIO DO PROGRAMA

// ---------------------------

int main( ) {

   pilha pilha1;        // Declara a primeira pilha

   pilha pilha2;        // Declara a segunda pilha

   pilha1.elementos = pilha2.elementos = 0; // inicializa as pilhas.

   

// ADICIONA ELEMENTOS À PILHA 1 - Para RA 12345678

empilha(1,&pilha1);   // Chama a função empilha

empilha(2,&pilha1);   // o primeiro argumento é o numero a adicionar

   empilha(3,&pilha1);   // o segundo argumento é o endereço da pilha

   empilha(4,&pilha1);

   empilha(5,&pilha1);

   empilha(6,&pilha1);

   empilha(7,&pilha1);

   empilha(8,&pilha1);

imprimepilha(&pilha1);  // Chama a função imprimepilha. Argumento é o endereço da pilha

 

// DESEMPILHA ELEMENTOS DA PILHA 1, PASSANDO PARA PILHA 2

empilha(desempilha(&pilha1),&pilha2);  // desempilha da pilha 1, e empilha na pilha 2

empilha(desempilha(&pilha1),&pilha2); // o primeiro argumento é a função desempilha, que

empilha(desempilha(&pilha1),&pilha2); // desempilha o numero da pilha 1

empilha(desempilha(&pilha1),&pilha2); // o segundo argumento é o endereço da pilha 2

empilha(desempilha(&pilha1),&pilha2); // seria possivel fazer isso usando uma variavel

empilha(desempilha(&pilha1),&pilha2); // intermediaria para armazenar o valor desempilhado

empilha(desempilha(&pilha1),&pilha2); // da pilha1 antes de empilhar na pilha2

empilha(desempilha(&pilha1),&pilha2); //  

   imprimepilha(&pilha2);   // Chama a função imprimepilha. Argumento é o endereço da pilha    

return 0;

}

//----------------------------

// LISTA DE FUNÇÕES

// ---------------------------

//--------------------------------------------

// FUNÇÃO EMPILHA - ADICIONA NUMERO A PILHA

// -------------------------------------------

bool empilha(int valor,pilha *mystack) { // retorna TRUE se adicionou, e FALSE se erro

 

if (mystack->elementos==100) // se já estiver no tamanho máximo da pilha: 100 elementos

 {

  printf("Tamanho máximo da pilha excedido.\n"); // stack overflow

  return false; // Retorna mensagem de erro ao chamador da função

 }

mystack->elemento[mystack->elementos]=valor; // adiciona o valor ao vetor da pilha

mystack->elementos++;      //  atualiza numero de elementos  

   //printf( "Elementos : %d\n", mystack->elementos);

   //printf( "Elemento incluido: %d\n\n", valor);

   return true; // retorna mensagem de sucesso  

}

//----------------------------------------------

// FUNÇÃO DESEMPILHA - RETIRA NUMERO A PILHA

// ---------------------------------------------

int desempilha(pilha *mystack ) { // retorna o valor retirado da pilha e -1 se erro.  

if (mystack->elementos==0) // pilha vazia  

 {

  printf("Nao ha elementos na pilha.\n"); // pilha zerada

  return -1; // Retorna mensagem de erro ao chamador da função

 }

mystack->elementos--; //  atualiza numero de elementos. Nao há necessidade de editar o vetor.

   //printf( "Elementos : %d\n", mystack->elementos);

   return mystack->elemento[mystack->elementos]; // retorna elemento desempilhado.  

}

// -----------------------------------------------------

// FUNÇÃO IMPRIMEPILHA - para gerar o output da tarefa.  

// -----------------------------------------------------

void imprimepilha(pilha *mystack )

{      

if (mystack->elementos==0) // pilha vazia  

 {

  printf("Nao ha elementos na pilha.\n"); // pilha zerada, mensagem de erro

  return;         // retorna a main

 }

for (int i=0;i<mystack->elementos;i++)  // Estrutura de repetição, corre os elementos do vetor

 printf( "%d ", mystack->elemento[i]); // imprime o numero, e segue um espaço " ".

   printf("\n");        // enter no final

return;          // retorna a main

}

Anexos:

mateusaramaki: aqui tambem só da erro. alguem ajuda ae por favor
souzacapucci: alguem conseguiu resolver?
alexvulf: O meu deu Erro stray\240' in program
antonioactj: ele roda, mas sem as pilhas...tem algo de errado neste codigo...
alexvulf: ta dificil fazer isso funcionar
JohnJohn2001: Ele roda se estiver em .cpp , mas o exercicio pede em .c
JohnJohn2001: Em .c dá o erro stray\240
claudio933: ta dificil essa atividade
claudio933: alguem da uma luz
scofieldmax50: Ele roda se estiver em .cpp , mas o exercício pede em .c
Quem conseguiu .c?
Respondido por alexvulf
7

Resposta:

#include <stdio.h>

#include <stdlib.h>

typedef struct {

int elemento[101];

int elementos;

}pilha;

int empilha (int valor, pilha *p);  

int desempilha (pilha *p);  

void imprimepilha(pilha *p);  

int main( ) {

pilha pilha1;  

pilha pilha2;  

pilha1.elementos = pilha2.elementos = 0;

empilha(1,&pilha1);  

empilha(2,&pilha1);

empilha(3,&pilha1);

empilha(4,&pilha1);

empilha(5,&pilha1);

empilha(6,&pilha1);

empilha(7,&pilha1);

empilha(8,&pilha1);

imprimepilha(&pilha1);    

empilha(desempilha(&pilha1),&pilha2);

empilha(desempilha(&pilha1),&pilha2);  

empilha(desempilha(&pilha1),&pilha2);  

empilha(desempilha(&pilha1),&pilha2);  

empilha(desempilha(&pilha1),&pilha2);  

empilha(desempilha(&pilha1),&pilha2);

empilha(desempilha(&pilha1),&pilha2);  

empilha(desempilha(&pilha1),&pilha2);

imprimepilha(&pilha2);

return 0;

}

int empilha(int valor,pilha *p) {  

if (p->elementos==100)

{

printf("Tamanho máximo da pilha excedido.\n");  

return 1;

}

p->elemento[p->elementos]=valor;  

p->elementos++;

return 0;

}

int desempilha (pilha *p) {

if (p->elementos==0)

{

printf("Nao ha elementos na pilha.\n");  

return -1;  

}

p->elementos--;

return p->elemento[p->elementos];

}

void imprimepilha (pilha *p)

{

if (p->elementos == 0)  

{

printf("Nao ha elementos na pilha.\n");  

return;

}

for (int i=0; i<p->elementos; i++)

printf( "%d ", p->elemento[i]);  

printf("\n");  

return;

}

Explicação:

se der esse erro [Error] 'for' loop initial declarations are only allowed in C99 or C11 mode

faça isso

Configurar o Dev C++ para usar o padrão ansi iso c99 (recomendado para evitar mais problemas de compatibilidade com os exercícios do livro).

– na barra de ferramentas do dev c++ clique em Ferramentas, depois clique em Opções do Compilador , vai abrir uma janelinha, clique na aba Geração de Código, aonde diz Padrão da Linguagem (-std) selecione para ISO C99 e clique em Ok, agora seu código vai funcionar, e não vai aparecer mais essa mensagem de erro.


jhonatas456: Continua [Error] stray '\240' in program
jhonatas456: Na verdade o erro era gerado devido aos espaços que havia ao final do ';' Removi os espaços no final e deu certo. Obrigado!
sannydonks: espaços no ponto e virgula ? onde exatamente? ainda nao estou conseguindo
mateusaramaki: tambem tirei os espaços e ainda da erro. poderia mandar o seu aqui ?
diegomaizenamapamj0y: funcionou aqui !!onde coloco meu RA ?
jhonatas456: Nao consigo adicionar aqui. É muito grande.
Perguntas interessantes