About Renato Pierri

Find more about me on:

Here are my most recent posts

Emulador de calculadora

Meu professor de matemática pediu que eu arrumasse uma calculadora para fazer os exercícios da faculdade. Tem algum programa que emule uma calculadora para PC? – Pergunta originalmente postada no Quora e que replico aqui.

Professores irão me odiar!

Olha, normalmente os professores pedem calculadoras científicas que tenham funções básicas, tipo seno, cosseno, tangente, exponenciação e mais algumas outras funções.

Há vários emuladores que podem resolver o paranauê e existem várias opções.

Se for um curso de Engenharia, talvez seja interessante considerar um emulador de calculadora mais porreta, e nessa linha eu sugiro o emulador da HP Prime Graphing Calculator, cujo print segue abaixo:

Imagem da HP Prime Graphing Calculator

Na verdade esse é um computador dedicado a fazer cálculos que inclusive é programável em Python.

O emulador dessa calculadora pode ser encontrado no site da HpCalc.org, cujo link para download da versão para PC segue abaixo:

HP Prime Virtual Calculator Emulator (64-bit) 2.1.14730 (2023-04-13)

Nota: Esse tipo de calculadora é complexa e precisa ler o manual para conseguir usar todas suas funcionalidades.

Caso queira algo mais simples, acesse o site HPCalc.org. Nesse site, você pode encontrar diversos emuladores das calculadoras da linha HP (alguns bem básicos) e centenas de programas e jogos para a linha de calculadoras HP.

Bônus:

Tem outro site, dividido em duas páginas que um serve para calcular a derivada e outro que serve para calcular a integral, cujos links seguem abaixo:

Calculadora de derivada
Calculadora de integral

Esse site em particular é uma mão na roda porque ele desmembra a resolução dos cálculos passo à passo, inclusive indicando quais regras se aplicam a cada caso.

Nessas páginas web, preste atenção às abas de configuração das integrais e derivadas, que possui vários exemplos e opções de configuração:

Aba de configuração da calculadora de derivadas
Aba de configuração da calculadora de integrais.

Vale a pena conferir essas indicações.

Publicado em 2023/Junho/02

O que você gostaria que tivessem ensinado na primeira aula sobre ponteiros?

Olha. Eu gostaria de ter aprendido as diversas maneiras de se exibir tanto o endereço de memória como o conteúdo de memória apontado por um ponteiro.

Resumindo, seria mais ou menos o código abaixo. Se faltar alguma coisa, irei adicionando.

#include <stdlib.h>
int main()
{

    char ponteiro[5]="ABCDE";

    printf("Comandos equivalentes em C\n\n");

    printf("Considerando 'char ponteiro[5]=\"ABCDE\";'\n\n");

    printf("Primeiro endereco do ponteiro:%p \n\n",ponteiro);

    printf("Primeiro conteudo de ponteiro[0]: %c\n",ponteiro[0]);
    printf("Primeiro conteudo de   *ponteiro: %c\n\n",*ponteiro);

    printf("Conteudo de ponteiro[1]  : %c\n",ponteiro[1]);
    printf("Conteudo de *(ponteiro+1): %c\n\n",*(ponteiro+1));

    printf("Endereco de memoria de (&ponteiro[1]):%p\n",(&ponteiro[1]));
    printf("Endereco de memoria de (&ponteiro+1) :%p\n\n",(ponteiro+1));

  return 0;
}

O print de tela fica assim:

Postado em 13/01/2023 por Renato de Pierri.

Do ponto de vista do hardware e da programação, o que podemos dizer sobre o conceito “tipo de dados”?

Quando consideramos o hardware do computador, o termo “tipo de dados” pode ser utilizado para classificar o tipo de informação que está contida em uma determinada célula de memória (inteiro, float, string…), sendo que esse tipo de dado é nativo do computador, ou seja, nessa abordagem, o conceito “tipo de dados”, é totalmente acoplado à arquitetura de hardware utilizada e o chamamos de tipo de dado Primário ou Primitivo conforme exemplificado abaixo:

Tipo de dados em C

Porém o conceito “tipo de dados” pode ser analisado sob uma ótica completamente diferente, desacoplando o seu significado das limitações impostas pelo hardware de uma arquitetura e aproximando esse conceito da função que deve ser executada.

Ao abstrairmos da arquitetura de hardware o conceito de “tipo de dados”, exemplificando, em uma operação de soma de dois inteiros, deixa de ser necessário descer ao nível de hardware e bits a fim de se conhecer detalhadamente o mecanismo empregado pelo computador para obter o resultado dessa soma.

Nesse caso utilizamos o hardware do computador para representar os inteiros e representar a execução da operação de soma entre esses dois inteiros, repito, sem conhecer os detalhes da implementação em hardware dessa operação.

Dissociado o tipo de dado da limitação arquitetural de hardware do computador, abre-se a possibilidade de representarmos uma quantidade ilimitada de tipos de dados e esse é o pulo do gato (jump of the cat).

Considerando abstrato o conceito “tipo de dados”, o dissociando das limitações de hardware e o empregando para definir um conjunto de definições lógicas, podemos então implementar por software esse conjunto de definições lógicas, a partir de um conjunto limitado de instruções de hardware, transcendendo as limitações do mesmo.

