Ir ao conteúdo
  • Cadastre-se

Java Programação Fila de Banco


Posts recomendados

Estou desenvolvendo um código para a fila de um banco. As regras são as seguintes.

 

A senha deve ter a letra do tipo do atendimento, seguida de um número sequencial. Todos os tipos (preferencial, rápida e comum) obedecem uma única sequência numérica (P-1, C-2, C-3, R-4).

 

São quatro caixas, sendo que:

- Caixa 1: realiza os atendimentos P. Se não houver atendimentos preferenciais na fila, atende o próximo (R ou C).
- Caixas 2 e 3: atendem primeiro as senhas de atendimento R. Se não houver atendimento rápido, atendem o próximo da fila (P ou C).
- Caixa 4: realiza os atendimentos C. Se não houver atendimentos comuns na fila, atende o próximo (R ou P).

 

No entanto, estou com problemas na lógica, pois não está obedecendo esta ordem de atendimentos e dá erro. 

 

Alguém sabe me dizer como fazer ou o que está errado?

 


public class Senha {
    
    private String tipo;
    private int numero;

    public Senha(String tipo, int numero) {
        this.tipo = tipo;
        this.numero = numero;
    }

    public Senha() {
        this.tipo = "";
        this.numero = 0;
    }
    
    @Override
    public String toString() {
        return "Senhas{" + "tipo=" + tipo + ", numero=" + numero + '}';
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

}


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


public class Formulario extends javax.swing.JFrame {

    int numero;
    List<Senha> listaSenha;
    
    
    public Formulario() {
        initComponents();
        numero = 0;
        listaSenha = new ArrayList<Senha>();
    }
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        painelSenha = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        painelGuiche = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        botaoComum = new javax.swing.JButton();
        botaoRapida = new javax.swing.JButton();
        botaoPreferencial = new javax.swing.JButton();
        jLabel5 = new javax.swing.JLabel();
        campoSenha = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        botaoCaixa1 = new javax.swing.JButton();
        botaoCaixa2 = new javax.swing.JButton();
        botaoCaixa3 = new javax.swing.JButton();
        botaoCaixa4 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("BANCO JAVA");

        jLabel2.setText("SENHA:");

        jLabel3.setText("COMPARACER AO:");

        jLabel4.setText("PARA CLIENTES:");

