projecto em c

bm97

Membro
Alguem que me diga se as estruturas que eu defeni estao bem
Pretende-se desenvolver uma aplicação para auxiliar um funcionário na gestão de uma agência de viagens. A aplicação deverá manter informação sobre os clientes e as suas viagens. A agência possui uma determinada oferta de viagens (lista de destinos e data) e cada cliente pode adquirir uma (ou mais) viagem, sendo-lhe atribuído um lugar na mesma, ou colocar-se em fila de espera, caso não haja lugares disponíveis nesse momento. Dados do cliente a guardar: nome, n.º de cartão de cidadão, viagens adquiridas, e viagens para as quais está em fila de espera. A aplicação deve permitir realizar de forma interativa, as seguintes operações: • adquirir uma viagem – o cliente é colocado numa lista de clientes que adquiriram essa viagem (de acordo com a data e hora de compra); • colocar em fila de espera para uma viagem – o cliente é colocado numa fila de espera para viagem de acordo com a data e hora do pedido (a colocação em fila de espera também poderá ser feita de forma automática, se ao adquirir uma viagem não houver lugares livres); • cancelar uma viagem – eliminar um cliente de uma viagem (deverá ser promovido para a lista de clientes que adquiriram a viagem o primeiro cliente em fila de espera para essa viagem); • cancelar pedido em fila de espera – retirar um cliente em fila de espera para uma viagem. • para um dado destino, listar todas as viagens – listar todas as viagens para um dado destino (podem haver várias datas) – as mais recentes primeiro; • para um dado cliente, listar todas as viagens adquiridas – as mais antigas primeiro; • listar clientes – listar todos os clientes que adquiriram ou estão em espera para viagens, sem repetições;


codigo
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define max 50
#define MAX_STACK 100

typedef struct{
int lugares;
int hora;
int dia;
int mes;
int ano;
char *destino[max];
}Viagem;

typedef struct{
char *nome[max];
int cc;
int lugar;
Viagem aq;
Viagem es;
}Cliente;

typedef struct lnode *List;
typedef struct lnode{
Cliente info;
List next;
}List_node;


typedef struct node_type {
Cliente info;
struct node_type *next;
}NODE_TYPE;
typedef NODE_TYPE *NODE_PTR;
typedef struct {
NODE_TYPE *rear;
NODE_TYPE *front;
}Q_TYPE;

void create_queue(void);
void putin_queue(void);
void dequeue(void);
void ListarViagensCliente(void);
void ListarViagensDest(void);
void ListarClientes(void);
void AdquirViagem(void);
void ColocarFilaEspera(void);
void CancelarViagem(void);
void CancelarFilaEspera(void);
void Sair(void);

