Jump to content
Fórum Script Brasil
  • 0

Dúvida em struct em C.


Nai

Question

Olá gente, boa noite! ^^

Eu to resolvendo o seguinte exercício:

Pesquise e construa um software que seja capaz de utilizar a estrutura apresentada na Figura 1 para cadastro

de no mínimo 30 livros. Para tanto, combine a estrutura da Figura 1 com um vetor ou uma matriz. Seu software

deve possuir uma estrutura de menus que possibilite ao usuário do software o uso fácil deste, para inclusão,

exclusão, alteração e consulta dos livros.

Eu tive dúvidas em relação ao menu. Por exemplo, quando for incluir algum livro, ele deve ser incluído em um espaço vago, correto? E como vou percorrer a struct pra achar essa 'ficha' vazia?

Excluir talvez eu tenha conseguido fazer, mas por via das dúvidas, tá certinho?

Alterar, acho também que consegui...

aaaagora consulta de livros não sei se tá certo também... :s

bobeiras, né?

Uma ajudinha ia ser muito boom, obrigada ^^

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, aux=0;


    struct livro
    {
        int codigo;
        char nome[100];
        char autor[100];
        char editora[100];
        int ano;
        float preço;
    }livro;

    struct livro l[30];

    int menu, aux_cod;
    char condicao;


    do
    {
    do
    {
        printf("Menu de opcoes:\n");
        printf("1- Incluir livro\n");
        printf("2- Excluir livro\n");
        printf("3- Alterar livro\n");
        printf("4- Consulta de livro\n");
    }while((menu<1) || (menu>4));

    switch (menu)
    {
        case 1:
        printf("Digite o codigo:\n");
        scanf("%d",&l[i].codigo);
        fflush(stdin);
        printf("Digite o nome do livro:\n");
        scanf("%s",&l[i].nome);
        fflush(stdin);
        printf("Digite o nome do autor:\n");
        scanf("%s",&l[i].autor);
        fflush(stdin);
        printf("Digite a editora do livro:\n");
        scanf("%s",&l[i].editora);
        fflush(stdin);
        printf("Digite o ano do livro:\n");
        scanf("%d",&l[i].ano);
        printf("Digite o preço do livro:\n");
        scanf("%f",&l[i].preço);
        break;


        case 2:
        printf("Digite o codigo do livro:\n");
        scanf("%d",&aux_cod);
            //Procura o código do livro pela posição que ele se encontra. Quando encontrado,
            //todos os dados serão apagados
        for(i=0;i<30;i++)
        {
            if(l[i].codigo==aux_cod)
            {
                l[i].codigo=0;
                l[i].nome='';
                l[i].autor='';
                l[i].editora='';
                l[i].ano=0;
                l[i].preço=0;
                printf("Dados excluídos com sucesso.");
            }
        }
        break;

        case 3:
        printf("Digite o codigo do livro:\n");
        scanf("%d",&aux_cod);

        printf("Digite o codigo:\n");
        scanf("%d",&l[aux_cod].codigo);
        fflush(stdin);
        printf("Digite o nome do livro:\n");
        scanf("%s",&l[aux_cod].nome);
        fflush(stdin);
        printf("Digite o nome do autor:\n");
        scanf("%s",&l[aux_cod].autor);
        fflush(stdin);
        printf("Digite a editora do livro:\n");
        scanf("%s",&l[aux_cod].editora);
        fflush(stdin);
        printf("Digite o ano do livro:\n");
        scanf("%d",&l[aux_cod].ano);
        printf("Digite o preço do livro:\n");
        scanf("%f",&l[aux_cod].preço);
        break;


        case 4:
        printf("Os livros são:\n");
        for(i=0;i<30;i++)
        {
            printf("%d ", l[i].codigo);
            printf("%s ", l[i].nome);
            printf("%s ", l[i].autor);
            printf("%s ", l[i].editora);
            printf("%d ", l[i].ano);
            printf("%f ", l[i].preço);
            printf("\n\n");
        }




    }
        printf("Deseja realizar mais alguma operação?\n\nS- Sim N- não\n");
        scanf("%c",&condicao);

    }while(condicao=='s' || condicao=='S');




    return 0;
}

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Ola,

