Ir para conteúdo

POWERED BY:

Arquivado

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

Janiel Lima

Programa em C

Recommended Posts

Olá, sou novo por aqui. Estou com um problema, espero que possam me ajudar.

Tenho que implementar um programa para efetuar a reserva de passagens aéreas de uma determinada companhia

utilizando as boas práticas de programação vistas até o momento. Dentre elas são explicitamente
obrigatórias:
• identação do código
• divisão do projeto por arquivos
• utilização de cabeçalho
• criação de registro e tipo para representar entidades complexas
• modularização do programa (criação de funções)
• utilização de vetor para representar varias variáveis do mesmo tipo
• persistência dos dados em arquivo
Requisitos do programa:
• A empresa deve poder cadastrar até 10 aviões. Cada avião possui um código para identificá-lo e a
quantidade de lugares para passageiros. Cada reserva possui o código do avião e o nome do
passageiro.
• Deve ser apresentado o seguinte Menu
MENU
1 – Cadastrar novo avião
2 – Reservar Passagem
3 – Consultar por avião
4 – Consultar por passageiro
5 - Sair
◦ O menu deve ficar em “loop” até que que o usuário escolha a opção 5
◦ Na opção 1, deve-se solicitar um código e a quantidade de vagas para cadastrar um novo avião.
◦ Na opção 2, deve-se solicitar o código do avião e o nome do passageiro para cadastrar uma nova
reserva.
▪ Verificar se o código do avião é de um avião existente (se o avião é válido). Se for verificar,
ainda, se o avião ainda possui vagas e, em caso posito, cadastre a reserva.
• Obs.: controle o número de vagas disponíveis.
◦ Na opção 3 deve-se olicitar o código do avião e exibir a quantidade de vagas disponíveis e todas
as suas reservas.
◦ Na opção 4 deve-se ser solicitado o nome do passageiro e exibido todas as suas reservas.
◦ Na opção 5 os dados do programa devem ser persistidos em disco e o programa encerrado."
Bom, eu consegui fazer boa parte do programa, porém o que falta é o que ainda não sei.
Alguém pode fazê-lo funcionar?
Segue os códigos:
//main:
 

#include <stdio.h>
#include <stdlib.h>
#include "fun.h"
void cadastrar();
void reservar();
void consultar();
void consultarpass();
 
void menu();
main() {
menu();
}

 
//cabeçalho:
 
 
void cadastrar();
void reservar();
void consultar();
void consultarpass();
void menu();
int escolha(int tcl);
 
 
typedef struct flyer celaviao;
typedef struct pass celreserva;
 
struct pass{
   int cdaviao;
   char nome[20];
};
 
struct flyer{
int cdaviao;
int quant;
celreserva reserva[15];
}aviao[10];

//arquivo1:

#include <locale.h>
#include <stdio.h>
#include "fun.h"
 
 void cadastrar() {
    setlocale (LC_ALL,"");
    int i=0, verif;
    if(i<10){
       printf("\nCadastro de avião");
       printf("\nInsira o código:\n");
       scanf("%i",&verif);
       if(verif==aviao[i].cdaviao){
          printf("\nAvião existente"); cadastrar();
       } else
         aviao[i].cdaviao = verif;

   
       printf("\nInforme a quantidade de vagas\n");
       scanf("%i",&aviao[i].quant);
       printf("\nAvião cadastrado!");
       i++;
       system("pause");
    }else
      printf("\nNúmero máximo de aviões alcançado!");
 }
 
  void reservar() {
     setlocale (LC_ALL,""); 
     int cod, i=0, j=0;
     printf("\nInsira o código do avião:");
     scanf("%i",&cod);
     if(j<=10) {
        if(cod==aviao[j].cdaviao) {
           aviao[j].reserva[i].cdaviao = aviao[j].cdaviao ;
           printf("\nInsira o nome do passageiro:");
           scanf("%s",aviao[j].reserva[i].nome);
           printf("\n Reserva feita com sucesso");
           i++;
           aviao[j].quant --;
           system("pause");
     } else
j++;
}
 }
 
void consultar(){
  setlocale (LC_ALL,"");
  int cod, j=0, i=0, k=0, num;
  printf("\nInsira o código do avião:");
  scanf("%i",&cod);
  while(i<=10){
if(cod==aviao[j].cdaviao){
num = aviao[j].quant;
  printf("\n %d Vagas disponíveis",aviao[j].quant );
  printf("\n Reservas do avião nº %d",cod );
  if(k <= num){ 
  printf("\n %s", aviao[j].reserva[k].nome);
  k++;break;
  system("pause");
  }
 
  } else j++;
     }
}
 
 void consultarpass(){
  setlocale (LC_ALL,"");
  char nome[20];
  int k, j=0;      
  printf("\nInsira o nome do passageiro:");
  scanf("%s",nome);
  if(nome==reserva[j].nome){
 
  printf("\n Reservas do passageiro %s",nome );
 
  printf("\n %c", reserva[k].cdaviao);
 
  }else j++;
     }
 
 void menu(){
 int tecla;
do{
system("CLS");
printf("\nMENU");
printf("\n1-Cadastrar Avião");
printf("\n2-Reservar passagem");
printf("\n3-Consultar por avião");
printf("\n4-Consultar por passageiro");
printf("\n5-Sair\n");
scanf("%i",&tecla);
escolha(tecla);
 
}while(tecla!=5);
 }
 
 int escolha(int tcl){
  switch (tcl){
case 1 : cadastrar();break;
case 2 : reservar();break;
case 3 : consultar();break;
case 4 : consutarpass();break;
case 5 : return tcl;
}
 
 }

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

