Work with Struct and print problem, change Struct and delete Struct

Asked

Viewed 2,570 times

3

I have a work at the college to do that consists of creating a structure of "Library Register"(cataloging code, name of the work, name of the author, publisher, donated works of each area, number of pages) and menu, with options "Register book, search by cataloging code and area, display donated books, change a register and delete a register". The books should be divided into 3 areas( human, exact and biomedical) and each area houses a maximum of 30 books. Ah, and main has to be as small as possible, using functions for everything. But I have some problems...

-When I print the books some information does not appear or is exchanged with other fields.

-The part of struct q is char is not changed, when the option is selected

-I have no idea how to delete a book entry ( in case a position in the array)

MAIN. C

//Grupo #x: Lucas Machado, Luís Felipe Zaban, Yasser Guimaraes.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "menus.h"
#define SAIR 6

struct Cadastro
{
    int Codigo_area;
    int Codigo_de_catalogacao;
    char Doacao;
    char Nome_obra[50];
    char Nome_autor[50];
    char Editora[50];
    int Num_paginas;

} livro_exatas[10],livro_humanas[10],livro_biomedicas[10];

int main()
{
    int op;
    op = Menu_principal();

    while (op < SAIR)
{
    switch(op)
    {
    case 1:
        Menu_cadastra_livros();
        system("cls");
        break;
    case 2:
        Consulta_por_area();
        system("cls");
        break;
    case 3:
        verifica_doacao();
        system("cls");
        break;
    case 4:
        system("cls");
        printf("\n***Alterar Dados***\n\n");
        Menu_Alteracao();

    }

    op = Menu_principal();

}
return 0;
}

MENUS. C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "funcoes.h"

int Menu_principal()
{
    int opcao_principal;
    printf("\nMENU PRINCIPAL\n\n\n");
    printf(" 1 - CADASTRAR LIVRO\n");
    printf(" 2 - CONSULTAR OBRA POR CODIGO E AREA\n");
    printf(" 3 - CONSULTAR OBRA DOADAS DE CADA AREA\n");
    printf(" 4 - ALTERAR UM REGISTRO\n");
    printf(" 5 - EXCLUIR UM REGISTRO\n");
    printf(" 6 - SAIR\n\n");
    printf("Digite sua opcao: ");
    scanf("%d", &opcao_principal);
    system("cls");
    return opcao_principal;
}

int Menu_cadastra_livros()
{
system("cls");
int opcao;
printf("\nMENU DE CADASTRO\n\n\n");
printf(" 1 - LIVRO DE CIENCIAS EXATAS\n");
printf(" 2 - LIVRO DE CIENCIAS HUMANAS\n");
printf(" 3 - LIVRO DE CIENCIAS BIOMEDICAS\n");
printf(" 4 - RETORNAR AO MENU PRINCIPAL\n\n");
printf("Digite sua opcao: ");
scanf("%d", &opcao);

while(opcao<4)
{
    switch(opcao)
    {
    case 1:
        Cadastro_livro_EXATAS();
        system("cls");
        break;
    case 2:
        Cadastro_livro_HUMANAS();
        system("cls");
        break;
    case 3:
        Cadastro_livro_BIOMEDICAS();
        system("cls");
        break;
    case 4:
        return 0;
        break;
    }
    return(opcao);
}
return 0;

}

int Menu_Alteracao()
{
int opcao_alt;
printf("Selecione uma opcao: \n");
printf(" 1 - Alterar Codigo de Catalogacao\n");
printf(" 2 - Alterar Nome da Obra\n");
printf(" 3 - Alterar Nome do Autor\n");
printf(" 4 - Alterar Editora\n");
printf(" 5 - Alterar Numero de Paginas\n");
printf(" 6 - Retornar ao Menu anterior\n");
printf("Digite sua opcao: ");
scanf("%d", &opcao_alt);
system("cls");
while(opcao_alt<6)
{
    switch(opcao_alt)
    {
    case 1:
        altera_codigo_de_catalogacao();
        break;
    case 2:
        altera_nome_da_obra();
        break;
    case 3:
        altera_nome_do_autor();
        break;
    case 4:
        altera_editora();
        break;
    case 5:
        altera_paginas();
        break;
    }
    return (opcao_alt);
}

return 0;
}

FUNCTIONS. C

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

int exatas=0,humanas=0,biomedicas=0,contador_e=0, contador_h=0,contador_b=0;


