![]() |
|
||||
![]() Planilha Web - Planilhas e Calculadoras online para estudantes e profissionais de Engenharia Civil, Engenharia Elétrica e Engenharia Mecânica. |
|||||
C ::: Estruturas de Dados ::: Lista Ligada Simples |
Estruturas de Dados em C - Como inserir antes de um determinado nó em uma lista encadeada simples usando CQuantidade de visualizações: 2090 vezes |
Em algumas situações nós precisamos inserir o novo nó antes de um determinado nó na lista encadeada simples. Veja, por exemplo, uma lista com o seguintes valores: 45 | 3 | 98 | 47 Suponha que queremos inserir o valor 50 antes do 98, então o novo conteúdo da lista será: 45 | 3 | 50 | 98 | 47 Observe que neste exemplo eu tratei o caso de inserir antes do primeiro nó, ou seja, antes do 45, mas não tratei a lista vazia. Há também a questão do laço infinito caso o usuário queira inserir antes de um nó não existente (não tratada). Veja o código completo: #include <stdio.h> #include <stdlib.h> // estrutura Nó struct No{ int valor; struct No *proximo; }; // fim da estrutura Nó // função que permite exibir os valores de // todos os nós da lista void exibir(struct No *n){ if(n != NULL){ do{ printf("%d\n", n->valor); n = n->proximo; }while(n != NULL); } else printf("A lista esta vazia\n\n"); } // função que permite inserir um novo nó // antes de um determinado valor struct No *inserir_antes_valor(struct No *n, int v, int v_antes){ // reserva memória para o novo nó struct No *novo = (struct No*)malloc(sizeof(struct No)); novo->valor = v; // guarda o nó antes do valor que procuramos struct No *anterior = NULL; struct No *temp = n; // aponta para o início da lista // enquanto for diferente do valor que estamos procurando while(temp->valor != v_antes){ anterior = temp; // anterior recebe temp // e temp recebe o seu próximo temp = temp->proximo; } // ATENÇÃO: não estamos tratando a condição // de lista vazia. Para isso veja minha dica // sobre como inserior no início da lista // devemos inserior no início da lista? if(anterior == NULL){ // o próximo do novo nó é o início da lista novo->proximo = n; n = novo; // início da lista é o novo nó } else{ // o proximo do anterior é o novo nó anterior->proximo = novo; // e o próximo do novo nó é temp novo->proximo = temp; } return n; } // função que permite inserir nós no // final da lista. // veja que a função recebe o valor a ser // armazenado em cada nó e um ponteiro para o // início da lista. A função retorna um // ponteiro para o início da lista struct No *inserir_final(struct No *n, int v){ // reserva memória para o novo nó struct No *novo = (struct No*)malloc(sizeof(struct No)); novo->valor = v; // verifica se a lista está vazia if(n == NULL){ // é o primeiro nó...não deve apontar para // lugar nenhum novo->proximo = NULL; return novo; // vamos retornar o novo nó como sendo o início da lista } else{ // não está vazia....vamos inserir o nó no final // o primeiro passo é chegarmos ao final da lista struct No *temp = n; // vamos obter uma referência ao primeiro nó // vamos varrer a lista até chegarmos ao último nó while(temp->proximo != NULL){ temp = temp->proximo; } // na saída do laço temp aponta para o último nó da lista // novo será o último nó da lista...o campo próximo dele deve // apontar para NULL novo->proximo = NULL; // vamos fazer o último nó apontar para o nó recém-criado temp->proximo = novo; return n; // vamos retornar o início da lista intacto } } int main(int argc, char *argv[]) { // declara a lista struct No *inicio = NULL; // vamos inserir quatro valores no final // da lista inicio = inserir_final(inicio, 45); inicio = inserir_final(inicio, 3); inicio = inserir_final(inicio, 98); inicio = inserir_final(inicio, 47); // vamos exibir a lista puts("Valores atuais:\n"); exibir(inicio); // vamos inserir o valor 50 antes do 98 inicio = inserir_antes_valor(inicio, 50, 98); // vamos exibir a lista novamente puts("\nValores agora:\n"); exibir(inicio); puts("\n\n"); system("pause"); return 0; } |
Java ::: Desafios e Lista de Exercícios Resolvidos ::: Arquivos e Diretórios |
Exercícios Resolvidos de Java - Um programa que recebe um caminho e nome de um arquivo e retorna apenas o caminho, sem o nome e extensão do arquivoQuantidade de visualizações: 7660 vezes |
Pergunta/Tarefa: Escreva um método Java que recebe um caminho e nome de arquivo na forma: "C:\temporario\Java\dica.txt" e retorne apenas o caminho do arquivo, sem o nome e extensão do arquivo. Assim, para o caminho acima, o retorno deve ser apenas: "C:\temporario\Java" Eis a assinatura do método a ser criado: public static String getCaminho(String caminho); Resposta/Solução: Veja a resolução comentada deste exercício usando Java console: package estudos; import java.io.File; public class Main { public static void main(String[] args) { // define um caminho e nome de arquivo String caminho = "C:\\temporario\\Java\\dica.txt"; // vamos retornar apenas o caminho do arquivo, ou seja, retirar o // nome do arquivo String caminhoFinal = getCaminho(caminho); // vamos mostrar o resultado System.out.println("O caminho do arquivo é: " + caminhoFinal); } public static String getCaminho(String caminho){ // vamos obter o índice da última ocorrência do separador de caminho int pos = caminho.lastIndexOf(File.separatorChar); if (pos > -1) { return caminho.substring(0, pos); } // por padrão vamos retornar uma string vazia return ""; } } Uma variação deste exercício é a criação de um método que recebe o caminho e nome do arquivo e retorne apenas o nome do arquivo, seguido por sua extensão. |
JavaScript ::: Dicas & Truques ::: Cookies |
Cookies em JavaScript - Como registrar a quantidade de vezes que o usuário visitou a sua página HTMLQuantidade de visualizações: 195 vezes |
Nesta dica mostrarei como podemos cookies em JavaScript para gravar e exibir para o usuário a quantidade de vezes que ele visitou o nosso site ou página. Veja que, no código, nós temos duas funções: gravarCookie(), que recebe o nome, o valor e a direção do cookie em dias, e obterCookie(), que recebe o nome do cookie e retorna o seu valor. O resultado ficará parecido ao que temos na figura abaixo: ![]() E agora o código JavaScript completo para o exemplo, incluindo a página HTML: <html> <head> <title>Estudando JavaScript</title> <script type="text/javascript"> // função que permite gravar um cookie function gravarCookie(nome, valor, diasDuracao){ var dataExpiracao = new Date(); dataExpiracao.setTime(dataExpiracao.getTime() + (diasDuracao * 24 * 3600 * 1000)); document.cookie = nome + "=" + escape(valor) + ((diasDuracao == null) ? "" : "; expires=" + dataExpiracao); } // função quer permite obter um cookie function obterCookie(nome){ if(document.cookie.length > 0){ var c_start = document.cookie.indexOf(nome + "="); if(c_start != -1){ c_start = c_start + nome.length + 1; c_end = document.cookie.indexOf(";", c_start); if(c_end == -1){ c_end = document.cookie.length; } return unescape(document.cookie.substring( c_start, c_end)); } } return null; } </script> </head> <body> </HEAD> <BODY> <script type="text/javascript"> // verifica se o visitante já esteve aqui var vezes = obterCookie('visitas'); if(vezes != null){ document.write("<h1>Esta é a sua " + vezes + "ª visita.</h1>"); gravarCookie("visitas", ++vezes, 30); } else{ // é a primeira vez. grave a visita // grava um cookie que durará 30 dias gravarCookie("visitas", 1, 30); document.write("<h1>Esta é a sua primeira visita ao site</h1>"); } </script> </body> </html> |
Python ::: Dicas & Truques ::: Formatação de datas, strings e números |
Como inserir uma determinada quantidade de espaços à esquerda de um valor numérico usando PythonQuantidade de visualizações: 7609 vezes |
Este trecho de código Python mostra como definir uma quantidade de caracteres de espaço à esquerda de um valor numérico. Este exemplo funciona com inteiros. Para ponto-flutuante você deve trocar "d" por "f". Veja o código: # método principal def main(): valor = 54 # com três espaços print("O valor é %5d" % valor) # com nove espaços print("O valor é %11d" % valor) # com quatro espaços print("O valor é %6d" % valor) if __name__== "__main__": main() Ao executar este código Python nós teremos o seguinte resultado: O valor é 54 O valor é 54 O valor é 54 |
C ::: Dicas & Truques ::: Matemática e Estatística |
Como usar a função modf() da linguagem C para separar um valor de ponto flutuante em suas partes inteira e fracionáriaQuantidade de visualizações: 10214 vezes |
Em algumas situações precisamos obter as partes inteira e fracionária de um valor de ponto flutuante. Para isso podemos usar a função modf(). Veja sua assinatura:double modf(double x, double * intpart); O parâmetro x é o valor de ponto flutuante cujas partes queremos separar e intpart é uma variável do tipo double que receberá a parte inteira do valor. O retorno da função é o valor fracionário. Vamos ver um exemplo? Veja como podemos quebrar o valor 34,27 em suas partes inteira e fracionária: #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { double valor = 34.27; // vamos separar o valor em suas partes inteira e fracionária double inteira = 0.0, fracionaria = 0.0; fracionaria = modf(valor, &inteira); // vamos exibir o resultado printf("Parte inteira: %f\n", inteira); printf("Parte fracionaria: %f\n", fracionaria); printf("\n\n"); system("pause"); return 0; } Ao executarmos este código teremos o seguinte resultado: Parte inteira: 34.000000 Parte fracionária: 0.270000 |
Java ::: Fundamentos da Linguagem ::: Estruturas de Controle |
Java para iniciantes - Como usar a instrução break em laços for e while da linguagem JavaQuantidade de visualizações: 13191 vezes |
A instrução break é usada para abandonarmos completamente a execução de um laço for ou while. Assim, a execução do laço é interrompida no ponto onde a instrução break se encontra e o controle segue para a próxima instrução do programa após o laço. Veja um exemplo no qual temos um laço for que é abandonado após a variável de controle atingir o valor 5:public class Estudos{ public static void main(String[] args) { for(int i = 0; i < 1000; i++){ if(i == 5) break; System.out.println(i); } } } Veja o mesmo código usando um laço while infinito: public class Estudos{ public static void main(String[] args) { int i = 0; while(true){ if(i == 5) break; System.out.println(i); i++; } } } |
C++ ::: Win32 API (Windows API) ::: Arquivos e Diretórios |
Arquivos e diretórios em C++ - Como escrever em arquivos usando a função WriteFile() da API do WindowsQuantidade de visualizações: 9264 vezes |
A função WriteFile() da Win32 API é útil quando precisamos escrever em arquivos. Esta função foi projetada para escritas síncronas e assíncronas, enquanto WriteFileEx() é somente para escritas assíncronas. Veja o protótipo desta função: BOOL WINAPI WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ); Antes de escrevermos em um arquivo, é importante entendermos o significado dos parâmetros da função WriteFile(): a) HANDLE hFile - Este é o handle para o arquivo no qual queremos escrever. Este handle deve ser criado com os direitos de acesso de escrita GENERIC_WRITE. b) LPCVOID lpBuffer - Um ponteiro para o buffer que contém os dados que serão escritos no arquivo. c) DWORD nNumberOfBytesToWrite - O número de bytes a serem escritos no arquivo. d) LPDWORD lpNumberOfBytesWritten - Um ponteiro para uma variável que receberá o número de bytes escritos. A função WriteFile() define o valor desta variável como zero antes de fazer seu trabalho ou verificação de erro. d) LPOVERLAPPED lpOverlapped - Um ponteiro para um estrutura OVERLAPPED. Esta estrutura é exigida se o handle para o arquivo for obtido usando FILE_FLAG_OVERLAPPED para o parâmetro dwFlagsAndAttributes da função CreateFile(). Geralmente usamos NULL para este parâmetro. Veja um trecho de código no qual usamos a função WriteFile() para escrever duas linhas em um arquivo texto: #include <cstdlib> #include <iostream> #include <windows.h> using namespace std; int main(int argc, char *argv[]){ // dados a serem escritos no arquivo CHAR frase[80]; DWORD nOut; // bytes escritos // nome do arquivo CHAR arquivo[] = "C:\\testes.txt"; // vamos abrir o arquivo para escrita. // se o arquivo não existir nós vamos criá-lo. HANDLE hArquivo = CreateFile(arquivo, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hArquivo == INVALID_HANDLE_VALUE){ cout << "Erro ao abrir o arquivo: " << GetLastError() << endl; } else{ // arquivo aberto com sucesso. Vamos escrever // dados a serem escritos no arquivo CHAR frase1[80] = "Programar em C++ é bom demais\r\n"; CHAR frase2[80] = "E a Win32 é da hora!!!!"; DWORD nOut; // bytes escritos // vamos escrever a primeira frase WriteFile(hArquivo, frase1, strlen(frase1), &nOut, NULL); cout << nOut << " bytes foram escritos. " << endl; // vamos escrever a segunda frase WriteFile(hArquivo, frase2, strlen(frase2), &nOut, NULL); cout << nOut << " bytes foram escritos. " << endl; } // vamos fechar o handle CloseHandle(hArquivo); system("PAUSE"); return EXIT_SUCCESS; } |
PHP ::: Dicas & Truques ::: Trigonometria - Funções Trigonométricas |
Como calcular o seno de um número ou ângulo em PHP usando a função sin()Quantidade de visualizações: 1804 vezes |
Em geral, quando falamos de seno, estamos falando do triângulo retângulo de Pitágoras (Teorema de Pitágoras). A verdade é que podemos usar a função seno disponível nas linguagens de programação para calcular o seno de qualquer número, mesmo nossas aplicações não tendo nenhuma relação com trigonometria. No entanto, é sempre importante entender o que é a função seno. Veja a seguinte imagem: ![]() Veja que temos um triângulo retângulo com as medidas já calculadas para a hipotenusa e os dois catetos, assim como os ângulos entre eles. Assim, o seno é a razão entre o cateto oposto (oposto ao ângulo theta) e a hipotenusa, ou seja, o cateto oposto dividido pela hipotenusa. Veja a fórmula: \[\text{Seno} = \frac{\text{Cateto oposto}}{\text{Hipotenusa}} \] Então, se dividirmos 20 por 36.056 (na figura eu arredondei) nós teremos 0.5547, que é a razão entre o cateto oposto e a hipotenusa (em radianos). Agora, experimente calcular o arco-cosseno de 0.5547. O resultado será 0.9828 (em radianos). Convertendo 0.9828 radianos para graus, nós obtemos 56.31º, que é exatamente o ângulo em graus entre o cateto oposto e a hipotenusa na figura acima. Pronto! Agora que já sabemos o que é seno na trigonometria, vamos entender mais sobre a função sin() da linguagem PHP. Esta função recebe um valor numérico e retorna um valor, também numérico) entre -1 até 1 (ambos inclusos). Veja: <?php // vamos calcular o seno de três números echo "Seno de 0 = " . sin(0); echo "<br>Seno de 1 = " . sin(1); echo "<br>Seno de 2 = " . sin(2); ?> Ao executar este código PHP nós teremos o seguinte resultado: Seno de 0 = 0 Seno de 1 = 0.8414709848079 Seno de 2 = 0.90929742682568 Note que calculamos os senos dos valores 0, 1 e 2. Observe como os resultados conferem com a curva da função seno mostrada abaixo: ![]() |
LISP ::: Fundamentos da Linguagem ::: Estruturas de Controle |
Como usar o laço loop para contar de 1 até 10 em LispQuantidade de visualizações: 759 vezes |
A estrutura de repetição loop da linguagem Common Lisp é o laço mais simples fornecido pela linguagem. Este laço nos permite repetir uma ou mais instruções de código repetidamente, até que o comando return seja encontrado, o que faz com que o laço seja interrompido. Veja no trecho de código abaixo como podemos usar o laço loop da Common Lisp para contar e exibir os valores de 1 até 10: ( ; vamos declarar a variável que vamos usar let (numero) ; vamos inicializar a variável com o valor 1 (setq numero 1) ; agora iniciamos o laço (loop ; escrevemos o valor da variável (write numero) ; aumentamos o valor da variável em 1 (setq numero (+ numero 1)) ; provocamos uma quebra de linha (terpri) ; e fazemos o teste da continuidade (when (> numero 10) (return)) ) ) Ao executarmos este código Common Lisp nós teremos o seguinte resultado: 1 2 3 4 5 6 7 8 9 10 Veja que usamos a macro when para testar o ponto de parada do laço. Note ainda o uso da função terpri da Common Lisp para provocar uma quebra de linha na saída do programa. |
React ::: Elementos de Formulários HTML ::: input type text Element/Object |
Como obter o conteúdo de uma caixa de texto em React usando a função useRef() para acessar os elementos HTMLQuantidade de visualizações: 810 vezes |
Nesta dica mostrarei como podemos usar useRef() para criar uma referência para um elemento HTML <input type="text">. Em seguida nós vamos usar a propriedade current.value para retornar o conteúdo da caixa de texto e atualizar o estado nomeAtualizado, criado a partir da função useState(). Este código, embora simples, é o ponto de partida para aplicações React bem interessantes, pois não fazemos uso do evento onChange das caixas de texto para atualizar o estado da aplicação. Isso, como é fácil de se perceber, economiza os recursos gastos em processamento desnecessário. Veja o código para App.js: // vamos importar o useState e useRef import {useState, useRef} from 'react'; // função App() que será exportada export default function App() { // vamos criar uma referência para a caixa // de texto. Veja que esta referência será // usada na declaração do elemento input type text const txtNome = useRef(null); // vamos usar um estado para guardarmos o conteúdo // da caixa de texto const [nomeAtualizado, setNomeAtualizado] = useState(''); // aqui nós gerenciamos o evento onClick do botão const tratarEventoClick = () => { // vamos obter o conteúdo da caixa de texto // usando "txtNome.current.value" setNomeAtualizado(txtNome.current.value); }; // e retornamos para renderização return ( <div> <input type="text" id="nome" name="nome" ref={txtNome}/> <h2>Nome Atualizado: {nomeAtualizado}</h2> <button onClick={tratarEventoClick}> Atualizar Estado</button> </div> ); } E aqui está o código para o index.js: // vamos fazer os imports necessários import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; // definimos a raiz da aplicação React const root = ReactDOM.createRoot( document.getElementById('root')); // e renderizamos a aplicação no navegador root.render( <React.StrictMode> <App /> </React.StrictMode> ); Execute a aplicação React, digite um nome na caixa de texto e clique o botão Atualizar Estado. Somente neste momento é que o conteúdo da caixa de texto será transferido para o estado nomeAtualizado e refletido no elemento <h2>. |
Nossas 20 dicas & truques de programação mais populares |
JavaScript - JavaScript Avançado - Como usar o operador de bits & (E/AND sobre bits) da linguagem JavaScript JavaScript - Como retornar o tamanho de uma string em JavaScript usando a propriedade length do objeto String Java - Java para iniciantes - Como pesquisar uma substring em uma string e retornar sua posição inicial |
Você também poderá gostar das dicas e truques de programação abaixo |
Java - Exercícios Resolvidos de Java - Contando de 1 até 20 e formatando a saída usando System.out.printf() C++ - Programação Orientada a Objetos em C++ - Como criar e usar métodos estáticos em suas classes C++ AutoCAD Civil 3D - Como criar pontos COGO no AutoCAD Civil 3D |
Nossas 20 dicas & truques de programação mais recentes |
Últimos Projetos e Códigos Fonte Liberados Para Apoiadores do Site |
Python - Como criar o jogo Pedra, Papel, Tesoura em Python - Jogo completo em Python com código comentado |
Últimos Exercícios Resolvidos |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |