Ir ao conteúdo
  • Cadastre-se

C Atribuir os elementos do vetor a uma lista encadeada


UmPrograma

Posts recomendados

Boa tarde, como vão?

 

Estou tentando passar um vetor de n elementos a uma estrutura, na qual os nós da lista corresponderão a cada valor do vetor.

Se o primeiro número for 2, o primeiro nó terá como número o número do 2. E assim sucessivamente.

 

Mas não estou conseguir atribuir a struct os valores do vetor.

Tentei resolver com um recursividade, mas não está dando certo.

 

Alguma sugestão?

 

Segue o código:

 

//Questao 06. Implemente uma função que recebe um vetor de valores inteiros com n elementos e construa
// uma lista encadeada armazenando os elementos do vetor nos nós da lista.
#include <stdio.h>
#include <stdlib.h>
struct lista{
    int info;
    struct lista *prox;
};
typedef struct lista Lista;

void inicia(Lista *node){
    node->prox=NULL;
}
int vazia(Lista *node){
    if(node->prox==NULL){
        return 1;
    }
    else
        return 0;
}

Lista *constroi(int n, int *v){
    Lista *novo=(Lista*)malloc(sizeof(Lista)*n);
    if(!novo){
        printf("\nSem memoria disponivel!\n");
        exit(1);
    }


    if(n==0){
        return novo;
    }
    else{
        novo->info=v[n];
        constroi(n-1, v);
    }
}

void exibir(Lista *node){
    if(vazia(node)){
        printf("Lista vazia!\n");
        return;
    }
    Lista *temp;
    temp = node->prox;
    while(temp!=NULL){
        printf("%d\n", temp->info);
        temp=temp->prox;
    }
}

int main(){
    Lista *node = (Lista*)malloc(sizeof(Lista));

    int n, i;
    printf("Informe o tamanho do vetor: ");
    scanf("%d", &n);
    int *v;
    v=(int *)malloc(n*sizeof(int));

    printf("\nEntre agora com os valores do vetor.\n");
    for(i=0;i<n;i++){
        printf("Vetor [%d]: ", i);
        scanf("%d", &v[i]);
    }
    constroi(n,v);

    exibir(node);

}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Josesousa disse:

Alguma sugestão?

Olá tudo bem!

 

  

"O coletivo de nós é lista": Então, não se ofenda com que vou dizer: Pois primeiro você tem que implementar a lista (seus métodos operacionais) somente depois constrói a função que recebe um vetor e retorna uma lista com elementos do vetor.

 

Disso, toda lista é um conjunto com operações de conjuntos, por exemplo: adicionar, remover, buscar, comparar, exibir e organizar nós, os nós são os elementos do conjunto que é uma lista.

 

Para o SEU problema precisamos agora de apenas 3 métodos para conjuntos (listas): adicionar, novo e exibir nós do conjunto  (lista). 

 

Dos 3 importantes (segundo eu) você somente fez 1: exibir e outra chamada constroi que na verdade é Uma Senhora Gambiarra.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@AnsiC A função exibir nem esta funcionando pois a gambiarra nao esta!

 

E o que seria essa funcao novo?

 

Poderia me ajudar a identificar o erro da funcao constroi e como fazer a funcao novo?

adicionado 50 minutos depois

 

 

@AnsiC  O que é essa funcao novo? (nao encontrei em lugar algum algo assim, somente as velhas criar, inserir, retirar, exibir, liberar)

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

 

 

@Josesousa Talvez se eu tivesse escrito new você teria associado ao new do C++, que é a mesma coisa de novo.

Criar pode até ser, mas prefico novo criar tem sentido a longo prazo, já novo é imediata, enfim essa discussão não importa VOCÊ tem muito o que fazer.

 

Exemplo 1

void * novo_vazio( void )
{ void * novo= malloc( sizeof (node_t) );
  if( novo )return( novo );
  
  printf( "Falha ao alocar novo nó\n" );
  return( NULL );
}

 

Exemplo 2

void * novo_dados( int info )
{ node_t * novo= novo_vazio();

  if( novo )return( (* novo)= (node_t){ info, NULL }, novo );
  return( NULL );
}
Em 02/11/2018 às 16:17, Josesousa disse:

identificar o erro da funcao constroi

Toda ela > < para o meu gosto. Mas pode ser que para a maioria não.

 


Atualização: Exemplo 3

