Ir ao conteúdo
  • Cadastre-se

Dúvida sobre programa em C++


Satanam

Posts recomendados

Bom dia,

 

Estou enfrentando alguns problemas pra resolver aqui e não acho solução alguma em vídeo-aulas ou textos. Sou iniciante nesse assunto, estou no segundo semestre da faculdade ainda e o professor não passa a matéria toda, ele explica o básico e deixa o resto pro pessoal se virar. Existem muitas aplicações diferentes, e eu estou me perdendo todo aqui. O programa que usamos é o Dev-C++.

 

O desafio é o seguinte: criar um programa para uma biblioteca, armazenando os dados em três structs (livros, funcionários e empréstimos). Tudo isso deve ser armazenado em três arquivos diferentes. Algumas opções das 10 que estão no menu são:

 

-Cadastrar um livro;

-Alterar a situação de um livro;

-Listar todos os livros;

-Consultar a situação de um livro;

-Sair do programa.

 

Essas são as que eu estou trabalhando no momento, as outras 5 vou começar/terminar assim que executar essas sem qualquer erro, sendo que as outras são mais fáceis e algumas dependem das primeiras que citei aqui. Para cadastrar um livro, listar todos os livros e sair do programa, nenhuma dificuldade. O problema é quando tento consultar a situação de um livro apenas. A única solução que encontrei foi consultar o livro através do registro dele, mas o professor pede para consultar através do número do livro. Aqui está a função do código onde tento consultar um livro:

void listaUmLivro(struct livros liv){  int main();  void listaUmLivro(struct livros liv);  void sair();  int menu9=1;  do{    int num;    printf("\nDigite o numero do livro: ");    scanf("%d",&num);    system("cls");    fseek(arqLivro,num*sizeof(struct livros),SEEK_SET);    fread(&liv,sizeof(struct livros),1,arqLivro);    if(feof(arqLivro)){      printf("\nErro ao abrir o arquivo.\n");      getch();    }    printf("Numero   |Titulo do Livro       |Situacao       |\n");    printf("do Livro |                      |               |\n");    printf("---------|----------------------|---------------|\n");    printf("%8d |%21s |%14c |\n", liv.numLivro,                                  liv.titLivro,                                  liv.sitLivro);           printf("\n\nO que deseja fazer?");    printf("\n[1] VOLTAR PARA O MENU PRINCIPAL.\n[2] CONSULTAR OUTRO LIVRO.\n");    scanf("%d", &menu9);    system("cls");    switch(menu9){      case 1:        main();    	break;      case 2:    	listaUmLivro(liv);    	break;    }  }while(menu9);}

Como faço para acessar o livro que eu quero através do seu número, e não do registro?

 

Algumas observações sobre o código acima:

1. Eu sei que posso usar "menu" em todas as outras funções, mas eu faço como "menu 3", "menu9" etc. só para lembrar em qual opção do menu principal eu estou trabalhando. Sei que não influencia em nada;

2. O código pode estar feio e tal, mas como eu disse sou iniciante.

 

 

A segunda dúvida: eu preciso trabalhar com três structs diferentes, como mencionei acima. O problema é essas structs usam algumas instruções iguais. Por exemplo:

-A struct "livros" possui a variável (instrução) "numLivro", armazenando o número do livro (fornecido pelo usuário);

-A struct "funcionários" possui a variável (instrução) "numFunc", armazenando o número do funcionário (fornecido pelo usuário);

-A struct "emprestimos" usa duas variáveis (instruções) iguais as anteriores, "numLivro" e "numFunc", e armazenando os mesmos valores contidas nelas, só que dessa vez acessando apenas os livros emprestados e não todos os livros.

 

