Ir ao conteúdo

Posts recomendados

Postado

Alguem poderia me ajudar em alocar dinamicamente esse codigo? tentei e não consegui, eu tenho que alocar dentro das funções ou no main?

deixei o codigo anexado, me ajuda pf 😕

 

desculpe se ficou mutito grande, o anexo ta ai para maior facilidade.

|| filmes.c ||

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "filmes.h"
#define TAM 30

//PROGRAMADOR JEDERSON YAGO / FRANCISCO RUAN
//DISCIPLINA: ALGORITMOS E ESTRUTURA DE DADOS I


struct ficha{
int codigo;
char filme[TAM];
float duracao;
char categoria[TAM];
char status;
int ativo;
};

struct ficha dados;
FILE *arq;
char resp;

/*Função para abrir o arquivo*/
void AbrirArquivo(char filme[]){

system("cls");

arq = fopen(filme, "rb+"); // associa ao arq fisico e, se arquivo nao existe, deve ser criado, rb = somente para leitura
if (arq == NULL) puts("NULL");
if (arq == NULL)

arq = fopen(filme, "wb+");// abre o arquivo depois - rb = escrita a partir do início do arquivo

puts("ARQUIVO ABERTO.");


}

/*Função para fechar o arquivo*/
void FecharArquivo() {

system("cls");

fclose(arq);

puts("ARQUIVO FECHADO.");

}

//Registra o filme 
void RegistrarFilme(){
char opcao;
do{
//Faz inclusão dos dados para registra o filme
system("cls");

fseek(arq,0,SEEK_END); // procura de uma certa posição do arquivo - arq, 0 = qtd bytes para deslocamento do cursor
//seek_end - começa do final para o início

puts("** INCLUSAO DE FILME ***\n");

printf("Codigo ......:");
fflush(stdin);
scanf("%d",&dados.codigo);

printf("Filme ..:");
fflush(stdin);
gets(dados.filme);

printf("Duracao do filme..:");
fflush(stdin);
scanf("%f",&dados.duracao);

printf("Categoria..:");
fflush(stdin);
gets(dados.categoria);

printf("Status..:");

puts("D = Disponivel");
puts("L = Locado");
fflush(stdin);

dados.status = toupper(getchar());

if((dados.filme == "") || (dados.filme == NULL))// tratamento para nome em branco
{
puts("ERRO DEVIDO A DADOS ERRADOS INSERIDOS");
puts("Deixou o campo FILME em branco");
puts("Os dados nao foram registrados no sistema");
}

else if(dados.codigo == NULL)//tratamento para codigo em branco
{
puts("REGISTRO RESTRINGIDO DEVIDO A DADOS ERRADOS INSERIDOS");
puts("Deixou o campo FILME em branco");
puts("Os dados nao foram registrados no sistema");
}

//Tratamento do status, restringe o usuário a colocar diferente de D ou L
else if((dados.status == 'D') || (dados.status == 'L') /*&& (dados.filme != NULL) || (dados.codigo != NULL)*/)
{
dados.ativo = 1;// Ativo = 1 quer dizer que existe, por que na função de exclusão, usaremos exclusão lógica colocando ativo = 0
fwrite(&dados,sizeof(struct ficha),1,arq);// escreve todos os dados no arquivo
}

else
{
puts("REGISTRO RESTRINGIDO DEVIDO A DADOS ERRADOS INSERIDOS");
puts("Ou você inseriu Status digitado errado, Somente digite D = disponivel ou L = locado");
puts("Deixou alguns dos campos em branco");
puts("Os dados nao foram registrados no sistema");
}

// se for errado o status, ele não registra os dados e dá a opcao de fazer uma nova inclusão
if (ferror(arq))
puts("ERRO!!");
printf("\nDESEJA INCLUIR OUTRO FILME <S/N>? ");
fflush(stdin);
opcao = toupper(getchar());
} //fim primeiro Do

while (opcao == 'S');
}