Lista * lista_new( int info )
{   Lista * nova= malloc( sizeof (lista) );

    if( NULL == nova )printf( "Falha alocar memoria\n" );
    else (* nova)= (lista){ info, NULL };
    
    return nova;
}
 
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@AnsiC

18 minutos atrás, AnsiC disse:

Toda ela > < para o meu gosto. Mas pode ser que para a maioria não.

Desculpe, mas assim fica um pouco difícil. Estou tentando entender e você está tratando o MEU problema como algo banal e que fosse como puramente consequência da minha falta de interesse. O que não é!

 

Dizer que a função está errada não está ajudando. Isso eu percebi quando o programa não rodou e as demais funções funcionava. Preciso saber onde estou errando, não quero que VOCÊ resolva MEU problema, mas que me ajude apenas a identificá-los, SE possível.

 

Sobre o operador new, se ele se tratar realmente sobre alocação dinâmica (não conheço muito bem o C++) eu acho que eu fiz. Mas no corpo principal, main.

 

TEMOS muito o que aprender ainda, não é mesmo?

 

  • Curtir 1
  • Haha 1
Link para o comentário
Compartilhar em outros sites

Sua sorte é que você deve ter uns professores bem bacanas e cariosos, aqui é porrada,  se Dr. João pegar um código desse, ele manda o aluno enfiar lá dentro do kú. Agente brinca desse jeito por aqui EGO de aço.

 

Isso é tão comum por aqui, é como dizem; costume de casa vai a praça. Mais me desculpe eu não saberia como ajudar você a partir do que você fez, e do que você sentiu.

 

@Josesousa Mas se você resolver fazer um código mais genérico (menos particular) talvez possa na discussão chegarmos a uma solução comum, foi exatamente por isso sugeri antes fazer um programa completo de listas, para depois recorrer a função principal do problema, ou seja, sem gambiarra. 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olá. Desculpa me intrometer, mas o exercício é referente a uma lista encadeada, porém, em nenhum momento está sendo definido o encadeamento da lista

Se uma lista tem os elementos 1, 2 e 3

Seria isso: 1 -> 2 -> 3, ou seja, o elemento 1 da lista aponta para o próximo elemento, que é o 2, o 2 também tem um aponta para o próximo elemento, que é o 3, O primeiro elemento da lista é aquele que não é apontado por ninguém, enquanto o último aponta para NULL

Pelo código mostrado pelo @Josesousa é importante ajustar algumas funções

Para inicializar uma lista:

Lista *inicializa() {
    return NULL;
}

Para verificar se a lista está ou não vazia:

int vazia(Lista *node) {

    if (node == NULL) {
        return 1;
    }
    else
        return 0;
}

Essa função acima pode ser simplificada dessa forma:

int vazia(Lista *node) {
    return (node == NULL); // se node é igual a NULL a função vai retornar 1, senão retorna 0
}

Para mostrar os elementos da lista:

void exibir(Lista *node) {

    Lista *temp = node; // ponteiro para percorrer a lista

    if (vazia(node)) {
        printf("Lista vazia!\n");
        return;
    }

    while (temp != NULL) {
        printf("%d\n", temp->info);
        temp = temp->prox;
    }
}

Com essas funções ajustadas, aí é preciso claro inserir os elementos na lista já acertando o encadeamento da lista, seja inserindo cada elemento no início da lista ou no meio, tal como no final da lista

Pelo que é dito nessa parte do enunciado:

19 horas atrás, Josesousa disse:

Se o primeiro número for 2, o primeiro nó terá como número o número do 2. E assim sucessivamente

Os elementos devem ser inseridos no final da lista

Só que passar o exercício resolvido não é algo que se deva fazer

Só vou passar uma forma de implementar a função para criar (construir) um novo nó:

Lista *constroi(int v) {

    Lista *p = malloc(sizeof(Lista)); // aqui não é preciso o uso do casting para a função malloc
    if (!p) {
        printf("\nSem memoria disponivel!\n");
        exit(1);
    }
    p->info = v;

    return p;
}

O que essa função faz é basicamente criar e inicializar um novo nó

Ela pode ser usada na função para inserir os elementos na lista (deve)

 

@Josesousa Apenas uma ponto: para o retorno da função malloc não se usa o casting, tal como está fazendo, além de desnecessário pode te induzir ao erro!

 

