Ir ao conteúdo
  • Cadastre-se

C++ Criar um procedure que trabalha com array


MUrisCuri

Posts recomendados

arfneto, obrigado, por ora, por lançar as explicações junto ao código, assim o torna mais inteligível! Irei estudar toda essa dinâmica com calma, pois meu aprendizado durante o curso de S.I. há 14 anos abordou superficialmente orientação a objeto. Tudo isso é novo para mim. 

Link para o comentário
Compartilhar em outros sites

arfneto:

 

Quanto à:

 

[[nodiscard]]

Array    Array::sort_array() {

Array novo;

novo.size = size;

for (unsigned short i = 0; i < size; i += 1) novo.array[i] = array[i];

bubble(novo.array, novo.size);

return novo;

}

 

 1) Porque criaste o método sort_array() que retorna a instância da classe? E o que faz [[nodiscard]] e isso está relacionado ao método Array::sort_array() ? Usar [[nodiscard]] impede que a instância seja destruída?

 

2) Qual a diferença entre esses dois métodos - Array sort_array();  e  void sort_array(unsigned short) ? Porque instanciaste a classe no 1º método e no 2º não?

Link para o comentário
Compartilhar em outros sites

Em 01/02/2021 às 00:23, arfneto disse:

Array::Array(unsigned short valor) : size(valor) { build_array(valor); // le os valores };

arfneto, não entendi porque " Array(unsigned short valor) : size(valor) "? size não é o atributo público! Porque escrever size(valor)?  Pode explicar/traduzir esse método?

Link para o comentário
Compartilhar em outros sites

Você rodou o programa que eu te mostrei? 

 

Leu a sequência de códigos e as mensagens? Viu os comentários números em main()? É importante que rode o código.

Estou te mostrando com o seu programa como usar esses conceitos na prática... Se não rodar em sua máquina e seguir linha a linha estaremos perdendo tempo.

 

Introdução:

 

Entendeu o que é polimorfismo?

 

class Array
{
public:
    Array(); // cria com 20 zerados
    Array(unsigned short N); // cria o array com N

public:
    void    build_array(unsigned short); // le do teclado
    void    show_array(string);
    Array   sort_array();
    void    sort_array(unsigned short);

private:
    unsigned short  size;
    short           array[20];

    void            bubble(short[], unsigned short);

};

 

Essa é  a classe Array. Um tal objeto. A classe é polimórfica: tem dois construtores, bem óbvio isso lá. Essa é uma vantagem de começar com uma classe pequena. Um construtor não tem parâmetros, e é chamado construtor padrão. O outro recebe um int como parâmetro, e permite que você crie uma classe com uma tabela menor. É claro que essa classe é um exemplo e o fim dela é esse mesmo. Não é pra ser algo útil.

 

sort_array() é polimórfica também:

 

A função --- método --- tem duas caras:

  • uma não tem parâmetros e retorna um Array
  • outra aceita um int e não retorna nada. 

Eu já te expliquei isso aqui antes. 

 

Pra que serve isso?
 

Pois é: o sort() zoa a tabela array[20] porque como já te expliquei o sort é in-place: ele classifica a tabela nela mesma e não tem volta. Nem sempre você quer isso. Às vezes você quer uma cópia classificada mas precisa manter os dados originais. Não é difícil imaginar uma razão para isso.

 

Com o polimorfismo você pode ter isso. E ainda pode classificar só uma parte da tabela, como te mostrei também no programa.

 

3 horas atrás, MUrisCuri disse:

E o que faz [[nodiscard]] e isso está relacionado ao método Array::sort_array() ?

 

Claro que está. [[nodiscard]] Poderia estar na mesma linha mas eu queria manter os nomes alinhados assim:
 

image.png.09761b4e9613a8764b419a2541e540ea.png

Porque é um exemplo de polimorfismo: sort_array()

tem duas versões, e os nomes estão assim alinhadinhos. Frescura apenas

 

 

 

Podia escrever 
 

[[nodiscard]] Array       Array::sort_array()
{
  // ...

 

Citação

Quanto mais coisas você deixar para o compilador fazer menos chances você dá de errar em alguma coisa no programa compilado. Por isso você declara coisas como const, unsigned e tal, por exemplo. Ao fazer isso você não precisa se preocupar em alguém entrar com um contador negativo por exemplo. Esse é o caso de [[nodiscard]]

 

As duas versões de sort_array() são muito diferentes:

 

	void        Array::sort_array(unsigned short n)


Essa versão atua direto na classe e classifica os primeiros n itens da tabela, definitivamente. Se você passar um número >= size ela faz o trivial e classifica a tabela inteira. Ao definir isso você não precisa testar:
 

    // (5)
    cout << "\n\nAgora classifica o vetor todo\n\n";
    obj.sort_array(4'000);
    obj.show_array("Vetor resultante");


4 mil é bem mais que 20. Se você ajusta na função nunca precisa testar a validade... O valor já é unsigned, então não pode ser negativo. E pode ser maior que size porque a função ajusta. Você se antecipa aos problemas e é só uma linha:
 

    if (n > size) n = size; // melhor garantir


Mas  e o outro caso?

 

E se é preciso classificar a tabela sem perder a ordem atual? por exemplo uma tabela de clientes em ordem de nome precisa ser colocada em ordem de chegada na fila para o algoritmo chamar o cliente certo para colocar a senha no painel de atendimento...

 

Então tem a segunda versão:


 

	Array       Array::sort_array()


Essa é uma função chamada de factory na literatura: ela devolve uma instância nova da classe, um novo Array. Por isso ela não precisa de parâmetros: vai criar uma nova instância com a tabela ordenada...

 

    // (3)
    Array outro = obj.sort_array();
    outro.show_array("Vetor novo classificado, criado a partir do original");
    obj.show_array("o original (inalterado)");


Entendeu? Essa versão cria outro, um novo Array com a tabela classificada.

 

Só que foi criada uma nova instância. Em geral uma função factory devolve -- fabrica, aloca --- um ponteiro para uma instância dinamicamente. Essa aqui devolve o valor mesmo porque eu preferi assim.

 

Compare com a função printf() do C por exemplo: printf() retorna sempre o tamanho da string gerada na saída. E raramente se usa. Muita gente nem sabe porque nunca prestou atenção no protótipo ou no manual... E tudo bem, porque não faz diferença. Mas nem sempre é assim: não ler o valor de retorno de scanf(), uma coisa comum de se ver nos programas postados aqui, por exemplo, é uma bobagem enorme.

 

De volta ao programa

 

Eu posso escrever no exemplo
   

    obj.sort_array();
    obj.sort_array();
    obj.sort_array();
    Array mais_outro = obj.sort_array();


E vai rodar ok. O compilador não sabe se está certo. Pode ser algo inofensivo como no caso de printf() ou pode ser uma ingenuidade enorme como no caso de scanf(). Pode ser que nem sempre eu precise do valor de retorno.

 

Mas no caso de uma função factory que cria de fato algo, qual é o propósito? Provavelmente está errado.

No código acima a tabela array[] de obj vai ser classificada 4 vezes. Nas primeiras 3 vezes o resultado vai sumir... Bem b3st@. Um erro.

 

Em C++ você pode sinalizar isso usando o que se chama atributo. Veja uma explicação em português provavelmente bem melhor que a minha em https://docs.microsoft.com/pt-br/cpp/cpp/attributes?view=msvc-160

 

O fato é que se você colocar isso como eu coloquei e usar o [[nodiscard]] veja o que acontece com o exemplo:

image.thumb.png.ab48bb32f563eda9a0c695c7646bd8ce.png

 

E o compilador avisa --- C4834 --- se alguém por engano ao tentar usar a void sort_array(int) e desprezar o retorno, por exemplo. Pode ser que o cara queria usar a versão com parâmetro e esqueceu o número. Assim você resolve o problema ANTES dele acontecer. Entenda que se ela retornar um ponteiro e ele "sumir" como acima vai ter um leak de memória, aquelas coisas que dão dor de cabeça e custam empregos às vezes...

 

4 horas atrás, MUrisCuri disse:

Porque instanciaste a classe no 1º método e no 2º não

 

Essa pergunta você não devia ter feito: uma retorna Array e a outra retorna void...

 

A razão de ter duas eu já tinha explicado, mas agora acho que ficou bem mais claro. E entenda que as duas usam a mesma função de sort
 

private:
    unsigned short  size;
    short           array[20];

    void            bubble(short[], unsigned short);

 

Assim você pode mudar a função de sort dentro da classe sem falar com ninguém, e não duplica código para classificar o vetor... Isso é encapsulamento e é outro conceito essencial

 

2 horas atrás, MUrisCuri disse:

Array(unsigned short valor) : size(valor) "? size não é o atributo público! Porque escrever size(valor)?

  

Confuso isso que escreveu. 

 

Entenda que

  • atributos são coisas como [[discard]] ou [[fallthrough]] ou [[maybe_unused]], essas coisas que vem entre [[ ]] que eu expliquei.
  • size é uma variável membro, chamada propriedade em alguns círculos. E é private.
  • É muito comum e esperado que no construtor você queira inicializar variáveis, já que ele é o construtor. E é muito comum você escrever o mesmo nome para o parâmetro do construtor e a variável da classe porque afinal é chato ficar inventando... Então existe essa possibilidade de você usar uma lista das variáveis direto na declaração do construtor, para economizar os dedos e facilitar a compreensão...

    Essas 3 formas são equivalentes, mas claro que a //1 é preferida
     
  • // 1
    Array::Array(unsigned short valor) : size(valor)
    {
        build_array(valor); // le os valores
    };
    // 2
    Array::Array(unsigned short valor)
    {
    	size = valor;
    	build_array(valor); // le os valores
    };
    // 3
    Array::Array(unsigned short size) : size(size)
    {
        build_array(valor); // le os valores
    };

     

 

 

 

 

Link para o comentário
Compartilhar em outros sites

entendeu o que eu expliquei no topico #29? Rodou em sua maquina?

 

Não acho que deva seguir adiante sem entender as coisas.

 

Usar arquivos separados para a classe e os headers não  é uma opção: é o normal, o esperto.

 

Toda a razão de escrever uma classe, ou mesmo uma biblioteca como stdio.h ou um arquivo DLL no Windows, como COMCTL32.dll, e manter acessíveis para vários programas.

 

Não seria muito esperto todo programa ter uma versão de cout por exemplo. comctl32.dll tem todos o código para todos os controles do windows, com os botões. labels, barras de progresso, spinners...

 

Para usar você precisa so do header e da biblioteca... E não precisa do fonte na linguagem original. Se você precisa usar a classe Array em todos seus programas não precisa mais do fonte, por exemplo. E claro que não vai querer compilar Array.cpp toda vez que for usar a classe, certo?

 

Essa é a razão.

 

8 horas atrás, MUrisCuri disse:

mas ocorrem erros.

 

Escreveu isso em um forum público.  Qual o propósito de não dizer quais erros nem postar uma descrição e o código para que alguém que quer ajudar possa reproduzir isso?

Link para o comentário
Compartilhar em outros sites

10 horas atrás, arfneto disse:

entendeu o que eu expliquei no topico #29? Rodou em sua maquina?

Olá, Entendi o tópico! Compilou e executou. Uso o Dev C++. Mas: [Warning] 'nodiscard' attribute directive ignored [-Wattributes]

10 horas atrás, arfneto disse:

Não acho que deva seguir adiante sem entender as coisas.

 

10 horas atrás, arfneto disse:

Para usar você precisa so do header e da biblioteca.

Dúvidas:

Se só preciso do cabeçalho e da biblioteca, onde será escrito o que faz a classe e métodos? e o main, onde será escrito? Serão 2 arquivos com extensão .h e .dll? 

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

17 minutos atrás, MUrisCuri disse:

Olá, Entendi o tópico! Compilou e executou. Uso o Dev C++. Mas: [Warning] 'nodiscard' attribute directive ignored [-Wattributes]

 

Use as opções de compilação de acordo com o programa e o ano em que estamos... Atualize seu compilador e use a versão de C++ ao menos de 2017. C++20 não seria nada estranho também, certo?

 

Compilar e executar não acrescenta muito: já acontecia isso quando eu escrevi o programa. É importante que você entenda os conceitos. E precisa testar se o compilador vai rejeitar se escrever o exemplo que te mostrei:
 

    obj.sort_array();
    obj.sort_array();
    obj.sort_array();
    Array mais_outro = obj.sort_array();


Nada respondeu sobre os tais "erros" ao separar o código da classe....

 

 

Link para o comentário
Compartilhar em outros sites

11 minutos atrás, arfneto disse:

Nada respondeu sobre os tais "erros" ao separar o código da classe....

Array.h  (arquivo 1) -Esse compilou!

 

#ifndef ARRAY_H_INCLUDED
#define ARRAY_H_INCLUDED
#include <string>

using namespace std;

class Array {
    // Private section
    unsigned short size;
    short array[20];
    
    void knuth(short[], unsigned short);
    
    public:
        // Public Declarations
        Array();
        Array(unsigned short N);
        
        void build_array(unsigned short);
        void show_array(string);
        Array sort_array();
        void sort_array(unsigned short);
};

#endif

 

 

Array.cpp (arquivo 2)

 

#include "Array.h"

class Array {
    private:
        void knuth(short cel[], unsigned short n){
            bool swap;
            short temp;
            for ( unsigned short ind=0; ind<=n-1; ind+=1 ){
                while ( ind >= n-1 ) {
                    if ( swap == 1 ){
                        n-=1;
                        swap = 0;
                        ind=0;
                    }
                    else{
                        break;
                    }
                }
                if ( cel[ind] > cel[ind+1] ){
                    temp = cel[ind];
                    cel[ind] = cel[ind+1];
                    cel[ind+1] = temp;
                    swap = 1;
                }
    }
    return;    
}
         
    public:
        Array::Array(){
            size=20;
            for( unsigned short ind=0; ind < 20; ind+=1) {
                array[ind] = 0;
            }

        }
        
        Array::Array( unsigned short valor ) : size(valor){
            build_array(valor);
        }
        
        void Array::build_array(unsigned short bound){
            size = bound;
            for (unsigned ind=0; ind < bound; ind+=1){
            cout << "Write array[" << ind << "] - size = " << bound << ": ";
            cin >> array[ind];
            }
        return;
        }
        
        void Array::show_array(string msg){
            if (msn != "") cout << "\n" << msg << "\n";
            cout << "The numbers entered are: " << endl;
            for ( unsigned ind=0; ind<size; ind+=1 )
            cout << "Tabela[" << ind << "] = " << array[ind] << endl;
        return;
        }
        
        void Array::sort_array(unsigned short n){
            if (n > size) n = size;
            knuth(array, n);
            return;
        }
        
        [[nodiscard]]
        Array Array::sort_array(){
            Array novo;
            novo.size = size;
            for (unsigned short ind=0; ind < size; ind+=1){
                novo.array[ind] = array[ind];
            }
            knuth(novo.array, novo.size);
            return novo;            
        }
        
};
ERROS: 1)  [Error] redefinition of 'class Array'  class Array {

                2)  [Error] previous definition of 'class Array'

 

 

 

main.cpp (ARQUIVO 3)

 

#include <iostream>
#include "Array.h"
using namespace std;

int main ( void ){
    Array um;
    um.show_array("With the constructor without parameters, with zeros.");
    
    unsigned short bound = 0;
    cout << "Enter the amount of new vector numbers: \n\n";
    cin >> bound;
    if (bound > 20) bound = 20;
    Array obj(bound);
    obj.show_array("Vector in the same way as typed.\n\n");
    
    Array outro = obj.sort_array();
    outro.show_array("New classified vector, created from the original.\n\n");
    
    obj.show_array("Original vector.\n\n");
        
    cout << "Now, classifies the first four elements of the original vector:\n";
    obj.sort_array(4);
    obj.show_array("Resultant vector.\n\n");
    
    cout << "Now, classifies the entire vector:\n\n";
    obj.sort_array(4000);
    obj.show_array("Resultant vector.");
    return 0;
}

Erros: 

image.thumb.png.08614584617cea109bf1f91036935ec2.png

16 minutos atrás, arfneto disse:

Compilar e executar não acrescenta muito: já acontecia isso quando eu escrevi o programa. É importante que você entenda os conceitos. E precisa testar se o compilador vai rejeitar se escrever o exemplo que te mostrei:
 


    obj.sort_array();
    obj.sort_array();
    obj.sort_array();
    Array mais_outro = obj.sort_array();

image.thumb.png.52a882f80261217fd41ac39dd9a082ad.png

image.thumb.png.77d998f04eca6f49bde4b4caaef29f62.png

Não rejeitou!

Link para o comentário
Compartilhar em outros sites

image.png.2b007510349936cbb65e3531131a5d4e.png

 

 

 

 







Se array.cpp começa assim, incluindo Array.h, e definindo a classe Aray, e por outro lado Array.h começa também definindo a classe Array, não deve ser estranho o compilador reclamar de definições duplicadas.

Pense nisso.

 

Não escreva nem uma linha sem razão de ser. Entenda o que é um include: simplesmente vai inserir aquele trecho de texto no lugar definido

 

 

Array.h  (arquivo 1) -Esse compilou!
 
#ifndef ARRAY_H_INCLUDED
#define ARRAY_H_INCLUDED
#include <string>

using namespace std;

class Array {
    // Private section
    unsigned short size;
  
  // ...

 

 

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

Em 03/02/2021 às 23:01, arfneto disse:

Se array.cpp começa assim, incluindo Array.h, e definindo a classe Aray, e por outro lado Array.h começa também definindo a classe Array, não deve ser estranho o compilador reclamar de definições duplicadas.

Cometi uma redundância?

 

Reescrevi o Array.cpp, e ficou assim:

 

#include "Array.h"
#include <iostream>
#include <iostream>
#include <string>
    void Array::knuth(short cel[], unsigned short n){
            bool swap;
            short temp;
            for ( unsigned short ind=0; ind<=n-1; ind+=1 ){
                while ( ind >= n-1 ) {
                    if ( swap == 1 ){
                        n-=1;
                        swap = 0;
                        ind=0;
                    }
                    else{
                        break;
                    }
                }
                if ( cel[ind] > cel[ind+1] ){
                    temp = cel[ind];
                    cel[ind] = cel[ind+1];
                    cel[ind+1] = temp;
                    swap = 1;
                }
    }
    return;    
}
        Array::Array(){
            size=20;
            for( unsigned short ind=0; ind < 20; ind+=1) {
                array[ind] = 0;
            }

        }
        
        Array::Array( unsigned short valor ) : size(valor){
            build_array(valor);
        }
        
        void Array::build_array(unsigned short bound){
            size = bound;
            for (unsigned ind=0; ind < bound; ind+=1){
            cout << "Write array[" << ind << "] - size = " << bound << ": ";
            cin >> array[ind];
            }
        return;
        }
        
        void Array::show_array(string msg){
            if (msg != "") cout << "\n" << msg << "\n";
            cout << "The numbers entered are: " << endl;
            for ( unsigned ind=0; ind<size; ind+=1 )
            cout << "Tabela[" << ind << "] = " << array[ind] << endl;
        return;
        }
        
        void Array::sort_array(unsigned short n){
            if (n > size) n = size;
            knuth(array, n);
            return;
        }
        
        [[nodiscard]]
        Array Array::sort_array(){
            Array novo;
            novo.size = size;
            for (unsigned short ind=0; ind < size; ind+=1){
                novo.array[ind] = array[ind];
            }
            knuth(novo.array, novo.size);
            return novo;            
        }

image.thumb.png.59c746aa8a6183ee751eb8669c196ee1.png

 

main.cpp :

 

 

#include "Array.h"
#include <iostream>
#include <string>
using namespace std;

int main ( void ){
    Array um;
    um.show_array("With the constructor without parameters, with zeros.");
    
    unsigned short bound = 0;
    cout << "Enter the amount of new vector numbers: \n\n";
    cin >> bound;
    if (bound > 20) bound = 20;
    Array obj(bound);
    obj.show_array("Vector in the same way as typed.\n\n");
    
    Array outro = obj.sort_array();
    outro.show_array("New classified vector, created from the original.\n\n");
    
    obj.show_array("Original vector.\n\n");
        
    cout << "Now, classifies the first four elements of the original vector:\n";
    obj.sort_array(4);
    obj.show_array("Resultant vector.\n\n");
    
    cout << "Now, classifies the entire vector:\n\n";
    obj.sort_array(4000);
    obj.show_array("Resultant vector.");
    return 0;
};

image.thumb.png.3eabf8a99722d04fa5a435e87d53d5f1.png

Pode me ajudar ?

 

Link para o comentário
Compartilhar em outros sites

26 minutos atrás, MUrisCuri disse:

Cometi uma redundância?

 

Pode chamar assim. Mas cometeu um erro apenas: você cria um header x.h para poder incluir em outros arquivos que usam a classe implementada em x.cpp. convencionalmente. E qualquer programa que use a classe x inclui o tal x.h para o compilador saber o que compilar. E o código correspondente a x.cpp pode estar em uma biblioteca, como um arquivo .obj ou .lib ou mesmo um arquivo .DLL no Windows. Não se precisa mais do código fonte, de x.cpp. 

 

Claro que em algum momento esse código referente a x tem que ser gerado e alguém tem que compilar x.cpp. E é razoável que o próprio arquivo x.h seja incluído em x.cpp. Em termos simples, x.cpp começa incluindo x.h. E se você faz isso é claro que não vai repetir todo o código. É uma questão de lógica, não de C++. #include simplesmente copia o texto. ANTES de compilar.

 

image.png.b0517f54221fa9e77ec4255c02f2c430.png

 

Para que d1@b0 usou duas vezes em seguida o mesmo #include, mesmo depois de tudo que eu expliquei? 

Para sua sorte o IDE em geral cria um mecanismo para evitar incluir duas vezes o mesmo header. Isso por causa de programas realmente complicados e que podem ter referências cíclicas a algum arquivo .h, não porque se imagine que alguém possa fazer isso em linhas seguidas no mesmo programa de poucas linhas e uma única classe

 

Sobre isso:

 

image.png.de02eb0f1e74fbd7898675acf0f95420.png

 

Evite essas coisas: espaços e especialmente acentos no nome de pastas só vão complicar sua vida. Não acho que acrescentem nada. Faça o simples. 

 

Sobre isso:
image.png.30b5931e094bc28076b0b5f4df98bf65.png

 

Acho que está claro que [[nodiscard]] foi ignorado. E se seu programa tem uma função main() e o compilador está se queixando de uma WinMain que você não definiu isso apareceu depois... Provavelmente está tentando gerar um programa para desktop e não um programa para console, já que um programa para desktop começa em WinMain()...

 

45 minutos atrás, MUrisCuri disse:

Pode me ajudar ?

 

Eu te mostrei mais de uma versão disso funcionando. E mostrei onde entram alguns dos conceitos de objetos em C++ e a nomenclatura. E expliquei o porque de várias coisas. Porque não faz o simples e parte do de eu te expliquei? 

 

Sobre isso:

 

public:
        // Public Declarations

 

Já te falei sobre isso: acha mesmo que precisa comentar uma coisa dessas? Não dá pra imaginar que depois de public: venham "Public Declarations"?

 

Porque não gasta as suas // comentando coisas como o código abaixo, do que já te perguntei: imagina que isso é uma implementação do descrito em The Art of Computer Programming, Volume 3: Sorting and Searching, do Prof. Knuth? Acho que não é. 

 

 void Array::knuth(short cel[], unsigned short n){
            bool swap;
            short temp;
            for ( unsigned short ind=0; ind<=n-1; ind+=1 )
         { \\...

 

O Exemplo, de novo:

 

Array.h
 

#pragma once
#include <iostream>
using namespace std;

class Array
{
public:
    Array(); // cria com 20 zerados
    Array(unsigned short N); // cria o array com N

public:
    void    build_array(unsigned short); // le do teclado
    void    show_array(string);
    [[nodiscard]] Array   sort_array();
    void                  sort_array(unsigned short);

private:
    unsigned short  size;
    short           array[20];

    void            bubble(short[], unsigned short);

};

 

E uma implementação para a classe Array como descrita no header acima:

 

Array.cpp

 

#include "Array.h"
Array::Array()
{
    size = 20;
    for (short i = 0; i < 20; i += 1)
        array[i] = 0;
};

Array::Array(unsigned short valor) : size(valor)
{
    build_array(valor); // le os valores
};

void        Array::bubble(short V[], unsigned short n)
{
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - i - 1; j++)
            if (V[j] > V[j + 1])
                std::swap(V[j], V[j + 1]);
    return;
}

void        Array::build_array(unsigned short bound)
{
    size = bound;
    for (unsigned ind = 0; ind < bound; ind += 1)
    {
        cout << "Entre valor " << 1 + ind <<
            " de " << bound << " : ";
        cin >> array[ind];
    }
    return;
}

void        Array::show_array(string msg)
{
    if (msg != "") cout << "\n" << msg << "\n";
    cout << "Os " << size << " numeros: " << endl;
    for (unsigned ind = 0; ind < size; ind += 1)
        cout << array[ind] << "  ";
    cout << endl;
    return;
}

void        Array::sort_array(unsigned short n)
{
    if (n > size) n = size; // melhor garantir
    bubble(array, n);
    return;
}

Array       Array::sort_array()
{
    Array novo;
    novo.size = size;
    for (unsigned short i = 0; i < size; i += 1) novo.array[i] = array[i];
    bubble(novo.array, novo.size);
    return novo;
}

 

E um programa de teste usando a tal classe Array

 

main.cpp

 

#include "Array.h"

int main(void)
{
    // (1)
    Array um; // cria com 20, zerados
    um.show_array("com o construtor sem parametros, zerado");

    // (2)
    unsigned short bound = 0;
    cout << "\nDigite a quantidade (limite) de numeros no novo vetor: ";
    cin >> bound;
    cout << endl;
    if (bound > 20) bound = 20;
    Array obj(bound);
    obj.show_array("Vetor como digitado");

    // (3)
    Array outro = obj.sort_array();

    outro.show_array("Vetor novo classificado, criado a partir do original");
    obj.show_array("o original (inalterado)");

    // (4)
    cout << "\n\nAgora classifica os primeiros 4 elementos do original\n\n";
    obj.sort_array(4);
    obj.show_array("Vetor resultante");

    // (5)
    cout << "\n\nAgora classifica o vetor todo\n\n";
    obj.sort_array(4'000);
    obj.show_array("Vetor resultante");
    return 0;
};

 

E o resultado do programa

 

com o construtor sem parametros, zerado
Os 20 numeros:
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

Digite a quantidade (limite) de numeros no novo vetor: 5

Entre valor 1 de 5 : 5
Entre valor 2 de 5 : 4
Entre valor 3 de 5 : 2
Entre valor 4 de 5 : -200
Entre valor 5 de 5 : 1

Vetor como digitado
Os 5 numeros:
5  4  2  -200  1

Vetor novo classificado, criado a partir do original
Os 5 numeros:
-200  1  2  4  5

o original (inalterado)
Os 5 numeros:
5  4  2  -200  1

Agora classifica os primeiros 4 elementos do original

Vetor resultante
Os 5 numeros:
-200  2  4  5  1


Agora classifica o vetor todo


Vetor resultante
Os 5 numeros:
-200  1  2  4  5

 

Gerando o programa tst.exe em Windows, com o compilador gcc 10.2:
 

PS C:\chp21-0203-array> g++ -o tst -Wall -std=c++17 main.cpp Array.cpp
PS C:\chp21-0203-array> ./tst

com o construtor sem parametros, zerado
Os 20 numeros:
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  

Digite a quantidade (limite) de numeros no novo vetor:      
^C

// cancelei o programa, afinal a saída é claro a mesma que está acima...

 

É o mesmo programa que te mostrei antes, claro. Só usei recortar e colar...

 

 

Link para o comentário
Compartilhar em outros sites

Em 06/02/2021 às 04:32, arfneto disse:

compilador gcc 10.2:

Onde faço download do gcc 10.2?

Array.h

 

#pragma once
#include <iostream>
using namespace std;

class Array
{
public:
    Array(); // cria com 20 zerados
    Array(unsigned short N); // cria o array com N

public:
    void    build_array(unsigned short); // le do teclado
    void    show_array(string);
    [[nodiscard]] Array   sort_array();
    void                  sort_array(unsigned short);

private:
    unsigned short  size;
    short           array[20];

    void            bubble(short[], unsigned short);

};

image.thumb.png.60041f9d19246faf57bb5ec7f43fcafb.png

 

 

 

Array.cpp:

 

#include "Array.h"
Array::Array()
{
    size = 20;
    for (short i = 0; i < 20; i += 1)
        array[i] = 0;
};

Array::Array(unsigned short valor) : size(valor)
{
    build_array(valor); // le os valores
};

void        Array::bubble(short V[], unsigned short n)
{
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - i - 1; j++)
            if (V[j] > V[j + 1])
                std::swap(V[j], V[j + 1]);
    return;
}

void        Array::build_array(unsigned short bound)
{
    size = bound;
    for (unsigned ind = 0; ind < bound; ind += 1)
    {
        cout << "Entre valor " << 1 + ind <<
            " de " << bound << " : ";
        cin >> array[ind];
    }
    return;
}

void        Array::show_array(string msg)
{
    if (msg != "") cout << "\n" << msg << "\n";
    cout << "Os " << size << " numeros: " << endl;
    for (unsigned ind = 0; ind < size; ind += 1)
        cout << array[ind] << "  ";
    cout << endl;
    return;
}

void        Array::sort_array(unsigned short n)
{
    if (n > size) n = size; // melhor garantir
    bubble(array, n);
    return;
}

Array       Array::sort_array()
{
    Array novo;
    novo.size = size;
    for (unsigned short i = 0; i < size; i += 1) novo.array[i] = array[i];
    bubble(novo.array, novo.size);
    return novo;
}

image.thumb.png.c7b0895219be5b9d3c61aa25dccab583.png

 

 

main.cpp:

 

#include "Array.h"

int main(void)
{
    // (1)
    Array um; // cria com 20, zerados
    um.show_array("com o construtor sem parametros, zerado");

    // (2)
    unsigned short bound = 0;
    cout << "\nDigite a quantidade (limite) de numeros no novo vetor: ";
    cin >> bound;
    cout << endl;
    if (bound > 20) bound = 20;
    Array obj(bound);
    obj.show_array("Vetor como digitado");

    // (3)
    Array outro = obj.sort_array();

    outro.show_array("Vetor novo classificado, criado a partir do original");
    obj.show_array("o original (inalterado)");

    // (4)
    cout << "\n\nAgora classifica os primeiros 4 elementos do original\n\n";
    obj.sort_array(4);
    obj.show_array("Vetor resultante");

    // (5)
    cout << "\n\nAgora classifica o vetor todo\n\n";
    obj.sort_array(4000);
    obj.show_array("Vetor resultante");
    return 0;
};

 

image.thumb.png.f790ce1f8df7d5a27bb03d1c4e428675.png

 

Será problema do compilador?

image.png.1ce89e2a1a47be80222f1002b5497ea0.png

Link para o comentário
Compartilhar em outros sites

1 hora atrás, MUrisCuri disse:

class Array
{
public:
    Array(); // cria com 20 zerados
    Array(unsigned short N); // cria o array com N

public:
    void    build_array(unsigned short); // le do teclado
    void    show_array(string);
    [[nodiscard]] Array   sort_array();
    void                  sort_array(unsigned short);

private:
    unsigned short  size;
    short           array[20];

    void            bubble(short[], unsigned short);

};

 

Acho que postou isso no tópico errado...

 

2 horas atrás, MUrisCuri disse:

Onde faço download do gcc 10.2?

 

Isso também está um tanto fora do tópico. As versões de gcc estão sempre no mesmo lugar:  http://gcc.gnu.org ou em algum lugar que copiou de lá. Clang tem residência em http://clang.llvm.org . O compilador da Microsoft pode ser obtido instalando Visual Studio a partir de https://visualstudio.microsoft.com/ como esperado. Ou apenas o compilador usando https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16 eu creio.

Um outro compilador popular pode ser obtido da Embarcadero em https://www.embarcadero.com/br/products/cbuilder mas esse não é grátis. Mas pode usar por 30 dias.

 

Claro, para mais de um projeto simples some a isso CMake ou uma versão de make. E se for usar na linha de comando claro algum gerenciador de pacotes como o vcpkg e algum pacote de controle de fonte como o git. E algo pra ajudar na documentação como o DOxygen. E um bom editor de texto, como o vi, o SublimeText ou o Atom, se for usar apenas a linha de comando. Ou algum dos IDE de qualidade. Perdoe por não colocar mais links: bateu uma preguiça agora :) 

 

image.png.c132f78bdfe907b70bca8f051796c364.png

 

 

Nem preciso dizer nada, certo? Direto de https://www.gnu.org/software/gcc/releases.html ...

 

image.png.d91ccedd2cff7893b80845a8f1755f04.png

 

Se você não tem um projeto gigante preso a uma versão centenária de compilador --- e até onde eu sei você não tem --- que razão teria para usar um compilador de 6 anos atrás?

 

Não acha que vai ter dificuldade em usar recursos de C++17 ou C++20 com um compilador de 2014?

 

E esse IDE que está usando é o pior que já vi. Eu não conhecia, descobri a partir do forum aqui, mas recomendo muito evitar. Estaria melhor servido mesmo sem nenhum IDE, usando por exemplo SublimeText como editor, git para o projeto e um compilador qualquer. E um debugger.

Link para o comentário
Compartilhar em outros sites

Em 09/02/2021 às 03:23, arfneto disse:

E esse IDE que está usando é o pior que já vi.

Instalei a IDE codeblocks-20.03-setup.exe e o compilador tdm64-gcc-9.2.0, e ao compilar e executar ainda ocorrem erros nos arquivos.

O main e o Array.cpp:

image.png.360196ff1e5e5cb95e7674c4f2461e01.png

 

Ao compilar e executar o .h, 

image.png.d1e853f77b278a1dad93e9d350179678.png

 

Tenho que configurar a IDE?

Link para o comentário
Compartilhar em outros sites

5 horas atrás, MUrisCuri disse:

Tenho que configurar a IDE?

 

IDE é um ambiente. o 'E' é de ambiente. E em geral se configura um ambiente ao gosto do usuário. E o ambiente inclui um compilador. esse gcc 9.2 que tem dezenas de opções. IDE é macho, não sei porque leio às vezes "uma" IDE. É como "a BIOS" sendo que BIOS é masculino... IDE é ambiente, BIOS é sistema.

 

Code::Blocks parece mais produtivo que o Dev-C++ embora mais lento. Usei um pouco.

Você estaria melhor servido com Visual Studio, VS Code, Eclipse, CLion, um editor  mais o IDE. Mas pode ser seguir com esse mesmo. E essa versão de compilador deve servir para quase tudo.

 

 

Os erros de compilação parecem erros básicos. Poste o código completo.

 

Porque não prossegue a partir do código que te mostrei e expliquei? Lá tem vários dos conceitos que quer usar...

 

Link para o comentário
Compartilhar em outros sites

Em 09/02/2021 às 01:04, MUrisCuri disse:

Array.h

 

#pragma once
#include <iostream>
using namespace std;

class Array
{
public:
    Array(); // cria com 20 zerados
    Array(unsigned short N); // cria o array com N

public:
    void    build_array(unsigned short); // le do teclado
    void    show_array(string);
    [[nodiscard]] Array   sort_array();
    void                  sort_array(unsigned short);

private:
    unsigned short  size;
    short           array[20];

    void            bubble(short[], unsigned short);

}

 

Em 09/02/2021 às 01:04, MUrisCuri disse:

Array.cpp:

 

#include "Array.h"
Array::Array()
{
    size = 20;
    for (short i = 0; i < 20; i += 1)
        array[i] = 0;
};

Array::Array(unsigned short valor) : size(valor)
{
    build_array(valor); // le os valores
};

void        Array::bubble(short V[], unsigned short n)
{
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - i - 1; j++)
            if (V[j] > V[j + 1])
                std::swap(V[j], V[j + 1]);
    return;
}

void        Array::build_array(unsigned short bound)
{
    size = bound;
    for (unsigned ind = 0; ind < bound; ind += 1)
    {
        cout << "Entre valor " << 1 + ind <<
            " de " << bound << " : ";
        cin >> array[ind];
    }
    return;
}

void        Array::show_array(string msg)
{
    if (msg != "") cout << "\n" << msg << "\n";
    cout << "Os " << size << " numeros: " << endl;
    for (unsigned ind = 0; ind < size; ind += 1)
        cout << array[ind] << "  ";
    cout << endl;
    return;
}

void        Array::sort_array(unsigned short n)
{
    if (n > size) n = size; // melhor garantir
    bubble(array, n);
    return;
}

Array       Array::sort_array()
{
    Array novo;
    novo.size = size;
    for (unsigned short i = 0; i < size; i += 1) novo.array[i] = array[i];
    bubble(novo.array, novo.size);
    return novo;
}

 

Em 09/02/2021 às 01:04, MUrisCuri disse:

main.cpp:

 

#include "Array.h"

int main(void)
{
    // (1)
    Array um; // cria com 20, zerados
    um.show_array("com o construtor sem parametros, zerado");

    // (2)
    unsigned short bound = 0;
    cout << "\nDigite a quantidade (limite) de numeros no novo vetor: ";
    cin >> bound;
    cout << endl;
    if (bound > 20) bound = 20;
    Array obj(bound);
    obj.show_array("Vetor como digitado");

    // (3)
    Array outro = obj.sort_array();

    outro.show_array("Vetor novo classificado, criado a partir do original");
    obj.show_array("o original (inalterado)");

    // (4)
    cout << "\n\nAgora classifica os primeiros 4 elementos do original\n\n";
    obj.sort_array(4);
    obj.show_array("Vetor resultante");

    // (5)
    cout << "\n\nAgora classifica o vetor todo\n\n";
    obj.sort_array(4000);
    obj.show_array("Vetor resultante");
    return 0;
};

 

17 horas atrás, arfneto disse:

Porque não prossegue a partir do código que te mostrei e expliquei? Lá tem vários dos conceitos que quer usar

Foi exatamente o que fiz.

 

17 horas atrás, arfneto disse:

Visual Studio, VS Code, Eclipse, CLion

Desses, tentei o VS Code, mas o que limita de mais é o ínfimo conhecimento que tenho tanto de inglês quanto das funcionalidades. Deu pra notar que não trabalho no ramo,. Cursei SI na Escola Técnica da UFRGS, mas não tive nenhum contato com essas ferramentas, por falta de tempo talvez.. Trabalhei pouco tempo com Netbeans (JAVA), PASCAL, C, PHP muito pouco, POO e banco de dados(não evoluí, fiquei apenas no comandos básicos de acesso a registros e updates), e meu estágio foi numa empresa que trabalhava com CACHE da intersystems por 4 meses. Meu objetivo é tentar implementar o conteúdo visto na disciplina de lógica de programação e aprender a programar em C++ e POO.

Voltando aos IDEs acima, tentei configurar o VS Code mas não fui feliz. Irei tentar usar o Eclipse ou CLion.  

Link para o comentário
Compartilhar em outros sites

Você entendeu o que eu expliquei sobre o seu código? É muito mais importante que o IDE. Por exemplo, entendeu porque acabou escrevendo 3 vezes a mesma coisa naquelas show_xxx()?

Entendeu que um Aluno não é um Node e um Node não é uma Lista? Talvez essa seja a noção que tenha faltado em seu curso e sobre POO em geral.

Link para o comentário
Compartilhar em outros sites

Em 16/02/2021 às 19:59, arfneto disse:

Por exemplo, entendeu porque acabou escrevendo 3 vezes a mesma coisa naquelas show_xxx()?

 

Sim. 

 

Em:

 

1) obj.show_array("Vetor como digitado"); //"obj", instância da classe, chama o método show_array, mostrando os valores digitados. Msg é diferente de vazio, pois o parâmetro é passado ao método.

 

2) Array outro = obj.sort_array(); \\aqui, "outro" que é outra instância da classe assume o que há no "obj" que chama o método sort_array.

    outro.show_array("Vetor novo classificado, criado a partir do original"); \\ O parâmetro que é String passa através do método show_array, e, como é diferente de vazio, mostra o que há no "outro", ou seja, os valores ordenados.

 

