sexta-feira, 24 de maio de 2013

Herança e Classes Abstratas em Java - Exemplo

O exemplo abaixo mostra um exercício a qual trabalhará com os conceitos de Herança e de Classes abstratas:

  • Crie uma classe chamada ExportToFileCommon, esta classe deverá conter o método público Export, este método não deverá ser implementado pois servirá de base para as classes herdeiras.
  • Crie uma classe chamada ExportToExcel que herdará a classe ExportToFileCommon, o método Export deverá ser implementado nesta classe e deverá exibir a seguinte mensagem “Arquivo exportado para o Excel com sucesso.”.
  • Crie uma classe chamada ExportToPdf que herdará a classe ExportToFileCommon, o método Export deverá ser implementado nesta classe e deverá exibir a seguinte mensagem “Arquivo exportado para PDF com sucesso.”.  Observação: Os métodos devem ser públicos.


public class Principal {
public static void main(String[] args) {
ExportToPdf pdf = new ExportToPdf();
pdf.Export();
ExportToExcel excel = new ExportToExcel();
excel.Export();
}
}

public abstract class ExportToFileCommon {
public abstract void Export();
}

public class ExportToExcel extends ExportToFileCommon {
public void Export() {
System.out.println("Arquivo exportado para o Excel com sucesso!");
}
}

public class ExportToPdf extends ExportToFileCommon {
public void Export() {
System.out.println("Arquivo exportado para PDF com sucesso!");
}
}

Terceira Forma Normal (3NF)

Uma entidade está em Terceira Forma Normal se e somente estiver em Primeira e em Segunda Forma Normal e todos os atributos não chave dependerem funcionalmente da chave primária.

Exemplo:
Pedido (nro_pedido, data, cod_cliente, nome_cliente, email_cliente, valor_total_pedido)

Vamos verificar a dependência funcional dos atributos:
nro_pedido -> data
nro_pedido -> cod_cliente
nro_pedido -> valor_total_pedido
cod_cliente -> nome_cliente
cod_cliente -> email_cliente

Verificamos que os atributos nome_cliente e email_cliente não são dependentes da chave primária e sim do atributo cod_cliente. Será necessário então desmembrar a entidade pedido.

Pedido (nro_pedido, data, cod_cliente, valor_total_pedido)
Que terá como chave primária o atributo nro_pedido.

Cliente (cod_cliente, nome_cliente, email_cliente)
Que terá como chave primária o atributo cod_cliente.

quinta-feira, 23 de maio de 2013

Segunda Forma Normal (2NF)

Uma entidade encontra-se em Segunda Forma Normal se e somente estiver em Primeira Forma Normal e não tiver atributos com dependências parciais. No caso de uma chave primária composta, isto é, que possui mais de um atributo em sua composição, é denominada dependência parcial a dependência de um atributo não chave a apenas uma parte da chave primária.

Tomemos como exemplo a tabela compra, descrita abaixo:

Compra (nro_nf, cod_fornecedor, cod_produto, data,nome produto, quantidade, valor_unitario, valor_total_nota)

Tendo como chave primária os atributos: nro_nf, cod_fornecedor, cod_produto

Se analisarmos a dependência funcional teremos:
nro_nf, cod_fornecedor --> data
nro_nf, cod_produto --> quantidade
nro_nf, cod_produto --> valor_unitario
nro_nf, cod_fornecedor --> valor_total_nota
cod_produto --> nome_produto

Vemos agora que nem todos os atributos dependem da chave primária. O que não é permitido pela Segunda Forma Normal. Para que essa entidade fique em 2NF, teremos de desmembrá-la.

Ela ficará assim:

Compra (nro_nf, cod_fornecedor, data, valor_total_nota)
Tendo como chave primária os atributos nro_nf e cod_fornecedor e como chave estrangeira o atributo cod_fornecedor.

Item_compra (nro_nf, cod_produto, quantidade, vl_unitario)
Tendo como chave primária os atributos nro_nf e cod_produto e como chaves estrangeiras os atributos nro_nf e cod_produto.

Produto (codigo, nome)
Tendo como chave primária o atributo codigo.

quarta-feira, 22 de maio de 2013

Primeira Forma Normal (1NF)

Uma entidade está em Primeira Forma Normal, se e somente todos os seus atributos são atômicos, isto é, se contém um valor único (atômico) e não contém atributos multivalorados.

Exemplo:
Dada a entidade funcionario, definida com os atributos abaixo:
Funcionario (codigo, nome, data_admissao, data_demissao, habilidades)

Vemos que a entidade funcionario possui o campo multivalorado habilidades, o que não é permitido pela Primeira Forma Normal. Devemos então dividir a tabela funcionario de forma que o campo habilidades se torne uma nova entidade.

Então teremos:
Funcionario (codigo, nome, data_admissao, data_demissao)
Possui (cod_funcionario, cod_habilidade)
Habilidade (codigo, descricao)

Exemplo:
Fornecedor (codigo, nome, endereco, telefones)

Vemos que a entidade fornecedor tem como atributo composto endereco e como atributo multivalorado telefones.

