Algoritmos e Estruturas de Dados Linguagem C - Conceitos Básicos - Prof. Me. Claudio Benossi [email protected] Histórico A linguagem C é uma linguagem de programação genérica inventada na década de 1970 por Dennis Ritchie. O ANSI (American National Standard Institute) padronizou a versão ANSI-C http://en.wikipedia.org/wiki/C_programming_language C é uma linguagem de médio nível Alto nível Ada Pascal Cobol Fortran Basic Médio nível C++ C Baixo nível Assembly Por que estudar C? Versatilidade: ele possui tanto características de "alto nível" quanto de "baixo nível". Poder: possui ampla biblioteca de funções e é utilizado na construção de “software” para os mais diversos projetos. Portabilidade: é possível adaptar um programa em C de um tipo de computador para outro. Primeiros passos Um programa em C consiste de várias funções encadeadas. Uma função é um bloco de código de programa que pode ser usado diversas vezes em sua execução. Blocos de código são delimitados por chaves: {} O uso de funções permite que o programa fique mais legível, mais estruturado. O C é “Case Sensitive” Caracteres maiúsculos e minúsculos fazem diferença: Soma ≠ soma ≠ SOMA ≠ SomA Comandos do C (if ou for, por exemplo) só podem ser escritos em minúsculas, pois senão o compilador interpretará como variáveis. Estrutura Geral tipo_de_retorno main() { comandos return valor; } Exemplo: int main() { int x, y; x = x + y; return 0; } A função main() Todo programa deve ter uma única função main. A função main é o ponto de partida quando o programa é executado. Arquivos auxiliares não devem conter a função main. Bibliotecas Programas que possuem a especificação das funções pré-definidas da linguagem. As bibliotecas que serão usadas devem ser os primeiros comandos de um programa em C. #include <nome_da_biblioteca.h> int main() { <açoes> return 0; } 1 Bibliotecas Programas que possuem a especificação das funções pré-definidas da linguagem. As bibliotecas que serão usadas devem ser os primeiros comandos de um programa em C. #include <nome_da_biblioteca.h> int main() { <açoes> return 0; } 1 Bibliotecas :: Exemplos stdio.h: biblioteca de funções de entrada e saída (leitura e escrita de dados). math.h: biblioteca de funções matemáticas (potenciação, raiz quadrada, funções trigonométricas, etc.). string.h: biblioteca de funções para manipulação de conjunto de caracteres (por exemplo, palavras). Comentários Comentários em C podem ser escritos em qualquer lugar do texto para facilitar a interpretação do algoritmo. Tipos de comentários: Delimitados por /* e */. Todo o texto delimitado é considerado pelo compilador como um comentário. Colocando // em uma linha. Tudo que estiver à direita do símbolo é considerado como um comentário. 1 Variáveis Devem ser declaradas antes de serem usadas, no início de um bloco de código. Forma geral da declaração de variáveis: tipo_da_variável lista_de_variáveis; Exemplo: char float int letra; temperatura, pressao; dia, mes, ano; Variáveis Variáveis são armazenadas na memória do computador. Endereço 0000 0001 0002 0003 0004 0005 ... FFFF Conteúdo Tipos de dados A linguagem C tem 5 tipos básicos: char – caractere ASCII int – número inteiro float – número real de precisão simples void – sem valor double – número real de precisão dupla Tipos de dados :: Modificadores Um modificador de tipo altera o intervalo de valores que uma variável pode armazenar ou como o compilador representa um valor. Existem quatro modificadores de tipo: signed unsigned long short Tipos de dados :: Modificadores Ao tipo float não se pode aplicar nenhum modificador. Ao tipo double pode-se aplicar apenas o modificador long. Os quatro modificadores podem ser aplicados a inteiros (int). O modificador unsigned serve para especificar variáveis sem sinal, instruindo o compilador a não considerar o primeiro bit como sinal. Tipos de dados :: Modificadores O número de bits do tipo int normalmente corresponde ao tamanho da palavra de uma determinada arquitetura de computador. Dependendo do compilador, os modificadores short e long alteram a quantidade de bits reservados para representar números inteiros: short int: reserva mais bits que o tipo int long int: reserva menos bits que o tipo int Cada compilador é livre para escolher tamanhos adequados para o seu próprio hardware. Tipos de dados :: Resumo (compilador gcc) Tipo Tamanho em bits char 8 -128 a 127 unsigned char 8 0 a 255 signed char 8 -128 a 127 32 -2.147.483.647 a 2.147.483.647 unsigned int 32 0 a 4.294.967.295 signed int 32 -2.147.483.647 a 2.147.483.647 short int 16 -32.767 a 32.767 unsigned short int 16 0 a 65.535 signed short int 16 -32.767 a 32.767 32 -2.147.483.647 a 2.147.483.647 unsigned long int 32 0 a 4.294.967.295 signed long int 32 -2.147.483.647 a 2.147.483.647 float 32 seis dígitos de precisão double 64 dez dígitos de precisão 80 dez dígitos de precisão int long int long double Faixa de números representados 2 Identificadores São os nomes que damos aos objetos utilizados (variáveis, constantes, funções, etc.) Podem ter qualquer nome, desde que: Comece com uma letra ou sublinhado (underscore) _ Os caracteres subseqüentes devem ser letras, números ou _. Não seja igual a: uma palavra reservada, uma função declarada bibliotecas do C. Identificadores :: Exemplos Não permitido! Permitido int int float char _mes ano_atual temp1 palavra_digitada char int float int char 2a_feira valores$ float main stdio 3 Constantes Constantes são valores fixos que não podem ser modificados em nenhuma parte do programa. Sua definição não usa ponto-e-vírgula, nem sinal de igualdade. #define <identificador> <valor> Exemplos: #define #define #define PI ANO LETRA 3.1415 2007 ' A' Constantes Costuma-se definir o nome das constantes com letras maiúsculas, para diferenciá-los de nomes de variáveis e funções. Essa prática melhora a legibilidade do programa. Definição de constantes facilita a manutenção do programa. 4 Operador de Atribuição Uma variável, ao ser definida, contém um valor qualquer e imprevisível. Costuma-se dizer que contém lixo de memória. O comando de atribuição (=) permite alterar o valor (conteúdo) de uma variável. <variável> = <valor>; Operador de Atribuição Exemplos: atribuição de valor letra = 'H'; ano = 2007; temperatura = 38.9; nova_letra = letra; float cateto = 3.1; definição e atribuição area_ret = base * altura; atribuição de fórmula atribuição de uma variável a outra Caractere × String de caracteres Quando uma variável possui apenas um caractere, ele ocupa apenas uma posição de memória: char letra = 'A'; A Variável 0100 0001 Memória Caractere × String de caracteres Uma string de n caracteres ocupa n+1 posições de memória. A posição adicional corresponde ao valor zero (\NULL em ASCII), indicativo do final da string. char nome[] = "ABC"; A B C 0100 0100 0100 0000 0001 0010 0011 0000 n caracteres Variável Memória n+1 posições Operadores Aritméticos Bit a bit Relacionais Lógicos Operadores Aritméticos Operador Ação Exemplo + Adição x = 0x1A + y; - Subtração x = x – y; * Multiplicação x = 8 * y; / Divisão x = y / 2; % Resto de divisão x = y % 2; ++ Incremento x++; -- Decremento y--; Operadores Aritméticos Diversos operadores podem ser utilizados em uma mesma expressão: area delta = 2 * PI * raio; = b*b – 4*a*c; A ordem de execução dos operadores pode ser determinada explicitamente pelo uso de parênteses: media delta = (a + b + c)/2; = (b*b) – (4*a*c); Operadores Aritméticos Quando não há parênteses, o compilador usa regras de precedência para determinar qual operação executar primeiro Maior precedência - (unário) * / % + Menor precedência Se duas operações têm a mesma precedência, segue-se a ordem da esquerda para a direita. 5 Operadores Aritméticos :: Incremento e decremento O operador incremento de 1 (++) realiza duas operações: Soma 1 ao valor atual da variável Armazena o resultado na própria variável Em vez de x = x + 1; , escreve-se x++; De forma semelhante funciona o operador decremento de 1 (--). Em vez de x = x - 1; , escreve-se x--; Operadores Aritméticos :: Incremento e decremento Os operadores ++ e -- podem ser usados como: Prefixos: antes da variável: ++x Sufixos: após a variável: x++ Se a operação aparece isolada, ambas notações são equivalentes: int n = 6, m = n++; /* ++m; /* n--; /* --m; /* 3; resultado: resultado: resultado: resultado: n m n m = = = = 7 4 6 3 */ */ */ */ 6 Operadores Aritméticos :: Incremento e decremento Se a operação é parte de uma expressão: Prefixo: Valor usado na expressão é o valor incrementado/decrementado. Sufixo: Operação incremento/decremento será realizada depois que o valor for usado na expressão. int n = 0, m = 0, a, b, c, d; n++; /* resultado: n = 1 ++m; /* resultado: m = 1 n--; --n; /* resultado: n = -1 a = n++; /* resultado: a = -1; b = ++m; /* resultado: b = 2; c = 2*(m++); /* resultado: c = 4; d = 3*(++n); /* resultado: d = 3; n m m n */ */ */ =0 */ = 2 */ = 3 */ = 1 */ 7 Operadores bit a bit Atuam sobre os bits individuais de uma variável. Não enxergam as variáveis com um valor único, mas sim como um conjunto de bits. Operador Ação & AND | OR ^ XOR (OR exclusivo) ~ NOT >> Deslocamento de bits à direita << Deslocamento de bits à esquerda 8 Operações combinadas com atribuição Uma operação pode ser combinada com a atribuição em um mesmo operador. Embora sejam mais eficientes, tornam o programa mais difícil de se compreendido. Forma normal Forma combinada x=x+5 x += 5 x=x-a x -= a x=x*k x *= k x = x / (x+1) x /= x+1 x=x&k x &= k x = x << k x <<= k ... ... 9 Operadores Relacionais Compara dois valores, produzindo um resultado lógico: FALSO é indicado pelo valor zero. VERDADEIRO é indicado por um valor ≠ zero. Operador Ação > Maior do que >= Maior ou igual a < Menor do que <= Menor ou igual a == Igual a != Diferente de Operadores Relacionais :: Exemplos int cond; int a = 3; float x = 1.5; cond cond cond cond cond cond cond cond cond = = = = = = = = = a != a/2.0 == a/2 == a != a >= a/3 <= a/2 > a; a – 2*x; x; x; x; 2*x; x; x; 2; /* /* /* /* /* /* /* /* /* cond=1 cond=1 cond=0 cond=0 cond=1 cond=1 cond=0 cond=3 cond=0 -> -> -> -> -> -> -> -> -> V V F F V V F V F */ */ */ */ */ */ */ */ */ 10 Operadores Lógicos Operam sobre os valores lógicos das variáveis, sem considerar seu bits individuais. Operador Ação && AND (E) || OR (OU) ! NOT (NÃO) Não confundir com operadores bit a bit. Operadores Lógicos :: Exemplos int cond; int a = 3; float x = 1.5; cond cond cond cond cond cond cond = = = = = = = (a/2 == x) && (a > 2); (a != x) || (a/x < 2); (x <= a) && (a >= 2*x); !(a/3 <= x); (a/2==x) || (a>=x) && !(2*x!=a); a && x; (a - 2*x) || (x < a/2); /* /* /* /* /* /* /* cond=0 cond=1 cond=1 cond=0 cond=1 cond=1 cond=0 -> -> -> -> -> -> -> F V V F V V F */ */ */ */ */ */ */ 11 Precedência entre operadores ++ -- - Menos Unário ! Negação * > Módulo (resto da divisão inteira) = Subtração, adição - >= <= == Maior precedência Multiplicação, divisão / % + Pré/pós incremento, decremento < != Relacionais Igual, diferente && E lógico || OU lógico += -= *= /= Atribuição Menor precedência Comandos de Entrada e Saída Estão descritos na biblioteca stdio.h Comandos de Saída: Função printf() Função putchar() Comandos de Entrada: Função scanf() Função gets() Função getchar() Comandos de Saída :: printf() Função para a escrita formatada no dispositivo de saída padrão, normalmente o vídeo. printf (string_de_controle, argumentos); Comandos de Saída :: printf() string_de_controle consiste em: Caracteres que serão exibidos na tela Caracteres de controle (\) Comandos de formato, que definem a maneira como os argumentos serão mostrados (%) argumentos são as variáveis cujos conteúdos serão exibidos na tela. Comandos de Saída :: printf() Caracteres de controle imprimem caracteres especiais na saída: \n – nova linha \t – tabulação horizontal \\ – a própria contra-barra \b – backspace \" – aspas \' – apóstrofe \xnnn – código hexadecimal do caractere ASCII \a – alerta sonoro Comandos de Saída :: printf() Comandos de formato disponíveis (começam por %): %d (%i)– números inteiros em decimal %f – números reais do tipo float %lf – números reais do tipo double %e (%E)– números reais em notação científica %c – caractere %s – seqüência de caracteres (string) %x (%X)– números em hexadecimal (base 16) %o – números em octal (base 8) %% – o próprio caractere % %p – endereços de memória (em hexadecimal) 12 Comandos de Saída :: printf() Comandos de formato podem ser alterados para especificação da largura mínima de campo ou do número de casas decimais: %[alinhamento][tamanho][.][precisão]formato Especifica número de casas decimais a serem impressas. Especifica número de caracteres a serem impressos, incluindo o sinal e o ponto decimal. 0: completa com zeros à esquerda para atingir o tamanho especificado -: força alinhamento à esquerda 13 Comandos de Saída :: printf() Outros comandos de alinhamento: + - imprime o sinal de + mesmo quando o número é positivo #x ou #X – imprime 0x ou 0X à esquerda do número hexa #f, #e ou #E – imprime o ponto decimal, mesmo para inteiros 13a Comandos de Saída :: putchar() Escreve um caractere na tela a partir da posição atual do cursor. putchar (<variável>); O resultado do comando é a impressão do caractere corresponde ao código ASCII do argumento. Argumento pode ser do tipo int ou char. 14 Comandos de Entrada :: scanf() Rotina de leitura formatada de dados inseridos pelo usuário pelo teclado. scanf (string_de_controle, argumentos); string_de_controle: comandos de formato (%_), os mesmos relacionados para o printf(). argumentos: endereço das variáveis onde serão colocados os valores de entrada: &nome_variável. O operador & representa o endereço de uma variável. 15 16 Comandos de Entrada :: gets() Rotina de entrada que lê uma seqüência de caracteres (string) até que seja pressionada a tecla ENTER. gets(nome_da_variável); 17 Comandos de Entrada :: getchar() getchar() - rotina que espera uma tecla ser pressionada e devolve seu valor na tela. Deve-se pressionar ENTER depois de digitar o caractere. nome_da_variável = getchar(); Não fazem parte do ANSI C padrão: getche() - lê caractere, exibe na tela, dispensa ENTER. getch() - lê caractere, não exibe na tela, dispensa ENTER. 18 Modeladores (Cast) Modeladores ou cast são aplicados a uma expressão para converter seu resultado em um tipo especificado. (<tipo>) <expressão> 19 Questões Tabela ASCII American Standard Code for Information Interchange (ASCII) é um conjunto de códigos para o computador representar números, letras, pontuação e outros caracteres. http://pt.wikipedia.org/wiki/ASCII Binário Decimal Hex Caractere 0100 0001 65 41 A 0100 0010 68 42 B 0100 0011 67 43 C 0010 1011 43 2B + 0011 0001 49 31 1