//Busca filme pelo código e exibe seu status se está locado ou não
int Buscar(int codigo)
{
int nreg = -1;

rewind(arq); //posiciona na primeira estrutura do arquivo

fread(&dados,sizeof(struct ficha),1,arq);//&dados aponta a estrutura a ser lida
//sizeof()o tamanho do arquivo, 1 quantidade de buscas, arq = arquivo

if (!ferror(arq))// se não retorna erro se der erro, entra no if

while (!feof(arq))//feof informa se chegou ao fim do arquivo, se for diferente entra no while
{
nreg++;

if ((dados.codigo) == codigo) // compara se o filme digitado tem na lista, se tem ele busca, ao invés de usar == tem que usar =

return(nreg);

fread(&dados,sizeof(struct ficha),1,arq); //fread, retorna um número inteiro correspondente a quantidade de bytes lidos

}

else

puts("ERROR!!");

return(-1);

}
// Função para buscar filme por categoria
int BuscarPalavra(char categoria[TAM])
{
int nreg = -1;

rewind(arq); //posiciona na primeira estrutura do arquivo

fread(&dados,sizeof(struct ficha),1,arq);//&dados aponta a estrutura a ser lida
//sizeof()o tamanho do arquivo, 1 quantidade de buscas, arq = arquivo

if (!ferror(arq))// se não retorna erro se der erro, entra no if

while (!feof(arq))//feof informa se chegou ao fim do arquivo, se for diferente entra no while
{

nreg++;

if (strcmp(dados.categoria, categoria) == 0) // compara se o filme digitado tem na lista, se tem ele busca, ao invés de usar == tem que usar =

return(nreg);

fread(&dados,sizeof(struct ficha),1,arq); //executa a leitura do arquivo
}

else

puts("ERROR!!");

return(-1);

}

//Função para fazer a locação do filme
void Locar() {

int codigo;
int nreg;

system("cls");

puts("** LOCAR FILME ***\n");

printf("Digite o codigo do filme para registrar a locacao ......:");
fflush(stdin);
scanf("%d",&codigo);

nreg = Buscar(codigo);

if ( nreg >=0 ) // se a busca for maior do que 0 ele achou e apresentará os dados achados e mudará o status automaticamente
{

if(dados.status != 'L')
{

printf("Status ..: %c\n",dados.status);
fflush(stdin);

dados.status = 'L';

printf("Novo Status..= %c: \n", dados.status);
puts("Status L = locado\n");

// Posiciona novamente o cursor sobre o registro desejado.
fseek(arq,sizeof(struct ficha) * nreg, SEEK_SET);//seek_set começa da posição corrente

fwrite(&dados, sizeof(dados), 1, arq);//escreve os novos dados no arquivo

if (!ferror(arq))//se não der erro
{
puts("");
puts("LOCACAO REALIZADA");
}

else
{
puts("ERROR!!");
}

}//fim if que filtra se nao esta locado

else
{
puts("");
puts("Filme ja se encontra em status L = Locado");
puts("Clique em enter para voltar ao menu principal");
}

system("pause");
}

else
puts("FILME NAO ESTA CADASTRADO OU NAO ESTA DISPONIVEL");
fflush(stdin);
getchar();
}

//Função para a devoluçao do filme
void DevolucaoFilme() {

int codigo;
int nreg;

system("cls");

puts("** DEVOLUCAO DO FILME ***\n");

printf("Digite o codigo do filme para registar a devolucao......:");
fflush(stdin);
scanf("%d",&codigo);

nreg = Buscar(codigo);

if ( nreg >=0 ) //if principal de busca se tem na lista o codigo digitado
{
    
if(dados.status != 'D')
{//if que filtra quem nao esta disponivel para devolver

printf("Status ..: %c\n",dados.status);
fflush(stdin);

dados.status = 'D';

printf("Novo Status..: %c -> Disponivel\n", dados.status);
puts("");
// Posiciona novamente o cursor sobre o registro desejado.

fseek(arq,sizeof(struct ficha) * nreg, SEEK_SET);// seek_set procura da posição corrente o cursor

fwrite(&dados, sizeof(dados), 1, arq);

if (!ferror(arq))

{
puts("DEVOLUCAO REALIZADA");
}

else
{
puts("ERROR!!");
}

}//fim if que filtra que nao esta devolvido para mudar o status

else
{
puts("");
puts("Filme ja se encontra em status D = Disponivel ou Devolvido");
puts("Clique em enter para voltar ao menu principal");
}

system("pause");

}//fim if principal de busca se tem na lista o codigo digitado

else
{
puts("FILME NAO ESTA CADASTRADO OU NAO ESTA DISPONIVEL");
fflush(stdin);
getchar();
}

}


//Função para exclui filme
void ExcluirFilme() {

char opcao;
int codigo;

int nreg;

system("cls");

puts("** EXCLUSAO DE FILME ***");

printf("Codigo do filme......:");
fflush(stdin);
scanf("%d",&codigo);

nreg = Buscar(codigo);

if ( nreg >=0 ) {

printf("num %d\n",nreg);
printf("Nome do filme..: %s\n",dados.filme);

printf("CONFIRMA EXCLUSAO DO FILME <S/N>?");
fflush(stdin);

opcao = toupper(getchar());

if (opcao == 'S') {
fseek(arq,sizeof(struct ficha) * nreg, SEEK_SET);//procura os dados da posição corrente (seek_set)
// Exclusão Lógica
dados.ativo = 0;// quando ativo = 0, ele é excluído logicamente
fwrite(&dados, sizeof(dados), 1, arq);//registra novos dados
if (!ferror(arq))

puts("FILME EXCLUIDO.");

else

puts("ERRO!!");
}

}

else

puts("FILME NAO ENCONTRADO.");
fflush(stdin);

getchar();

}

