Jump to content
  1. Problema no código

    JonyBoy
    By JonyBoy,

    Boa Noite,
    queria saber como posso fazer para mudar o "estado" neste codigo, no void que tenho queria introduzir algo como pedir o nome do filme ou o código e mudar para 0 ou mudar para 1 se este for 0.
    é possível ajudar ?
    preciso de entregar isto com urgência e estou a bloquear com os fread e fwrite

        #include <stdio.h>
    #include <stdlib.h>
    #define MAXDESIGNACAO 120
    #define FICHEIROFILMES "filmes.dat" //definir nome do arquivo;
    
            //Variaveis utilizadas;
    
    struct Filmes {
        char nome[MAXDESIGNACAO];
        char genero[MAXDESIGNACAO];
        float codigo;
        int modo;
        int ano;
        int estado;
    };
    
        //Escolha das funções do menu;
        //Aqui a função menu retorna o dado selecionado e executa a respectiva função;
    
    int main()
    {
        int opcao = 0;
        do {
            system("cls");
            printf("\n---- Lista de Filmes ------");
            printf("\n1-Guardar\n2-Visualizar\n3-Pesquisar\n4-Estado\n5-Sair");
            opcao = lerOpcao();
            switch(opcao) {
                case 1:
                    guardar();
                    break;
                case 2:
                    visualizar();
                    break;
                case 3:
                    pesquisar();
                    break;
                case 4:
                    estado();
                    break;
                case 5:
                    printf("\nAte a Proxima");
                    break;
            }
        }while (opcao !=5);
        return 0;
    }
    
    int lerOpcao () {
        int opcao = 0;
        do {
            printf("\nOpcao:");
            scanf("%d", &opcao);
        } while (opcao < 0 || opcao > 5);
        return opcao;
    }
    
            //Escrita das palavras utilizadas;
            //Caso não seja a que se pretende ira retornar '0';
            //Ira voltar ao menu para que o utilizador volte a inserir nova opção;
    
    void guardar () {
        FILE *fFilmes;
        struct Filmes save;
        fFilmes = fopen(FICHEIROFILMES, "rb+");
        if(!fFilmes) {
            fFilmes = fopen(FICHEIROFILMES, "wb");
            fclose(fFilmes);
            fFilmes = fopen(FICHEIROFILMES, "rb+");
        }
                //Abertura do ficheiro para rb+
    
        fflush(stdin);
        printf("Nome:");
        gets(save.nome);
        printf("Genero:");
        gets(save.genero);
        printf("Estado (1/0):"); // 1 ativo(esta disponivel) / 0 inativo(nao esta disponivel)
        scanf("%d", &save.modo);
        printf("Codigo:");
        scanf("%f", &save.codigo);
        printf("Ano:");
        scanf("%d", &save.ano);
        save.estado = 1;
    
        //Dados a gravar no ficheiro
    
        fseek(fFilmes, 0, SEEK_END);
        fwrite (&save, sizeof(struct Filmes), 1, fFilmes);
        fclose(fFilmes);
    }
    
    void visualizar (){
        FILE *fFilmes;
        struct Filmes save;
        fFilmes = fopen(FICHEIROFILMES, "rb+");
        if(fFilmes) {
    
    
            int cVass = 0;
            fseek(fFilmes, 0, SEEK_SET);
            printf("\nNome\tGenero\tEstado\tCodigo\tAno");
    
            while (cVass == 0) {
                fread(&save, sizeof(struct Filmes), 1, fFilmes);
                if(feof(fFilmes)) cVass=1;
                else {
                    printf("\n%s\t%s\t%02d\t%.2f\t%02d",
                           save.nome, save.genero,
                           save.modo,save.codigo,save.ano);
    
                }
            }
            printf("\n---- FIM DE LISTAGEM ----");
            printf("\n---- ATE A PROXIMA ----");
        }
        fclose(fFilmes);
        getch();
    }
            //Faz a leitura de caracteres do arquivo e mostra no ecra ate ao fim;
    
    void pesquisar (){
        FILE *fFilmes;
        struct Filmes save;
        fFilmes = fopen(FICHEIROFILMES, "rb+");
        if(fFilmes) {
    
            int cVass = 0;
            fseek(fFilmes, 0, SEEK_SET);
            int anoPesquisar = 0;
            printf("Ano a Pesquisar:");
            scanf("%d", &anoPesquisar);
    
    
            printf("\nNome\tGenero\tEstado\tCodigo\tAno");
            while (cVass == 0) {
                fread(&save, sizeof(struct Filmes), 1, fFilmes);
                if(feof(fFilmes)) cVass=1;
                else {
                    if (anoPesquisar == save.ano) {
                        printf("\n%s\t%s\t%d\t%.2f\t%02d",
                           save.nome, save.genero,
                           save.modo,save.codigo,save.ano);
                    }
                }
            }
            printf("\n---- FIM DE LISTAGEM ----");
            printf("\n---- ATE A PROXIMA ----");
        }
        fclose(fFilmes);
        getch();
    }
    void estado (){    --------------------------------   Aqui o problema -------------------------
        FILE *fFilmes;
        struct Filmes save;
        fFilmes = fopen(FICHEIROFILMES, "rb+");
        if(fFilmes) {
    
            int cVass = 0;
            fseek(fFilmes, 0, SEEK_SET);
            int estadoPesquisar = 0;
            printf(" Estado a Pesquisar:");
            scanf("%d", &estadoPesquisar);
    
    
            printf("\nNome\tEstado");
            while (cVass == 0) {
                fread(&save, sizeof(struct Filmes), 1, fFilmes);
                if(feof(fFilmes)) cVass=1;
                else {
                    if (estadoPesquisar == save.modo) {
                        printf("\n%s\t%d",save.nome,save.modo);
                    }
                }
            }
            printf("\n---- FIM DE LISTAGEM ----");
            printf("\n---- ATE A PROXIMA ----");
        }
        fclose(fFilmes);
        getch();
    }

     

    • 0 replies
  2. Re: Menu de opções

    thoga31
    By thoga31,

    Não entendi qual é a tua ideia com esse código. Se estás a pedir ao utilizador o número do animal a ser modificado (scanf("%d",&n_animais);), por que motivo estás a percorrer a lista com dois ciclos for, a incrementar o n por duas vezes e a copiar o novo nome em todos os índices de 0 até ao número lido? Ou estás a tentar mostrar os animais todos depois de (supostamente) alterar o nome?

     

    O código que te dei funciona perfeitamente bem para procurar o índice na lista de um animal com um dado nome. Encontrado esse índice, é só alterar o nome nesse índice, mais nada.

    void alterarAnimal(void) {
      char nome[64];                                 // String para guardar os nomes dados pelo utilizador
      printf("Nome do animal a alterar? ");          // Primeiro lemos o nome do animal a ser alterado
      fgets(nome, 64, stdin);
      int pos = procurar(bichanos, quantos, nome);   // Procuramos o índice do vector que contém o animal com o nome dado
      
      if (pos >= 0) {
        /* O animal está registado no vector */
        printf("Novo nome do animal? ");             // Lemos o novo nome do animal
        fgets(nome, 64, stdin);
        strcpy(bichanos[pos].nome, nome);            // Copiamos o novo nome para o campo "nome" do animal no índice "pos"
      
      } else {
        /* O animal NÃO foi encontrado (pos = -1), logo não existe no vector */
        printf("Não existe um animal com nome %s.\n", nome);
      }
    }

    Por outro lado, se de facto queres que o utilizador te diga o índice na lista e não o nome original do animal a alterar, então basta isto:

    void alterarAnimal(void) {
       printf("Qual animal deseja alterar?");
       scanf("%d", &i);
       printf("Para qual categoria deseja alterar?");
       scanf("%s", nome);
       strcpy(animal[i], nome);
    }

     

    Adicionalmente, recomendo mostrar o conteúdo do vector com recurso uma função que possas chamar sempre que precisares:

    void listarAnimais(ANIMAL *bichos, int n) {
      printf("Existem %d animais registados.", n);
      for (int i = 0; i < n; i++) {
        printf("Registo %d:\n", i);
        printf("Nome:   %s\n" , bichos[i].nome);
        printf("Genero: %c\n" , bichos[i].genero);
        printf("Idade:  %d\n" , bichos[i].idade);
      }
    }

     

    Cumprimentos.

     

     

    • 15 replies
  3. Re: Menu de opções

    Ana Silva
    By Ana Silva,
    Em 24/01/2021 às 02:12, thoga31 disse:

    Sim, por exemplo:

    
    
    // Função de procura
    int procurar(ANIMAL *bichos, int n, const char *nome) {
       for(int i = 0; i < n; i++) {
          if (strcmp(bichos[i].nome, nome) == 0)
             return i;
       }
       return -1;
    }
    
    // Como usar:
    int pos = procurar(bichanos, quantos, "macaco");
    if (pos >= 0) {
       strcpy(bichanos[pos].nome, "gato");
    }

    Cumprimentos.

    void alterarAnimal(){
      printf("Qual animal deseja alterar?"); scanf("%d",&n_animais);
      printf("Para qual categoria deseja alterar?"); scanf("%s",nome);
      printf("Animais:\n");
      for(int n = 1; n<=n_animais; n++){
      for(int i = 0; i<n_animais; i++){
        printf("%d:",n);
      n++;
      strcpy(animal[i], nome);
      printf("%s\n", animal[i]);
    }
      }}

    Eu fiz desse jeito mas não está dando certo poderiam verificar o erro?

    • 15 replies
  4. Re: Que competências necessito?

    Francisco.Silva
    By Francisco.Silva,
    7 horas atrás, AshKetshup disse:

    Boa noite Francisco.
    Estou no 3º ano do curso de Engenharia Informática na UBI.

    Com base na minha experiência, não precisas de te preocupar muito com bases vindas do secundário, no meu ano de caloiro fui introduzido a programação como se fosse a minha primeira vez na área. Visto que há muita gente que não vem com quaisquer bases.

    No entanto se quiseres ir com algum avanço, aconselho a veres algumas de C é uma das linguagem mais completas e consegues aprender bastante com ela, also foi a linguagem com que no meu curso me "introduziram" à programação.

    Espero que te tenha ajudado.

    Ok muito obrigado , sinto mais aliviado sabendo isso, irei certamente dar uma vista na linguagem no mínimo.

    Comprimentos, obrigado pela ajuda

    • 4 replies
  5. Re: Que competências necessito?

    Francisco.Silva
    By Francisco.Silva,
    6 horas atrás, thoga31 disse:

    Não precisas de ter "todas as bases" antes de entrar no curso: é precisamente para isso que serve o curso ;)

    Podes sem dúvida começar a aprender por ti mesmo, mas não é absolutamente necessário nem essencial para o curso.

    Se te quiseres iniciar agora, concordo com o @AshKetshup na sua recomendação da linguagem C. Contudo, não é propriamente a linguagem mais intuitiva em vários aspectos, havendo outras linguagens de programação igualmente boas para te introduzires nos conceitos fundamentais (e.g. Python).

    Algo a ter em conta é que, independentemente da linguagem com que te inicies, os conceitos fundamentais são essencialmente os mesmos (salvo algumas excepções, mas isso são contas de outro rosário).

    Se quiseres dicas para te iniciares, estamos disponíveis para te dar umas dicas nesse sentido.

    Cumprimentos.

    Ok obrigado pelo esclarecimento, pensei que era necessário já ter uma pré-formação , irei certamente ver as linguagens que recomendaram. 

    Comprimentos.

     

    • 4 replies
  6. Re: Que competências necessito?

    thoga31
    By thoga31,
    3 horas atrás, Francisco.Silva disse:

    tenho receio que chegue a altura da faculdade e ainda não ter todas as bases

    Não precisas de ter "todas as bases" antes de entrar no curso: é precisamente para isso que serve o curso ;)

    Podes sem dúvida começar a aprender por ti mesmo, mas não é absolutamente necessário nem essencial para o curso.

    Se te quiseres iniciar agora, concordo com o @AshKetshup na sua recomendação da linguagem C. Contudo, não é propriamente a linguagem mais intuitiva em vários aspectos, havendo outras linguagens de programação igualmente boas para te introduzires nos conceitos fundamentais (e.g. Python).

    Algo a ter em conta é que, independentemente da linguagem com que te inicies, os conceitos fundamentais são essencialmente os mesmos (salvo algumas excepções, mas isso são contas de outro rosário).

    Se quiseres dicas para te iniciares, estamos disponíveis para te dar umas dicas nesse sentido.

    Cumprimentos.

    • 4 replies
  7. Re: Que competências necessito?

    AshKetshup
    By AshKetshup,

    Boa noite Francisco.
    Estou no 3º ano do curso de Engenharia Informática na UBI.

    Com base na minha experiência, não precisas de te preocupar muito com bases vindas do secundário, no meu ano de caloiro fui introduzido a programação como se fosse a minha primeira vez na área. Visto que há muita gente que não vem com quaisquer bases.

    No entanto se quiseres ir com algum avanço, aconselho a veres algumas de C é uma das linguagem mais completas e consegues aprender bastante com ela, also foi a linguagem com que no meu curso me "introduziram" à programação.

    Espero que te tenha ajudado.

    • 4 replies
  8. Re: Que competências necessito?

    Francisco.Silva
    By Francisco.Silva,

    Boa noite pessoas deste fórum, meu nome é Francisco e me encontro no secundário, tenho em mente trabalhar em algo relacionado com programação já a algum tempo mas tenho receio que chegue a altura da faculdade e ainda não ter todas as bases então gostaria de pedir dicas do que aprender até la.

    Comprimento, Francisco Silva

    • 4 replies
  1. Load more activity
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.