C ::: Dicas & Truques ::: Recursão (Recursividade)

Como somar os elementos de um vetor em C usando uma função recursiva - Linguagem C para iniciantes

Quantidade de visualizações: 5453 vezes
Em algumas ocasiões ficamos imaginando o que pode ser feito com os métodos e funções recursivas. A resposta é: praticamente tudo.

Veja abaixo um programa C completo no qual eu mostro como escrever uma função recursiva que recebe um array e mostra a soma de seus elementos (lembre-se de que um array é o mesmo que vetor, ou seja, uma matriz de uma linha e várias colunas):

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

// função recursiva para somar todos os elementos de um array
int somar(int indice, int tamanho, int vetor[]){
  // o caso base...hora de encerrar a recursividade
  if(indice == (tamanho - 1)){
    return vetor[indice];
  }
  else{
    // ainda não é o caso base? vamos fazer uma nova chamada à função somar()
    return vetor[indice] + somar(indice + 1, 10, vetor);
  }
}

// função principal do programa
int main(int argc, char *argv[]){
  // vamos declarar um array de 10 elementos
  int valores[10];
  int i, soma;

  // vamos pedir ao usuário para informar os valores para o vetor
  for(i = 0; i < 10; i++){
    printf("Informe o valor do elemento %d: ", i);
    scanf("%d", &valores[i]); 
  }

  // vamos efetuar uma chamada à função recursiva somar();
  // nota que estamos passando o índice inicial, o tamanho do
  // array e o array em si
  soma = somar(0, 10, valores);
  printf("\nA soma dos elementos è: %d", soma);
  
  printf("\n\n");
  system("PAUSE");
  return 0;
}

Ao executarmos este código C nós teremos o seguinte resultado:

Informe o valor do elemento 0: 7
Informe o valor do elemento 1: 3
Informe o valor do elemento 2: 1
Informe o valor do elemento 3: 3
Informe o valor do elemento 4: 8
Informe o valor do elemento 5: 9
Informe o valor do elemento 6: 4
Informe o valor do elemento 7: 3
Informe o valor do elemento 8: 2
Informe o valor do elemento 9: 6

A soma dos elementos é: 46


Java ::: Projetos Java Completos - Códigos Fonte Completos Java ::: Jogos (Games)

Como criar um Jogo da Velha em Java - Jogo completo com código fonte comentado - Versão console

Quantidade de visualizações: 7222 vezes
Faça o download do código-fonte Jogo da Velha em Java

Sobre o Jogo da Velha em Java

O Jogo da Velha, também conhecido como Tic-Tac-Toe, é um dos joguinhos mais fáceis de se programar em Java. Além disso, ele possibilita uma boa oportunidade de se entender matrizes, a estrutura switch, os laços for e while, assim como a estrutura básica presente em praticamente todos os games.

O Jogo da Velha em Java Console

Neste código fonte eu demonstro como o Jogo da Velha pode ser criado em Java usando o modo console, ou seja, em formato texto. Penso que o entendimento da lógica é mais fácil em modo console. Uma vez que você tenha aprendido todos os passos envolvidos, você poderá reproduzí-lo em modo gráfico sem muitas dificuldades.

A versão do jogo apresentado nesta dica é um jogador humano, ou seja, você, contra o computador. Não coloquei inteligência artificial nem aprendizado de máquina nos movimentos do computador. Usei apenas jogadas sorteadas. Fica como desafio você implementar jogadas inteligentes por parte do computador como forma de deixar o jogo ainda mais interessante. Por enquanto o objetivo é só o aprendizado mesmo.

Antes de continuarmos, veja uma imagem demonstrando o jogo:



Me mostra um pouco do código

Para mostrar a simplicidade do código, veja o método que registra a jogada do jogador humano:

// este método registra a jogada do jogador humano
private static void jogadaHumano(char[][] tabuleiro) {
  int jogada; // para registrar a jogada do jogador humano
	
  // repete até que a jogada seja válida
  while (true) {
    // lê a jogada do humano
    System.out.print("\nSua jogada (1 a 9): ");
    jogada = Integer.parseInt(entrada.nextLine());
    // este movimento é válido?
    if (movimentoValido(tabuleiro, jogada)){
      break;
    } 
    else{ // não é válido
      System.out.println("O número " + jogada + " não é um movimento válido.");
    }  
  }
 
  // vamos registrar esse movimento 
  registrarMovimento(tabuleiro, jogada, 'X');
}
Como posso obter este código fonte?

Os links para você baixar todas as versões deste projeto estão abaixo:

1) JOGOVELHAJC - Jogo da Velha em Java Console - NetBeans IDE - Faça o Download.

Não se esqueça: Uma boa forma de estudar o código é fazendo pequenas alterações e rodando para ver os resultados. Outra opção é começar um projeto Java do zero e ir adicionando trechos do código fonte para melhor entendimento de suas partes.


C++ ::: Dicas & Truques ::: Arquivos e Diretórios

Como excluir um diretório em C++ usando a função rmdir()

Quantidade de visualizações: 8549 vezes
Em algumas situações nossos códigos C++ precisam excluir diretórios. Isso pode ser feito com o auxílio da função _rmdir() ou rmdir(), disponível no header direct.h (trazido da linguagem C). Veja a assinatura desta função:

int _rmdir(const char *pathname);
Se o diretório for excluído com sucesso a função retornará o valor 0. O retorno será -1 se um erro ocorrer. Neste caso a variável global errno será definido como um dos seguintes valores:

a) ENOTEMPTY - Directory not empty - O diretório não está vazio e portanto não pode ser excluído;

b) ENOENT - No such file or directory - O caminho do diretório é inválido;

c) EACCESS - Acesso negado - Algum outro programa está usando este diretório e mantém controle sobre o mesmo.

Veja um trecho de código C++ no qual excluímos um diretório:

#include <iostream>
#include <direct.h>

using namespace std;

int main(int argc, char *argv[]){
  // vamos excluir este diretório
  char diretorio[] = "C:\\Dev-Cpp\\estudos";

  // vamos testar se houve erro na exclusão do diretório
  if(rmdir(diretorio) == -1){
    cout << "Erro: " << strerror(errno) << endl;
  }
  else{
    cout << "Diretório excluído com sucesso" << endl;
  }

  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}

É possível usar a versão Unicode de _rmdir(), ou rmdir(). O método _wrmdir(), também presente em direct.h é útil quando precisamos internacionalizar nossas aplicações. Veja o exemplo:

#include <iostream>
#include <direct.h>

using namespace std;

int main(int argc, char *argv[]){
  // vamos excluir este diretório
  wchar_t diretorio[] = L"C:\\Dev-Cpp\\estudos";

  // vamos testar se houve erro na exclusão do diretório
  if(_wrmdir(diretorio) == -1){
    cout << "Erro: " << strerror(errno) << endl;
  }
  else{
    cout << "Diretório excluído com sucesso" << endl;
  }

  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}



Java ::: Desafios e Lista de Exercícios Resolvidos ::: Laços de Repetição

Exercício Resolvido de Java - Usando o laço do...while para pedir ao usuário para informar números inteiros e calcular a quantidade de números positivos, negativos, a soma e a média

Quantidade de visualizações: 9626 vezes
Pergunta/Tarefa:

Escreva um programa Java que usa o laço do...while para ler números inteiros até que o valor lido seja igual a 0. Em seguida mostre a quantidade de valores positivos e negativos, a soma dos valores e a média aritmética (sem incluir o valor 0 na contagem e no cálculo da média). A média deverá ser exibida como um valor de ponto flutuante.

Sua saída deverá ser parecida com a mostrada abaixo:

Informe um número inteiro (0 para sair): 5
Informe um número inteiro (0 para sair): -4
Informe um número inteiro (0 para sair): 3
Informe um número inteiro (0 para sair): 8
Informe um número inteiro (0 para sair): -2
Informe um número inteiro (0 para sair): 0
Quantidade de números positivos: 3
Quantidade de números negativos: 2
A soma dos números lidos é: 10
A média aritmética é: 2.0
Resposta/Solução:

Veja a resolução comentada deste exercício usando Java console:

package exercicios;

import java.util.Scanner;

public class Exercicios {
  public static void main(String[] args) {
    // vamos fazer a leitura usando a classe Scanner
    Scanner entrada = new Scanner(System.in);
      
    // declaração das variáveis
    int numero, quantLidos = 0, soma = 0;
    int quantPositivos = 0, quantNegativos = 0;
      
    // laço do...while que repetirá até que o usuário informe o valor 0
    do {
      // lê o primeiro ou próximo número
      System.out.print("Informe um número inteiro (0 para sair): ");
      numero = Integer.parseInt(entrada.nextLine());

      if(numero > 0){ // o número é positivo?
        quantPositivos++;
      }
      else if(numero < 0){ // o número é negativo?
        quantNegativos++;
      }

      // soma este número à soma já existente
      soma += numero;
      // aumenta a contagem dos números lidos
      if(numero != 0){ // não incluir o 0 para sair do programa na contagem
        quantLidos++;
      }
    }
    while(numero != 0); // condição de parada do laço

    if(quantLidos == 0){
      System.out.println("Você não informou nenhum número.");
    }
    else{
      System.out.println("Quantidade de números positivos: " + quantPositivos);
      System.out.println("Quantidade de números negativos: " + quantNegativos);
      System.out.println("A soma dos números lidos é: " + soma);
      System.out.println("A média aritmética é: " + ((soma * 1.0) / quantLidos));
      
      // note a multiplicação de soma por 1.0 para gerar um valor de ponto flutuante
      // antes da divisão
    }    
  }
}



Java ::: Dicas & Truques ::: Strings e Caracteres

Como retornar a representação numérica de um caractere em Java fazendo um cast de char para int

Quantidade de visualizações: 220 vezes
Um cast forçado de char para int é uma das formas mais práticas para se obter a representação numérica de um caractere em Java. Tudo que precisamos fazer é usar o método charAt() da classe String para obtermos o caractere na posição desejada de um texto, frase ou palavra e, em seguida, convertê-lo (cast) para um int.

Veja o código completo para o exemplo:

package arquivodecodigos;

// Este exemplo mostra como obter a representação
// númerica de um caractere

public class Estudos{
  public static void main(String[] args){
    String frase = "Programando em Java";
    
    for(int i = 0; i < frase.length(); i++){
      int valor = (int)frase.charAt(i);
      System.out.println(frase.charAt(i) + " = " 
        + valor);
    }    
        
    System.exit(0);
  }
}

Ao executar este código Java nós teremos o seguinte resultado:

P = 80
r = 114
o = 111
g = 103
r = 114
a = 97
m = 109
a = 97
n = 110
d = 100
o = 111
  = 32
e = 101
m = 109
  = 32
J = 74
a = 97
v = 118
a = 97



JavaScript ::: Dicas & Truques ::: Formatação de datas, strings e números

Como exibir apenas dois dígitos após o ponto decimal em JavaScript usando a função toFixed() do objeto Number

Quantidade de visualizações: 12731 vezes
Nesta dica mostrarei como podemos usar a função toFixed() do objeto Number da linguagem JavaScript para convertermos um valor de ponto flutuante em uma string (em texto). Durante a conversão nós vamos especificar que queremos apenas dois dígitos depois do ponto decimal.

Veja o código JavaScript completo para o exemplo:

<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; 
  charset=iso-8859-1" />
<title>Estudos JavaScript</title>
</head>
<body>
  
<script type="text/javascript">
  // vamos obter o valor de 
  // PI 3.141592653589793
  var valor = Math.PI;
  document.write("PI: " + valor);
  
  // agora vamos converter o valor de PI para
  // string e arredondar para o número de
  // decimais desejados
  var res = valor.toFixed(2);
  document.write("<br>Resultado: " + res);