int main()
{
int opcao;
do{
system("cls");

printf(" Agencia de viagens \n");

printf("[1] - Listar todas as viagens por cliente\n\n");
printf("[2] - Listar todas as viagens por destino\n\n");
printf("[3] - Listar todos os clientes\n\n");
printf("[4] - Adquirir uma viagem\n\n");
printf("[5] - Colocar em fila de espera\n\n");
printf("[6] - Cancelar uma viagem\n\n");
printf("[7] - Cancelar pedido em fila de espera\n\n");
printf("[8] - Sair\n\n");
printf("Qual opcao deseja: ");
setbuf(stdin,NULL);
scanf("%d",&opcao);

switch(opcao){
case 1:
system("cls");

break;
case 2:
system("cls");

break;
case 3:
system("cls");

break;
case 4:
system("cls");
AdquirViagem();
break;
case 5:
system ("cls");
break;
case 6:
system("cls");

break;
case 7:
system("cls");

break;
case 8:
system("cls");
//Sair();
break;

default :
printf("\n\n\t\t\tOpção inválida O.o \n \t\t\tTente novamente...");

}

} while((opcao !=8));

void insert_last_lista(List lista,Cliente n){
List no=(List)malloc(sizeof(List_node));
while(lista->next!=NULL){
lista=lista->next;
}
assert(no);
no->info=n;
no->next=lista->next;
lista->next=no;
}
void enqueue(Q_TYPE *queue,Cliente n){
NODE_PTR temp_ptr;
temp_ptr = (NODE_PTR) malloc (sizeof (NODE_TYPE));
if (temp_ptr != NULL){
temp_ptr->info = n;
temp_ptr->next = NULL;
if (empty_queue (queue) == 1)
queue->front = temp_ptr;
else queue->rear->next = temp_ptr;
queue->rear = temp_ptr;
}
}

void AdquirViagem(void){
char cod[max];
printf("\nDigite o destino da viagem : ");
scanf("%s",cod);
setbuf(stdin,NULL);
printf("\nDestino da viagem\n");
scanf("%s",&Viagem.destino);
setbuf(stdin,NULL);
printf("\nnome do cliente \n");
gets( Cliente.nome);
getch();
}
 
Código:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define max 50
#define MAX_STACK 100

typedef struct{
    int lugares;
    int hora;
    int dia;
    int mes;
    int ano;
    char *destino;
}Viagem;

typedef struct{
    char *nome;
    int cc;
    int lugar;
    Viagem aq;
    Viagem es;
}Cliente;

typedef struct lnode *List;
typedef struct lnode{
    Cliente info;
    List next;
}List_node;


typedef struct node_type {
    Cliente info;
    struct node_type *next;
}NODE_TYPE;
typedef NODE_TYPE *NODE_PTR;
typedef struct {
    NODE_TYPE *rear;
    NODE_TYPE *front;
}Q_TYPE;

    void create_queue(void);
    void putin_queue(void);
    void dequeue(void);
    void ListarViagensCliente(void);
    void ListarViagensDest(void);
    void ListarClientes(void);
    void AdquirViagem(void);
    void ColocarFilaEspera(void);
    void CancelarViagem(void);
    void CancelarFilaEspera(void);
    void Sair(void);

int main()
{
    int opcao;
    do{
      system("cls");

      printf("                               Agencia de viagens                                \n");

    printf("[1] - Listar todas as viagens por cliente\n\n");
    printf("[2] - Listar todas as viagens por destino\n\n");
    printf("[3] - Listar todos os clientes\n\n");
    printf("[4] - Adquirir uma viagem\n\n");
    printf("[5] - Colocar em fila de espera\n\n");
    printf("[6] - Cancelar uma viagem\n\n");
    printf("[7] - Cancelar pedido em fila de espera\n\n");
    printf("[8] - Sair\n\n");
    printf("Qual opcao deseja: ");
    setbuf(stdin,NULL);
    scanf("%d",&opcao);

    switch(opcao){
        case 1:
        system("cls");
        ListarViagensCliente();
        break;
                case 2:
                system("cls");
                ListarViagensDest();
                break;
                        case 3:
                        system("cls");
                        ListarClientes();
                        break;
                                case 4:
                                system("cls");
                                AdquirViagem();
                                break;
                                        case 5:
                                        system ("cls");
                                        ColocarFilaEspera();
                                        break;
                                                case 6:
                                                system("cls");
                                                CancelarViagem();
                                                break;
                                                        case 7:
                                                        system("cls");
                                                        CancelarFilaEspera();
                                                        break;
                                                                case 8:
                                                                system("cls");
                                                                Sair();
                                                                break;

                                                                        default :
                                                                        printf("\n\n\t\t\tOpção inválida O.o \n \t\t\tTente novamente...");

            }

       } while((opcao !=8));

    void insert_last_lista(List lista,Cliente n){
        List no=(List)malloc(sizeof(List_node));
        while(lista->next!=NULL){
            lista=lista->next;
        }
        assert(no);
        no->info=n;
        no->next=lista->next;
        lista->next=no;
    }
    void enqueue(Q_TYPE *queue,Cliente n){
        NODE_PTR temp_ptr;
        temp_ptr = (NODE_PTR) malloc (sizeof (NODE_TYPE));
        if (temp_ptr != NULL){
            temp_ptr->info = n;
            temp_ptr->next = NULL;
            if (empty_queue (queue) == 1)
                queue->front = temp_ptr;
            else queue->rear->next = temp_ptr;
                queue->rear = temp_ptr;
        }
    }

    void AdquirViagem(void){
        char cod[max];
        printf("\nDigite o destino da viagem : ");
        scanf("%s",cod);
        setbuf(stdin,NULL);
        printf("Destino da viagem: \n");
        scanf("%s",&Viagem.destino);
        setbuf(stdin,NULL);
        printf("\n nome do cliente: \n");
        gets(&Cliente.nome);
        getch();
    }
    return 0;
}
 
Eu não sou profissional em programação, mas acho que ai não é necessário estares a utilizar o malloc não vai ser uma aplicação grande, portante não vais achar grande a diferente. E na minha opiniao deverias criar nas tuas structs um ID para cada uma delas, muitas das vezes da muito geito xD Mas posso estar errado, i'm not a pro. Mas de resto assim por maior não vi assim nada a apontar.
 
O codigo também me parece estar bem... em relação a questão dos ID's não é necessario porque não estas a escrever numa BD mas sim em memoria, portanto o campo ID não é necessário
 
Sendo que vais guardar num ficheiro, pois um ID associado a cada tabela (ID_Cliente e ID_Viagem, penso que terás que criar dois ficheiros separados), nesse ID_Cliente e ID_Viagem, podes meter um contador a incrementar um valor ao registo anterior e assim terás um ID unico e sequencial consoante a entrada dos registos
 
Vou pegar no teu codigo logo e vou fazer essa parte do incrementar um ID e depois meto novamente aqui o codigo ou então zippo o ficheiro e meto aqui
 
Esta a dar 2 erros na funcao adquirir viagem
expressionn before viagem
experssion before cliente

Onde tens as variáveis Viagem e Cliente declaradas? Ou melhor, porque estás a tentar usar tipos como variáveis? Tens a noção do que é um tipo e do que é uma variável, certo?

Já agora, porque tens uma lista simples e uma duplamente ligada, à qual chamas Queue???

PS: O id é completamente desnecessário, pelo menos no contexto actual, em que cada instância de Viagem está directamente ligada ao cliente. Mesmo numa BD não seria necessário, já que o id do cliente pode ser o CC, e a viagem é um túplo único.
 
viagem é uma estrutura assim como cliente
lista simples e a lista normal de clientes e a lista queue é uma lista de espera tambem para clientes
mas estas listas ja vao ser carregadas de um ficheiro
 
Vou ser um pouco picuínhas, mas a ver se percebes.

typedef struct{
...
}Viagem;

struct {...} é uma estrutura. Viagem é um tipo, por isso é que fizeste o typedef. Traduzindo para português:
#define struct {...} como tipo Viagem.

Por isso o teu scanf "scanf("%s",&Viagem.destino);" é o mesmo que tentares ler um inteiro com "scanf("%d",&int);". Daqui vem o erro que te dá.


Segundo ponto, porquê criar os 2 tipos diferentes, e não usar o mesmo? Normalmente numa fila de espera só precisas de conhecer a cabeça, não precisas navegar na lista. Vais construir funções duplicadas quando um só tipo seria suficiente. Ou tens alguma razão específica para tal?

Finalmente, onde pensas guardar a lista de viagens disponíveis na agência?

A agência possui uma determinada oferta de viagens (lista de destinos e data)
 
os 2 tipos referes te ao cliente e viagem ?
eu tenho de criar uma lista para os clientes, uma lista para as viagens e uma lista de espera ;
a lista de viagens disponiveis guardo na lista para as viagens e depois para o ficheiro
como posso corrigir o erro que disseste?
 
Eu tinha percebido mal a questão da queue, mas de qualquer forma tens o tipo dos nodos repetido.

C:
typedef struct lnode *List;
typedef struct lnode{
    Cliente info;
    List next;
}List_node;


typedef struct node_type {
    Cliente info;
    struct node_type *next;
}NODE_TYPE;
typedef NODE_TYPE *NODE_PTR;
typedef struct {
    NODE_TYPE *rear;
    NODE_TYPE *front;
}Q_TYPE;

List_node e NODE_TYPE são exactamente a mesma coisa, listas de clientes, apenas com nomes diferentes, e mantenho que Q_TYPE é desnecessário, já que a única coisa que faz é facilitar a inserção no fim, mas terás de fazer o método "tradicional" para List_node de qualquer forma... Por isso só estás a fazer código redundante.

a lista de viagens disponiveis guardo na lista para as viagens e depois para o ficheiro

Tens código que não postaste? Porque no que aqui colocaste só vejo tipos de listas de clientes. Cada cliente tem 2 campos do tipo Viagem (nem uma lista são).

como posso corrigir o erro que disseste?

Criando variáveis do tipo correspondente.
C:
Cliente cliente1;
printf("\n nome do cliente: \n");
gets(&cliente1.nome);
getch();
Atenção depois ao âmbito das variáveis.

Sendo completamente honesto contigo, se não consegues chegar a esta parte, aconselho-te urgentemente a reveres a matéria. Sem teres este tipo de noções, dificilmente vais conseguir fazer alguma coisa de jeito.

PS: lembra-te mais tarde que não deves usar o gets. Não é seguro, podes usar o fgets em vez dele. Mas não te preocupes com isso agora. Tens outras coisas mais urgentes a ver.
 
sao duas listas de clientes que e o que eu quero uma lista normal e uma lista diferente de espera
ainda nao tenho mais codigo tou a tentar acabar essa funçao
esses clientes supostamente e para estarem em ficheiro como faço para ir buscar​
 
Presumo que queiras usar ficheiros de texto, e não binários, já que os binários te obrigam a inserir a informação a partir da aplicação, para depois gravarem.

assim sendo,
fopen
fclose
fscanf

tutorial

De qualquer forma volto a enfatisar que neste momento tu não tens nenhuma lista. Tens um Tipo lista, mas não tens nenhuma variavel para conter a tua lista.

no que aqui colocaste só vejo tipos de listas de clientes
E como disse, nem sequer tens um tipo de lista para as viagens. Apenas tens um tipo Viagem, não uma lista.
 
Back
Topo