1) Referente a leitura de uma string, utilize fgets e não scanf. Fgets le uma string mesmo contendo espaço em branco entre elas:

Ex: "Programa em c".

2)Referente a inserção de valores dentro do seu vetor, é muito simples é só incrementar no final da opção 1 após preencher os dados. Por exemplo, seu vetor começa em 0 e vai até 29, logo apos você preencher a primeira posição do vetor(zero) ele incrementa +1, sendo que a proxima vez que você for cadastrar irá para a posição 1,e assim em diante até o final do seu vetor.

Exemplo:

switch (menu)
    {
        case 1:
        printf("Digite o codigo:\n");
        scanf("%d",&l[i].codigo);
        fflush(stdin);
        printf("Digite o nome do livro:\n");
        fgets("%s",&l[i].nome);
        fflush(stdin);
        printf("Digite o nome do autor:\n");
        fgets("%s",&l[i].autor);
        fflush(stdin);
        printf("Digite a editora do livro:\n");
        fgets("%s",&l[i].editora);
        fflush(stdin);
        printf("Digite o ano do livro:\n");
        scanf("%d",&l[i].ano);
        printf("Digite o preço do livro:\n");
        scanf("%f",&l[i].preço);
        i++;
         break;
         }
3) Referente a exclusão de um elemento de um vetor: Tecnicamente é impossível não deixar espaço em branco... Mesmo que você mova as posições seguintes para frente, vai ficar um espaço em branco na última posição.Pegue a posição do elemento que quer tirar, sobrescreva-o com seu elemento seguinte, e vá fazendo este processo até chegar ao final do vetor. Não precisamos "apagar" o valor do "i" elemento pois ele não será exibido. E devemos subtrair 1 da variável "i" pois removemos 1 elemento. O loop do j percorre até i-1 pois dentro do loop acessamos o elemento seguinte ao contador. Não esqueça de declarar a variável j! Exemplo:
printf("Digite o codigo do livro:\n");
scanf("%d",&aux_cod); 

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

     if(l[i].codigo==aux_cod)
    {
       for(j=i; j<30-1; j++)
          l[j].codigo = l[j+1].codigo;
       i--;
    }
    printf("codigo = %d\n",l[i].codigo);
}
4)Alteração: Pelo o que eu vi ali, acho que está correto,caso esteje errado, peço ajuda de algum colega do fórum. 5) Referente a consulta.Você quer listar todos os livros cadastrados dentro do vetor? ou quer listar apenas o livro de codigo igual ao que for digitado pelo usuario. Se for listar todos, faça assim:
case 4:
        printf("Os livros são:\n");
        for(i=0;i<30;i++)
        {
            printf("%d ", l[i].codigo);
            printf("%s ", l[i].nome);
            printf("%s ", l[i].autor);
            printf("%s ", l[i].editora);
            printf("%d ", l[i].ano);
            printf("%f ", l[i].preço);
            printf("\n\n");
        }
Caso queira apenas o que o usuario digitar, faça assim:
case 4:
        printf("Digite codigo do livro que deseja consultar:\n");
        scanf("%d",&codlivro); // não esqueça de declarar alguma variavel para poder ler aqui dentro do scanf.

        for(i=0;i<30;i++)
        {
            if(l[i].codigo == codlivro)
            { 
                 printf("%d ", l[i].codigo);
                 printf("%s ", l[i].nome);
                 printf("%s ", l[i].autor);
                 printf("%s ", l[i].editora);
                 printf("%d ", l[i].ano);
                 printf("%f ", l[i].preço);
                 printf("\n\n");
            } 
           else
           {
               printf("Livro não foi encontrado.Verifique");
           } 
        }
      break;