Em relação ao atributo composto endereco, sabemos que o mesmo é composto, pois nele pressupõe-se incluir as informações de rua, complemento, bairro, cidade, estado e cep . Ou substituímos o atributo endereco por seus atributos componentes (rua, complemento, bairro, cidade, estado e cep ) ou criamos uma
outra entidade com o nome do atributo composto (endereco), tendo como atributos dessa nova entidade rua, complemento, bairro cidade, estado e cep.

Já o campo telefones, por estar no plural, indica que nele poderá ser armazenado mais de um número. Pela regra, esse atributo precisa ser separado em outra entidade, que pode ser chamada de telefone e que conterá os diversos números de telefone do fornecedor.

Assim, temos:
Fornecedor (codigo, nome, rua, complemento, bairro, cidade, estado, cep)

Tendo como chave primária o atributo codigo.
Telefone (cod_fornecedor, nro telefone)

Tendo como chave primária os atributos cod_fornecedor e nro_telefone, já que isso garante que não será cadastrado o mesmo telefone para o forncedor e como chave estrangeira o atributo cod_fornecedor.

Fornecedor (codigo, nome)

Tendo como chave primária o atributo código.
Endereco (cod_fornecedor, rua, complemento, bairro, cidade, estado, cep).

Tendo como chave primária o atributo cod_fornecedor e como chave estrangeira o atributo cod_fornecedor.

terça-feira, 21 de maio de 2013

Saiba o que é Normalização

Normalização é um processo utilizado para acertar possíveis problemas estruturais das entidades e relacionamentos com campos criados – também chamados de anomalias – em um modelo de entidade e relacionamento. Consiste na análise dos atributos das entidades e relacionamentos com campos, sob o ponto de vista das regras chamadas formas normais, que descrevem, com base na teoria de conjuntos, na álgebra e no cálculo relacional, o que devemos ou não fazer nas estruturas das entidades e relacionamentos de nosso modelo, baseados em conceitos matemáticos.

Essa análise pode demonstrar a necessidade de alterarmos a estrutura de nossas entidades e relacionamentos com campos, dividindo ou agrupando seus atributos para aprimorar o processo de recuperação das informações (performance) e seu armazenamento, de modo a evitar perda, redundância e distorção da informação.

Sempre que formos obrigados pela aplicação das formas normais em nosso modelo a dividir entidades, temos que garantir que a divisão poderá ser revertida, isto é, que, mesmo particionada em duas ou mais entidades, uma entidade poderá voltar à sua formação original, por meio de operações de conjuntos.

Dependência funcional
Seja R uma relação e X e Y atributos de R. X e Y podem ser atributos simples ou compostos.
X --> Y (o atributo X determina funcionalmente o atributo Y) sempre que duas tuplas quaisquer de R tiverem o mesmo valor para X, elas possuem também o mesmo valor para Y.

Exemplo:
Tendo a entidade funcionario os atributos codigo, nome, cidade e DDD, e sabendo  que o codigo é a chave primária da entidade funcionario, se analisarmos esses atributos sob a óptica da dependência funcional, teremos:
codigo -->  nome
codigo -->  cidade
cidade -->  DDD

Logo, podemos dizer que os atributos nome e cidade dependem do atributo codigo. Já o atributo DDD depende do atributo cidade. Definida a dependência funcional, nas próximas postagens abordaremos sobre as definições das formas normais.

segunda-feira, 20 de maio de 2013

Comparação entre Linguagens - C# e Visual Basic

Muito se tem escrito sobre o C# (pronúncia: "C-Sharp"). Esta é uma nova linguagem baseada no C/C++. O C#, como o VB.Net, é construído especificamente para a estrutura .NET  (.NET Framework), e muito se tem escrito sobre ela. Dada toda a propaganda, algumas pessoas se perguntam sobre o porquê de escolher VB .NET em lugar de C#.

Embora tanto os projetos VB .NET como C# possam ser criados no ambiente do Visual Studio .NET (VS .NET), o VB .NET foi criado especificamente para os desenvolvedores de VB e tem um número de características únicas que o fazem uma grande escolha para criar aplicações .NET. O VB .NET ainda é a única linguagem no VS .NET que inclui compilação em segundo plano, o que quer dizer que pode sinalizar os erros imediatamente enquanto você digita. VB .NET é a única linguagem .NET que suporta ligação tardia, isto é o que você faz quando declara uma variável do tipo Object no VB 6. No ambiente de trabalho do VS .NET, o VB .NET oferece uma lista do tipo drop-down no topo da janela de código com todos os objetos e eventos.

O ambiente do VS .NET não oferece esta funcionalidade para nenhuma das outras linguagens. O VB .NET também é a única a fornecer valores default para parâmetros opcionais e a ter uma coleção Controls disponível para o desenvolvedor. Não esqueça também que o C#, assim como seus irmãos C e C++, diferencia maiúsculas de minúsculas (case sensitive), algo que deixa os programadores mais experientes em VB completamente loucos. Some-se a isto que o C# usa diferentes símbolos para o operador de atribuição (=) e o operador de comparação de igualdade (==). Finalmente, consideremos, se você sabe VB, você está a meio caminho de dominar o VB .NET do que estaria para dominar o C#. Mesmo tendo mudado muitas coisas, a sintaxe básica da linguagem do VB .NET continua semelhante à do VB, assim você já sabe como declarar variáveis, criar loops, e assim por diante.

