Working with Struct and problem in print, changing Struct and deleting a Struct [closed]

3

I have a job of the faculty to do that is to create a struct of "Library Register" (cataloging code, name of the work, name of the author, publisher, donated works of each area, number of pages) with options of "Register book, search for cataloging code and area, display donated books, change a register and delete a record". The books should be divided into 3 areas (human, exact and biomedical) and each area houses a maximum of 30 books. Oh, 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.

-A part of struct q is char is not changed when option is selected

- I do not have the slightest idea how to delete a bookmark (in this 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");
}
    
asked by anonymous 19.06.2014 / 19:20

1 answer

5

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

With this program in hand, you should narrow down the scope of your problem. Use the binary search principle to know where it is, go deleting parts of the code and substituting blocks that do nothing or set values until your problem adds up. 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 will be able to find it yourself. If not, you can always come to Stack Overflow for help.

What I see jumping into your eyes at a glance at your code is this:

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

Your scanf expects to receive in the second argument a pointer from where it should start with the data. When you type &livro_exatas[exatas].Nome_obra[50] you are passing a pointer to the fiftieth element of the array. Since it only has fifty elements, this is actually the first element of the next array of the struct. The correct thing is to pass a pointer to the first element, like this: &livro_exatas[exatas].Nome_obra[0] . Or better yet, just pass the array: livro_exatas[exatas].Nome_obra . When you use an array in a context that expects a pointer, it decays to a pointer to the first element naturally.

Another problem here: What happens if the user types 70 letters? Remember, your array fits only 49.% w / w% will write data to pieces of memory outside of the array and this is not legal. The workaround is to specify in the format a size limit for the string. Change% with% by% with%.

It looks like this:

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

I do not know if there are other problems. It's up to you to test and isolate.

    
19.06.2014 / 19:54