kmash
(usa Ubuntu)
Enviado em 14/06/2011 - 17:27h
Gente, eu to fulo de raiva que nao consigo resolver esse erro do ALÉM.
estou já a 4 dias agarrado e vou compartilhar meu codigo de pilha encadeada pra voces e peço ajuda com a logica.
O problema é o seguinte... é a implementação de um mini mundo dos blocos...onde terao um certo numero de pilhas com um bloco cada uma, e tem que ler um arquivo com comandos em texto para falar oq vai fazer o prog...exemplo: "move 3 acima 2" ele vai tirar o bloco dois e colocar imediatamente depois do 3...
e assim vai
o arquivo txt seria assim:
5 //numero de pilhas
mover 3 acima 0
move 2 topo 4
empilhar 4 acima 0
empilhar 1 topo 3
sair
Ele basicamente começa dando erro ao abrir o arquivo aqui no DEV, mas quando fui pro visual studio, ele compila acha o arquivo mas da um erro na primeira função init();
No dev onde coloco o arquivo pra ele ler padrao em?
É estranho por que pelos intelisense os parametros parecem normais entao é erro de logica (porisso gosto de banco de dados rsrs)
O codigo é enorme entao to mandando aqui só o Main e a estrutura, se precisarem de alguma funçao só falar..(sim pequei na formatação)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
# define stacksize 27
struct tnodo{
int item;
struct tnodo *prox;
};
struct stack{
struct tnodo *top;
};
//definicao das funcoes
char menu();
//exibe um menu de opcaoes e retorna a opcao escolhida
void sair(struct stack *pilha,int tam);
// fecha o programa
void mover_acima(struct stack *pilha,int tam,int blocoA,int blocoB);
//move o bloco a para cima do bloco b retornando eventuais blocos que já estiverem sobre a ou b para as suas posições originais.
void mover_topo(struct stack *pilha,int tam,int blocoA,int blocoB);
//coloca o bloco a no topo do monte onde está o bloco b retornando eventuais blocos que já estiverem sobre a às suas posições originais.
void empilhar_topo(struct stack *pilha,int tam,int blocoA,int blocoB);
//coloca o bloco a juntamente com todos os blocos que estiverem sobre ele no topo do monte onde está o bloco b.
void empilhar_acima(struct stack *pilha,int tam,int blocoA,int blocoB);
//coloca o bloco a juntamente com todos os blocos que estiverem sobre ele em cima do bloco b, retornando eventuais blocos que já estiverem sobre b as suas posições originais.
int stacktop (struct stack *ps);
//retorna o topo de uma pilha
int pop (struct stack *ps);
// desempilha um bloco e retonra o valor dele
int empty (struct stack *ps);
// verifica se a pilha esta vazia
void push (struct stack *ps,int x);
// insere um bloco em uma pilha
int localiza_pilha(struct stack *pilha,int tam,int a);
//localiza um bloca dentre todas as pilha
int stacktop2 (struct stack *ps,int i);
void alimenta_pilha(struct stack *pilha,int tam);
//preenche uma pilha com os blocos que o usuario informar
void init (struct stack *p);
//////////////////////////////////////////////////////////////////////////////////////////
int main()
{
//abre main
int tam,p1,p2;
//declaração de variaveis
char comando1[8], comando2[8],op;
//declaração de variaveis
FILE *arquivo;
//declaração de ponteiro de arquivo
//o ponteiro arquivo recebe o endereço do arquivo para leitura
if((arquivo = fopen("Entrada.txt","r")) == NULL){//testa se o arquivo existe
printf("Erro ao abrir o arquivo!\nArquivo nao encontrado!\n");
//exibe mensagem de erro ao abrir arquivo
system("pause");
//aguarda entrada de teclado
exit(1);
//para o programa imediatamente e fecha o mesmo
}//fecha o teste de arquivo
fscanf(arquivo,"%d",&tam);
//le a quantidade de pilha que foi foi definido na posição 1 do arquivo
tam--;
//ajustando o tamanho da pilha com a qtd informada no arquivo, pois o programa considera a posição zero
struct stack pilha[stacksize];
//define um vetor de pilhas com tamanho igual a quantidade de pilhas
for (int i=0;i<=tam;i++)
//repete a quantidade de vezes igual a variavel tam
init(&pilha[i]);
//insere o valor -1 no topo de cada pilha
alimenta_pilha(pilha,tam);//chama a funcao para alimentar as pilhas com um valor cada
printf("As pilhas foram carregadas com sucesso com um valor cada!\n");
//exibe mensagem ao usuario informando a quantidade de pilhas e que elas receberam valores.
system("pause");
do{
//loop de menu, o usuario so fecha o programa pela funcao sair
op=menu();
//op recebe o retorno da funcao menu();
switch (op){
//testa o conteudo da variavel op
case 1://caso 1
do{//repete ate ler todas as linhas do arquivo
fscanf(arquivo,"%s",&comando1);
//le o primeiro comando da linha do arquivo
if(strcmp(comando1,"sair")==0)
{//abre if
system("cls");
printf("Os comandos foram executados com sucesso!");
system("pause");
break;
}//fecha if(strcmp(comando1,"sair")==0)
else{//caso o primeiro comando não seja encontrar
fscanf(arquivo,"%d %s %d",&p1,&comando2,&p2);
//lê o restante dos comandos (a primeira posição o segundo comando e a segunda posição)
if (strcmp(comando1,"empilhar")==0){
//se o primeiro comando for igual à empilhar
if (strcmp(comando2,"topo")==0){
//se o segundo comando for igual a topo
empilhar_topo(pilha,tam,p1,p2);
}//fecha if (strcmp(comando2,"topo")==0)
else//senão
if (strcmp(comando2,"acima")==0){//se o segundo comando for igual a acima
empilhar_acima(pilha,tam,p1,p2);
}//fecha if (strcmp(comando2,"acima")==0)
}//fecha if (strcmp(comando1,"empilhar")==0)
if (strcmp(comando1,"mover")==0){
//se o primeiro comando for igual a mover
if (strcmp(comando2,"topo")==0){
//se o segundo comando for igual a topo
mover_topo(pilha,tam,p1,p2);
}//fecha if (strcmp(comando2,"topo")==0)
else//senão
if (strcmp(comando2,"acima")==0){
//se o segundo comando for igual a acima
mover_acima(pilha,tam,p1,p2);
}//fecha if (strcmp(comando2,"acima")==0)
}//fecha if (strcmp(comando1,"mover")==0)
}//fecha else do if (strcmp(comando1,"encontrar")==0)
}//fecha do do case 1 que lê todas as linha do arquivo
while(feof(arquivo)==0);//Verifica se o arquivo chegou ao fim
break;//para a execução do switch
case 5: //caso o usuario selecionar a opção 5 do menu
sair(pilha,tam);//chama a função sair
break;//para a execução do switch
}//fecha switch (op)
}//fecha loop de menu
while(op==op);
//causa uma condinção eternamente verdadeira para obrigar o progrma permanecer em execução até que seja selecionada a opção sair
fclose(arquivo);
return(0);}
//////////////////////////////////////////////////////////////////////////////////////////