INTRODUÇÃO À LINGUAGEM C

Documentos relacionados
INTRODUÇÃO À LINGUAGEM C

INTRODUÇÃO À LINGUAGEM C

Introdução à Computação MAC0110

Princípios de Desenvolvimento de Algoritmos MAC122

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Linguagem C: Introdução

ECT1203 Linguagem de Programação

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Algoritmos e Programação

Programação II. Ponteiros. Bruno Feijó Dept. de Informática, PUC-Rio

Disciplina de Algoritmos e Programação

Linguagem C Princípios Básicos (parte 1)

Representação de Dados (inteiros não negativos)

Algoritmos e Estruturas de Dados I (DCC/003) 2013/1. Estruturas Básicas. Aula Tópico 4

Introdução a Programação de Jogos

Aula 3 Constantes e funções de E/S

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

Introdução à Linguagem C Variáveis e Expressões

Aula 03: Introdução a C

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 3 de setembro de 2010

3. Linguagem de Programação C

Introdução à Programação

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

3. Linguagem de Programação C

Representação de Dados (inteiros não negativos)

Conhecendo a Linguagem de Programação C

Algoritmos e Estruturas de Dados I (DCC/003) Introdução à Programação de Computadores. Aula - Tópico 1

1/50. Conceitos Básicos. Programa Básico

Cap. 2 Expressões na linguagem C

Faculdade de Computação

SSC304 Introdução à Programação Para Engenharias. Introdução a Linguagem C. GE4 Bio

Variáveis, Comandos de Atribuição e Comando de Entrada e Saída

Tópicos de hoje: Cap. 2 Expressões na linguagem C. Bits, Bytes e Palavras. Variáveis e Constantes. Números inteiros num Byte

Estrutura do programa

Ponteiros. Baseado nos slides do Prof. Mauro.

Programação Estruturada

6 Alguns conceitos e comandos em programação

Linguagem C. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

Programação Estruturada

Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados

Laboratório de Introdução à Ciência da Computação I

Introdução à Programação

Introdução à Programação. Introdução a Linguagem C. Prof. José Honorato F. Nunes

Capítulo 2 Operadores. A função scanf()

Hello World. Linguagem C. Tipos de Dados. Palavras Reservadas. Operadores Aritméticos. Pré e pós incremento e pré e pós decremento

Programação Básica. Estrutura de um algoritmo

Introdução a C. Para saber quais os procedimento ou funções que existem em cada biblioteca, acesse

Linguagem C. André Tavares da Silva.

Estruturas de Dados. Módulo 2 Expressões. 9/8/2005 (c) Marco A. Casanova - PUC-Rio 1

4 Variáveis. Unesp Campus de Guaratinguetá

Cursos: Análise, Ciência da Computação e Sistemas de Informação Laboratório I - Prof. Aníbal Notas de aula 2 SISTEMAS NUMÉRICOS

Introdução a Linguagem C. Prof. Me. Hélio Esperidião

FACULDADE BATISTA MINEIRA - CST Banco de Dados Estruturas de Dados - Variáveis

LINGUAGEM DE PROGRAMAÇÃO C AULA 2. Professor: Rodrigo Rocha

4. Estruturas Fundamentais de Programação em C

Tipos de Dados Simples (Continuação)

Laboratório de Introdução à Ciência da Computação I

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

1 Exercícios com ponteiros

Aula 1 Apresentação do Curso

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU

Apontadores/ponteiros

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

A Linguagem C. A forma de um programa em C

Estrutura básica de um programa Instruções do Programa Sintaxe das instruções Diretivas apenas o contexto Variáveis e Constantes Tipos e modificadores

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 29 de agosto de 2008

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

3. Linguagem de Programação C

Estrutura de dados 2. Ponteiro. Prof. Jesuliana N. Ulysses

Entender o problema Encontrar um algoritmo para resolvê-lo. Implementar o algoritmo numa linguagem de programação

Sistemas de Numeração. Tiago Alves de Oliveira

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Métodos Computacionais

Conceitos Básicos Linguagem C

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

Alocação Dinâmica em C

Algoritmos e Estruturas de Dados I IEC012. Linguagem C - Guia de bolso - Prof. César Melo

Módulo 5 Vetores e Alocação Dinâmica

Ambiente de desenvolvimento

Linguagens de Programação

3.1 - Funções para manipular dados de entrada e saída padrão

Programação 11543: Engenharia Informática 6619: Tecnologias e Sistemas de Informação. Cap. 8 Endereçamento de Memória Endereçamento de Memória

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Aula 08: Funções (Parte II)

a) Calcule o valor médio de CPI apresentado na execução deste programa P, utilizando-se C1 sem e com otimização.

Introdução à Computação

Programação Estruturada Aula - Tipos, Constantes, Variáveis e Identificadores

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação

Tópicos em C. Eliade F. Lima

Introdução a Computação

Algoritmos e Estruturas de dados