</script>
   
</body>
</html>

Ao executar este código JavaScript nós teremos o seguinte resultado:

PI: 3.141592653589793
Resultado: 3.14


Java ::: Fundamentos da Linguagem ::: Passos Iniciais

Aprenda a ler entrada do usuário usando a classe Scanner do Java - Como ler a entrada do usuário em Java usando um objeto da classe Scanner

Quantidade de visualizações: 50370 vezes
Podemos ler entrada do usuário em aplicações Java console usando a classe Scanner do JDK 5.0 e recentes. Esta classe está no pacote java.util. Para ler strings use o método nextLine(), para ler inteiros use nextInt() e assim por diante. Não é um boa idéia misturar nextLine() com nextInt(), nextFloat(), etc. Em caso de comportamento estranho, é melhor ler tudo usando nextLine() e fazer conversões usando Integer.parseInt(), por exemplo.

Veja um código completo demonstrando o uso dessa classe:

package arquivodecodigos;

import java.util.*;
 
public class Estudos{
  public static void main(String[] args){
    Scanner in = new Scanner(System.in);
     
    System.out.print("Qual é o seu nome? ");
    String nome = in.nextLine();
 
    System.out.print("Qual sua idade? ");
    int idade = in.nextInt();
 
    System.out.println("Olá, " + nome +
       ". Você tem " + idade + " anos.");
  }
}

Ao executar este código nós teremos o seguinte resultado:

Qual é o seu nome? Osmar J. Silva
Qual sua idade? 39
Olá, Osmar J. Silva. Você tem 39 anos.


React Native ::: React Native - Componentes Visuais ::: Image

Como exibir imagens e fotos em aplicações React Native usando o componente Image

Quantidade de visualizações: 1097 vezes
O componente Image do React Native é usado quando queremos carregar imagens e exibí-las em nossas aplicações mobile. Este componente possibilita a exibição de diferentes tipos de imagens, incluindo imagens remotas (em um site, por exemplo), recursos estáticos, imagens em locais temporários e imagens a partir do armazenamento local, tais como imagens da câmera.

Veja uma aplicação React Native completa que mostra como carregar uma imagem da internet e exibí-la em um componente Image. Note que a imagem a ser exibida é a logo do nosso site. Eis o código:

import React, {Component} from 'react';  
import {Image, View} from 'react-native';  
   
type Props = {};  
export default class App extends Component<Props> {  
  render() {  
    return (        
      <View style={{padding: 10, flexDirection: 'column'}}>  
        <Image style={{width: 237, height: 49}} source={{uri:
           'https://www.arquivodecodigos.com.br/logo2.jpg'}} /> 
      </View>  
    );  
  }
}

É importante observar que, quando a imagem estiver sendo carregada de uma rede (internet, por exemplo) ou via propriedade data, temos que, manualmente, indicar as dimensões da imagem a ser exibida.


Delphi ::: Dicas & Truques ::: Ponteiros, Referências e Memória

Como usar nil para testar ou indicar que um ponteiro Delphi não referencia nenhuma posição de memória

Quantidade de visualizações: 15188 vezes
O propósito dos ponteiros é nos permitir acessar e manipular os valores de outras variáveis. Isso é feito acessando-se diretamente o endereço de memória destas variáveis. Porém, há situações nas quais queremos testar se um determinado ponteiro está realmente apontando para um local na memória. Veja o seguinte trecho de código:

procedure TForm1.Button1Click(Sender: TObject);
var
  pvalor: ^integer;
begin
  // vamos exibir o valor da variável referenciada pelo
  // ponteiro pvalor
  ShowMessage(IntToStr(pvalor^));
end;