3) obj.show_array("o original (inalterado)"); // aqui, obj chama o método e mostra os valores que não foram ordenados

 

Quanto aos arquivos, os mesmos erros persistem nos arquivos main.cpp e Array.cpp, mesmo após acrescentar ";" ao final da declaração da classe. Seguem o código e os erros.

 

Array.h

#pragma once
#include <iostream>
using namespace std;

class Array
{
public:
    Array(); // cria com 20 zerados
    Array(unsigned short N); // cria o array com N

public:
    void    build_array(unsigned short); // le do teclado
    void    show_array(string);
    [[nodiscard]] Array   sort_array();
    void                  sort_array(unsigned short);

private:
    unsigned short  size;
    short           array[20];

    void            bubble(short[], unsigned short);

};

 

 

Array.cpp

 

#include "Array.h"
Array::Array()
{
    size = 20;
    for (short i = 0; i < 20; i += 1)
        array[i] = 0;
};

Array::Array(unsigned short valor) : size(valor)
{
    build_array(valor); // le os valores
};

void        Array::bubble(short V[], unsigned short n)
{
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - i - 1; j++)
            if (V[j] > V[j + 1])
                std::swap(V[j], V[j + 1]);
    return;
}

void        Array::build_array(unsigned short bound)
{
    size = bound;
    for (unsigned ind = 0; ind < bound; ind += 1)
    {
        cout << "Entre valor " << 1 + ind <<
            " de " << bound << " : ";
        cin >> array[ind];
    }
    return;
}