Estipula-se um novo tipo de dado, define-se suas características, especifica-se as operações possíveis a serem executadas nesse objeto e procede-se com a implementação em software do mesmo, a exemplo dos tipos de dados utilizados em Big Data, alguns listados abaixo:

Tipos de dados utilizados em Big Data

Fonte: TENENBAUM, Aaron M.; LANGSAM, Yedidyah; AUGESNSTEIN, Moshe J.. Estruturas de Dados Usando C. São Paulo: Pearson, 2013. 884 p. ISBN 13: 978-85-346-0348-5.

Publicado em 2022/dez/14 por Renato de Pierri

Dica Linux

Vou mandar uma dica aqui para quem resolveu instalar o Linux e volta e meia apanha quando instalando alguma coisa e ou compilando um pacote. Coisa simples, que eu gostaria muito que tivesse me ensinado quando comecei a mexer com Linux.

Abra o terminal e dê o seguinte comando:

sudo apt install build-essential 
re@re-VirtualBox:~$ sudo apt install build-essential Lendo listas de pacotes... Pronto Construindo árvore de dependências        Lendo informação de estado... Pronto Os NOVOS pacotes a seguir serão instalados:   build-essential 0 pacotes atualizados, 1 pacotes novos instalados, 0 a serem removidos e 0 não atualizados. É preciso baixar 4.664 B de arquivos. Depois desta operação, 21,5 kB adicionais de espaço em disco serão usados. Obter:1 https://atl.mirrors.clouvider.net/ubuntu focal-updates/main amd64 build-essential amd64 12.8ubuntu1.1 [4.664 B] Baixados 4.664 B em 1s (4.156 B/s)           A seleccionar pacote anteriormente não seleccionado build-essential. (Lendo banco de dados ... 203071 ficheiros e directórios actualmente instalados.) A preparar para desempacotar .../build-essential_12.8ubuntu1.1_amd64.deb ... A descompactar build-essential (12.8ubuntu1.1) ... Configurando build-essential (12.8ubuntu1.1) ... re@re-VirtualBox:~$
Instalando o pacote build-essential

O comando acima instala um conjunto de pacotes chamado “build-essentials”, que são um conjunto de pacotes necessários para compilar softwares no Linux.

Esse comando instala automaticamente o depurador GNU, os compiladores g++/GNU e mais algumas ferramentas e bibliotecas necessárias para compilar um programa.

Ao instalar os pacotes build-essential, alguns outros pacotes como G++, dpkg-dev, GCC e make, etc. também são instalados em seu sistema.

Não resolve tudo, mas na prática ter esse conjunto de ferramentas ajuda e muito na instalação de pacotes e eu considero uma boa pedida o ter instalado no sistema.

Autor: Renato de Pierri.
Publicado em 24/08/2022.

Qual é a diferença entre Heap e Stack?

Pergunta originalmente respondida no QUORA em 03/07/2019

Definição de Heap:

Heap é uma árvore binária com chaves em seus nós (uma chave por nó) conforme a seguir:

Ela é essencialmente completa, ou seja, todos os seus níveis são completos menos o último nível, onde somente a chave mais à direita pode eventualmente estar faltando.

*A chave de cada nó pai (acima) é maior ou igual à chave filho (que vem abaixo).

Observe: Os elementos de uma heap são ordenados de cima para baixo (junto com qualquer caminho abaixo de sua raiz), porém eles não são ordenados da esquerda para a direita.

Algumas propriedades de uma heap:

  • Dado n, há uma única árvore binária com n nós que é essencialmente completa com h=[log2n]
  • .
  • A raiz contém o maior valor chave
  • Uma sub árvore extraída de qualquer nó de uma heap também é uma heap
  • Uma heap pode ser representada como um array.

Fonte da definição de uma heap: https://cs.winona.edu/lin/cs440/…


Definição de Stack:

Stack ou pilha é um conjunto ordenado de itens no qual novos itens podem ser inseridos e a partir do qual podem ser eliminados itens um uma extremidade chamada topo da pilha.

Ao contrário do vetor, a definição de pilha abrange a inserção e remoção de itens o que a faz um objeto dinâmico, mutável.

Por definição somente uma extremidade é designada como topo da pilha. Novos itens podem ser adicionados no topo da pilha, consequentemente deslocando o topo da pilha para cima e os itens que estão no topo da pilha podem ser removidos, consequentemente deslocando o topo da pilha para baixo.

O topo da pilha é a extremidade em que os dados são inseridos e retirados da pilha e por essa razão uma pilha também é chamada de LIFO, last in first out, último a entrar, primeiro a sair.

A pilha, computacionalmente, sempre é vista pelo topo, de cima para baixo (somente pode-se observar o topo da pilha), embora para explicar seu funcionamento a pilha seja exibida em perfil.

Para acessar o último elemento de uma pilha é necessário desempilhar os elementos que estiverem por cima do último elemento para poder acessá-lo, conforme imagem abaixo (clique para ampliar).

Fonte da difinição de stack: TENENBAUM, Aaron M.; LANGSAM, Yedidyah; AUGESNSTEIN, Moshe J.. Estruturas de Dados Usando C. São Paulo: Pearson, 2013. 884 p. ISBN 13: 978-85-346-0348-5.