struct Cadastro
{
int Codigo_area;
int Codigo_de_catalogacao;
char Doacao;
char Nome_obra[50];
char Nome_autor[50];
char Editora[50];
int Num_paginas;

} livro_exatas[10],livro_humanas[10],livro_biomedicas[10];


int Cadastro_livro_EXATAS()
{
if(contador_e<10)
{
    livro_exatas[exatas].Codigo_area=1;
    printf("\nDigite o codigo de catalogacao: \n");
    scanf("%d",&livro_exatas[exatas].Codigo_de_catalogacao);
    printf("Digite os dados de aquisicao da obra-doado(S/N): \n");
    scanf("%s",&livro_exatas[exatas].Doacao);
    printf("Digite o nome da obra: \n");
    scanf("%s",&livro_exatas[exatas].Nome_obra[50]);
    printf("Digite o nome do autor: \n");
    scanf("%s",&livro_exatas[exatas].Nome_autor[50]);
    printf("Digite a editora: \n");
    scanf("%s",&livro_exatas[exatas].Editora[50]);
    printf("Digite o numero de paginas: \n");
    scanf("%d",&livro_exatas[exatas].Num_paginas);
    contador_e ++;
    exatas++;
    return 0;
}
else
{
    printf("\nLimite de livros cadastrados atingido!\n");
    system("pause");
    return 0;
}
}


int Cadastro_livro_HUMANAS()
{
if(contador_h<10)
{
    livro_humanas[humanas].Codigo_area=2;
    printf("\nDigite o codigo de catalogacao: \n");
    scanf("%d",&livro_humanas[humanas].Codigo_de_catalogacao);
    printf("Digite os dados de aquisicao da obra-doado(S/N): \n");
    scanf("%s",&livro_humanas[humanas].Doacao);
    printf("Digite o nome da obra: \n");
    scanf("%s",&livro_humanas[humanas].Nome_obra[50]);
    printf("Digite o nome do autor: \n");
    scanf("%s",&livro_humanas[humanas].Nome_autor[50]);
    printf("Digite a editora: \n");
    scanf("%s",&livro_humanas[humanas].Editora[50]);
    printf("Digite o numero de paginas: \n");
    scanf("%d",&livro_humanas[humanas].Num_paginas);
    contador_h ++;
    humanas++;
    return 0;
}
else
{
    printf("\nLimite de livros cadastrados atingido!\n");
    system("pause");
    return 0;
}
}



int Cadastro_livro_BIOMEDICAS()
{
if(contador_b<10)
{
    livro_biomedicas[biomedicas].Codigo_area=3;
    printf("\nDigite o codigo de catalogacao: \n");
    scanf("%d",&livro_biomedicas[biomedicas].Codigo_de_catalogacao);
    printf("Digite os dados de aquisicao da obra-doado(S/N): \n");
    scanf("%s",&livro_biomedicas[biomedicas].Doacao);
    printf("Digite o nome da obra: \n");
    scanf("%s",&livro_biomedicas[biomedicas].Nome_obra[50]);
    printf("Digite o nome do autor: \n");
    scanf("%s",&livro_biomedicas[biomedicas].Nome_autor[50]);
    printf("Digite a editora: \n");
    scanf("%s",&livro_biomedicas[biomedicas].Editora[50]);
    printf("Digite o numero de paginas: \n");
    scanf("%d",&livro_biomedicas[biomedicas].Num_paginas);
    contador_b ++;
    biomedicas++;
    return 0;
}
else
{
    printf("\nLimite de livros cadastrados atingido!\n");
    system("pause");
    return 0;
}
}

void Consulta_por_area()
{
int i, a, b,cont=0;
printf("\n\nDigite o Codigo de area da obra:\n [1] para exatas\n [2] para humanas\n [3]        para biomedicas  \n Sua opcao: ");
scanf("%d",&a);
printf("\n\nDigite o Codigo de Catalogacao:  \n");
scanf("%d",&b);
for(i=0; i<10; i++)
{
    switch(a)
    {
    case 1:
        if(b==livro_exatas[i].Codigo_de_catalogacao)
        {
            system("cls");
            imprime_dados_exatas(i);
        }
        else
        {
            cont++;
        };
        break;
    case 2:
        if(b==livro_humanas[i].Codigo_de_catalogacao)
        {
            system("cls");
            imprime_dados_humanas(i);
        }
        else
        {
            cont++;
        };
        break;
    case 3:
        if(b==livro_biomedicas[i].Codigo_de_catalogacao)
        {
            system("cls");
            imprime_dados_biomedicas(i);
        }
        else
        {
            cont++;
        };
        break;
    }
}
if(cont==10)
{
    system("cls");
    printf("\nLivro nao encontrado!\n");
}
system("pause");
}