void        Array::show_array(string msg)
{
    if (msg != "") cout << "\n" << msg << "\n";
    cout << "Os " << size << " numeros: " << endl;
    for (unsigned ind = 0; ind < size; ind += 1)
        cout << array[ind] << "  ";
    cout << endl;
    return;
}


void        Array::sort_array(unsigned short n)
{
    if (n > size) n = size; // melhor garantir
    bubble(array, n);
    return;
}

Array       Array::sort_array()

{
    Array novo;

    novo.size = size;
    for (unsigned short i = 0; i < size; i += 1) novo.array[i] = array[i];
    bubble(novo.array, novo.size);
    return novo;
}

 


image.thumb.png.6de9820133e6f5266a05373b12335f6c.png

 

 

 

main.cpp

 

#include "Array.h"

int main(void)
{
    // (1)
    Array um; // cria com 20, zerados
    um.show_array("com o construtor sem parametros, zerado");

    // (2)
    unsigned short bound = 0;
    cout << "\nDigite a quantidade (limite) de numeros no novo vetor: ";
    cin >> bound;
    cout << endl;
    if (bound > 20) bound = 20;
    Array obj(bound);
    obj.show_array("Vetor como digitado");

    // (3)
    Array outro = obj.sort_array();

    outro.show_array("Vetor novo classificado, criado a partir do original");

    obj.show_array("o original (inalterado)");

    // (4)
    cout << "\n\nAgora classifica os primeiros 4 elementos do original\n\n";
    obj.sort_array(4);
    obj.show_array("Vetor resultante");

    // (5)
    cout << "\n\nAgora classifica o vetor todo\n\n";
    obj.sort_array(4000);
    obj.show_array("Vetor resultante");
    return 0;
};
image.thumb.png.4aa9d29f69c303cf194c0d06846a44e8.png

 