//Função para consultar filme
void ConsultarFilme(){

int codigo;
int nreg;

system("cls");

puts("** CONSULTA DE FILMES ***\n");

printf("Codigo do Filme ......:");
fflush(stdin);
scanf("%d",&codigo);

nreg = Buscar(codigo);

if ( nreg >= 0 ) // se não atingou -1, ele achou um codigo correspondente, e imprimirá o conteúdo, usado pelo função buscar
{
    
if(dados.status == 'D')
{
printf("num %d\n",nreg);
printf("Codigo: %d\n Filme ..: %s\n Categoria: %s\n Duracao: %.2f Hs \n Status: %c -> Disponivel\n", dados.codigo, dados.filme, dados.categoria, dados.duracao, dados.status);
}

else
{
printf("num %d\n",nreg);
printf("Codigo: %d\n Filme ..: %s\n Categoria: %s\n Duracao: %.2f Hs \n Status: %c -> Locado\n", dados.codigo, dados.filme, dados.categoria, dados.duracao, dados.status);
}

}
else
puts("FILME NAO ENCONTRADO.");
fflush(stdin);
getchar();

}

//Função para listar as categoria cadastradas
void listarCategorias()
{
rewind(arq); //posiciona na primeira linha do arquivo // inicia funcao mostra categoria

fread(&dados,sizeof(struct ficha),1,arq); //le os dados

puts("Categorias registradas para fazer a busca");
puts("");

if (!ferror(arq)) //se não der erro pela função ferror

while (!feof(arq)) //feof informa se chegou ao fim do arquivo, se for diferente entra continua no loop do while
{
if (dados.ativo)// o if identifica se o valor é verdadeiro automaticamente que é 1, se 1 ele existe, se 0,

//não existe, na função de exclusão, ter filmes que estarão com ativo = 0 e não aparecerão na listagem

printf("%s \n",dados.categoria);

fread(&dados,sizeof(struct ficha),1,arq); //le os dados selecionados
}

else
{
puts("ERROR!!");
fflush(stdin);
getchar();
}

puts("");

//Fim funcao mostra categorias
}

//Função para listar todos os filmes no arquivo
void ListarFilme()
{
system("cls");

puts("***** LISTA DE FILMES*****\n");

rewind(arq); //posiciona na primeira linha do arquivo

fread(&dados,sizeof(struct ficha),1,arq); //le os dados

if (!ferror(arq)) //se não der erro pela função ferror

while (!feof(arq)) //feof informa se chegou ao fim do arquivo, se for diferente entra continua no loop do while

{

if (dados.ativo)// o if identifica se o valor é verdadeiro automaticamente que é 1, se 1 ele existe, se 0,

//não existe, na função de exclusão, ter filmes que estarão com ativo = 0 e não aparecerão na listagem

printf("Codigo: %d \n Filme: %s: \n Duracao: %.2lf hs\n Categoria: %s\n Status: %c\n Ativo: %d \n\n",dados.codigo,dados.filme,dados.duracao,dados.categoria,dados.status,dados.ativo);

fread(&dados,sizeof(struct ficha),1,arq); //le os dados selecionados

}

else

puts("ERROR!!");
fflush(stdin);
getchar();
}


//Função para listar os filmes por categoria
void ListarFilmeCategoria()
{
char categoria[TAM];// variavel categoria para comparar durante a busca e imprimir caso seja condizente

system("cls");//limpa a tela do menu

puts("***** LISTA DE FILMES POR CATEGORIA*****\n");

// listarCategorias();

listarCategorias();//Funcao lista categorias registradas para facilitar a busca

puts("Digite a categoria de filmes");
scanf("%s",&categoria);

rewind(arq); //posiciona na primeira linha do arquivo, para começar a busca do começo

fread(&dados,sizeof(struct ficha),1,arq);

if (!ferror(arq)) // se for diferente de erro da função ferror

while (!feof(arq)) //feof informa se chegou ao fim do arquivo, se for diferente entra continua no loop do while

{

if (strcmp(dados.categoria, categoria) == 0)// comparando pelo strcmp se for igual, imprime os dados da struct que o cursor está buscando dados

printf("Codigo: %d \n Filme: %s: \n Duracao: %.2lf hs\n Categoria: %s\n Status: %c\n Ativo: %d \n\n",dados.codigo,dados.filme,dados.duracao,dados.categoria,dados.status,dados.ativo);

fread(&dados,sizeof(struct ficha),1,arq); //fread, retorna um número inteiro correspondente a quantidade de bytes lidos
}

else

puts("ERROR!!");
fflush(stdin);
getchar();
}