MCTA028 Programação Estruturada Aula 01: - Introdução à linguagem C - Teste de avaliação

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Conceitos básicos. Computação eletrônica: Gurvan Huiban

Transcrição:

INTRODUÇÃO À LINGUAGEM C Prof. Bruno Feijó, Dept. de Informática, PUC-Rio (2018) C foi criado no início da década de 70, quando os programas mais eficientes eram escritos em linguagem Assembly, bem próxima à máquina. C surgiu como uma substituição ao assembly, porém mais fácil e com eficiência próxima - tanto que o Sistema operacional Unix e vários jogos da época foram escritos em C. Programadores de C trabalham muito mais próximos da máquina do que em outras liguagens high level e por isto precisam entender como a memória do computador funciona. 1

O sistema de numeração decimal (ou sistema de numeração posicional de base 10) requer 10 dígitos diferentes (0,1,2,3,4,5,6,7,8,9) para representar números. Por exemplo, o número 253 é a seguinte soma: 2 5 3 BITS E BYTES 3 x 10 0 = 3 5 x 10 1 = 50 2 x 10 2 = 200 253 O sistema binário (ou de base 2) usa 2 dígitos (0,1). Por exemplo, 1101 equivale ao número 13 no sistema decimal: 1 0 1 1 x 2 0 = 1 0 x 2 1 = 0 1 x 2 2 = 4 1 x 2 3 = 8 Vamos usar o sistema binário para armazenar números no computador. bit (abreviação de binary digit) é a menor unidade de armazenamento (um bit armazena apenas um 0 ou 1) byte (lê-se baite) é uma unidade de informação formada por 8 bits. Menor número: 0; maior número: 255, total de números diferentes: 256 1 13 2