int imprime_dados_exatas(int i)
{
printf("Codigo de area:  %d\n",livro_exatas[i].Codigo_area);
printf("Codigo de catalogacao:  %d\n",livro_exatas[i].Codigo_de_catalogacao);
printf("Doacao:  %c\n",livro_exatas[i].Doacao);
printf("Nome da obra:  %s\n",livro_exatas[i].Nome_obra);
printf("Nome do autor:  %s\n",livro_exatas[i].Nome_autor);
printf("Editora:  %s\n",livro_exatas[i].Editora);
printf("Numero de paginas:  %d\n\n\n",livro_exatas[i].Num_paginas);
return 0;
}
int imprime_dados_humanas(int i)
{
printf("Codigo de area:  %d\n",livro_humanas[i].Codigo_area);
printf("Codigo de catalogacao:  %d\n",livro_humanas[i].Codigo_de_catalogacao);
printf("Doacao:  %c\n",livro_humanas[i].Doacao);
printf("Nome da obra:  %s\n",livro_humanas[i].Nome_obra);
printf("Nome do autor:  %s\n",livro_humanas[i].Nome_autor);
printf("Editora:  %s\n",livro_humanas[i].Editora);
printf("Numero de paginas:  %d\n\n\n",livro_humanas[i].Num_paginas);
return 0;
}

int imprime_dados_biomedicas(int i)
{
printf("\n\n\nCodigo de area:  %d\n",livro_biomedicas[i].Codigo_area);
printf("Codigo de catalogacao:  %d\n",livro_biomedicas[i].Codigo_de_catalogacao);
printf("Doacao:  %c\n",livro_biomedicas[i].Doacao);
printf("Nome da obra:  %s\n",livro_biomedicas[i].Nome_obra);
printf("Nome do autor:  %s\n",livro_biomedicas[i].Nome_autor);
printf("Editora:  %s\n",livro_biomedicas[i].Editora);
printf("Numero de paginas:  %d\n\n\n",livro_biomedicas[i].Num_paginas);
return 0;
}


void verifica_doacao()
{
int i,j,cont=0;
for(j=0; j<3; j++)
{
    for(i=0; i<10; i++)
    {
        switch(j)
        {
        case 1:
            if('s'==livro_exatas[i].Doacao)
            {
                printf("\nObra doadas da area de ciencias exatas\n\n\n");
                imprime_dados_exatas(i);
            }
            else
            {
                cont++;
            }
        case 2:
            if('s'==livro_humanas[i].Doacao)
            {
                printf("\nObra doadas da area de ciencias humanas\n\n\n");
                imprime_dados_humanas(i);
            }
            else
            {
                cont++;
            }
        case 3:
            if('s'==livro_biomedicas[i].Doacao)
            {
                printf("\nObra doadas da area de ciencias biomedicas\n\n\n");
                imprime_dados_biomedicas(i);
            }
            else
            {
                cont++;
            }
        }
    }
}
if(cont==30)
{
    printf("\nNenhum livro doado!\n");
    system("cls");
}
system("pause");
}

int altera_registro()
{
int i, a, b,cont=0;
printf("\n\nDigite o Codigo de area da obra:\n [1] para exatas\n [2] para humanas\n [3]   para biomedicas  \n Sua opcao: ");
scanf("%d",&a);
printf("\n\nDigite o Codigo de Catalogacao:  \n");
scanf("%d",&b);
for(i=0; i<10; i++)
{
    switch(a)
    {
    case 1:
        if(b==livro_exatas[i].Codigo_de_catalogacao)
        {
            system("cls");
            printf("\nLIVRO SELECIONADO: \n");
            imprime_dados_exatas(i);
            return i;
        }
        else
        {
            cont++;
        };
        break;
    case 2:
        if(b==livro_humanas[i].Codigo_de_catalogacao)
        {
            system("cls");
            printf("\nLIVRO SELECIONADO: \n");
            imprime_dados_humanas(i);
            return i;
        }
        else
        {
            cont++;
        };
        break;
    case 3:
        if(b==livro_biomedicas[i].Codigo_de_catalogacao)
        {
            system("cls");
            printf("\nLIVRO SELECIONADO: \n");
            imprime_dados_biomedicas(i);
            return i;
        }
        else
        {
            cont++;
        };
        break;
    }
}
if(cont==10)
{
    printf("\nLivro nao encontrado!\n");
    system("cls");
}
return 0;
}