Edited by Prog_Junior
Link to comment
Share on other sites

  • 0
Ola,

1) Referente a leitura de uma string, utilize fgets e não scanf. Fgets le uma string mesmo contendo espaço em branco entre elas:

Ex: "Programa em c".

2)Referente a inserção de valores dentro do seu vetor, é muito simples é só incrementar no final da opção 1 após preencher os dados. Por exemplo, seu vetor começa em 0 e vai até 29, logo apos você preencher a primeira posição do vetor(zero) ele incrementa +1, sendo que a proxima vez que você for cadastrar irá para a posição 1,e assim em diante até o final do seu vetor.

Exemplo:

switch (menu)
    {
        case 1:
        printf("Digite o codigo:\n");
        scanf("%d",&l[i].codigo);
        fflush(stdin);
        printf("Digite o nome do livro:\n");
        fgets("%s",&l[i].nome);
        fflush(stdin);
        printf("Digite o nome do autor:\n");
        fgets("%s",&l[i].autor);
        fflush(stdin);
        printf("Digite a editora do livro:\n");
        fgets("%s",&l[i].editora);
        fflush(stdin);
        printf("Digite o ano do livro:\n");
        scanf("%d",&l[i].ano);
        printf("Digite o preço do livro:\n");
        scanf("%f",&l[i].preço);
        i++;
         break;
         }
3) Referente a exclusão de um elemento de um vetor: Tecnicamente é impossível não deixar espaço em branco... Mesmo que você mova as posições seguintes para frente, vai ficar um espaço em branco na última posição.Pegue a posição do elemento que quer tirar, sobrescreva-o com seu elemento seguinte, e vá fazendo este processo até chegar ao final do vetor. Não precisamos "apagar" o valor do "i" elemento pois ele não será exibido. E devemos subtrair 1 da variável "i" pois removemos 1 elemento. O loop do j percorre até i-1 pois dentro do loop acessamos o elemento seguinte ao contador. Não esqueça de declarar a variável j! Exemplo:
printf("Digite o codigo do livro:\n");
scanf("%d",&aux_cod); 

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

     if(l[i].codigo==aux_cod)
    {
       for(j=i; j<30-1; j++)
          l[j].codigo = l[j+1].codigo;
       i--;
    }
    printf("codigo = %d\n",l[i].codigo);
}
4)Alteração: Pelo o que eu vi ali, acho que está correto,caso esteje errado, peço ajuda de algum colega do fórum. 5) Referente a consulta.Você quer listar todos os livros cadastrados dentro do vetor? ou quer listar apenas o livro de codigo igual ao que for digitado pelo usuario. Se for listar todos, faça assim:
case 4:
        printf("Os livros são:\n");
        for(i=0;i<30;i++)
        {
            printf("%d ", l[i].codigo);
            printf("%s ", l[i].nome);
            printf("%s ", l[i].autor);
            printf("%s ", l[i].editora);
            printf("%d ", l[i].ano);
            printf("%f ", l[i].preço);
            printf("\n\n");
        }
Caso queira apenas o que o usuario digitar, faça assim:
case 4:
        printf("Digite codigo do livro que deseja consultar:\n");
        scanf("%d",&codlivro); // não esqueça de declarar alguma variavel para poder ler aqui dentro do scanf.

        for(i=0;i<30;i++)
        {
            if(l[i].codigo == codlivro)
            { 
                 printf("%d ", l[i].codigo);
                 printf("%s ", l[i].nome);
                 printf("%s ", l[i].autor);
                 printf("%s ", l[i].editora);
                 printf("%d ", l[i].ano);
                 printf("%f ", l[i].preço);
                 printf("\n\n");
            } 
           else
           {
               printf("Livro não foi encontrado.Verifique");
           } 
        }
      break;

Muuuuuuito obrigada, Prog_Junior! Consegui fazer tudo certinho, obrigada ^^

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652.1k
×
×
  • Create New...