Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais |
Você está aqui: Delphi ::: Dicas & Truques ::: Recursão (Recursividade) |
|
Obtendo o número ou a sequencia de Fibonacci recursivamente usando DelphiQuantidade de visualizações: 17983 vezes |
|
Uma sequencia de números de Fibonacci é definida como a seguir: Fib(n) = n | se n < 2 Fib(n) = Fib(n - 2) + Fib(n - 1) | caso contrário A definição estabelece que, se os primeiros dois números são 0 e 1, então qualquer número na sequencia é a soma de seus dois predecessores. Mas esses predecessores são, por sua vez, somas de seus predecessores, e assim por diante, até o início da sequencia. Desta forma, a sequencia produzida pela definição é: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377... Se quisermos, por exemplo, calcular o Fibonacci de 6, teríamos apenas que somar seus dois predecessores, a saber, 3 e 5, resultando em 8. Mas antes, é preciso calcular o Fibonacci de 3 e também de 5. É aqui que o uso da recursão ou recursividade nos auxilia bastante. Veja uma função fibonacci() recursiva que calcula o Fibonacci de 6. Note a condição de parada da cadeia de chamadas (que deve ocorrer quando n for menor que 2): // função recursiva para calcular o Fibonacci // de um determinado número function fibonacci(n: Integer): Integer; begin if n < 2 then Result := n else Result := fibonacci(n - 2) + fibonacci(n - 1); end; // vamos chamar a função recursiva // a partir do Click de um botão procedure TForm1.Button1Click(Sender: TObject); var res: Integer; begin // vamos calcular o fibonacci de 6 res := fibonacci(6); // vamos mostrar o resultado ShowMessage('O Fibonacci de 6 é: ' + IntToStr(res)); end; Execute o código e veja o resultado. Mas, tenha cuidado ao tentar obter o Fibonacci de um número muito grande devido à recursividade excessiva. Isso ocorre porque, para calcular Fibonacci(6) nós precisamos calcular Fibonacci(5), Fibonacci(4), Fibonacci(3), Fibonacci(2), Fibonacci(1) e Fibonacci(0) primeiro. No entanto, para calcular Fibonacci(4), temos que novamente calcular Fibonacci(3), Fibonacci(2), Fibonacci(1) e Fibonacci(0) novamente. Veja no trecho de código a seguir como podemos obter uma lista de todas as chamadas: // função recursiva para calcular o Fibonacci // de um determinado número function fibonacci(n: Integer; memo: TMemo): Integer; begin // vamos registar esta chamada memo.Lines.Add('Fibonacci(' + IntToStr(n) + ')'); if n < 2 then Result := n else Result := fibonacci(n - 2, memo) + fibonacci(n - 1, memo); end; // vamos chamar a função recursiva // a partir do Click de um botão procedure TForm1.Button1Click(Sender: TObject); var res: Integer; begin // vamos calcular o fibonacci de 6 e registrar // a cadeia de chamadas em um TMemo res := fibonacci(6, Memo1); // vamos mostrar o resultado ShowMessage('O Fibonacci de 6 é: ' + IntToStr(res)); end; Execute o código e verá a seguinte árvore de chamadas: Fibonacci(6) Fibonacci(4) Fibonacci(2) Fibonacci(0) Fibonacci(1) Fibonacci(3) Fibonacci(1) Fibonacci(2) Fibonacci(0) Fibonacci(1) Fibonacci(5) Fibonacci(3) Fibonacci(1) Fibonacci(2) Fibonacci(0) Fibonacci(1) Fibonacci(4) Fibonacci(2) Fibonacci(0) Fibonacci(1) Fibonacci(3) Fibonacci(1) Fibonacci(2) Fibonacci(0) Fibonacci(1) De fato é uma cadeia de chamadas muito grande para calcularmos apenas o Fibonacci de 6. Se precisássemos calcular o Fibonacci de 200, o número de chamadas chegaria à casa dos milhões. Não tente! Pode haver estouro da pilha do sistema operacional. Podemos combinar a função recursiva que vimos no início da dica com um laço for para obter os 10 primeiros termos da sequencia de Fibonacci. Veja: // função recursiva para calcular o Fibonacci // de um determinado número function fibonacci(n: Integer): Integer; begin if n < 2 then Result := n else Result := fibonacci(n - 2) + fibonacci(n - 1); end; // vamos chamar a função recursiva para calcular // os 10 primeiros termos da sequencia de Fibonacci procedure TForm1.Button1Click(Sender: TObject); var i: Integer; res: String; begin res := ''; for i := 0 to 9 do begin res := res + IntToStr(fibonacci(i)) + ' '; end; ShowMessage(res); end; Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009. |
|
Link para compartilhar na Internet ou com seus amigos: | |
C ::: Dicas & Truques ::: Strings e Caracteres |
Como escrever uma função is_numeric() em C que verifica se uma string contém apenas dígitos de 0 a 9Quantidade de visualizações: 9774 vezes |
Em algumas situações precisamos verificar se uma string contém apenas dígitos de 0 a 9, ou seja, é um valor numérico inteiro válido. Para isso podemos usar a função personalizada em C que mostro nesta dica. Veja que o segredo é passar todos os caracteres individualmente para a função isdigit(). Veja o código:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // função personalizada que permite verificar se uma // string contém apenas dígitos de 0 a 9 int is_numeric(const char *str){ int res = 1; // passou no teste // vamos percorrer todos os caracteres da string // e testar se cada um é um dígito. Se não // for nós marcamos res como 0 e retornamos while(*str){ if(!isdigit(*str)){ res = 0; break; } // vamos passar para o próximo caractere str++; } return res; } int main(int argc, char *argv[]){ char valor[20]; // vamos guardar o valor digitado aqui // vamos ler o valor informado pelo usuário printf("Digite qualquer coisa e tecle ENTER: "); gets(valor); // vamos verificar se o usuário informou uma string // que contém apenas dígitos de 0 a 9 if(is_numeric(valor)) printf("Voce informou uma string numerica"); else printf("Voce NAO informou uma string numerica"); puts("\n\n"); system("PAUSE"); return 0; } E, antes que perguntem como é possível verificar se a string contém um valor fracionário válido, a seguinte alteração pode ser feita: int is_numeric(const char *str){ int res = 1; // passou no teste // vamos percorrer todos os caracteres da string // e testar se cada um é um dígito ou uma vírgula. Se não // for nós marcamos res como 0 e retornamos while(*str){ if((!isdigit(*str)) and (*str != ',')){ res = 0; break; } // vamos passar para o próximo caractere str++; } return res; } |
Java ::: Classes e Componentes ::: JList |
Java Swing - Como obter o valor selecionado em um JList usando o método getSelectedValue()Quantidade de visualizações: 12776 vezes |
Nesta dica eu mostro como chamar o método getSelectedValue() de um controle JList para obter o valor do item selecionado na mesma. No exemplo nós exibimos o item selecionado em uma mensagem JOptionPane ao clicarmos em um botão JButton. Veja o código completo para o exemplo: package arquivodecodigos; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Estudos extends JFrame{ JList lista; public Estudos() { super("A classe JList"); Container c = getContentPane(); c.setLayout(new FlowLayout(FlowLayout.LEFT)); // Cria os itens da lista String nomes[] = {"Carlos", "Marcelo", "Fabiana", "Carolina", "Osmar"}; // Cria a JList lista = new JList(nomes); // Define a seleção única para a lista lista.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // Um botão que permite obter o valor do item selecionado JButton btn = new JButton("Obter valor selecionado"); btn.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e){ String valor = (String)(lista.getSelectedValue()); JOptionPane.showMessageDialog(null, "O valor selecionado é: " + valor); } } ); // Adiciona a lista à janela c.add(new JScrollPane(lista)); // Adiciona o botão à janela c.add(btn); setSize(350, 250); setVisible(true); } public static void main(String args[]){ Estudos app = new Estudos(); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } Ao executar esta aplicação Java Swing nós teremos o seguinte resultado: |
Java ::: Fundamentos da Linguagem ::: Tipos de Dados |
Apostila de Java para iniciantes - Como usar o tipo de dados int da linguagem JavaQuantidade de visualizações: 12094 vezes |
O tipo de dados int pode ser usado quando queremos armazenar valores inteiros na faixa ?2.147.483.648 até 2.147.483.647 (acima de dois milhões). Veja um exemplo:public class Estudos{ static int valor = 1500; public static void main(String args[]){ System.out.println("O valor da variável é: " + valor); System.exit(0); } } O tipo de dados int pode ser convertido (sem a necessidade de cast) para os seguintes tipos: int -> long -> float -> double Se precisarmos converter o tipo int para os tipos char, byte ou short, teremos que lançar mão de uma coerção (cast). Veja: short valor2 = (short)(valor); |
C++ ::: Dicas & Truques ::: Strings e Caracteres |
Como acessar os caracteres de uma string C++ individualmente usando um iteradorQuantidade de visualizações: 10897 vezes |
Nesta dica mostrarei como podemos usar um iterador para percorrer todos os caracteres de uma palavra, frase ou texto em C++. Para isso nós vamos combinar um iterator e as funções begin() e end(). Veja o código C++ completo para o exemplo: #include <string> #include <iostream> using namespace std; // função principal do programa C++ int main(int argc, char *argv[]){ // vamos declarar um objeto da classe string string palavra("FACULDADE"); // agora criamos um iterador para a string string::iterator it; // e usamos um laço for para percorrer o iterador // do início ao fim for(it = palavra.begin(); it < palavra.end(); it++){ // e mostramos os caracteres individuais cout << *it << "\n"; } cout << "\n" << endl; system("PAUSE"); // pausa o programa return EXIT_SUCCESS; } Ao executar este código C++ nós teremos o seguinte resultado: F A C U L D A D E |
C ::: Dicas & Truques ::: Arquivos e Diretórios |
Como escrever em um arquivo um caractere de cada vez usando a função fputc() da linguagem CQuantidade de visualizações: 9067 vezes |
Em algumas situações precisamos escrever em um arquivo um caractere de cada vez. Para isso podemos usar a função fputc() do header stdio.h. Esta função recebe o caractere a ser escrito e um ponteiro para o objeto FILE que identifica o arquivo no qual queremos escrever. Se o caractere for escrito com sucesso, o indicador de posição interna do arquivo é adiantado para a inserção do próximo caractere. Veja um exemplo no qual escrevemos o alfabeto maiúsculo em um arquivo chamado alfabeto.txt: #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ FILE *arquivo; char letra; // vamos abrir o arquivo para escrita arquivo = fopen("alfabeto.txt", "w"); if(arquivo != NULL){ for(letra = 'A'; letra <= 'Z'; letra++){ fputc((int)letra, arquivo); } fclose(arquivo); } puts("Tentei escrever no arquivo. Veja se funcionou."); puts("\n\n"); system("PAUSE"); return 0; } Ao executar este código nós teremos o seguinte resultado: Tentei escrever no arquivo. Veja se funcionou. Em seguida, se olharmos o conteúdo do arquivo "alfabeto.txt" veremos que o conteúdo foi escrito da forma que imaginamos. |
Desafios, Exercícios e Algoritmos Resolvidos de C |
Veja mais Dicas e truques de C |
Dicas e truques de outras linguagens |
Códigos Fonte |
Software de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais |
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais |
Linguagens Mais Populares |
1º lugar: Java |