Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

krad99

Desafio aos programadores avancados C++

Recommended Posts

Segue o codigo abaixo instavel, ninguem sabe por que, 3 professores da minha faculdade olharam e nao sabem por que se alguem conseguir resolver eu vou fik bastante agredecido.funciona e nao funciona...ou seja funciona qdo quer...esse programa parte do principio q um aviao sai de recife e vai para algum canto...porem você deve cadastrar um passageiro e uma poltrona mas antes de inserir alguem na poltrona você deve checar se a poltrona jah esta ocupada...logo qdo eu coloco um if para o resultado da poltrona isso qdo pega por q as vezes ele nem roda[abre e fecha]...enfim já tentei de tdo mas nao consigo nda =p...totamente instavel o programa...

 

CODE
#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

#define tagpoa "<poltrona>"

#define tagpof "</poltrona>"

#define tagpaa "<passageiro>"

#define tagpaf "</passageiro>"

int continuar;

 

int flag;

 

FILE *parquivo; //ponteiro para arquivo

void abre_arquivo()

{ if ((parquivo = fopen("aviao.txt","r+b"))== NULL)

parquivo = fopen("aviao.txt","w+b");

}

int procura(char p[20]){

int i,x;

char textoArquivo[100];

char linha;

char val[10];

char poltrona[2];

char aux[1];

char aux2[2];

x = 10;

for(i = 0; !feof(parquivo);i++){ //incrementa 'i' enquando não for

fgets(textoArquivo, 101, parquivo); //pega uma string de 100 caracteres

 

while(textoArquivo[x] != '<'){

fflush(stdin);

aux[1] = textoArquivo[x];

strcat(poltrona,aux);

strcat(aux2,poltrona);

++x;

 

 

}

 

if(strstr(aux2,p)){

return 1;

 

}

continue; //volta ao inicio do loop sem executar o resto

}

 

return 0;

}

 

 

void cadastrar(){

int ie;

char entrada[30];

char entrada2[30];

printf("\n Cadastrar Novo Aluno\n\n");

printf("\n\tNome do Aluno.....: ");

gets(entrada);

printf("\n\tNome do Aluno.....: ");

gets(entrada2);

ie = procura(entrada2);

printf("%d",ie);

 

char aux_tagpoa[60] = tagpoa;

char aux_tagpaa[60] = tagpaa;

strcat(aux_tagpoa,entrada2);

strcat(aux_tagpaa,entrada);

strcat(aux_tagpoa,aux_tagpaa);

strcat(aux_tagpoa,tagpaf);

strcat(aux_tagpoa,tagpof);

char *xml = aux_tagpoa;

printf("%-20s",xml);

fseek(parquivo,0,SEEK_END);

fwrite(xml,strlen(xml),1, parquivo);

getch();}

 

 

 

 

main(){

abre_arquivo();

cadastrar();

getch();

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peça para seus professores se aposentarem!

 

Erros:

 

char poltrona[2];
Tu tá entupindo a string de caracteres com strcat. Se ficar com dois caracteres, depois da segunda passada no loop de leitura, já estourou e tchau.

Tente assim:

char poltrona[100];
aux2 também:

char aux2[100];
Aliás, você tem que inicializar as strings, senão vai pegar lixo depois:

Aliás, quanto ao aux[1], cadê o espaço pro caractere nulo???

char poltrona[100] = "";
char aux[2] = " ";
char aux2[100] = "";

 

for(i = 0; !feof(parquivo);i++)
while(!feof(parquivo)) nunca faça isso!!!

feof só retorna que acho o EOF DEPOIS que já leu o dito cujo!!!

for(i = 0;;i++)

fgets(textoArquivo, 101, parquivo); //pega uma string de 100 caracteres
Além de fazermos uma comparação com NULL para determinar o fim do loop nessa parte, ainda tem um problema: lê só 99 caracteres!!!!! O último tem que ser o caractere null que termina a string!!

if(fgets(textoArquivo, 100, parquivo) == NULL) //PEGA 99!!!!!!! O ULTIMO TEM QUE SER USADO COMO CARACTERE NULL!!!!!
{
	break;
}

while(textoArquivo[x] != '<')
{
fflush(stdin);
aux[1] = textoArquivo[x];
strcat(poltrona,aux);
strcat(aux2,poltrona);
++x;
}

Pra que fflush(stdin)?

aux[1] não, array começa em 0!!!!

 

while(textoArquivo[x] != '<')
{
	 aux[0] = textoArquivo[x];
	 strcat(poltrona, aux);
	 strcat(aux2,poltrona);
	 ++x;
}

 

if ((parquivo = fopen("aviao.txt","r+b"))== NULL)
parquivo = fopen("aviao.txt","w+b");
Você não está escrevendo dados binários porque você abre os arquivos com b?

Não precisa insistir no arquivo, se der NULL basta retornar a função e nas outras verificar se o arquivo foi carregado ou não.

if ((parquivo = fopen("aviao.txt","r+b")) == NULL) return;

gets(entrada);
gets(entrada2);
Não use gets, use fgets ao invés disso, é mais confiável:

fgets(entrada, 30, stdin);
gets(entrada2, 30, stdin);

Acho que isso é tudo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

http://forum.imasters.com.br/public/style_emoticons/default/clap.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif vlw cara...assim q eu sair do trabalho eu vo tentar...eu nao tenho mtos conhecimentos em c nao infelizmente...ai nem meus professores souberam ajudar mas você ajudou mto...faz mto sentido oq você falou...alias faz tdo sentido...mto obrigado

 

tenho so mais duvidasinha?

for(i = 0;;i++)

esse `for` vai rodar ateh o fim do arquivo pois ele vai rodar ateh q a linha seja nula nao eh isso?

 

for(i = 0; !feof(parquivo);i++)

while(!feof(parquivo)) nunca faça isso!!!

for(i = 0;;i++)

fgets(textoArquivo, 101, parquivo); //pega uma string de 100 caracteres

Além de fazermos uma comparação com NULL para determinar o fim do loop nessa parte, ainda tem um problema: lê só 99 caracteres!!!!! O último tem que ser o caractere null que termina a string!!
CODE
if(fgets(textoArquivo, 100, parquivo) == NULL) //PEGA 99!!!!!!! O ULTIMO TEM QUE SER USADO COMO CARACTERE NULL!!!!!
{
	break;
}

MTO OBRIGADO MSMO CARA VOCE ME SALVOU eu vo dizer pra eles se aposentarem skUHSUK

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso mesmo, o loop não tem condição de parada, porém tem no fgets ali um break pra quando ler EOF, parar! (o break sai do loop)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara só por curiosidade, qual a faculdade que você faz e onde :)