        botaoComum.setText("COMUM");
        botaoComum.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoComumActionPerformed(evt);
            }
        });

        botaoRapida.setText("RÁPIDA");
        botaoRapida.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoRapidaActionPerformed(evt);
            }
        });

        botaoPreferencial.setText("PREFERENCIAL");
        botaoPreferencial.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoPreferencialActionPerformed(evt);
            }
        });

        jLabel5.setText("SUA SENHA É:");

        jLabel6.setText("PARA CAIXAS:");

        botaoCaixa1.setText("CAIXA 1");
        botaoCaixa1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoCaixa1ActionPerformed(evt);
            }
        });

        botaoCaixa2.setText("CAIXA 2");
        botaoCaixa2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoCaixa2ActionPerformed(evt);
            }
        });

        botaoCaixa3.setText("CAIXA 3");
        botaoCaixa3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoCaixa3ActionPerformed(evt);
            }
        });

        botaoCaixa4.setText("CAIXA 4");
        botaoCaixa4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoCaixa4ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(19, 19, 19)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(painelSenha, javax.swing.GroupLayout.DEFAULT_SIZE, 437, Short.MAX_VALUE)
                            .addComponent(jLabel3)
                            .addComponent(jLabel2)
                            .addComponent(jLabel1)
                            .addComponent(painelGuiche))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel4)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addComponent(botaoComum, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(botaoRapida, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(botaoPreferencial, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                                .addGap(18, 18, 18)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(campoSenha))))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 111, Short.MAX_VALUE)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(botaoCaixa1, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel6)
                            .addComponent(botaoCaixa2, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(botaoCaixa3, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(botaoCaixa4, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(42, 42, 42))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addGap(18, 18, 18)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(painelSenha, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jLabel3)
                .addGap(4, 4, 4)
                .addComponent(painelGuiche, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(33, 33, 33)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(jLabel6))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(botaoComum)
                            .addComponent(botaoCaixa1))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(botaoRapida)
                            .addComponent(botaoCaixa2))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(botaoPreferencial)
                            .addComponent(botaoCaixa3)))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(11, 11, 11)
                        .addComponent(jLabel5)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(campoSenha)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botaoCaixa4)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void botaoRapidaActionPerformed(java.awt.event.ActionEvent evt) {                                            
        numero++;
        Senha s = new Senha("R", numero);
        listaSenha.add(s);
        campoSenha.setText(String.valueOf(s.getTipo()) + "-" + String.valueOf(s.getNumero()));
    }                                           

    private void botaoComumActionPerformed(java.awt.event.ActionEvent evt) {                                           
       numero++;
        Senha s = new Senha("C", numero);
        listaSenha.add(s);
        campoSenha.setText(String.valueOf(s.getTipo()) + "-" + String.valueOf(s.getNumero())); 
    }                                          

    private void botaoPreferencialActionPerformed(java.awt.event.ActionEvent evt) {                                                  
numero++;
        Senha s = new Senha("P", numero);
        listaSenha.add(s);
        campoSenha.setText(String.valueOf(s.getTipo()) + "-" + String.valueOf(s.getNumero()));        // TODO add your handling code here:
    }                                                 

    private void botaoCaixa1ActionPerformed(java.awt.event.ActionEvent evt) {                                            
        Iterator<Senha> itr = listaSenha.iterator();

        while (itr.hasNext()) {
            Senha caixa = itr.next();
            itr.remove();
            if (caixa.getTipo().equals("P")) {

                painelSenha.setText(String.valueOf(caixa.getTipo()) + "-" + String.valueOf(caixa.getNumero()));
                painelGuiche.setText(" Caixa 1 ");
                break;

            } else {
                painelSenha.setText(String.valueOf(caixa.getTipo()) + "-" + String.valueOf(caixa.getNumero()));
                painelGuiche.setText(" Caixa 1 ");
            }

        }                          
    }                                           

    private void botaoCaixa2ActionPerformed(java.awt.event.ActionEvent evt) {                                            
        Iterator<Senha> itr = listaSenha.iterator();

        while (itr.hasNext()) {
            Senha caixa = itr.next();
            itr.remove();
            if (caixa.getTipo().equals("R")) {

                painelSenha.setText(String.valueOf(caixa.getTipo()) + "-" + String.valueOf(caixa.getNumero()));
                painelGuiche.setText(" Caixa 2 ");
                break;

            } else {
                painelSenha.setText(String.valueOf(caixa.getTipo()) + "-" + String.valueOf(caixa.getNumero()));
                painelGuiche.setText(" Caixa 2 ");
            }
    }                   
    }                                           

    private void botaoCaixa3ActionPerformed(java.awt.event.ActionEvent evt) {                                            
        Iterator<Senha> itr = listaSenha.iterator();
        
        while(itr.hasNext()){
            Senha caixa = itr.next();
            itr.remove();
            if(caixa.getTipo().equals("R")){
                
            painelSenha.setText(String.valueOf(caixa.getTipo()) + "-" + String.valueOf(caixa.getNumero()));
            painelGuiche.setText(" Caixa 3 ");
            break;
                   
            }
            else{
            painelSenha.setText(String.valueOf(caixa.getTipo()) + "-" + String.valueOf(caixa.getNumero()));
            painelGuiche.setText(" Caixa 3 ");
            }
    }              
    }                                           

    private void botaoCaixa4ActionPerformed(java.awt.event.ActionEvent evt) {                                            
        Iterator<Senha> itr = listaSenha.iterator();
        
        while(itr.hasNext()){
            Senha caixa = itr.next();
            itr.remove();
            if(caixa.getTipo().equals("C")){
                
            painelSenha.setText(String.valueOf(caixa.getTipo()) + "-" + String.valueOf(caixa.getNumero()));
            painelGuiche.setText(" Caixa 4 ");
            break;
                   
            }
            else{
            painelSenha.setText(String.valueOf(caixa.getTipo()) + "-" + String.valueOf(caixa.getNumero()));
            painelGuiche.setText(" Caixa 4 ");
            }
    }                     
    }                                           

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
       
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Formulario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Formulario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Formulario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Formulario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Formulario().setVisible(true);
            }
        });
    }



    // Variables declaration - do not modify                     
    private javax.swing.JButton botaoCaixa1;
    private javax.swing.JButton botaoCaixa2;
    private javax.swing.JButton botaoCaixa3;
    private javax.swing.JButton botaoCaixa4;
    private javax.swing.JButton botaoComum;
    private javax.swing.JButton botaoPreferencial;
    private javax.swing.JButton botaoRapida;
    private javax.swing.JTextField campoSenha;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JTextField painelGuiche;
    private javax.swing.JTextField painelSenha;
    // End of variables declaration                   
}

 