Link para o comentário
Compartilhar em outros sites

2 horas atrás, MUrisCuri disse:

Lista estruturada não faz parte do tratamento nesse tópico

 

Isso não faz sentido.
 

Citação

 

Uma lista é uma estrutura. Não existe esse conceito de "lista estruturada". Existe o conceito de estruturas (abstratas) de dados, ADT na literatura, e a lista é apenas uma dessas estruturas.
No mínimo uma lista tem o encapsulamento de uma sequência, como uma lista de compras em papel no bolso de alguém. E isso é uma estrutura, a sequência.


 

 

Não sei onde pode ter lido isso ou como alguém eventualmente tentou ensinar algo assim. Recomendo buscar outras fontes de informação.
 

Lista é uma Lista: um conjunto S  (de set) de Nodes x (por causa da álgebra, muitos autores usam x). Cada Node tem um dado. E o dado tem uma chave k (de key). Em exercícios para iniciantes geralmente o registro é apenas a chave, como a clássica lista de int.
 

image.png.91d511cb30ad083b3ad2da313e733a74.png

A referência provavelmente mais importante do planeta sobre isso é o livro de Cormen, Leiserson, Rivest e Stein, Introduction to Algorithms e assim não precisa ficar com a minha opinião: é o melhor texto que existe. Spoiler: vai encontrar lá a definição como expliquei acima...

 