Ao executarmos este código nós teremos um valor aleatório sendo exibido (e um warning do tipo W1036 Variable 'pvalor' might not have been initialized. Isso acontece porque criamos um ponteiro para um Integer mas não indicamos o endereço da variável para a qual ele aponta, ou seja, até o momento este ponteiro é nulo (não aponta para nenhuma posição de memória). Mova a declaração do ponteiro para a seção interface e verá que código compilará mas teremos uma exceção do tipo EAccessViolation (Exception class EAccessViolation with message 'Access violation at address ... in module ...). Clássico erro de lógica. Estamos tentando acessar dados não existentes na memória.

Esta situação pode ser evitada testando se o ponteiro ainda é nulo antes de tentarmos desreferenciá-lo. Veja:

procedure TForm1.Button1Click(Sender: TObject);
begin
  // vamos exibir o valor da variável referenciada pelo
  // ponteiro pvalor
  if pvalor = nil then
    ShowMessage('O ponteiro ainda é nulo.')
  else
    ShowMessage(IntToStr(pvalor^));
end;

Note que movi a declaração do ponteiro para a secão interface, de forma a torná-la global. Isso evita que o ponteiro seja automaticamente inicializado (o que sempre acontece com as variáveis locais). Ao executar o código novamente você verá a mensagem indicando que o ponteiro ainda é nulo.

Podemos também usar nil para, explicitamente, marcar um ponteiro como nulo, ou seja, definir que o ponteiro não aponta para nenhum local na memória. Comece declarando as variáveis abaixo na seção interface do formulário:

valor: Integer;
pvalor: ^Integer;

Em seguida coloque o código abaixo no evento Click de um botão:

procedure TForm1.Button1Click(Sender: TObject);
begin
  // vamos atribuir um valor à variável valor
  valor := 14;

  // vamos "apontar" nosso ponteiro para o local de
  // memória da variável valor
  pvalor := @valor;

  // vamos exibir o valor da variável apontada por pvalor
  ShowMessage(IntToStr(pvalor^));

  // vamos marcar pvalor como nulo
  pvalor := nil;

  // vamos causar um EAccessViolation já que pvalor
  // não aponta para nenhum local na memória agora
  ShowMessage(IntToStr(pvalor^));
end;

Sempre que marcamos um ponteiro como nil, a memória até então ocupada por ele é liberada para uso por parte do sistema operacional ou demais programas. Este procedimento ajuda a evitar os vazamentos de memória (memory leak) tão frequentes em códigos que trabalham com memória alocada dinamicamente.

Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009.


C# ::: Windows Forms ::: CheckBox

Como testar se uma CheckBox do C# Windows Forms está marcada ou desmarcada

Quantidade de visualizações: 22308 vezes
Em algumas situações precisamos verificar se uma CheckBox do C# Windows Forms está marcada ou desmarcada. Para isso só precisamos acessar sua propriedade Checked. Esta propriedade retorna um valor true se a CheckBox estiver marcada e false em caso contrário.

Veja o trecho de código abaixo (estou assumindo que você colocou um Button e uma CheckBox no seu formulário):

private void button1_Click(object sender, EventArgs e){
  // vamos verificar se a CheckBox está marcada ou desmarcada
  if(checkBox1.Checked)
    MessageBox.Show("A CheckBox está marcada");
  else
    MessageBox.Show("A CheckBox está desmarcada");
}

Se você quiser inverter o teste, ou seja, verificar primeiro se a CheckBox está desmarcada, poderá fazer algo assim:

private void button1_Click(object sender, EventArgs e){
  // vamos verificar se a CheckBox está marcada ou desmarcada
  if(!checkBox1.Checked)
    MessageBox.Show("A CheckBox está desmarcada");
  else
    MessageBox.Show("A CheckBox está marcada");
}


Carregar Publicações Anteriores


Nossas 20 dicas & truques de programação mais populares

Você também poderá gostar das dicas e truques de programação abaixo

Nossas 20 dicas & truques de programação mais recentes

Últimos Projetos e Códigos Fonte Liberados Para Apoiadores do Site

Últimos Exercícios Resolvidos

E-Books em PDF

E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 20 usuários muito felizes estudando em nosso site.