BITS, BYTES E TIPOS Poderíamos pensar em usar o bit mais à esquerda do byte (leftmost) para armazenar o sinal. Neste caso, o maior número positivo seria 127, i.e. [0111 1111]: sinal E como seria o número -2? Seria [1000 0010]? 0 1 1 1 1 1 1 1 Nos computadores, -2 seria [1111 1110]!! Note que desta maneira: 2 + (-2) = 0. Isto é: [0000 0010] + [1111 1110] = [] Nos computadores, usamos um artifício matemático chamado de Two s Complement (complemento de dois) para representar números negativos. Isto também facilita a implementação em hardware das operações com números binários. Com este artifício, o maior número negativo é -128 (e não -127). E a faixa de valores é -128 a 127. Na prática, você inverte os dígitos e soma 1, e.g. -2: [1111 1101] + 1 = [1111 1110] Se o leftmost bit é 1, então é o número negativo. 1 byte é muito pouco para representar números inteiros. Por isto adotamos 1 byte para representar caracteres, como A, z, [,. E a ideia é bem simples: estabelecemos uma correspondência entre caracteres e códigos numéricos. Por exemplo, 65 representa a letra A, 91 representa o abre cochete [, 122 representa a letra z,. E dizemos que caracteres são do tipo char. O tamanho de um char é 1 byte! Para números inteiros, que chamamos de tipo int, juntamos 4 bytes (32 bits) e consideramos um bit para o sinal. Desta maneira, podemos representar números de -2,147,483,648 a +2,147,483,647. Se não usarmos o bit do sinal, podemos ter números de 0 a 4,294,967,295 e chamamos de tipo unsigned int. float tem 4 bytes, 32 bits (aprox. 6 casas decimais de precisão), faixa: 3.4 10 38 a +3.4 10 38. double tem 8 bytes, 64 bits (aprox. 15 casas decimais de precisão), faixa: 1.7 10 308 a +1.7 10 308. Os tamanhos de int, float e double podem variar (com tipo de máquina e sistema operacional). 3

MEMÓRIA Uma vez que definimos tipos (vimos alguns até agora: char e int), podemos armazenar dados numéricos em blocos de bytes que são identificados por um número chamado endereço (address). Em uma máquina byte addressable: Endereço 1023 1022 1021 1020 3 2 1 0 Memória Endereço da variável x é 1020 y x 1027 1026 1025 1024 1023 1022 1021 1020 0000 0010 Tipo int ocupa 4 bytes Uma variável é um nome dado a uma área da memória que armazena o valor (i.e. o conteúdo) de um determinado tipo. Portanto, uma variável tem um nome (identificador), um tipo de dado e um valor. Por exemplo, as instruções int x; x = 2; fazem o seguinte: Em C, o delimitador de int x; : a variável x representa uma área de memória reservada de 4 bytes (tipo int) uma instrução é o ; x = 2; o número inteiro 2 é colocado na memória reservada (ver figura acima) Mas, quando fazemos referência a uma variável, apontamos para o primeiro endereço e consideramos o conjunto de bytes como uma única unidade endereçável: valor 2 em x Uma variável é equivalente ao valor armazenado. Portanto se y = x + 2; então y contém 4. O código do programa (instruções) também são transformados em blocos de bytes (e.g. 64 bits) e armazenados. y x 1024 1020 isto é: 1028 y 1024 x 1020 0000 0010 0000 0010 4

FUNÇÕES Um programa em C consiste basicamente de variáveis e funções. Uma função em C recebe valores através de seus argumentos, realiza tarefas e retorna um valor. C tem uma função principal, chamada main, que é chamada pelo Sistema Operacional quando o usuário roda o programa. Portanto, a função main é sempre o primeiro código executado quando um programa começa. Uma função pode chamar outras funções auxiliares. Algumas destas funções você mesmo escreveu e outras estão em bibliotecas (libraries) que são disponibilizadas pela linguagem para você. As funções de bibliotecas requerem definições e declarações que estão em arquivos texto com extensão.h, chamados de header files. Depois veremos o que são estes arquivos.h. 5

Equação de uma reta y = ax + b, com a = 2 e b = 1: #include <stdio.h> int equation1(int x) { int a = 2; int b = 1; return a*x + b; } int main(void) { int x = 10; int y; y = equation1(x); printf("hello\n"); printf("%d resultado %d\n", x, y); return 0; } UM PROGRAMA EM C Início e fim de bloco: { } O cabeçalho de uma função é tipoderetorno nome(argumentos) Não pode ter duas funções com o mesmo nome. Argumentos são passados by value (i.e. a função recebe uma cópia do valor do argumento e não o seu endereço). printf() tem um número variável de argumentos O primeiro argumento é uma cadeia de caracteres (string), onde cada %x indica onde cada um dos outros argumentos deve ser inserido e em que forma deve ser impresso. Por exemplo, %d especifica um argumento inteiro. A notação \x indica um número que representa algo especial. Especificação de formato: %c um char %d um int %u um unsigned int %f um double (ou float) %e um double (ou float) no formato científico %g um double (ou float) no formato mais apropriado (%f ou %e) %s uma cadeia de caracteres %p um ponteiro (endereço) Notações: \n (new line), \t (tab),..., \ (double quote),... 6

COMPILER & LINKER prog.c prog.obj prog.exe 7

INTRODUÇÃO À LINGUAGEM C Prof. Bruno Feijó, Dept. de Informática, PUC-Rio (2018) ENDEREÇOS E PONTEIROS 8

ENDEREÇOS O tamanho (em bytes) de um tipo é dado pelo operador sizeof(tipo) e o endereço de uma variável é obtido com o operador &. Acompanhe o código a seguir: #include <stdio.h> int main(void) { char c = 'A'; int a = 5; printf("tamanho char = %d bytes\n",sizeof(char)); printf("endereco de c que contem %c(%d): %p\n", c, c, &c); Responda: você tem direito de ler ou depositar printf("proximo endereco (+1): %p\n", &c + 1); valores neste próximo endereço? c printf("\ntamanho int = %d bytes\n", sizeof(int)); printf("endereco de a: %p\n", &a); 8 para mostrar 8 dígitos, 0 prefix com 0 s ao invés de printf("proximo endereco (+1): %p\n", &a + 1); brancos, X/x para imprimir maiúsculas/minúsculas return 0; Endereços são números inteiros (mas não do tipo int) no sistema } Hexadecimal, que é um sistema de numeração posicional de base 16: (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F). Em C, usamos o prefixo 0x para representar um hexadecimal (e.g.: 0x00CFFB80). Para imprimir, usamos %08X printf("%08x\n", 0x00CFFB80); As conversões são feitas automaticamente. Por exemplo, para int b = 13630336; e printf("%08x\n", b); é impresso 0x00CFFB80. Tente imprimir int b = 0x00CFFB80; como hexa e como decimal. E você sabe fazer o cálculo? Por ex., 4A3 é (3x16 0 ) + (10x16 1 ) + (4 x 16 2 ) = 1187 Responda: quanto é a diferença 00CFFB80 00CFFB7C? 9

PONTEIROS Variáveis que guardam endereços são chamadas de ponteiros (pointers) e declaradas com *, e.g.: int * p; O * também é usado como o operador que acessa o conteúdo no endereço que p guarda (p funciona como um apontador), e.g.: int a, c; int * p; a = 5; P = &a; // p contem endereco de a printf( conteudo de a atraves de p: %d \n", *p); c = *p; // c agora tem o mesmo valor que esta em a Você pode andar na memória com um pointer, e.g. faça p = p + 1; e depois p = p + 10. Imprima os novos endereços. Por curiosidade, acesse o que tem nestes novos endereços e imprima estes conteúdos. cuidado com o uso de memória que não pertence às suas variáveis. Veja o exemplo PERIGOSO abaixo: int b = 6, c; int * p; p = &b; Ir até uma memória alheia (e até mesmo imprimir seu endereço) não causa problemas. p = p + 1; c = *p; // o conteudo e indederminado!!! Mas, CUIDADO: não use conteúdo de memória alheia!!! printf("content of the next address after b: %d\n", c); c = c - 1; // operando sobre o indederminado!!! printf( novo valor: %d\n", c); 10