só pra saber, fiquei com medo dos seus professores, isso é preocupante, você como aluno tem todo direito de cometer esses e outros erros que por ventura venha a comenter, mas agora professores universitários não de depararem com erros como esse, isso sim é preocupante...

 

cara abraços e tomara que seu programa rode depois das dicas do nosso colega :)

abraços

 

Marcio

Compartilhar este post


Link para o post
Compartilhar em outros sites

assim num vo falar q é 'facil' fazer esse algoritmo, + seus professores naum sabarem explicar certos tipos de coisas basicas como um loop sem condição de parada ow algo assim é d+!

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu definitivamente nao tenho talento pra c++...preciso de ajuda mais uma vez...talvez seja algo pikeno...e eu nao estou vendo pq tow de cabeça quente...enfim desde jah eu pesso desculpas por gastar o tempo de vcs e vamo ao problema...ele roda tdo certo agora o char vem limpo....mas o char P q eh o parametro da funcao vai sujo tem mais como eu tow montando nao taw passando a linha...se tiver mais de 1 registro no arquivo o programa indoida..enfim se puderem me ajudar fikrei mto grato novamente...segue o codigo:

 

 

CODE
#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

#define tagpoa "<poltrona>"

#define tagpof "</poltrona>"

#define tagpaa "<passageiro>"

#define tagpaf "</passageiro>"

int continuar;

 

int flag;

 

FILE *parquivo; //ponteiro para arquivo

void abre_arquivo()

{ if ((parquivo = fopen("aviao.txt","r+b"))== NULL)

parquivo = fopen("aviao.txt","w+b");

}

int procura(char p[20]){

int i,x;

char textoArquivo[100];

 

 

 

char poltrona[100] = "";

char aux[2] = " ";

char aux2[100] = "";

x = 10;

 

for(i = 0;;i++){

 

if(fgets(textoArquivo, 100, parquivo) == NULL){

break;

}else{

 

fgets(textoArquivo, 100, parquivo); //pega uma string de 100 caracteres

while(textoArquivo[x] != '<'){

 

puts(textoArquivo);

aux[0] = textoArquivo[x];

strcat(poltrona,aux);

++x;

}

if(strstr(poltrona,p)){

return 1;

}else{

continue;

}

 

 

 

}

return 0;

}

 

}

 

 

 

 

void cadastrar(){

int ie;

char entrada[30];

char entrada2[30];

printf("\n Cadastrar Novo Aluno\n\n");

printf("\n\tNome do Aluno.....: ");

fgets(entrada, 30, stdin);

printf("\n\tNome do Aluno.....: ");

fgets(entrada2, 30, stdin);

ie = procura(entrada2);

printf("%d",ie);

 

 

char aux_tagpoa[60] = tagpoa;

char aux_tagpaa[60] = tagpaa;

strcat(aux_tagpoa,entrada2);

strcat(aux_tagpaa,entrada);

strcat(aux_tagpoa,aux_tagpaa);

strcat(aux_tagpoa,tagpaf);

strcat(aux_tagpoa,tagpof);

char *xml = aux_tagpoa;

//printf("%-20s",xml);

fseek(parquivo,0,SEEK_END);

fwrite(xml,strlen(xml),1, parquivo);

getch();}

 

 

 

 

main(){

abre_arquivo();

cadastrar();

getch();

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.