main() { menu(); }

 

Pelo padrão, incorreto. Deveria ser int main(void), retornando algum inteiro.

 

Por que vc define os protótipos das funções 2x?

 

 

Cada avião possui um código para identificá-lo e a quantidade de lugares para passageiros. Cada reserva possui o código do avião e o nome do passageiro.

 

O exercício não diz que o avião possui os dados da reserva. O que vc fez na struct flyer está incorreto (lugares ocupados não são a mesma coisa que capacidade do avião).

 

A função de cadastro pode levar a um stack overflow porque ao invés de usar um loop simples, vc chama a função novamente. Isso vai encher a pilha e o programa vai parar de funcionar eventualmente.

 

O que é k na consulta de passageiros, que nem é inicializado?

 

Como o exercício não fala sobre uma capacidade máxima para os aviões, vc já aprendeu sobre alocação dinâmica?

 

Qual a dúvida em relação à parte de persistência em disco?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fazer eu consigo. Quero é que vc responda as minhas perguntas primeiro.

 

O exercício não pede uso de listas encadeadas. Se não pede alocação dinâmica, fica difícil armazenar na memória a lista de passageiros (olá, programa mal projetado com restrições/desperdício de espaço).

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que é k na consulta de passageiros, que nem é inicializado?

 

K é um contador.

Como o exercício não fala sobre uma capacidade máxima para os aviões, você já aprendeu sobre alocação dinâmica?

 

Sei muito pouco sobre alocação dinâmica, pois estou no segundo módulo ainda, espero passar pro próximo com sua ajuda nessas funções, que podem ser feitas em alocação dinâmica.

Qual a dúvida em relação à parte de persistência em disco?

Não sei como fazer isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que é k na consulta de passageiros, que nem é inicializado?

 

K é um contador.

 

Com esse nome bom, conta o quê? Detalhe, novamente: está contando errado porque nem foi inicializado; tá pegando lixo da memória. Provavelmente ele nem deveria existir.

 

O problema com a lista de reservas é que não há um limite de capacidade para os aviões. Ex: se a capacidade máxima permitida fosse 100 poltronas, poderia alocar estaticamente um array de reservas com 1000 posições. Se tudo o que se sabe é a quantidade máxima de aeronaves, sendo permitido informar qualquer inteiro p/ a capacidade do avião, a lista de reservas será uma lista alocada dinamicamente, mas como você não viu isso... O problema aqui é que posso declarar um array de reservas com 50 posições (capacidade total da frota), mas posso cadastrar aviões de tal forma que tenham menos lugares ou mais lugares. Onde fica a consistência?

 

http://www.cprogramming.com/tutorial/cfileio.html

 

Qual o formato de gravação dos arquivos? CSV? Um dado por linha?

Ainda existem detalhes sutis que vc deve prestar atenção ao escrever o código:

Na opção 4 deve-se ser solicitado o nome do passageiro e exibido todas as suas reservas.

Dá a entender que um mesmo passageiro pode ter reservas em aviões diferentes.

 

Olhando novamente as funções pedidas no exercício, acho bem difícil isso estar funcionando corretamente. Corrija primeiro as funcionalidades básicas:

 

- A função escolha diz que retorna um int, mas isso só ocorre na saída. E o return no restante do código?

- A função cadastrar eventualmente resultará num stack overflow.

- A consulta às reservas do avião está errada; falta um loop. Também está usando variáveis incorretas como contadores (uma hora é i, outra é j) e por causa disso, o programa entra em loop infinito.

 

Faça a base do programa funcionar antes de se preocupar com gravação em arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, estou seguindo suas instruções.

 

O que ocorre aqui é que quando vou cadastrar um novo avião, o verificador, não está a funcionar. Isso faz com que toda vez que eu for cadastrar um novo avião, será sobrescrito os dados do novo no que fora antes cadastrado. Por meio de uma variável global é possível fazer a contagem e verificação de espaços disponíveis. O problema é que isso só se deu na teoria. Aqui continua sobrescrevendo.

Mas como hoje é o ultimo dia de prazo pra eu entregar esse programa rodando, eu creio que estou com grandes chances de perder o módulo. Mas isso não é problema. Afinal, fóruns são para se compartilhar problemas, e além disso, ainda servem pra nos motivar, pois sempre tem alguém com um problema maior que o nosso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pergunta séria aqui: teu professor alguma vez falou sobre depuração de código na aula? Mostrou como é feito? Isso faz parte do processo de desenvolvimento porque é como se localiza lógica incorreta.

 

O exercício menciona loops. É sabido que precisamos de loops p/ percorrer listas quando se faz verificação de registro existente. Não vi isso no código. Só tem um if i<10.

 

P/ saber: quando esse exercício foi passado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, sobre depuração não vi ele falar em aula. Mas ele já falou sobre divisão do código em arquivos e o cabeçalho.

 

Então, esse exercício foi passado dia 4 pra entregar dia 11 valendo 8,5. Mas como eu não consegui, o professor deu um prazo para entregar hoje(18) valendo 6,5. :pinch:

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.