Link para o comentário
Compartilhar em outros sites

Vou tentar fazer em pseudo código aqui,

 

primeiro if(caixa == 1) 

você percorre até o final da fila achando o primeiro P você atende, caso não existe(else) P, você atende o próximo da fila.

 

segundo if(caixa == 2) ou (caixa == 3)

você percorre até o final da fila achando o primeiro R você atende, caso não existe(else) R, você atende o próximo da fila.

 

terceiro if(caixa == 4) 

você percorre até o final da fila achando o primeiro C você atende, caso não existe(else) C, você atende o próximo da fila.

 

não fiz em Java, mas espero ter tentado ajudar na lógica.

 

Link para o comentário
Compartilhar em outros sites

@Verônica Xavier Gabardo Olha eu não to compilando aqui mas você poderia descrever o erro? e o comportamento que está dando errado?

 

adicionado 6 minutos depois

Pelo jeito enquanto percorre você está fazendo o if, ta errado você tem que guardar a referencia do próximo seja quem for, se for P no caixa 1 você defini o atendimento e remove em seguida, se não for P, você NÃO remove da fila continua andando até achar o próximo P e atender, se não existir mais P volte na referencia do próximo inicial e atendi ele(remove em seguida)  e de continuidade na fila.

Link para o comentário
Compartilhar em outros sites

@Matheus0019 Os caixas atendem primeiro as letras que devem atender, porém, na sequência, deveriam seguir a ordem da fila do começo, mas não, seguem a ordem a partir do último atendido.

 

Por exemplo, o caixa 2 tem que atender as senhas R, se não tiver senha R, tem que atender as C ou P (de acordo com a ordem numérica).

Supondo que temos a seguinte fila: C1, C2, R3, R4, P5, P6. Ele atende a R3 e R4 (até aí está correto), mas depois, chama a P5, enquanto deveria obedecer a ordem numérica e chamar a C1.

Link para o comentário
Compartilhar em outros sites

5 minutos atrás, Verônica Xavier Gabardo disse:

@Matheus0019 Os caixas atendem primeiro as letras que devem atender, porém, na sequência, deveriam seguir a ordem da fila do começo, mas não, seguem a ordem a partir do último atendido.

 

Por exemplo, o caixa 2 tem que atender as senhas R, se não tiver senha R, tem que atender as C ou P (de acordo com a ordem numérica).

Supondo que temos a seguinte fila: C1, C2, R3, R4, P5, P6. Ele atende a R3 e R4 (até aí está correto), mas depois, chama a P5, enquanto deveria obedecer a ordem numérica e chamar a C1.

Isso que falei se o próximo não for o preferencial naquele caixa, você GUARDA a referencia dele, atendi os preferenciais remove da fila e depois volta na referencia guardada, você não está guardando a referencia. Sempre tu ta indo para o próximo e não está voltando no ponto que deveria voltar

Link para o comentário
Compartilhar em outros sites

13 minutos atrás, Verônica Xavier Gabardo disse:

@Matheus0019 @Matheus0019 como assim guardar a referência? sou bem iniciante... hehehe