//Função para excuir todos os filmes do arquivo
void excluirTodos(){
    int op;
    printf("Deseja Realmente excluir todos os filmes? \n [1-Sim ou 2-nao]: ");
    scanf("%d",&op);
    if (op == 1){
        struct  ficha;
        FILE * arquivo;
        arquivo = fopen("FILMES.txt","w");
        printf("Todos excluidos com Exito!");         
        fclose(arquivo);
    }
    getch();
}

/*void libera(){
    free(dados);
}*/

//Função menu
void Menu() {

system("cls");

system("color 1F");

puts("|-----------------------------------------------|");
puts("|  Programador: JEDERSON YAGO / FRANCISCO RUAN  |");
puts("|-----------------------------------------------|");
puts("|         PROGRAMA DE CONTROLE DE LOCADORA      |");
puts("|----------------------MENU---------------------|");
puts("|                                               |");
puts("|           1. Inclusao Filmes                  |");
puts("|           2. Consulta Filmes por codigo       |");
puts("|           3. Locar um Filme                   |");
puts("|           4. Devolver um Filme                |");
puts("|           5. Excluir Filme                    |");
puts("|           6. Listar Filmes                    |");
puts("|           7. Listar Filmes por categoria      |");
puts("|           8. Excluir todos os filmes          |");
puts("|           0. Sair                             |");
puts("|                                               |");
puts("|-----------------------------------------------|\n");
}

//Função para a escolha da opção desejada
void opções(){

int opcao;

do{
Menu();
printf("Selecione uma opcao: ");
scanf("%d", &opcao);

switch(opcao)
//usando switch case, chamamos as funções de acordo com as opções escolhidas
{

case 1: RegistrarFilme(); break;

case 2: ConsultarFilme(); break;

case 3: Locar(); break;

case 4: DevolucaoFilme(); break;

case 5: ExcluirFilme(); break;

case 6: ListarFilme(); break;

case 7: ListarFilmeCategoria(); break;

case 8: excluirTodos();

case 0: puts("Programa finalizado"); break;

default:

puts("Opcao Invalida");

}

} while (opcao != 0);

}



|| filmes.h ||



#define FILMES_H_INCLUDED
#ifndef FILMES_H_INCLUDED

//PROGRAMADOR JEDERSON YAGO / FRANCISCO RUAN
//DISCIPLINA: ALGORITMOS E ESTRUTURA DE DADOS I

typedef struct ficha ficha;

AbrirArquivo(char filme[]);

FecharArquivo();

RegistrarFilme();

Buscar(int codigo);

AlterarStatus();

DevolucaoFilme();

ExcluirFilme();

void excluirTodos();

ListarFilme();


#endif



|| main ||



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "filmes.h"
#define TAM 30

//PROGRAMADOR JEDERSON YAGO / FRANCISCO RUAN
//DISCIPLINA: ALGORITMOS E ESTRUTURA DE DADOS I

int main(){
system("cls");
AbrirArquivo("FILMES.txt");
opções();
FecharArquivo();
system("pause");

}

Nova pasta (4).rar

Postado

Alocação dinâmica faz sentido apenas quando deseja-se guardar muitos dados na memória, ou quando a quantidade de dados é indeterminada podendo ser arbitrariamente grande.

 

Este programa usa apenas 1 variável da struct para fazer qualquer coisa, ou seja apenas dados sobre 1 filme está na memória da struct a qualquer momento, nunca lê e armazena em um vetor de structs o arquivo de filmes inteiro, o programa apenas pega do arquivo os dados de 1 filme por vez e realiza as operações necessárias (impressão, alteração, comparação, etc).

 

Então pela lógica usada no programa não é necessário alocar memória dinamicamente, e não faz sentido fazê-lo.

 

Mudar a lógica para trabalhar com todos os dados dos filmes na memória em um vetor de struct alocado dinamicamente, ao invés de lendo 1 por 1 do arquivo toda vez, basicamente requer mudar a lógica do código inteiro, o que seria quase o mesmo que fazer o programa do zero...

 

Mas fazer programas para outros os usuários não é a proposta desse fórum, podemos apenas te ajudar tirando dúvidas ou fazendo correções no seu código.

 

 

Notei também que esse código na verdade é basicamente este código antigo de 2013 modificado:

E não consta a autoria original no seu código.

 

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!