domingo, 19 de maio de 2013

Cálculo de imposto de renda em Java

Calculando o imposto de renda, de forma simples, para demonstração de alguns recursos que a Linguagem Java oferece:

public class CalculoDeImposto {
    public static void main(String[] args) {
       //Declaração de Variáveis
       double imposto;
       double impostotot;
       double valor = 1200.50;
       String porcento;

        if (valor >= 1201f && valor <= 5000f) {
                 imposto = 1.1f;
                 porcento = "10%";
                 impostotot = 0.1f;
        } else if(valor >= 5.001f && valor <= 10000f){
                 imposto = 1.15f;
                 porcento = "15%";
                 impostotot = 0.15f;
       } else{
                imposto = 1.2f;
                porcento = "20%";
                impostotot = 0.2f;
       }
     
       //Saída de dados
       System.out.println("Valor:   R$ " + valor);
       System.out.println("Imposto pago:  " + porcento + " | Valor em Dinheiro: R$" + (valor*impostotot));
       System.out.println("Valor Total Pago  R$ " + (valor * imposto));
    }

}

sexta-feira, 17 de maio de 2013

Manipulações em Banco de Dados - SQL | SELECT


O Comando SELECT busca informações de um banco de dados. A sintaxe é:

SELECT [DISTINCT] {*, coluna [alias], ...}
FROM tabela;

Onde:
DISTINCT: elimina as colunas duplicadas da consulta.
*: seleciona todas as colunas da tabela.
Coluna: especifica as colunas desejadas na pesquisa.
alias: fornece às colunas diferentes cabeçalhos.
FROM: especifica em qual tabela desejamos realizar a consulta.
Tabela: especifica que tabela será utilizada para pesquisa.

Utilizando ainda nosso exemplo de tabela departamento e Cliente, com as colunas: codigo, nome, salario, endereco:

Exemplo:
SELECT codigo, nome
FROM departamento;

Exemplo com alias:
SELECT nome “Nome”, salario*12 “Salário Anual”
FROM empresas;

Vamos fazer algumas inclusões para melhor verificação das instruções SELECT:

INSERT INTO Cliente (codigo, nome, endereco) VALUES (123, ‘WILSON OLIVEIRA’, ‘CAIXA POSTAL: 155 – ITU’);

INSERT INTO Cliente (codigo, nome, endereco) VALUES (145, ‘ANDREA SIRTORI OLIVEIRA’, ‘CAIXA POSTAL: 135 – ITU’);

INSERT INTO Cliente (codigo, nome, endereco) VALUES (567, ‘LUCAS OLIVEIRA’, ‘CAIXA POSTAL: 111 – ITU’);

INSERT INTO Cliente (codigo, nome, endereco) VALUES (345, JOSE FRANCISCO’, ‘CAIXA POSTAL: 45 – ITU’);

INSERT INTO Cliente (codigo, nome, endereco) VALUES (777, ‘AMANDA SIRTORI’, ‘CAIXA POSTAL: 233 – ITU’);

Agora, façamos um select para verificar os registros incluídos: Select * from cliente

Manipulações em Banco de Dados - SQL | DELETE


Tem a função de eliminar registros de uma tabela. O comando DELETE exclui permanentemente uma ou mais linhas, baseado em uma condição. Sintaxe é:

DELETE From nome_tabela Where condição

Onde:
Nome_tabela: é o nome da tabela em que se deseja excluir os dados.
Where: determina quais registros serão eliminados da tabela.
Condição: é a condição para selecionar os dados que se deseja excluir.

Utilizando nosso exemplo de tabela Cliente, e colunas: codigo, nome, endereco:

DELETE FROM Cliente Where codigo = 123.

Podemos observar de acordo com o retorno, não há nenhum registro em nossa tabela.

Manipulações em Banco de Dados - SQL | UPDATE


A cláusula UPDATE tem a finalidade de alterar campos de um conjunto de registros. Ou seja, para modificarmos uma ou mais linhas existentes, devemos utilizar a declaração UPDATE, cuja sintaxe é a seguinte:

UPDATE tabela
SET coluna=valor
Where condição

Onde:
Tabela: é o nome da tabela a ser atualizada.
Coluna: é o nome da coluna a ser atualizada.
Valor: é o novo valor para a coluna.
SET: determina os campos que receberão os valores.

Where: determina em quais registros a mudança ocorrerá. Na sua ausência, a mudança ocorrerá em todos os registros da tabela.

Utilizando o mesmo exemplo de tabela com nome: Cliente, e colunas: codigo, nome, endereco:

UPDATE Cliente
Set nome = “Wilson Oliveira”
Where codigo= 123.

Para conferir, basta fazer um select na tabela:
Select * from cliente

Podemos observar que o nome do cliente agora aparece como Wilson Oliveira e não mais Wilson, apenas.

quinta-feira, 16 de maio de 2013

Manipulações em Banco de Dados - SQL | INSERT

As instruções SQL podem ser agrupadas em três grandes categorias:

DDL (Declarações de Definição de Dados): parte da linguagem com comandos para criação de estruturas de dados como tabelas, colunas, etc. Exemplo: CREATE TABLE.

DML (Declarações de Manipulação de Dados) Linguagem de Manipulação de dados: parte da linguagem com comandos para acessar e alterar os dados armazenados no banco de dados. Os principais comandos dessa categoria são: SELECT, UPDATE, INSERT e DELETE.

DCL (Declarações de Controle de Dados): parte da linguagem com comandos para definir usuários e controlar seus acessos aos dados. Exemplo: GRANT.

Comando INSERT

O comando INSERT insere linhas em uma tabela e, sua forma mais simples, somente uma linha de dados. A sua sintaxe é:

INSERT [INTO] nome_tabela (colunas )
VALUES ( valores )

Onde:
Nome_tabela: é o nome da tabela em que se deseja incluir os dados.
Colunas: parte da tabela onde se deseja acrescentar os dados.
Valores: é o conteúdo de cada coluna.

Exemplo de uma inserção num banco já criado com a tabela Cliente, e as colunas: codigo, nome, endereco:

INSERT INTO Cliente (codigo, nome, endereco) VALUES (123, ‘WILSON’, ‘CAIXA POSTAL: 155 – ITU’)

Com esta instrução, iremos incluir um registro. Para verificar a inclusão, utiliza-se a instrução select
Select * from cliente

E teremos o na qual aparece listado somente o cliente Wilson.

Modelo de Referência ISO/OSI

Dentro deste cenário de grande variedade de sistemas operacionais, CPUs, interfaces de rede, tecnologias e várias outras variáveis, e a necessidade de interconexão entre os diversos sistemas computacionais, em 1977, a International Organization for Standardization  – ISO, criou um sub-comitê para o desenvolvimento de padrões de comunicação para promover a interoperabilidade entre as diversas plataformas. Foi então desenvolvido o modelo de referência Open Systems Interconnection – OSI.

O comitê ISO assumiu o método “dividir para conquistar”, dividindo o processo complexo de comunicação em pequenas sub-tarefas (camadas), de maneira que os problemas passem a ser mais fáceis de tratar e as subtarefas melhor otimizadas. O modelo ISO/OSI é constituído por sete camadas, descritas sucintamente a seguir de cima para baixo:

7 - Aplicação: Esta camada funciona como uma interface de ligação entre os processos de comunicação de rede e as aplicações utilizadas pelo usuário.
6 - Apresentação Aqui os dados são convertidos e garantidos em um formato universal.
5 - Sessão: Estabelece e encerra os enlaces de comunicação.
4 - Transporte: Efetua  os  processos de sequenciamento e, em alguns casos, confirmação de recebimento dos pacotes de dados.
3 - Rede: O roteamento dos dados através da rede é implementado aqui
2 - Enlace: Aqui a informação é formatada em quadros (frames). Um quadro representa a exata estrutura dos dados fisicamente transmitidos através do fio ou outro meio.
1 - Física: Define a conexão física entre o sistema computacional e a rede. Especifica o conector, a  pinagem, níveis de dimensões físicas, características mecânicas e elétricas, tensão, etc.

Cada camada se comunica com sua semelhante em outro computador. Quando a informação é passada de uma camada para outra inferior, um cabeçalho é adicionado aos dados para indicar de onde a informação vem e para onde vai. O bloco de cabeçalho + dados de uma camada é o dado da próxima camada.

A unidade de informação muda de nome ao longo das camadas de maneira que podemos saber sobre qual camada se está referindo pelo nome destas unidades. A tabela abaixo relaciona os diversos nomes destas unidades de informação ao longo das camadas:

7 - Aplicação: Mensagem
4 - Transporte: Segmento
3 - Rede: Datagrama
2 - Enlace: Quadro/Frame
1 - Física: Bit

quarta-feira, 15 de maio de 2013

Protocolos e Aplicações

Existem vários outros protocolos que pertencem ao grupo TCP/IP dos quais podemos citar: SMTP, DNS, NFS, HTTP, RIP, Rlogin, X Windows, Packet Internet Groper – PING, Traceroute. Segue abaixo algumas informações:

Domain Name Server – DNS: também chamada de Name Service, esta aplicação relaciona endereços IP com os seus respectivos nomes atribuídos a dispositivos da rede.

Simple Mail Transfer Protocol – SMTP: este protocolo é utilizado nos serviços básicos de envio de mensagens.

Network File System – NFS: este sistema foi desenvolvido pela Sun Microsystems e permite que computadores possam “montar” discos ou parte deles (diretórios) de dispositivos remotos e operá-los como se fossem locais.

HyperText Transfer Protocol  – HTTP: este protocolo é a base do ambiente World Wide Web que basicamente permite a leitura dinâmica e interativa de documentos constituídos de texto, imagens e som.

Protocolo Internet - IP

O protocolo Internet é definido na camada 3 do modelo ISO/OSI. Esta camada é responsável pelo endereçamento dos pacotes de informação dos dispositivos origem e destino e possível roteamento entre as respectivas redes, se diferentes. Este roteamento é executado através do IP.

Como visto anteriormente, o endereço IP é composto de 4 octetos, que são divididos em parte rede e parte dispositivo, chamados de identificadores de rede e de host, de acordo com o tipo de classe definido pelos primeiros bytes do primeiro octeto, e/ou subrede, definida pelo número de máscara.

Este protocolo, usando a parte rede do endereço ou identificador de rede, pode definir a melhor rota através de uma tabela de roteamento mantida e atualizada pelos roteadores.

Este protocolo recebe os dados da camada superior (transporte) na forma de segmentos. Ocorre então o processo de fragmentação e os conjuntos de dados passam a se chamar datagramas. Estes datagramas são então codificados para envio à camada inferior (física) para encaminhamento no meio físico.

Cabeçalho: contém informação sobre a versão do número IP (ipv4 ou ipv6) e o tipo de serviço (ToS), muito usado em aplicações que necessitem de Qualidade de Serviço (QoS).

Comprimento: informa o comprimento do datagrama incluindo dados e cabeçalho.

Fragmentação: instrui ao protocolo, como reagrupar datagramas quando chegam após um processo de fragmentação muito comum em interfaces defeituosas e tráfego intenso.

Time to Live – TTL:  informa o número de roteadores que podem redirecionar o datagrama. O valor é decrementado até zero a cada roteador quando então o datagrama é descartado, impedindo a criação de  loops  e assim garantindo estabilidade ao processo de roteamento.

Verificação de Erro:  seleciona que processo será utilizado na detecção de erros: Cyclical Redundance Check – CRC ou Frame Check Sequence – FCS.

Endereço Fonte e Endereço Destino: 32 bits cada, caracterizam por completo toda informação sobre endereçamento necessária ao processo de roteamento.

Todas as informações necessárias para que o IP possa se comunicar com o resto da rede estão distribuídas nestes campos, principalmente naqueles relativos ao endereçamento. É importante observar que a camada de rede utiliza estes endereços lógicos de 4x8bits, para definir as redes existentes e como conseguir obter informação delas. Entretanto, para que os dados cheguem aos  hosts é necessário um outro tipo de endereço: endereço Media Access Control - MAC ou Ethernet.

Protocolo TCP/IP

Existem duas versões do protocolo IP: O IPV4 que é a versão atual, que utilizamos na maioria das situações, enquanto o IPV6 é a versão atualizada que prevê um numero brutalmente maior de endereços que deve se popularizar a partir de 2012 ou 2014, quando os endereços IPV4 começarem a se esgotar. No IPV4, os endereços IP são compostos por quatro blocos de 8 bits (32 bits no total), que são representados por meio de números de 0 a 255 (Cobrindo as 256 possibilidades permitidas por 8 bites), como “192.168.12.14” ou “169.224.210.143”. Os grupos de 8 bits que formam o endereço são chamados de “Octetos”, que dá origem a expressões como: “Primeiro Octeto do Endereço”. De qualquer forma, a divisão dos endereços em Octetos e o uso de números decimais serve apenas para facilitar a configuração para nós, seres humanos.

Quando processadas, os endereços são transformados em binários como: “01010101000101”.

As faixas de endereços começadas com: “10”, “192.168” ou de “172.16” até “172.31” são reservadas para o uso de redes locais, e por isso não são usadas na Internet. Os roteadores que compõem a grande rede são configurados para ignorar pacotes provenientes destas faixas de endereço, de forma que as inúmeras redes locais que utilizam endereços na faixa “192.168.0.X” (Por exemplo) podem conviver pacificamente, sem entrar em conflito.

terça-feira, 14 de maio de 2013

Lógica e Raciocínio

Lógica
É uma parte da filosofia que estuda o fundamento, a estrutura e as expressões humanas do conhecimento.

A lógica foi criada por Aristóteles no século IV A.C para estudar o pensamento humano e distinguir interferências e argumentos certos e errados. Aristóteles estabeleceu um conjunto de regras rígidas para que conclusões pudessem ser aceitas como logicamente válidas: o emprego da lógica leva a uma linha de raciocínio baseado em premissas e conclusões sendo assim a lógica estabelece as regras do pensamento correto, cujo conjunto constitui uma arte de pensar. E como o raciocínio é a operação intelectual que implica todas as outras, define-se muitas vezes a lógica como ciência do raciocínio correto.

A lógica coloca não só o raciocínio em funcionamento, como também faz com que todos os sentidos trabalhem em prol de uma solução efetiva.

Raciocinar
Raciocinar ou argumentar é um ato característico da inteligência humana tratase de um tipo de operação discursiva do pensamento que consiste em encadear premissas para deles extrair uma conclusão. O raciocínio chega de uma premissa a uma conclusão, passando por várias outras premissas intermediárias. Podemos dizer que o raciocínio é um conhecimento mediato ou indireto, isto é intermediado por vários outros. Assim, é o contrário da intuição que é o conhecimento imediato.

Raciocínio Dedutivo
É um tipo de raciocínio que parte de uma proposição geral (referente a todos os elementos de um conjunto) e conclui com uma proposição particular (referente a parte dos elementos de um conjunto), que se apresenta como necessária, ou seja, que deriva logicamente das premissas.

Ex.
(premissa) Todo metal é dilatado pelo calor.
(premissa) Ora, a prata é um metal
Logo, a prata é dilatada pelo calor.

Aristóteles chamava o raciocínio dedutivo como um modelo de rigor lógico. Entretanto, é importante notar que a dedução não traz um novo conhecimento sempre se apresenta com um caso particular de uma regra geral.

Raciocínio Indutivo
A indução é o raciocínio que, após considerar um número suficiente de casos particulares, conclui como uma verdade geral, a suposição de um resultado, em um processo generalizado de indução falsa.

Ex.
(premissa) o cavalo e o burro são quadrúpedes
(premissa) o cavalo e o burro são mamíferos
Logo, todos os mamíferos são quadrúpedes.

Generalização de uma conclusão falsa.
O raciocínio indutivo caracteriza-se essencialmente por conclusões provavelmente verdadeiras e não necessariamente verdadeiras.

A indução também pressupõe a probabilidade, isto é, já que tantos se se comportam de tal forma, é muito provável que todos se comportem assim.

segunda-feira, 13 de maio de 2013

Estrutura de Condição Se-Senão (If-else)


Exemplo de exercício para mostrar o valor da média. Se for maior ou igual a 5 exibe a mensagem “Aluno aprovado”, ou “Aluno Desaprovado” caso contrário.

Início
/*Entrada de Dados*/
real media, nota1, nota2, nota3, nota4;

Escreva (“Insira a primeira nota”);
leia (nota1);
Escreva (“Insira a segunda nota”);
leia (nota2);
Escreva (“Insira a terceira nota”);
leia (nota3);
Escreva (“Insira a quarta nota”);
leia (nota4);

/*Processamento*/
media = (nota1 + nota2 + nota3 + nota4) / 4;

/*Saída de Dados*/
Se (media >= 5) {
Escreva (“Aluno aprovado com média”, media);
}
Senão {
Escreva (“O aluno foi reprovado com a média”, media);
};

fim!

domingo, 12 de maio de 2013

Escrevendo Data na Linguagem C

Abaixo, na Linguagem C, estão alguns comandos básicos, como entrada, formatação e saída de dados, manipulando então as entradas para "saírem" com os espaçamentos e divisões corretas para exibição.

#include <stdio.h>

#include <stdlib.h>
#include <ctype.h>

int main (int arg, char * args[])
{
    int dia, mes, ano;
    
    printf("Digite uma data no formato dd/mm/aaaa: ");
    scanf("%d %*c %d %*c %d",&dia,&mes,&ano);

    printf("\n\nData digitada: ");
    printf("%d/%d/%d",dia, mes, ano);

    printf("\n\nData digitada formatada com espacamentos: ");
    printf("%2d/%2d/%4d",dia, mes, ano);

    system("Pause >> null");
    
    return 0;
}

sexta-feira, 10 de maio de 2013

Operadores

Operadores aritméticos
Tanto variáveis como constantes poderão ser utilizadas na elaboração de cálculos matemáticos, ou seja, na elaboração de expressões aritméticas, desde que sejam estabelecidas como do tipo real ou inteira e, para que isto ocorra é necessário a utilização de operadores aritméticos.

Principais operadores: ** (exponenciação), /, *, + e -

Operadores relacionais
= =, !=, >, <, >=, <=


Operadores lógicos
Relacionam 2 ou mais condições ao mesmo tempo (operadores booleanos). Mais comum: e, ou e não.
  • e: todos os relacionamentos lógicos necessitam ser verdadeiros
  • ou: pelo menos um dos relacionamentos lógicos necessita ser verdadeiro
  • não: inversão do resultado lógico de uma determinada condição (!)
Expressões aritméticas
Será muito comum trabalhar com expressões aritméticas ou fórmulas matemáticas em algoritmos. As expressões aritméticas em computação são escritas de forma diferente da forma conhecida em matemática:

Exemplo: x = {43 . [55 : (30 + 2)]}
Na forma computacional teríamos: x = (43 * (55 / (30 + 2)))

Tipos, Variáveis e Constantes

Tipos de Dados
Definem o conjunto de valores que uma variável pode receber, armazenar e o conjunto de operadores que podem agir sobre eles.

Inteiro: qualquer valor pertencente ao conjunto dos números inteiros. Exemplos: 1, 0, -3.
Real: qualquer valor pertencente ao conjunto dos números reais. Exemplos: -2, 3.5, 0, 2.
Carácter: seqüência de caracteres contendo letras, dígitos e/ou símbolos especiais. Os dados literais são sempre delimitados pelas aspas ( “ ); também são chamados de cadeia de caracteres, alfanuméricos, string. Exemplos: “Alo”, “Algoritmos”, “4.3”.
Lógico: toda e qualquer informação que pode assumir apenas duas situações biestáveis.
Exemplo: a porta pode estar aberta ou fechada. A lâmpada pode estar acesa ou apagada.

Armazenamento de dados na memória
A memória pode ser comparada a um armário repleto de gavetas (variáveis), que seriam os
locais físicos responsáveis por armazenar objetos (dados).
  • Cada célula de memória ocupa 1 byte e cada tipo de dados necessita de uma certaquantidade de memória para armazenar a informação.
  • Para recuperar uma determinada informação na memória é necessário saber o tipo dedado desta informação (o número de bytes que ela ocupa) e a posição inicial desteconjunto de bytes na memória. Por exemplo: para recuperar a informação ‘Azul”,tempos que saber que são 4 e que inicia na posição 33. Para contornar esse problema,foi criado o conceito de variável. Uma variável contém uma referência ao endereçoinicial, e sabe-se o número de bytes que ocupa na memória através do seu tipo de dado.