Só que agora vou deixar contigo @Josesousa para implementar a função de inserir os elementos na lista, já fazendo para isso o uso da função que cria e inicializa um novo nó e também ajustando o encadeamento da lista

 

Se tiver alguma dúvida é só perguntar! 😉

adicionado 13 minutos depois

No main, para inicializar a lista seria isso:

Lista *node = inicializa();

que é o mesmo que isso:

Lista *node = NULL;

obs: Não é necessário alocar memória aqui novamente, pois a memória está sendo alocada a medida que um novo nó é inserido na lista

 

@Josesousa Comecei a aprender sobre lista encadeada tanto no curso de C que fiz e também com esse tutorial, que o instrutor desse curso me recomendou:

 

Cap 10 - Lista Encadeada.pdf

 

Se der uma olhada nesse tutorial vai passar a entender bem a respeito de lista encadeada e saber exatamente o que é feito em cada função que é mostrado no mesmo, pois é tudo muito bem explicado

E aí, acredito que vai conseguir resolver o exercício

 

Boa sorte!

Link para o comentário
Compartilhar em outros sites

@giu_d   A pergunta completa....apenas para que fique mais claro o que estava tentando resolver.150362835_questao06deestruturadedados.png.09c1c499906774bee350f3064feb88a7.png

 

Valeu pela ajuda, @giu_d

Sobre o livro, capítulo, vou esta lendo para conseguir resolver o exercicio.

 

Obrigadão 🙂

 

@AnsiC

15 horas atrás, AnsiC disse:

Sua sorte é que você deve ter uns professores bem bacanas e cariosos, aqui é porrada,  se Dr. João pegar um código desse, ele manda o aluno enfiar lá dentro do kú. Agente brinca desse jeito por aqui EGO de aço.

Meus professores aqui não são essa moleza não. Federal não é fácil não amigo. E sobre enfiar no ... achei desnecessário.

(Acho que nunca vou entender essa falta de empatia por parte de alguns, não me refiro a você)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

6 horas atrás, AnsiC disse:

a função que transfere os dados do vetor para uma lista dinâmica é a coisa mais fácil do mundo.

Não mesmo.

 

adicionado 26 minutos depois

 

 

@giu_d   Faz sentido eu colocar no main um for e ir passando valor do indice de cada vez?

 

for(i=0;i<n;i++)
    inserir(node,v[i]);
                 
                 
//E a funcao ser a seguinte
Lista* inserir(Lista *node, int v){
    Lista* novo= (Lista*)malloc(sizeof(Lista));
    if(!novo){
        printf("SEM MEMORIA!\n");
        exit(1);
    }
   	novo->info = v;
   	novo->prox = NULL;

}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@AnsiC Porque que quando vou preencher eu crio uma lista, mas na hora de exibir eu exibo a que foi criado no corpo principal????

adicionado 8 minutos depois

 

 

Poderia olhar a funcao constroi.

Lista *constroi(int n, int *v){
    Lista *novo = malloc(sizeof(Lista));

    int i=0;
    for(i=0;i<n;i++){
        novo->info=v[i];
        novo=novo->prox;
    }

    return novo;
}

 

Eu apaguei e comecei tudo de novo. Mas acho que ainda cometo os mesmos erros, mesmo com as funcoes sendo diferentes.

adicionado 11 minutos depois

 

 

@AnsiC Acho que nao estou preenchendo a lista node. Não sei.

adicionado 20 minutos depois

 

Eu poderia construir o vetor dentro da funcao, mas nao é o que o exercicio pede. Me ajuda.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Josesousa disse:

Porque que quando vou preencher eu crio uma lista, mas na hora de exibir eu exibo a que foi criado no corpo principal????

@Josesousa Aqui no curso de Física tanto quando para criar, quanto para quando exibir listas chamamos métodos (funções se em C) porque o usuário (aqui é outro programador) não pode ter acesso a implementação da lista, apenas usar os método que são suas ações.

 

O  que Programador tem que fazer para usar uma lista e suas ações é dedicar um ponteiro para ela, esse ponteiro dependendo da lógica da implementação é o que os ingleses chamada de head/ cabeça /essa cabeça tem apenas dois valores possíveis: NULL ou não NULL. Então quando eu crio um elemento e adiciono seu apontador para o ponteiro cabeça (head) estou preenchendo uma lista, na verdade, a ideia de lista no contexto do problema é abstrato, pois todo ponteiro qualquer do tipo que chamamos pode ser chamado também de lista, se esse ponteiro é NULL, então é uma lista vazia.