void altera_codigo_de_catalogacao()
{
int novo_codigo, posicao;
posicao=altera_registro();
printf("\nDigite o novo Codigo de Catalogacao: ");
scanf("%d", &novo_codigo);
livro_exatas[posicao].Codigo_de_catalogacao=novo_codigo;
system("cls");
}

void altera_nome_da_obra()
{
char novo_nome[50];
int posicao;
posicao=altera_registro();
printf("\nDigite o novo Nome da Obra: ");
scanf("%s", &novo_nome[50]);
livro_exatas[posicao].Nome_obra[50]=novo_nome[50];
system("cls");
}

void altera_nome_do_autor()
{
char novo_autor[50];
int posicao;
posicao=altera_registro();
printf("\nDigite o novo Nome do Autor: ");
scanf("%s", &novo_autor[50]);
livro_exatas[posicao].Nome_autor[50]=novo_autor[50];
system("cls");
}

void altera_editora()
{
char nova_editora[50];
int posicao;
posicao=altera_registro();
printf("\nDigite a nova Editora: ");
scanf("%s", &nova_editora[50]);
strcpy(livro_exatas[posicao].Editora[50],nova_editora[50]);
system("cls");
}

void altera_paginas()
{
int novo_paginas, posicao;
posicao=altera_registro();
printf("\nDigite o novo Numero de Paginas: ");
scanf("%d", &novo_paginas);
livro_exatas[posicao].Num_paginas=novo_paginas;
system("cls");
}
  • 2

    You even posted a call for help with better work than people usually do. But it seems that much of the code posted is not necessary for the problem. See: http://answall.com/help/mcve. In addition it seems to me that you have 3 unrelated problems. This would possibly make the question too broad. Perhaps it would be nice to separate the 3 problems into different questions. It would be easier to create the minimal, fully verifiable code and help people to help you objectively. Let’s see other opinions on this.

  • Thank you so much, I came here today and I’m still learning...

  • @Welcome to Stackoverflow in English! Although your answer has been closed, I see you got off to a good start. Feel free to post new questions to help you solve specific problems. Just avoid questions "3 in 1" and with lots of code as it makes it difficult for those who will answer.

1 answer

5


When you discover that your program does not work for some reason, try to do your best to isolate the problem. The first step is usually to find an automated way to reproduce the problem, that is, to make a program that does not depend on any user input and that when executed clearly shows the unexpected behavior.

With this program in hand, you must reduce the scope of your problem. Use the principle of binary search to know where it is, by deleting parts of the code and replacing it with blocks that do nothing or fixed values until your problem is gone. In the end you will have such a small amount of code that the problem will be obvious and it is very likely that you can find it yourself. If not, you can always come to Stack Overflow for help.

What I see popping out of my eyes at a quick glance at your code is as follows:

scanf("%s",&livro_exatas[exatas].Nome_obra[50]);

Your scanf expects to receive in the second argument a pointer from where it should start to put the data. When you write &livro_exatas[exatas].Nome_obra[50] is passing a pointer to the fifty-first element of the array. Since it only has fifty elements, this is actually the first element of the next struct array. The correct is to pass a pointer to the first element, thus: &livro_exatas[exatas].Nome_obra[0]. Or better yet, merely pass the array: livro_exatas[exatas].Nome_obra. When using an array in a context that is expected to be a pointer, it decay a pointer to the first element naturally.

Another problem here: what happens if the user type 70 letters? Remember, in your array only 49 fit. The scanf will write data to pieces of memory outside the array and that’s not cool. The solution is to specify a size limit for the string in the format. Change "%s" for "%49s".

Stay like this:

scanf("%49s", livro_exatas[exatas].Nome_obra);

I don’t know if there are other problems. It’s up to you to test and isolate.

  • Thank you very much, solved one of the problems already! now just need to replace one string by another and delete one of the entries...

Browser other questions tagged

You are not signed in. Login or sign up in order to post.