Variável
É a representação de um dado que pode ser alterado durante a execução do algoritmo; possui apenas um valor num determinado instante. Cada variável deve ter um nome e pode guardar apenas um objeto por vez e sempre de um tipo. A definição do nome e do tipo de uma variável é chamada declaração.

Constante
Representa um dado que não é alterado durante a execução do algoritmo. Assim como as variáveis, as constantes devem possuir um NRO_LADOS_QUADRADO, PI, etc.

Regras de utilização de uma variável/constante
  • O nome de uma variável/constante pode ser formado por um ou mais caracteres.
  • O primeiro caracter nunca poderá ser um número.
  • Não deve ter espaços em branco.
  • Não poderá ser uma palavra reservada (comando/instrução).
  • Não é permitido o uso de caracteres especiais (*, -, +, !, ?, etc). O único caracter especial permitido é o sublinhado ( _ ).
  • No caso da linguagem C que utilizaremos no curso, os compiladores diferenciam letras MAIÚSCULAS de minúsculas; ou seja “A” é diferente de “a”. Por isso é recomendável adotar um padrão: defina variáveis sempre em MAIÚSCULO.

quinta-feira, 9 de maio de 2013

Algoritmo - Saiba o que é, e suas definições

Um algoritmo é seqüência ordenada, e sem ambigüidade, de passos que levam à solução de um dado problema.

Construção de Algoritmo (Passos)
1. Ler atentamente o enunciado do problema;
2. Retirar do enunciado a relação das entradas de dados;
3. Retirar do enunciado a relação das saídas de dados;
4. Determinar o que deve ser feito para transformar as entradas nas saídas
especificadas (ações);
5. Construir o algoritmo; e
6. Executar o algoritmo (realizar teste: teste de mesa).

Diagrama de Blocos: usamos símbolos geométricos para representar a seqüência de
passos/ações a serem tomadas para a solução de um problema.

Português estruturado: o algoritmo é descrito na forma de código simplificado que depois
pode ser facilmente passado para uma linguagem de programação. Também conhecido
como pseudocódigo, pseudolinguagem e/ou portugol.

Exemplo de Português Estruturado:
Fornecidos dois números inteiros quaisquer; efetuar a soma dos mesmos e
apresentar o resultado obtido.

Início
/* declaração de variáveis */
Inteiro N1, N2, SOMA;
/* Entrada de dados */
Escreva (“Entre com um número inteiro qualquer”);
Leia(N1);
Escreva (“Entre com outro número inteiro qualquer”);
Leia(N2);
/* Processamento */
SOMA = N1 + N2;
/* Saída de dados */
Escreva(“Soma dos números fornecidos =”, SOMA);
fim

quarta-feira, 8 de maio de 2013

Algoritmo para Rotina de Ordenação

Existem vários métodos para obter a ordenação de elementos de uma matriz. Um método bastante simples de ordenação consiste na comparação de cada elemento com todos os elementos subsequentes. Sendo o elemento comparado menor para ordenação decrescente, ou maior para ordenação crescente que o atual, ele será trocado de posição com o outro.

Ordem crescente
Para (i=0; i<4; i=i+1) {
    Para (j=i+1; j<=4; j=j+1) {
        Se (A[i] > A[j]) então {
            X = A[i];
            A[i]=A[j];
            A[j]= X;
        };
    };
};

Ordem decrescente (troca de sinal "<")
Para (i=0; i<4; i=i+1) {
    Para (j=i+1; j<=4; j=j+1) {
        Se (A[i] < A[j]) então {
            X = A[i];
            A[i]=A[j];
            A[j]= X;
        };
    };
};

terça-feira, 7 de maio de 2013

Cálculo de Fatorial

Algoritmo para Cálculo de Fatorial
Para (cont = 1; cont <= 10; cont = cont + 2) 
{
    Para(i = 1; i <=cont; i = i + 1) {
        fat = fat * i;
    }
    Escreva (“O fatorial de ”, cont, “é: ”, fat);
}

-------------------------------------------------------------

Cálculo de Fatorial em C
- números em um array

int Fatorial()
{
  int i, j;
  for (i=0; i<=2; i=i+1){
      int fat = 1;
      for (j=1; j<=A[i]; j=j+1){
          fat = fat * j;
          B[i] = fat;
      };
  };  
};

O Sistema de Arquivos e o Disco Rígido

No disco rígido a controladora enxerga os dados de forma totalmente diferente dos Sistemas Operacionais (S.O.), enquanto a controladora enxerga setores, trilhas e cilindros, o S.O. enxerga uma longa lista de endereços, chamados de blocos ou clusters.

Um fato muito importante é que a controladora esconde as informações da organização interna dos HDS, fazendo com que todos os HDs do mercado sejam compatíveis sem precisarem de drivers. Os HDs sem serem formatados são um grande universo totalmente descontrolado, o que realiza a organização é a formatação, na qual se possui dois tipos.

Formatação física: Que permitem que os discos posicionem corretamente as cabeças de leitura, dividindo e organizando os setores, trilhas e cilindros. Hoje em dia é realizada nas fábricas antes do processo de embalagem, porém antigamente nos HDs Pré-ATA haviam que ser realizados pelo usuário.