Logo o máximo de ações com minha lista devem ser por meio métodos Para Criar e Para Exibir.

 

Não se pode sobrecarregar uma função, quando focamos no principio de qualidade falamos de dos termos muito presentes engenharia de software: Alta coesão e Baixo acoplamento, não vou falar muito sobre essas duas palavras se ficou curioso pesquise-as, em resumo as boas práticas e culturas de linguagem vêm desde de 1970 mais profundamente 2000 introduzindo uma ideia da programação eficiente (atualmente a eficiência é muito mais uma questão de software que somente de Hardware), tanto para execução quando para manutenção; legibilidade de código o princípio básico que não se pode conseguir se responsabilizar um método por todas as questões da tarefa.

 

A conseqüência de boas práticas é: mais eficiência, legibilidade, manutenção e otimização de código mais rápido.

 

Donald Ervin Knuth foi um dos pioneiros dessa ideia ainda 196x.

 

 

adicionado 49 minutos depois

Estou tendo um delay nas mensagem, até então só tinha uma pergunta,  mais as resposta estão relacionadas.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

 

4 horas atrás, Josesousa disse:

Lista *constroi(int n, int *v){ 
  Lista *novo = malloc(sizeof(Lista)); 
  
  int i=0; 
  for(i=0;i<n;i++){ 
  	novo->info=v[i];
  	novo=novo->prox; 
  } 
  return novo;
}

 

Observe que sua função tem alguns responsabilidades que são de ações da lista.

  1. Alocando memória
  2. Operando ligações entre nós

 

O que eu proponho para sua função é que ela percorra o vetor adicionando os elementos a lista até o fim com retorno da lista criada. Para criar a lista a função chama método de criar, para adicionar sua função chama o método de adicionar.