E tem em português.
 

A noção de chave existe porque em geral se quer colocar os itens na lista por alguma ordem, ordem de chegada, de matrícula, de chave, de algo. E assim é preciso algo para comparar dois registros na hora de inserir ou procurar.

 

1 hora atrás, MUrisCuri disse:

main.cpp

 

#include "Array.h"

int main(void)
{


image.png.4e7bf2d17f621e46e423c0cc36d01aa5.pngUse o botão certo, o code lá no menu, para envolver seus trechos de código. Esse primeiro no desenho aqui à esquerda... Está descrito nas regras do forum. É muito chato recortar trechos de programa sem necessidade aqui. O software do forum já é fraco, mas com o código formatado como texto fica tudo pior... Veja a diferença:
 

main.cpp // code <>



#include "Array.h"

int main(void)
{

 

 

1 hora atrás, MUrisCuri disse:

Quanto aos arquivos, os mesmos erros persistem nos arquivos main.cpp e Array.cpp, mesmo após acrescentar ";" ao final da declaração da classe. Seguem o código e os erros

 

Pois é: você precisa aprender um mínimo sobre o IDE que vai usar. Ou como eu te disse não use nenhum. Notou que eu não usei e te mostrei o exemplo para compilar, gerar o programa e executar?

 

Em 06/02/2021 às 04:32, arfneto disse:

PS C:\chp21-0203-array> g++ -o tst -Wall -std=c++17 main.cpp Array.cpp
PS C:\chp21-0203-array> ./tst

 

Uma linha só compila o programa e gera o arquio tst.exe. A linha seguinte roda o tal programa tst. Não pode nem fazer isso em sua máquina?

 

Você usava o pior IDE que eu já vi, e passou para o segundo pior que eu já vi. 

 

Mas pode ter sucesso com o Dev-C++ ou o Code::Blocks. Só vai ter mais trabalho e depois descobrir que ninguém usa isso na prática. 

 

Preste atenção às mensagens, como a que postou:
 

image.png.fcb9bb1fb60bcfe4f2f571b50e874181.png

 

"no target" e "no project" parecem coisas ruins para seu programa.

 

image.png.44adc4b80657263ace87f48b4177a60d.png

 

undefined reference to "WinMain" sendo que seu programa não tem isso parece estranho, certo? O seu programa começa em main() não em WinMain()...

 

Você deve criar um projeto nesse IDE e inserir os arquivos de código nesse projeto. E esse projeto tem que ter um tipo porque o LINK precisa saber o sistema que vai ser usado: CONSOLE, WINDOWS, veja a s opções no Windows

 

      /SUBSYSTEM:{ BOOT_APPLICATION|CONSOLE|EFI_APPLICATION|
                  EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER|
                  NATIVE|POSIX|WINDOWS|WINDOWSCE} [,#[.##]]


O IDE precisa saber o que passar na fase do LINK, para gerar o executável. Como você não fez nada deu errado: WinMain() é o entrypoint para projetos WINDOWS. Só que o seu é CONSOLE e começa em main() como você sabe.

 

Corrija. Note a linha que eu te mostrei: 

 

        g++ -o tst -Wall -std=c++17 main.cpp Array.cpp

 

basta isso. Então precisa por isso no IDE...

 

 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...
10 horas atrás, MUrisCuri disse:

gera arquivos-fonte

 

? arquivos fonte não são gerados. Eles são a fonte. a entrada para o compilador, como os .cpp e os .h

 

O compilador gera arquivos objeto. Esses .o ou .obj dependendo da plataforma. Mais outros arquivos em certos casos, como certas listagens.

 

O montador, LINK, junta tudo e tenta criar um executável. Esse tudo inclui bibliotecas, como iostream, e arquivos .lib. 

 

O gcc pode chamar o LINK por conta dele e tentar gerar um executável, e é o que faz a menos que use a opção -c para só compilar.

 

E nesse caso o -o define o nome do arquivo de saída, o nome do PROGRAMA executável. Não percebeu que seu programa main.cpp gerou um tal tst.exe?

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

 

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!