Eu sei que essas instruções, embora tenham nomes iguais, não são as mesmas. Ou seja, para acessar a instrução "numLivro" da struct "livros", vou usar liv.numLivro, enquanto que para acessar a instrução "numLivro" da struct "emprestimos", vou usar empr.numLivro. "liv" é a variável de tipo "livros" e "empr" é a variável de tipo "emprestimos". Eu poderia usar instruções com nomes diferentes que daria na mesma, mas uso iguais apenas para ficar mais fácil a compreensão. Enfim, eu gostaria de saber, nesse caso, como faço para as duas instruções diferentes terem o mesmo conteúdo. Ou seja, empr.numLivro pegando o conteúdo de liv.numLivro, e empr.numFunc pegando o conteúdo de func.numFunc. "func" é outra variável, de tipo "funcionarios". Pra ficar mais claro:

struct livros{  int numLivro; //numero do livro, para todos os livros cadastrados no sistema  char titLivro[101]; //titulo do livro, idem  char sitLivro[21]; //situacao do livro, idem}liv;	
struct funcionarios{  int numFunc; //numero do funcionario, para todos os funcionarios cadastrados no sistema  char nomeFunc[101]; //nome do funcionario  char emailFunc; //email do funcionario, opcional  int telFunc; //telefone do funcionario, idem}func;
struct emprestimos{  int numLivro; //numero do livro, apenas daqueles que foram emprestados  int numFunc; //numero do funcionario, idem  int dataEmpr; //data do emprestimo  int dataDevo; //data da devolucao}empr;

Ou seja, empr.numLivros deve pegar informações de liv.numLivros e empr.numFunc deve pegar informações de func.numFunc. Eu deveria fazer isso onde? Logo no início do programa?

 

 

Não estou postando o código todo, pois o problema está nessas partes que citei acima. Outra coisa: eu estou criando os ponteiros para os arquivos logo no início do programa, abaixo das bibliotecas. Tem algo de errado nisso? O código abaixo, para entender o que eu quero dizer:

//aqui as bibliotecas stdlib, stdio etc.FILE *arqLivro;char *nomeArqLivro=(char *)"livros.dat";FILE *arqFunc;char *nomeArqFunc=(char *)"funcionarios.dat";FILE *arqEmpr;char *nomeArqEmpr=(char *)"emprestimos.dat";//daqui em diante sao as structs que citei acima e o resto do programa

Eu fiz isso para que eu possa alterar o nome dos arquivos num só lugar ao invés de alterar em cada função diferente. Só não sei se está certo colocar isso aí logo no início.

 

 

Enfim, como eu disse o programa pode estar mal organizado, pois não sei muito sobre programação. Estive o tempo todo que o professor deu para desenvolver esse programa pesquisando nas fontes que ele mesmo passou, em outras fontes que encontrei na internet, tutoriais, video-aulas etc., mas não consegui encontrar a solução para esses detalhes. Peço desculpas pelo paredão de texto, e agradeço a qualquer ajuda que vier.

 

EDIT:

Outro problema: na hora de cadastrar, a instrução liv.sitLivro deve ser, por padrão, "LIVRE". Eu tenho fazer isso, mas aparece esse erro:

"[Error] incompatible types in assignment of 'const char [6]' to 'int [21]'"

 

Eu entendo que é sobre tipos de atribuições incompatíveis da "const char [6]", que seria o "LIVRE" para "int[21]". O que não entendo é que a instrução sitLivro está declarada como "char", e não "int". Creio que a maneira como eu quis inserir "LIVRE" esteja errada:

liv.sitLivro="LIVRE";

Como seria o modo correto de fazer isso?

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...
Em 04/12/2015 às 11:21, Satanam disse:

Bom dia,

 

Estou enfrentando alguns problemas pra resolver aqui e não acho solução alguma em vídeo-aulas ou textos. Sou iniciante nesse assunto, estou no segundo semestre da faculdade ainda e o professor não passa a matéria toda, ele explica o básico e deixa o resto pro pessoal se virar. Existem muitas aplicações diferentes, e eu estou me perdendo todo aqui. O programa que usamos é o Dev-C++.

 

O desafio é o seguinte: criar um programa para uma biblioteca, armazenando os dados em três structs (livros, funcionários e empréstimos). Tudo isso deve ser armazenado em três arquivos diferentes. Algumas opções das 10 que estão no menu são:

 

-Cadastrar um livro;

-Alterar a situação de um livro;

-Listar todos os livros;

-Consultar a situação de um livro;

-Sair do programa.

 

Essas são as que eu estou trabalhando no momento, as outras 5 vou começar/terminar assim que executar essas sem qualquer erro, sendo que as outras são mais fáceis e algumas dependem das primeiras que citei aqui. Para cadastrar um livro, listar todos os livros e sair do programa, nenhuma dificuldade. O problema é quando tento consultar a situação de um livro apenas. A única solução que encontrei foi consultar o livro através do registro dele, mas o professor pede para consultar através do número do livro. Aqui está a função do código onde tento consultar um livro:


void listaUmLivro(struct livros liv){  int main();  void listaUmLivro(struct livros liv);  void sair();  int menu9=1;  do{    int num;    printf("\nDigite o numero do livro: ");    scanf("%d",&num);    system("cls");    fseek(arqLivro,num*sizeof(struct livros),SEEK_SET);    fread(&liv,sizeof(struct livros),1,arqLivro);    if(feof(arqLivro)){      printf("\nErro ao abrir o arquivo.\n");      getch();    }    printf("Numero   |Titulo do Livro       |Situacao       |\n");    printf("do Livro |                      |               |\n");    printf("---------|----------------------|---------------|\n");    printf("%8d |%21s |%14c |\n", liv.numLivro,                                  liv.titLivro,                                  liv.sitLivro);           printf("\n\nO que deseja fazer?");    printf("\n[1] VOLTAR PARA O MENU PRINCIPAL.\n[2] CONSULTAR OUTRO LIVRO.\n");    scanf("%d", &menu9);    system("cls");    switch(menu9){      case 1:        main();    	break;      case 2:    	listaUmLivro(liv);    	break;    }  }while(menu9);}

Como faço para acessar o livro que eu quero através do seu número, e não do registro?

 

Algumas observações sobre o código acima:

1. Eu sei que posso usar "menu" em todas as outras funções, mas eu faço como "menu 3", "menu9" etc. só para lembrar em qual opção do menu principal eu estou trabalhando. Sei que não influencia em nada;

2. O código pode estar feio e tal, mas como eu disse sou iniciante.

 

 

A segunda dúvida: eu preciso trabalhar com três structs diferentes, como mencionei acima. O problema é essas structs usam algumas instruções iguais. Por exemplo:

-A struct "livros" possui a variável (instrução) "numLivro", armazenando o número do livro (fornecido pelo usuário);

-A struct "funcionários" possui a variável (instrução) "numFunc", armazenando o número do funcionário (fornecido pelo usuário);

-A struct "emprestimos" usa duas variáveis (instruções) iguais as anteriores, "numLivro" e "numFunc", e armazenando os mesmos valores contidas nelas, só que dessa vez acessando apenas os livros emprestados e não todos os livros.

 

Eu sei que essas instruções, embora tenham nomes iguais, não são as mesmas. Ou seja, para acessar a instrução "numLivro" da struct "livros", vou usar liv.numLivro, enquanto que para acessar a instrução "numLivro" da struct "emprestimos", vou usar empr.numLivro. "liv" é a variável de tipo "livros" e "empr" é a variável de tipo "emprestimos". Eu poderia usar instruções com nomes diferentes que daria na mesma, mas uso iguais apenas para ficar mais fácil a compreensão. Enfim, eu gostaria de saber, nesse caso, como faço para as duas instruções diferentes terem o mesmo conteúdo. Ou seja, empr.numLivro pegando o conteúdo de liv.numLivro, e empr.numFunc pegando o conteúdo de func.numFunc. "func" é outra variável, de tipo "funcionarios". Pra ficar mais claro:


struct livros{  int numLivro; //numero do livro, para todos os livros cadastrados no sistema  char titLivro[101]; //titulo do livro, idem  char sitLivro[21]; //situacao do livro, idem}liv;	

struct funcionarios{  int numFunc; //numero do funcionario, para todos os funcionarios cadastrados no sistema  char nomeFunc[101]; //nome do funcionario  char emailFunc; //email do funcionario, opcional  int telFunc; //telefone do funcionario, idem}func;

struct emprestimos{  int numLivro; //numero do livro, apenas daqueles que foram emprestados  int numFunc; //numero do funcionario, idem  int dataEmpr; //data do emprestimo  int dataDevo; //data da devolucao}empr;

Ou seja, empr.numLivros deve pegar informações de liv.numLivros e empr.numFunc deve pegar informações de func.numFunc. Eu deveria fazer isso onde? Logo no início do programa?

 

 

Não estou postando o código todo, pois o problema está nessas partes que citei acima. Outra coisa: eu estou criando os ponteiros para os arquivos logo no início do programa, abaixo das bibliotecas. Tem algo de errado nisso? O código abaixo, para entender o que eu quero dizer:


//aqui as bibliotecas stdlib, stdio etc.FILE *arqLivro;char *nomeArqLivro=(char *)"livros.dat";FILE *arqFunc;char *nomeArqFunc=(char *)"funcionarios.dat";FILE *arqEmpr;char *nomeArqEmpr=(char *)"emprestimos.dat";//daqui em diante sao as structs que citei acima e o resto do programa

Eu fiz isso para que eu possa alterar o nome dos arquivos num só lugar ao invés de alterar em cada função diferente. Só não sei se está certo colocar isso aí logo no início.

 

 

Enfim, como eu disse o programa pode estar mal organizado, pois não sei muito sobre programação. Estive o tempo todo que o professor deu para desenvolver esse programa pesquisando nas fontes que ele mesmo passou, em outras fontes que encontrei na internet, tutoriais, video-aulas etc., mas não consegui encontrar a solução para esses detalhes. Peço desculpas pelo paredão de texto, e agradeço a qualquer ajuda que vier.

 

EDIT:

Outro problema: na hora de cadastrar, a instrução liv.sitLivro deve ser, por padrão, "LIVRE". Eu tenho fazer isso, mas aparece esse erro:

"[Error] incompatible types in assignment of 'const char [6]' to 'int [21]'"

 

Eu entendo que é sobre tipos de atribuições incompatíveis da "const char [6]", que seria o "LIVRE" para "int[21]". O que não entendo é que a instrução sitLivro está declarada como "char", e não "int". Creio que a maneira como eu quis inserir "LIVRE" esteja errada:


liv.sitLivro="LIVRE";

Como seria o modo correto de fazer isso?

Obs: Na sua estrutura livros precisa conter um campo para o código do livro.

EX:

typedef struct{

        char livro[20];
        int codigo;// Esse código do tipo inteiro
       
}tipo_livros;
tipo_livros liv;
FILE *livros;

rewind(livros);
     do {

            fread(&livros, sizeof(tipo livros), 1, livros);
            if (num==livros.codigo)// Aqui irá comparar o "num" digitado pelo usuário com o código do arquivo. 
            printf("Numero , Titulo do livro .....");// Aqui irá imprimir o código do livro consultado e demais dados da estrutura.

     }while( feof(livros)==0 && num!=livros.codigo);
     if(num!=livros.codigo) printf("\n\nLivro não cadastrado");// Mensagem caso o código do livro não estar cadastrado.

 

Link para o comentário
Compartilhar em outros sites

  • mês depois...

Olá, eu sou o Sr. Gerard Sanchez, um emprestador empréstimo privado que dá empréstimos oportunidade de tempo de vida. Você precisa de um empréstimo urgente para limpar suas dívidas ou você precisa de um empréstimo de capital para melhorar o seu negócio? Você já foi rejeitado pelos bancos e outras agências financeiras? Você precisa de um empréstimo de consolidação ou hipoteca? Não procure mais, porque estamos aqui para todos os seus problemas financeiros no passado. Nós emprestar fundos a pessoas que necessitam de assistência financeira, que têm um mau crédito ou que necessitam de dinheiro para pagar as contas, a investir em negócios a uma taxa de 2%. Eu quero usar este meio informar que prestamos assistência confiável e beneficiário e estarão dispostos a oferecer-lhe um empréstimo. Então, entre em contato conosco hoje por e-mail para: ([email protected])

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...