Lista * constroi( int n, int * v )
{	Lista * inteiros= lista_create();
  
  	for( int i= 0; i < n; ++i )
  	{	lista_add( &inteiros, lista_new(* (v + (i)) );	}
  
  	return inteiros;
}
Link para o comentário
Compartilhar em outros sites

@Josesousa Olá. Vamos por parte: Pelo q vi q você procurou fazer, basicamente, é tentar inserir os elementos no início da lista. Mas isso não resolve o problema, os elementos devem ser inseridos no fim da lista (No tutorial é ensinado como fazer isso) Se você entender a lógica que é ensinada no tutorial para inserir tanto no início da lista como no meio (tbém no fim) e colocar dentro de um loop do modo como fez, você resolve o exercício.

Se você inserir os elementos no início da lista somente, vai acontecer o seguinte: insere os elementos 1, 2 e 3. Com isso,a sua lista ficará assim: 3, 2, 1 e não é isso que o exercício pede

Se você inserir no final os mesmos elementos: 1, 2 e 3 aí sua lista ficará assim: 1, 2, 3 e é isso q queremos. Entendeu essa parte?

No tutorial q passei é mostrada uma forma de fazer isso (inserir no final), só q a diferença é q não podemos passar como parâmetro da função constroi o ponteiro do tipo Lista que é usada no main. Para contornar isso d forma simples, crie um ponteiro do tipo Lista com escopo global, use ele para percorrer a lista na função constroi e também no main

 

Obs: A princípio, recomendo dar uma olhada no tutorial e aprender a criar uma função para inserir os elementos no final da lista. Depois q conseguir isso, aí sim passe para esse exercício do tópico

 

Qualquer dúvida é só perguntar! 

Dica: No tutorial, a lógica para inserir no fim da lista, é passada na função q é mostrada como inserir ordenado

@Josesousa Dá uma olhada na pags. 7 e 8 do tutorial (Figura 9.6) 😉

Link para o comentário
Compartilhar em outros sites

@AnsiC  Porque voce esta passando o endereco da estrutura lista (&inteiro)?

 

Em 03/11/2018 às 20:57, giu_d disse:

Se você inserir os elementos no início da lista somente, vai acontecer o seguinte: insere os elementos 1, 2 e 3. Com isso,a sua lista ficará assim: 3, 2, 1 e não é isso que o exercício pede

Se você inserir no final os mesmos elementos: 1, 2 e 3 aí sua lista ficará assim: 1, 2, 3 e é isso q queremos. Entendeu essa parte?

@giu_d Mas nesse caso seria apenas eu mudar o for e ir pegando os ultimos numeros do vetor (acho que fazendo com que o for ja comece no 'n'). Mas nem isso adiantaria pois o codigo não funciona da forma como esta, preenchendo de tras para frente.

adicionado 18 minutos depois
Em 03/11/2018 às 17:45, AnsiC disse:

Observe que sua função tem alguns responsabilidades que são de ações da lista.

  1. Alocando memória
  2. Operando ligações entre nós

@AnsiC Percebo que voce esta falando para criar uma funcao para cada comando, mas acho mais pratico assim. Principalmente que se nao estou conseguindo fazer so uma funcao, imagina criar um monte. Já estou muito perdido.

Link para o comentário
Compartilhar em outros sites

46 minutos atrás, Josesousa disse:

Porque voce esta passando o endereco da estrutura lista (&inteiro)?

Porque nesse caso a função que adiciona o nó a lista não retorna a lista, retorna o ponteiro do novo nó. Mas para não se confundir a ideia ainda veja como fica normalmente.

Lista * constroi( int n, int * v )
{   Lista * inteiros= lista_create();
  
    for( int i= 0; i < n; ++i )
    {	inteiros= lista_add( inteiros, lista_new(* (v + (i)) );
    }
    return inteiros;
}

 

 

adicionado 14 minutos depois

Ficou mais fácil ou não?

adicionado 19 minutos depois
49 minutos atrás, Josesousa disse:

Percebo que voce esta falando para criar uma funcao para cada comando, mas acho mais pratico assim. Principalmente que se nao estou conseguindo fazer so uma funcao, imagina criar um monte. Já estou muito perdido.

kkkkkkkkkkk

Link para o comentário
Compartilhar em outros sites

@Josesousa Olá. Desculpa mas não deu para chegar antes

A necessidade de usar um for de "trás p frente" é porque você deve estar inserindo os elementos do vetor sempre no início da lista. Se você inserir os elementos no final da lista o for vai ser normal, de 0 até n - 1

Dá uma olhada na pags. 7 e 8 do tutorial (Figura 9.6) 

Nessas páginas é mostrado um exemplo de uma função para inserir os elementos do vetor no final da lista, basta jogar a lógica toda da função q é ensinada no tutorial, se não me engano pag. 8 e pronto, exercício resolvido

Segue a função já ajustada para esse exercício:

/* função insere_ordenado: insere elemento em ordem */
Lista* insere_final (Lista* l, int v)
{
    Lista* novo = cria(v); /* cria novo nó */
    Lista* ant = NULL; /* ponteiro para elemento anterior */
    Lista* p = l; /* ponteiro para percorrer a lista*/
    /* procura posição de inserção */
    while (p != NULL) {
        ant = p;
        p = p->prox;
    }
    /* insere elemento */
    if (ant == NULL) { /* insere elemento no início */
        novo->prox = l;
        l = novo;
    }
    else { /* insere elemento no meio da lista, serve também para inserir no fim */
        novo->prox = ant->prox;
        ant->prox = novo;
    }
    return l;
}

Seria isso, basta jogar essa lógica dentro do for e resolve o exercício

Eu só mudei o nome da função e no while removi a validação para q insira ordenado

Nesse exercício não podemos passar um ponteiro para a lista como parâmetro. Seria útil para a parte de percorrer a lista 

Mas esse ponteiro do tipo Lista * pode ser criado com escopo global no código e usado na função e também no main

A vantagem de usar essa função é q os elementos ficam ordenados na lista de acordo com a ordem de inserção

 

Qualquer dúvida é só perguntar!

adicionado 28 minutos depois

@Josesousa Veja de maneira prática a diferença em inserir os elementos no início de uma lista e inserir no fim

Montei esse simples código para ilustrar isso:

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

struct lista
{
    int valor;
    struct lista *prox;
};

typedef struct lista Lista;

Lista *l;

Lista *inserir_no_inicio(int v) {

    Lista *novo = malloc(sizeof(Lista));
    novo->valor = v;
    novo->prox = l;
    return novo;
}

Lista *inserir_no_fim(int v) {

    Lista *novo = malloc(sizeof(Lista));
    Lista *ant = NULL;
    Lista *p = l;
    novo->valor = v;

    while (p != NULL) {
        ant = p;
        p = p->prox;
    }

    if (ant == NULL) {
        novo->prox = l;
        l = novo;
    } else {
        novo->prox = ant->prox;
        ant->prox = novo;
    }

    return l;
}

void imprimir(Lista *l) {

    Lista *p = l;

    while (p != NULL) {
        printf("%d ", p->valor);
        p = p->prox;
    }

    printf("\n");
}

int main(void) {

    l = NULL;
    // aqui estou inserindo os elementos no início da lista
    l = inserir_no_inicio(10);
    l = inserir_no_inicio(20);
    l = inserir_no_inicio(30);

    imprimir(l); // vai ser impresso 30 20 10

    return 0;
}

Agora, execute o mesmo código inserindo os elementos no fim da lista. Dessa forma:

int main(void) {

    l = NULL;

    // aqui estou inserindo os elementos no fim da lista
    l = inserir_no_fim(10);
    l = inserir_no_fim(20);
    l = inserir_no_fim(30);

    imprimir(l); // vai ser impresso 10 20 30, de acordo com a ordem de inserção e é isso q queremos para esse exercício

    return 0;
}

Agora vai conseguir entender de forma clara esse ponto de inserir no início da lista e inserir no fim

Link para o comentário
Compartilhar em outros sites

19 horas atrás, AnsiC disse:

Teve um momento que quase achei isso, principalmente quando vi sua primeira tentativa com recursividade na solução.

@AnsiC Se você sabia que recursividade não daria certo, porque não falou logo. Perdi o maior tempo tentando arrumar/adequar a recursividade no exercício. (Aliás, você poderia ser mais direto às vezes. Metade das coisas que você fala não tem aplicabilidade para a resolução do exercício, ora por ser conteúdo que nunca vi e você pressupõe que eu devo correr atrás e saber mesmo sendo necessário outros conteúdos como base, ora é uma conceitualização desnecessária. Talvez isso se deve ao ser nível de conhecimento em programação). Mas obrigado mesmo assim, tem me ajudado muito.

 

 

@giu_d Você sempre me ajudando, valeu. (Sobre os capítulos que você sugeriu a leitura, eu meio que não conseguir entender como eles me ajudariam a resolver o problema, principalmente pelo fato de a questão ter uma função própria - constroi(int n, int *v). Mas mesmo assim foi uma leitura agradável e me permitiu da uma clareada em lista encadeada (só uma clareada mesmo hehehe))

 

Acho que a demora para resolver esse exercício permitiu que algumas coisas fixassem mais na minha cabeça. Tenho muito que aprender e quero muito aprender.

 

Obrigado @AnsiC e @giu_d . 

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Josesousa disse:

Se você sabia que recursividade não daria certo, porque não falou logo. Perdi o maior tempo tentando arrumar/adequar a recursividade no exercício. (Aliás, você poderia ser mais direto às vezes. Metade das coisas que você fala não tem aplicabilidade para a resolução do exercício, ora por ser conteúdo que nunca vi e você pressupõe que eu devo correr atrás e saber mesmo sendo necessário outros conteúdos como base, ora é uma conceitualização desnecessária. Talvez isso se deve ao ser nível de conhecimento em programação). Mas obrigado mesmo assim, tem me ajudado muito.

Você postou o código aqui para juízo de todos isso é um fórum ninguém aqui pago para dar respostas que você que ouvir. Alias tudo que eu disse é útil a resolução e muito mais, com falta experiência é que não se nota isso.

 

Em 03/11/2018 às 16:40, AnsiC disse:

Donald Ervin Knuth

Escreveu os Livros Arte de Programa: atualmente e sempre lido pelos melhores da área. Confesso que é um leitura complicada para maioria, pra mim também. Depois de lê-los nunca mais você vai utilizar recursividade em sua vida, terá ódio. É uma leitura obrigatória, só erra na lógica que nunca leu. Essa é uma leitura MUITO NECESSÁRIA, de conceitos muito NECESSÁRIOS. Repito é um leitura PESADA !!!

 

Por fim, eu falei desde o começo que na minha opinião.

Em 02/11/2018 às 21:32, Josesousa disse:
Em 02/11/2018 às 20:46, AnsiC disse:

Toda ela > < para o meu gosto. Mas pode ser que para a maioria não.

Desculpe, mas assim fica um pouco difícil. Estou tentando entender e você está tratando o MEU problema como algo banal e que fosse como puramente consequência da minha falta de interesse. O que não é!

 

 

"Aqui não se critica pessoas, critica-se ideias"

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

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