Então você entra na fila vê se o primeiro é preferencial, se sim voce atende e remove, se não for preferencial você faz uma variável que aponte para ele tipo first_fila = primeiro, em seguida ande na fila até o final, se não existir preferencial você volta no first_fila e continua percorrendo a fila a partir dele percorrendo normalmente. Por exemplo você anda na fila até o final atendendo os preferenciais e removendo da fila depois que não houver preferencial você volta na primeira posição que é aquele que não é preferencial que você guardou lá no começo e prossiga normalmente. Entende?

Link para o comentário
Compartilhar em outros sites

@Verônica Xavier Gabardo O que você ta fazendo atualmente é andando e removendo, neste caso você tem perdido algumas senhas que ainda não foram atendidas, você só remove após atender. Você deve andar na fila duas vezes uma vez pegando só preferencial e atendendo(removendo), e outra voltando do ponto inicial e prosseguindo normalmente.

adicionado 45 minutos depois

Outra solução seria sempre ordenar as filas primeiro por preferência(colocando o preferencial do caixa na frente), depois os que sobrarem ordenar por ordem numérica da senha, resolveria seu problema.

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

Não programo em Java, mas vou dar meu palpite de leigo:

//Crie 3 filas, uma para cada tipo de senha 
List<Senha> listaSenhaP;
List<Senha> listaSenhaR;
List<Senha> listaSenhaC;
//Cada botao adicionar um elemento em filas diferens
private void botaoRapidaActionPerformed(java.awt.event.ActionEvent evt) {                                            
       //...
        listaSenhaR.add(s);
        
private void botaoComumActionPerformed(java.awt.event.ActionEvent evt) {                                           
  //...
        listaSenhaC.add(s);
        
private void botaoPreferencialActionPerformed(java.awt.event.ActionEvent evt) {                                                  
//...
        listaSenhaP.add(s);
  
// Na hora de iteragir com as filhas, se uma determinada fila esta vazia você passa para a proxima
 
  private void botaoCaixa1ActionPerformed(java.awt.event.ActionEvent evt) {                                            
        Iterator<Senha> itr = listaSenhaP.iterator();
  		// verifica se a fila Preferencial está vazia
  		if (listaSenhP.isEmpty()) 
  		{
  			//verifica se a lista Rápida também está vazia
  			if (listaSenhaR.isEmpty()) 
  			{
  				//Caso a fila rápida esteja vazia, coloque aqui o código para chamar da fila Comum
  			} else
  			{
  				//Bote aqui o código para chamar a da fila Rápida
  			}
  
  		} else //Cahama da fila Rápida, pois não está vazia
  		{
   			Senha caixa = itr.next();
            itr.remove();
  			painelSenha.setText(String.valueOf(caixa.getTipo()) + "-" + String.valueOf(caixa.getNumero()));
           	painelGuiche.setText(" Caixa 1 ");
           
  		}

        
    }         
            
  

Espero ter ajudado.

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

Mas qual é a versão do Java? Eu usei o Java 15 para escrever aquele código, então se você estiver usando uma versão mais antiga que a 15, não vai rolar.

adicionado 37 minutos depois

Eu compilei o código de novo, agora ele é compatível com o Java 8.

FilaBanco.zip

Link para o comentário
Compartilhar em outros sites

@Mateus Corcini  sim, fiz por primeiro.

adicionado 4 minutos depois

@j6t2h

private void botaoCaixa1ActionPerformed(java.awt.event.ActionEvent evt) { int aux = 0; if(listaSenha.size() > 0){ painelGuiche.setText(" Caixa 1 "); for (int i = 0; i < listaSenha.size(); i++) { if(listaSenha.get(i).getTipo().equals("P")){ painelSenha.setText(String.valueOf(listaSenha.get(i).getTipo()) + "-" + String.valueOf(listaSenha.get(i).getNumero())); listaSenha.remove(i); aux = 1; break; } } if(aux == 0){ for (int i = 0; i < listaSenha.size(); i++) { if(listaSenha.get(i).getTipo().equals("R") || listaSenha.get(i).getTipo().equals("C")){ painelSenha.setText(String.valueOf(listaSenha.get(i).getTipo()) + "-" + String.valueOf(listaSenha.get(i).getNumero())); listaSenha.remove(i); aux = 1; break; } } } } }

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!