Formatação lógica: É realizada pelos Sistemas Operacionais, via software e serve para adicionar as estruturas utilizadas do S.O., porém sempre quando realizada novamente o usuário perde todos os dados gravados no disco rígido. Ela é feita em duas etapas: a primeira realizada o particionamento de forma que se possa organizar a estrutura física do HD. (Por exemplo, instalando o S.O. em uma e os arquivos em outra). Nesta primeira etapa pode-se organizar com diversas partições diferentes, sistemas operacionais diferentes e com tamanhos diferentes. A segunda parte é realizada juntamente com o sistema de arquivos.

Sistema de Arquivos - O que é?

Pode-se dizer que sistema de arquivos nada mais é que a parte do sistema operacional mais visível para os usuários, isto é, durante a manipulação de arquivos, como textos, planilhas, desenhos, dentre outros, é exigido que o Sistema de Arquivos apresente uma interface coerente e simples, sendo assim mais acessível a todos.

É importante destacar que sistemas de arquivos implementam um recurso em software que não existe no hardware. Como um acesso ao disco demora cerca de 10000 vezes mais tempo do que um acesso à memória principal, são necessárias estruturas de dados e algoritmos que otimizem os acessos a disco gerados pela manipulação de arquivos.

Sobremaneira o hardware simplesmente oferece espaço em disco, na forma de setores que podem ser acessados individualmente, em uma ordem aleatória. Muito mais útil que um simples espaço em disco, é dado o conceito de arquivo, sendo criado como abstração pelo sistema operacional, o qual cria um recurso lógico a partir de recursos físicos existentes no computador.

quinta-feira, 2 de maio de 2013

CISC x RISC

A diferença principal é que o RISC utiliza um conjunto de instruções de linguagem básica da máquina, já o CISC usa um conjunto de instruções complexo. Ambos possuíam sua vantagem e desvantagem, a vantagem é que no processador RISC por utilizar uma linguagem simples, é muito mais rápido que o CISC, porém o RISC possuía problemas em operações matemáticas sem um hardware poderoso, já que era necessário sintetizar uma série de formas. A forma RISC foi utilizada primariamente pela IBM em 1975 com o modelo IBM 801, mais tarde foi lançado pela Berkeley e Stanford, das quais a IBM era a mais poderosa no número de instruções com 120. Já o modelo CISC foi utilizado primariamente também pela IBM em 1973 pela VAX e pela Xerox, o maior número de instruções era da VAX com 303 instruções. Existem inúmeras diferenças entre as duas, mas o que realmente faz o RISC ser bem mais rápido que o CISC é que o segredo está na via de dados, quanto menos tempo em ciclo na via de dados, mais rápido será o processamento, e o RISC apenas utiliza 1 ciclo enquanto o CISC utiliza instruções complexas.

O uso do registrador nas máquinas RISC é muito maior do que as CISC porque enquanto as CISC utilizam o método LOADs e STOREs, o uso do registrador diminui o uso de LOADs e STOREs, e assim fazendo que o processador utilize menos a memória, descongestionando os ciclos.

Microprocessadores


Processador pode definir como o cérebro do computador, ele é responsável pelo processamento de programas através de procedimentos. São dividos em duas arquiteturas: CISC E RISC.

Em 1978 a Intel, a primeira fabricante de microprocessadores lançou o modelo 8086, duas vezes mais rápido que seu antecessor, e então através disto a Intel utilizou novas ideias e tecnologias para inovar o mercado de processadores.

A partir de 1991 surgiram os processadores da linha 486, que reinavam no mercado. Porém ao mesmo tempo surgiam os concorrentes AMD e Cytrix.



Os processadores também chamados de CPU (Unidade central de processamento) executam cálculos em uma velocidade extremamente rápida, executam diversas tarefas. Cada CPU tem seu conjunto de instruções próprio que são processados pelo ciclo do clock.

O ciclo do clock pode ser definido como: -> Buscar instrução na memória principal. -> Executar aquela instrução. -> Buscar a instrução seguinte. -> Executar a instrução seguinte. -> E assim por diante em milhões de vezes por segundo. Dentro dessas instruções podemos defini-las com operações básicas como: Comparar informações, realizar operações matemáticas básicas e escrever palavra na memória ou dispositivo de saída.

Os dispositivos básicos dentro de um processador são: unidade de controle, decodificador, registrador de instrução, contador de instrução, clock e os registradores de endereço de memória e de dados de memória.

Unidades de Entrada e Saída (E/S)


As unidades de entrada e saída permitem a gravação e recuperação das informações, também podendo ser os meios aos quais podemos colocar os dados e receber um resultado, como por exemplo, em uma tela de um monitor.

Os periféricos de entrada são aqueles que introduzem dados e/ouo comandos no computador, como: teclado, mouse, scanner, câmeras fotográficas, joystick, etc. Já os periféricos de saída, mostram os resultados obtidos nos processos ou operações executadas pela CPU, podendo ser, por exemplo: impressoras, monitores, caixas de som, dentre outros. Podem ser considerados exemplos de periféricos de entrada e saída o disco rígido, pendrives e telas touchscreen.