Ir ao conteúdo

Posts recomendados

Postado

Estava vendo um video no YouTube quando cheguei em um exemplo que não consegui resolver e o rapaz do canal não deu continuidade ao vídeo, gostaria de alguém com habilidades em estrutura de dados aplicado em C pra me ajudar a entender os dois exemplos.

Se alguém me ajudasse comentando as linhas pra eu entender cada ação, seria eternamente grato.
Manda responde pra nós trocar uma ideia tlgd

exemplos canal dev.docx

Postado

@Lucca Rodrigues

Esse é o enunciado.

 

1. A partir do TAD lista, escreva uma função que receba um ponteiro de vetor de int e  seu tamanho, e o converta em uma lista de float. Se o vetor estiver vazio, deve  retornar uma lista vazia. A função segue o protótipo: 

Em um código cliente, aloque o vetor dinamicamente, atribua valores a ele, utilize a  função acima e imprima na tela a lista criada. 
2. Você foi contratado para desenvolver um software de cadastro de uma grande empresa  varejista. A empresa não lhe repassou exatamente o que será cadastro (livros, produtos em geral, clientes), portanto, você decidiu dar um passo à frente e desenvolver um  sistema simples por conta própria, para demonstrar suas capacidades. O software que  você decidiu fazer utiliza uma estrutura dinâmica para armazenar os dados – mais  especificamente, uma lista encadeada. O tipo de dado armazenado fica a seu critério,  sendo que você deve definir um tipo, o qual ficará armazenado na lista da seguinte  forma: 
struct listano2 { 
Tipo* info; 
ListaNo* ant; 
ListaNo* prox; 
}; 
Ou seja, os nós da lista duplamente encadeada devem conter um dado individual do  tipo que você escolher. O tipo criado deve ter, no mínimo, 3 membros. Crie uma  segunda lista, chamada “lixeira”, para onde vão os itens removidos. 
Para que seu programa se mostre mais interativo, você decidiu fazer um menu  interativo, onde o usuário tem a opção de: cadastrar novo item, buscar um item baseado em algum critério (você escolhe quais), remover um item baseado em algum  critério (você escolhe quais), remover n itens dentro de um intervalo (ex: do 1 ao 4),  imprimir a lista inteira (exibir mensagem se vazia), imprimir dentro de um intervalo,
apagar a lista inteira (exibir mensagem se vazia) liberando sua memória, imprimir a  lixeira (exibir mensagem se vazia), esvaziar a lixeira liberando sua memória.

 

DICAS:

• Use switch-case e separe cada opção do menu em uma função específica;
• Tipo* info é um ponteiro do tipo que você vai criar, portanto lembre-se que 
o acesso é feito por ->;
• Use a função system(“cls”) da biblioteca <windows.h> para limpar a tela 
após cada procedimento para a leitura ficar mais clara;
• Para leituras de strings do teclado, use as funções fflush(stdin) antes de 
cada leitura e gets(nome_variável) para realizar a leitura.

@Lucca Rodrigues

não consegui criar uma logica acho que ver o exercicio resolvido e comentado pode me ajudar.

 

Postado
22 minutos atrás, aprendiz universal disse:

não consegui criar uma logica acho que ver o exercicio resolvido e comentado pode me ajudar.

 

Acho que o @Lucca Rodrigues vai concordar que você ver o exercício em questão resolvido E comentado pode ajudar. Um ☕ talvez fosse legal também! Um lanche? Tudo ajuda.

 

Vou fazer menos e só escrever umas notas 

 

Sobre o enunciado:

 

Os dois problemas são o mesmo. Se tiver escrito o segundo item acho que dá pra imaginar que se definir

 

    #define float Tipo


fica tudo igual. Alocar o vetor dinamicamente envolve uma chamada a malloc(). Nada mais. E claro, ao final uma chamada a free() para liberar o tal vetor. 

 

Esse item 1 é meio besta, ainda mais por supor uma implementação de lista que será aparentemente criada no item seguinte (!)

 

Sobre as "DICAS"
 

DICAS:

• Use switch-case e separe cada opção do menu em uma função específica;
• Tipo* info é um ponteiro do tipo que você vai criar, portanto lembre-se que 
o acesso é feito por ->;
• Use a função system(“cls”) da biblioteca <windows.h> para limpar a tela 
após cada procedimento para a leitura ficar mais clara;
• Para leituras de strings do teclado, use as funções fflush(stdin) antes de 
cada leitura e gets(nome_variável) para realizar a leitura.

 

  • Não existe switch-case. Existe um comando switch. E case é o prefixo dos labels desse comando.
  • Tipo* info não é um ponteiro. info é o ponteiro. E aponta para algo do tipo Tipo, e claro que não foi uma escolha feliz de nome :) apesar de divertida.
  • system("cls") não é uma função. system() é a função. "cls", do tipo const char*, é o argumento. E system não fica em windows.h. Ou teria dificuldades de usar em Mac ou Linux ;) 
    Nunca use system(). É proibida em muitos lugares e não faz nada usando system: apenas passa uma string para o sistema. system("Entrar em órbita")  não põe um satélite em órbita. Só passa uma mensagem. Aqui mesmo nesse forum pode encontrar várias funções para "limpar a tela".
  • Não deveria usar fflush() em stdin, sequer está definida para fluxos de entrada, como o teclado. E NUNCA deve usar gets(), condenada há décadas, marcada como obsoleta e sequer aceita em alguns compiladores.
     

Uma pena ter DICAS assim. Imagino que a aula seja bem folclórica, apesar de que você disse que isso estava no Youtube.
 

21 horas atrás, aprendiz universal disse:

quando cheguei em um exemplo que não consegui resolver e o rapaz do canal não deu continuidade ao vídeo

 

E não me surpreende que o autor sequer tenha dado continuidade ao tal vídeo.

 

Sobre a tal "TAD" lista

 

/*
O tipo de dado armazenado fica a seu critério,  sendo que você deve definir um tipo,
o qual ficará armazenado na lista da seguinte  forma: 
*/

struct listano2
{ 
    Tipo* info; 
    ListaNo* ant; 
    ListaNo* prox; 
}; 

 

Isso não está bem escrito.

 

A lista, como qualquer outra dessas estruturas, é um container. o A de TAD significa ABSTRATO e isso porque a lista é um container e pode "conter" qualquer coisa, e nesse ponto o texto do enunciado é bacana.

 

E essa estrutura acima seria a descrição de um dado. O dado para a lista é geralmente chamado de nó ou node. E dentro do node tem uma chave, que identifica um registro para efeito de comparação. E tem em geral um dado, uma informação. Em programas de exercício para iniciantes muitas vezes a chave é o único dado: lista de int, lista de char, lista de float como o seu item 1.

 

Eis uma descrição comum de lista, bem de acordo com o seu item 1
 


typedef float Tipo;

typedef struct no_
{
    Tipo*      item;
    struct no_* proxima;
    struct no_* anterior;

}   Node;  // um no

typedef struct 
{
    char*     nome;
    unsigned  quantos;
    unsigned  maximo;
    Node*     inicio;
    Node*     fim;

}   Lista;

 

Para o item 2 você apenas usaria um Tipo diferente, com ao menos 3 campos, como exemplo uma ficha de entrada com o nome, hora de chegada e a senha do cliente,. aplicável a uma certa quantia de situações práticas...
 

typedef struct
{
    char*       nome;
    char*       entrada; // "dd/mm/aaaa hh:mm:ss"
    unsigned    senha;

}   Tipo;

 

E acho que entende porque a lista é ABSTRATA. Muda o tipo não muda NADA nas funções.

 

Na verdade em geral se programa isso em C usando um ponteiro void no nó, ao invés de usar Tipo. Assim nunca precisa pensar nisso mais. void* é p que basta.

 

Em resumo, numa definição formal, a lista é um container S de dados X0 X1...XN onde cada cada dado X tem uma chave k e opcionalmente um registro de dados D identificado por essa chave.

 

No exemplo acima a chave provável seria a senha, mas poderia ser o nome ou simplesmente a hora de chegada. O lance da chave é que ela envolve o essencial conceito de ordem nessas estruturas.

 

 

 

 

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!