Introdução à Ciência da Computação Prof. Dr. Rogério Vargas http://rogerio.in
O que é dado? - Defino dado como uma sequência de símbolos quantificados ou quantificáveis. - Letras são símbolos quantificados. - Podemos por si só constituir uma base numérica. - Também são dados: fotos, figuras, sons gravados e animação. - É muito importante notar-se que, mesmo se incompreensível para o leitor, qualquer texto constitui um dado ou uma sequência de dados.
O que é dado na computação? - Com essa definição, um dado é necessariamente uma entidade matemática. Isto significa que os dados podem ser totalmente descritos através de representações formais, estruturais. Sendo ainda quantificados ou quantificáveis, eles podem obviamente ser armazenados em um computador e processados por ele. - Dentro de um computador, trechos de um texto podem ser ligados virtualmente a outros trechos, por meio de "ponteiros". Ponteiros podem fazer a ligação de um ponto de um texto a uma representação quantificada de uma figura, de um som, etc.. - O processamento de dados em um computador limita-se exclusivamente a manipulações estruturais dos mesmos, e é feito por meio de programas. Estes são sempre funções matemáticas, e portanto também são "dados".
O que é informação? - Informação é uma abstração informal (isto é, não pode ser formalizada através de uma teoria lógica ou matemática), que está na mente de alguém, representando algo significativo para essa pessoa. Note-se que isto não é uma definição, é uma caracterização, porque "algo", "significativo" e "alguém" não estão bem definidos; assumo aqui um entendimento intuitivo (ingênuo) desses termos. - Por exemplo, a frase "O Rio Grande do Sul é um estado fascinante" é um exemplo de informação desde que seja lida ou ouvida por alguém, desde que Rio Grande do Sul" signifique para essa pessoa um estado do Brasil e "fascinante" tenha a qualidade usual e intuitiva associada com essa palavra.
Dado x Informação - Uma distinção fundamental entre dado e informação é que o primeiro é puramente sintático e a segunda contém necessariamente semântica (implícita na palavra "significado" usada em sua caracterização). É interessante notar que é impossível introduzir e processar semântica em um computador, porque a máquina mesma é puramente sintática (assim como a totalidade da matemática). Análise Sintática é o processo de analisar uma sequência de entrada (lida de um arquivo de computador ou do teclado, por exemplo) para determinar sua estrutura gramatical segundo uma determinada gramática formal.
Em ciência da computação tipos de variáveis ou dados é uma combinação de valores e de operações que uma variável pode executar, o que pode variar conforme o sistema operacional e a linguagem de computador.. São utilizados para indicar ao compilador ou interpretador as conversões necessárias para obter os valores em memória durante a construção do programa. Por outro lado, ajudam também o programador a detectar eventuais erros (sintáticos).
Dependendo da linguagem de programação,, o tipo de um dado é verificado diferentemente, de acordo com a análise léxica, sintática e semântica do compilador ou interpretador da linguagem. Os tipos têm geralmente associações com valores na memória ou com objetos (para uma linguagem orientada a objeto) ou variáveis. Análise léxica é o processo de analisar a entrada de linhas de caracteres (tal como o código-fonte de um programa de computador) e produzir uma sequência de símbolos chamado "símbolos léxicos" (lexical tokens), ou somente "símbolos" (tokens), que podem ser manipulados mais facilmente por um parser (leitor de saída).
Estáticos ou Dinâmicos A verificação do tipo de um dado é feita de forma estática em tempo de compilação ou de forma dinâmica em tempo de execução.. Em C, C++, Java e Haskell os tipos são estáticos, em Scheme, Lisp, Smalltalk, Perl, PHP, Visual Basic, Ruby e Python são dinâmicos. Em C uma definição estática do tipo de uma variáveis ficaria assim: printf("o tipo char ocupa %d bytes\n", sizeof(char));
Estáticos ou Dinâmicos Em Linguagem Python a definição dinâmica do tipo de dado é feita em tempo de execução, por exemplo: Variável de tipo "inteiro": >>> a = 123 >>> type(a) <type 'int'> E logo a mudança de estado para tipo string: >>> a = 'teste' >>> type(a) <type 'str'> >>>
Forte e Fraco Linguagens implementadas com tipos de dados fortes, tais como Java e Python, exigem que o tipo de dado de um valor seja do mesmo tipo da variável ao qual este valor será atribuído.
Forte e Fraco (Sintaxe genérica) 1. Declarar Variáveis 2. TEXTO nome 3. INTEIRO idade 4. 5. Atribuições 6. nome = "Fulano" 1. idade = "13" Ocorrerá um erro ao compilar a linha 7, pois o valor "13" precisa ser convertido para o tipo de dado INTEIRO.
Forte e Fraco Em linguagens com tipos de dados fracos, tais como PHP e VBScript,, a conversão não se faz necessária, sendo realizada implicitamente pelo compilador ou interpretador.
Primitivo e Composto Um tipo primitivo (também conhecido por nativo ou básico) é fornecido por uma linguagem de programação como um bloco de construção básico. Dependendo da implementação da linguagem, os tipos primitivos podem ou não possuir correspondência direta com objetos na memória. Um tipo composto pode ser construído em uma linguagem de programação a partir de tipos primitivos e de outros tipos compostos, em um processo chamado composição. Em C, cadeias de caracteres são tipos compostos, enquanto em dialetos modernos de Basic e em JavaScript esse tipo é nativo da linguagem.
Primitivo e Composto Tipos primitivos típicos incluem caracter, inteiro (representa um sub-conjunto dos números inteiros,, com largura dependente do sistema; pode possuir sinal ou não), ponto flutuante (representa o conjunto dos números reais), booleano (lógica booleana, verdadeiro ou falso) e algum tipo de referência (como ponteiro ou handles). Tipos primitivos mais sofisticados incluem tuplas, listas ligadas, números complexos, números racionais e tabela hash,, presente sobretudo em linguagens funcionais.
Primitivo e Composto Espera-se que operações envolvendo tipos primitivos sejam as construções mais rápidas da linguagem. Por exemplo, a adição de inteiros pode ser feita com somente uma instrução de máquina, e mesmo algumas CPUs oferecem instruções específicas para processar sequências de caracteres com uma única instrução. A maioria das linguagens não permite que o comportamento de um tipo nativo seja modificado por programas. como exceção, Smalltalk permite que tipos nativos sejam estendidos, adicionando-se operações e também redefinindo operações nativas.
Primitivo e Composto Uma estrutura em C e C++ é um tipo composto de um conjunto determinado de campos e membros. O tamanho total da estrutura para o tipo composto corresponde a soma dos requerimentos de cada campo da estrutura, além de um possível espaço para alinhamento de bits.. Por exemplo: struct Conta { int numero; char *nome; char *sobrenome; float balanco; };
Primitivo e Composto struct Conta define um tipo composto chamado Conta. A partir de uma variável minhaconta do tipo acima, pode-se acessar o número da conta através de minhaconta.numero. Conta minhaconta;
Strings de Caracteres Em programação e em linguagens formais, uma cadeia de caracteres (também conhecida como string) é uma sequência ordenada de caracteres (símbolos) escolhidos a partir de um conjunto pré-determinado. Em programação, cada símbolo armazenado na memória é representado por um valor numérico. Uma variável declarada com tipo de dado cadeia geralmente armazena um número pré-determinado de caracteres.
Strings de Caracteres Teoria Formal Seja Σ um alfabeto,, um conjunto finito e não vazio. Os elementos de Σ são chamados caracteres. Uma cadeia sobre Σ é qualquer sequência finita de caracteres de Σ. Por exemplo, se Σ = {0, 1}, então 0101 é uma cadeia sobre Σ. O tamanho da cadeia é a quantidade de caracteres, e pode ser qualquer valor inteiro não negativo. A cadeia vazia é uma cadeia única sobre Σ de tamanho 0, sendo denotada por ε ou λ.
Strings de Caracteres Tipo de Dados. Um tipo de dado cadeia de caracteres (referido em programação geralmente como string) é uma modelagem de uma cadeia formal de caracteres. São bastante usados em programação, sendo implementados em quase todas as linguagens de programação. Em algumas linguagens esse tipo é definido nativamente, em outras é um tipo composto, derivado.
Arrays Em programação de computadores, um array, também conhecido como vetor ou lista (para arrays uni-dimensionais) ou matriz (para arrays bi-dimensionais), é uma das mais simples estruturas de dados. Os arrays mantêm uma série de elementos de dados, geralmente do mesmo tamanho e tipo de dados. Elementos individuais são acessados por sua posição no array. A posição é dada por um índice, também chamado de subscrição.
Arrays O índice geralmente utiliza uma sequência de números inteiros. Alguns arrays são multi-dimensionais, significando que eles são indexados por um número fixo de números inteiros, por exemplo, por um sequência (ou sucessão) finita de quatro números inteiros. Geralmente, arrays uni- e bi-dimensionais são os mais comuns.
Arrays Os arrays podem-se considerar como as estruturas de dado mais simples que é possível imaginar. Têm a vantagem de que os seus elementos são acessíveis de forma rápida, mas têm uma notável limitação: são de tamanho fixo, não podem ser incrementados ou diminuídos sem implicar complexos processos de cópia. Estas estruturas de dado são ajeitadas nas situações em que o acesso aos dados seja realizado de forma aleatória e imprevisível.
Arrays Forma de Acesso. A forma de acesso aos elementos de um array é direta, ao contrário das listas. Isto quer dizer que o elemento desejado obtêm-se a partir do seu índice e não é preciso procurá-lo elemento por elemento. No caso das listas, por exemplo, para alcançar o terceiro elemento ter-se-á de acessar primeiro aos dois anteriores (ou bem de guardar um ponteiro que permita acessar de maneira rápida a esse elemento em particular).
Arrays declarando e alocando um array. Em Java, os arrays são objetos que necessitam ser inicializados. Isto geralmente é feito usando o operador new. Para um array, o programador especifica o tipo dos elementos do array e o número de elementos como parte da operação new. Ex.: int[] A = new int[5]. String[] S = new String[5]; double[] d = new double[10]; int[][] d2 = new int[10][10]; // matriz 10x10, array de arrays double[] a; a = new double[100];
Arrays declarando e alocando um array. Em C, os arrays são declarados, definindo primeiro o seu tipo, em seguida do seu nome e por fim a sua dimensão. Ex.: int array[10];. int quadro[10]; double array[100]; int matrix[20][10]; /* matriz 20x10 */
Arrays declarando e alocando um array. Inicializando arrays no momento da criação int[] A = {5, 7, 9, 2, 0}; int[][] d2 = { {1,2,3}, {4,5,6} }; long[] a; a = new long[] {10,20,30,40};
Arrays declarando e alocando um array. Automaticamente o Java inicializa com um valor default cada elemento do array: Null para tipo Objetos; 0 (zero) para short, byte, int, long, float e double; Unicode 0 para char; False para boolean; Em C, os arrays quando inicializados no momento da declaração, são definidos do seguinte modo: int array[5] = {3,4,5,6,3}; double quadro[5] = {3.0,4.0,5.0,6.03,3.0}; int matrix[4][4] = {{3,4,3,4},{5,6,2,3}};
Referências Slides extraídos da internet - V. Setzer, Dado, Informação, Conhecimento e Competência, Depto. de Ciência da Computação, Universidade de São Paulo. Disponível em: http://www.ime.usp.br/~vwsetzer/dado-info.html. - E. Silvestre, Modelos de Linguagem de Programação I Aula 06. Disponível em: http://www.eduardosilvestri.com.br
Dúvidas http://rogerio.in prof. Dr. Rogério Vargas