DISCIPLINA DE LINGUAGEM DE PROGRAMAÇÃO LINGUAGEM C Professor Airton Kuada Email - [email protected] QUESTÕES PRELIMINARES LINGUAGEM DE PROGRAMAÇÃO. É UMA FORMA DE TRANSFERIR O CONHECIMENTO HUMANO PARA O COMPUTADOR SEM CONHECER A LINGUAGEM NATIVA DO COMPUTADOR. EXISTEM DIVERSAS LINGUAGENS DE PROGRAMAÇÃO: - BASIC - COBOL - FORTRAN - ASSEMBLER - PASCAL -C QUESTÕES PRELIMINARES O COMPUTADOR CONHECE APENAS A LINGUAGEM BINÁRIA COMO POR EXEMPLO 01010100011100110011001 É NECESSÁRIO TRADUZIR OS COMANDOS CONHECIDOS PELO HOMEM PARA UMA FORMA QUE O COMPUTADOR ENTENDA: Imprima (“Bom final de semana a todos”) EXISTEM DIFERENTES FORMAS DE EXPRESSAR O COMANDO ACIMA E VARIA CONFORME A LINGUAGEM DE PROGRAMAÇÃO QUE ESTÁ SENDO UTILIZADA printf (“Bom final de semana a todos”) - C writeln (‘Bom final de semana a todos”) - PASCAL display “Bom final de semana a todos” - COBOL print “Bom final de semana a todos” - BASIC QUESTÕES PRELIMINARES TODAS AS INSTRUÇOES ANTERIORES SÃO TRADUZIDAS PARA UM MESMO FORMATO FINAL. UM PROGRAMA É ESCRITO UTILIZANDO UMA FORMA QUE É DEFINIDOS PELA LINGUAGEM DE PROGRAMAÇÃO UM PROGRAMA É ESCRITO UTILIZANDO-SE UMA EDITOR DE TEXTO UM PROGRAMA ESCRITO EM UMA LINGUAGEM DE PROGRAMAÇÃO É CHAMADO DE PROGRAMA FONTE. QUESTÕES PRELIMINARES EXEMPLO DE UM PROGRAMA FONTE EM LIGUAGEM #include <stdio.h> main () { printf (“Bom final de semana a todos\n”); } C. QUESTÕES PRELIMINARES UM PROGRAMA FONTE AINDA NÃO É ENTENDIDO PELO COMPUTADOR É NECESSÁRIO CONVERTER ESTE PROGRAMA PARA A LINGUAGEM DO COMPUTADOR (BINÁRIO) ESTE PROCESSO É CHAMADO DE GERAÇÃO DE PROGRAMA EXECUTÁVEL A GERAÇÃO É COMPOSTA POR DUAS FASES: - COMPILAÇÃO; - LINKEDIÇÃO; QUESTÕES PRELIMINARES A FERRAMENTA QUE REALIZA A COMPILAÇÃO É CHAMADO DE COMPILADOR E GERA UM CODIGO INTERMEDIÁRIO CHAMADO DE CÓDIGO OBJETO A FERRAMENTA QUE GERA O PROGRAMA EXECUTÁVEL FINAL A PARTIR DO CODIGO OBJETO É CHAMADO DE LINKEDITOR EXISTEM DIVERSOS FABRICANTES DE COMPILADORES (OS MAIS CONHECIDOS) : - MICROSOFT - BORLAND QUESTÕES PRELIMINARES LINGUAGEM C - HISTÓRICO NASCEU NO INÍCIO DA DÉCADA DE 1970 NOS LABORATÓRIO DA AT&T BELL A PARTIR DE UMA LINGUAGEM CHAMADA DE B(CPL) DE BELL TEM UMA LIGAÇÃO MUITO ESTREITA COM O SISTEMA OPERACIONAL UNIX 1978 BRIAN KERNIGHAN E DENNIS RITCHIE ESCREVERAM O LIVRO THE C LANGUAGE PROGRAMMING MUITAS VERSÕES FORAM CRIADAS 1983 UM COMITÊ COMEÇOU A TRABALHAR NA CRIAÇÃO DE UM PADRÃO (ANSI C) LINGUAGEM C CARACTERÍSTICAS LINGUEM DE NÍVEL MÉDIO PORTABILIDADE PADRONIZADA LINGUAGEM ESTRUTURA LINGUAGEM C - APLICAÇÕES A LINGUAGEM C PODE UTILIZADA EM DIVERSOS CAMPOS DE DESENVOLVIMENTO: SISTEMAS OPERACIONAIS GERENCIADORES DE BD EDITORES DE TEXTO PLANILHAS ELETRÔNICAS COMPILADORES SISTEMAS DE NEGÓCIOS (FOLHA, CONTAB, ESTOQUE, ETC). LINGUAGEM C - ESTRUTURA BÁSICA #include <stdio.h> main () { commandos; } OBSERVAÇÕES IMPORTANTES: A LINGUAGEM C TRABALHA SEMPRE COM LETRAS MINÚSCULAS C É CASE-SENSITIVE, ISTO É FAZ DIFERENCIAÇÃO ENTRE MAÍUSCULA E MINÚSCULA. EX: BOM É DIFERENTE DE Bom E É DIFERENTE DE bom LINGUAGEM C DESCRIÇÃO DA ESTRUTURA A LINHA #include <stdio.h> INDICA A INCLUSÃO DE UM SEGUNDO ARQUIVO FONTE NO ARQUIVO FONTE ATUAL, SEMELHANTE AO ATO DE COPIAR E COLAR. A LINHA main(), ESPECIFÍCA O NOME DA FUNÇÃO. TODOS OS PROGRAMAS EM C INICIAM SUA EXECUÇÃO CHAMANDO A FUNÇÃO main(), DESTA FORMA, A FUNÇÃO TEM QUE ESTAR SEMPRE PRESENTE (INICIO DO PROGRAMA) A LINHA { SIGNIFICA O INICIO DA FUNÇÃO MAIN E TAMBÉM INDICA O INÍCIO DE UM BLOCO DE COMANDO A LINHA } SIGNIFICA O FINAL DA FUNÇÃO MAIN E TAMBÉ INDICA A FINALIZAÇÃO DE UM BLOCO DE COMANDO comandos INDICA COMANDOS DA LINGUAGEM C QUE PODEM SER UTILIZADOS NO CORPO DA FUNÇÃO main() LINGUAGEM C COMANDOS DE ENTRADA E SAÍDA #include <stdio.h> main() { int valorint; printf (“Entre com o valor da variável “); scanf (“%d”, &valorint); printf (“O valor que você digitou foi %d\n”, valorint ); } LINGUAGEM C DESCRIÇÃO DE printf E scanf NO PROGRAMA ANTERIOR, FOI DECLARADA UMA VARÍAVEL CHAMADA variavel DO TIPO int QUE REFERE-SE A UM INTEIRO (VISTO ADIANTE) A LINHA printf (“Entre com o valor da variável “); IRÁ MOSTRAR A EXPRESSÃO QUE ESTÁ ENTRE ASPAS A LINHA scanf (“%d”, &valorint); IRÁ LER DO TECLADO UM VALOR INTEIRO QUE SERÁ ARMAZENADO NA VARIÁVEL valorint A LINHA printf (“O valor que você digitou foi %d\n”, valorint ); IRÁ MOSTRAR O CONTEÚDO A EXPRESSÃO QUE ESTÁ ENTRE ASPAS E O LOCAL QUE POSSUI %d, SERÁ SUBSTITUIDO PELO CONTEÚDO DA VARIÁVEL valorint. O \n IRÁ GERAR UM CRLF (NOVA LINHA) APÓS O FINAL DA MENSAGEM LINGUAGEM C FUNÇÃO UMA FUNÇÃO É UM BLOCO DE COMANDOS QUE EXECUTA UMA ÚNICA FUNÇÃO, SEMELHANTE AS FUNÇÕES DE UMA CALCULADORA EXEMPLO DE FUNÇOES: RAIZ QUADRADA - SQRT ORDENAÇÃO - SORT LOGARÍTMO - LOG LINGUAGEM C FORMA GERAL DE UMA FUNÇÃO nome-da-função (declarações dos parâmetros) { comandos; } COMO PODEMOS VER, A ESTRUTURA É BEM SEMELHANTE A ESTRUTURA DE UM PROGRAMA EM C. NA VERDADE O main () É A FUNÇÃO PRINCIPAL DO PROGRAMA. ASSIM, SEMPRE IRÁ EXISTIR PELO MENOS UMA FUNÇÃO EM UM PROGRAMA EM C, ISTO É, A FUNÇÃO main(). LINGUAGEM C FUNÇÃO - EXEMPLO #include <stdio.h> main () { soma (); } soma () { int a, b, c; a = 10; b = 10; c = a + b; printf (“O valor da soma foi %d\n”, c); } LINGUAGEM C FUNÇÃO - ARGUMENTOS ARGUMENTOS DE UMA FUNÇÃO É SIMPLESMENTE UM VALOR QUE É PASSADO PARA A FUNÇÃO NA HORA EM QUE ELA É CHAMADA. A FUNÇÃO ANTERIOR soma() NÃO NECESSITA DE NENHUM ARGUMENTO DURANTE A SUA CHAMADA, A FUNÇÃO printf E scanf, NECESSITAM DE ARGUMENTOS NA HORA DE SUA CHAMADA. LINGUAGEM C PARÂMETROS x ARGUMENTOS ARGUMENTOS REFERE-SE AO VALOR QUE É USADO PARA CHAMAR UMA FUNÇÃO. PARÂMETROS REFERE-SE À VARIÁVEL EM UMA FUNÇÃO QUE RECEBE O VALOR DOS ARGUMENTOS USADOS NA CHAMADA DA FUNÇÃO É IMPORTANTE QUE DEVE FICAR CLARO QUE, A VARIÁVEL USADA COMO ARGUMENTO NA CHAMADA DE UMA FUNÇÃO NÃO TEM NADA A VER COM O PARÂMETRO QUE RECEBE O VALOR DESTA VARIÁVEL. FUNÇÕES QUE ACEITAM ARGUMENTOS SÃO CHAMADAS DE FUNÇÕES PARAMETRIZADAS E POSSUEM UM COMPORTAMENTO DINÂMICO LINGUAGEM C FUNÇÃO PARAMETRIZADA #include <stdio.h> main () { int a = 10, b=20, c; soma (a, b); printf (“O valor da soma é %d \n”, c ); } soma (int x,int y ) { int z; z = x + y; printf (“O valor da soma foi %d\n”, z ); } LINGUAGEM C FUNÇÃO-RETORNO DE VALOR UMA FUNÇÃO PODE RETORNAR ALGUM VALOR PARA A FUNÇÃO CHAMADORA, ESTE VALOR É CHAMADO DE VALOR DE RETORNO DA FUNÇÃO. LINGUAGEM C FUNÇÃO-RETORNO DE VALOR #include <stdio.h> main () { int resultado; resultado = soma (10, 20); printf (“o resultado final é %d\n”, resultado ); } soma (int a, int b) { int c; c = a + b; return ( c ); } LINGUAGEM C FUNÇÃO-RETORNO DE VALOR NESSE EXEMPLO, A FUNÇÃO SOMA DEVOLVE O RESULTADO DE a + b QUE ESTÁ ARMAZENADO EM c USANDO O COMANDO return. O PROGRAMA ENTÃO ATRIBUI ESSE VALOR PARA A VARIÁVEL resultado, ISTO É, O VALOR DEVOLVIDO PELO COMANDO return SE TORNA O VALOR DE soma () NA ROTINA CHAMADA. NO EXEMPLO, O VALOR DE RETORNO É DO TIPO int, MAS FUNÇÕES PODEM DEVOLVER OUTROS TIPOS DE DADOS. POR DEFAULT UMA FUNÇÃO DEVOLVE SEMPRE UM VALOR DO TIPO int É POSSÍVEL UTILIZAR O COMANDO return SEM NENHUM VALOR LIGADO A ELA. LINGUAGEM C COMANDOS INICIAIS - if O COMANDO if AVALIA SE UMA EXPRESSÃO LÓGICA É VERDADEIRA OU FALSA. A FORMA MAIS SIMPLES DO COMANDO if é if ( condição ) comando; EXEMPLO: if (a < b ) printf (“A e menor que B ); LINGUAGEM C COMANDOS INICIAIS - if OPERADORES DE COMPARAÇÃO < - MENOR QUE > - MAIOR QUE <= - MENOR OU IGUAL QUE >= MENOR OU IGUAL QUE == IGUAL QUE != DIFERENTE DE A ANALISE DAS EXPRESSÕES LÓGICAS SEMPRE RESULTAM EM UM VALOR 0 OU 1; LINGUAGEM C COMANDOS INICIAIS - for COMANDO DE LOOP (REPETIÇÃO) A FORMA MAIS SIMPLES DO COMANDO for É for (inicialização, condição, incremento) comando; inicialização AJUSTA A VARIÁVEL DE CONTROLE DO LOOP PARA UM VALOR INICIAL A condição É TESTADO TODA VEZ QUE O LOOP SE REPETE, SE A condição FOR VERDADEIRO, O LOOP CONTINUA A SER EXECUTADO incremento INCREMENTA UMA VARÍAVEL DE CONTROLE DE LOOP LINGUAGEM C COMANDO for - EXEMPLO #include <stdio.h> main() { int cont; for ( cont = 0; cont <= 100; cont++ ) printf (“%d\n”, cont); } OBSERVAÇÃO: a=a+1 ========= a++ a=a-1 ========= a-- LINGUAGEM C BLOCOS DE CÓDIGO UM BLOCO DE CÓDIGO É UM GRUPO DE COMANDOS (DOIS OU MAIS) DE PROGRAMAS LÓGICAMENTE AGRUPADOS UM BLOCO DE CÓDIGO É CRIADO QUANDO É COLOCADO UMA SEQUENCIA DE COMANDO ENTRE CHAVES EXEMPLO: if ( a >= b) { printf (“O valor comparado é muito baixo, tente novamente”); scanf (“%d”,^&b) } LINGUAGEM C BLOCOS DE CÓDIGO SÃO UMA UNIDADE LÓGICA UM COMANDO NÃO PODE SER EXECUTADO SEM QUE O OUTRO TAMBEM SEJA EXECUTADO PERMITE QUE SE IMPLEMENTE ALGORITMOS COM MAIOR CLAREZA, ELEGÂNCIA E EFICIÊNCIA AJUDAM A CONCEITUALIZAR A VERDADEIRA NATUREZA DA ROTINA UM BLOCO DE CÓDIGO PODE TER UM COMANDO APENAS, NESTE CASO NÃO É NECESSÁRIO O ABRE E FECHA CHAVES O MAIS COMUM É TER NO MÍNIMO DOIS COMANDOS LINGUAGEM C CARACTERES OUTRO TIPO IMPORTANTE EM C É O TIPO char (CARACTER) UM CARACTER É UM VALOR DE UM BYTE QUE É UTILIZADO PARA MANTER CARACTERES IMPRIMÍVEIS OU INTEIROS NA ESCALA DE -128 A + 127 EM UM PROGRAMA, A CONSTANTE DE UM CARACTERE APARECE ENTRE ASPAS SIMPLES LINGUAGEM C CARACTERES - EXEMPLO #include <stdio.h> main() { char ch; printf (“Entre com o caracter: “); scanf (“%c”, &ch) printf (“A entrada foi %c\n”, ch); ch = ‘T’; printf (“O valoR de ch é = %c\n”, ch); } LINGUAGEM C CARACTERES - GETCH, GETCHE #include <stdio.h> main() { char ch; ch = getche(); if (ch == ‘H’) printf (“Você apertou a tecla mágica\n\n\n”); else printf (“Você apertou a tecla errada, tente novamente\n\n\”); } LINGUAGEM C DIFERENÇA - getch, getche, scanf scanf (“%c”, &ch) - ESPERA A DIGITAÇÃO DE UM CARACTER E A SEGUIR A TECLA ENTER; ch = getche () - APÓS A LEITURA DE UM CARACTER DO TECLADO O CARACTER É MOSTRADO NA TELA E ARMAZENADO NA VARIÁVEL ch, NÃO É NECESSÁRIO APERTAR A TECLA ENTER. ch = getch() - APÓS A LEITURA DE UM CARACTER DO TECLADO O CARACTER NÃO É MOSTRADO NA TELA E ARMAZENADO NA VARIÁVEL ch, NÃO É NECESSÁRIO APERTAR A TECLA ENTER LINGUAGEM C STRING E MATRIZES UMA STRING É UMA MATRIZ DE CARACTERES TERMINADO POR UM ZERO BINÁRIO EM C NÃO EXISTE O TIPO STRING UMA MATRIZ É UM LISTA DE VARIÁVEIS DO MESMO TIPO A MATRIZ É CRIADA , COLANDO ENTRE COLCHETES O SEU TAMANHO, DEPOIS DO NOME DA MATRIZ EXEMPLO: char ch[15]; LINGUAGEM C STRING E MATRIZES O PRIMEIRO ELEMENTO DE UMA MATRIZ É SEMPRE ZERO O SEGUNDO ELEMENTO É 1 O ULTIMO ELEMENTO DE UMA MATRIZ É SEMPRE O NÚMERO DE ELEMENTO MENOS 1 ( N - 1 ) PARA FAZER REFERENCIA A UM ELEMENTO ESPECÍFICO DA MATRIZ, É COLOCADO O ÍNDICE DO ELEMENTO ENTRE COLCHETES, DEPOIS DO NOME DA MATRIZ EXEMPLO: if (ch[0] == ‘H’) ...... ch[ n - 1 ] = ‘h’ LINGUAGEM C STRING E MATRIZES A CARACTERÍSTICA MAIS IMPORTANTE A SER LEMBRADO EM LINGUAGEM C É QUE A LINGUAGEM NÃO FAZ VERIFICAÇÃO DE LIMITE, ISTO SIGNIFICA QUE É NECESSÁRIO TER MUITO CUIDADO PARA NÃO IR ALÉM DOS LIMITES DA MATRIZ. PARA O MOMENTO, A MANEIRA MAIS FÁCIL DE EVITAR ESSES PROBLEMA É USAR UMA MATRIZ QUE SEJA GRANDE O SUFICIÊNTE PARA CONTER TUDO O QUE VOCÊ QUISER COLOCAR DENTRO DELA. LINGUAGEM C STRING E MATRIZES EM C TODAS AS STRINGS TERMINAM COM UM ZERO BINÁRIO QUE É ESPECIFICADO EM UM PROGRAMA NA FORMA DA CONSTANTE DE CARACTERE ‘\0’. EXEMPLO: ch[14] = ‘\0’; PORTANTO, UMA MATRIZ ESTÁ SENDO PROJETADA PARA SUPORTAR NO MÁXIMO 14 CARACTERES, NECESSITAMOS AUMENTAR EM UM ESSE TAMANHO PARA FINALIZAR A STRING COM O ‘\0’; LINGUAGEM C STRING E MATRIZES PARA LER UMA STRING DO TECLADO, PRIMEIRO É NECESSÁRIO CRIAR UMA MATRIZ DE CARACTERES PARA CONTER A STRING E DEPOIS UTILIZAR A FUNÇÃO gets(). ESTA FUNÇÃO RECEBE O NOME DA STRING COMO ARGUMENTO E LÊ OS CARACTERES DO TECLADO ATÉ SER PRESSIONADO A TECLA ENTER, O ENTER NÃO É ARMAZENADO, MAS SUBSTITUIDO PELO TERMINADOR ZERO (‘\0’) LINGUAGEM C STRING E MATRIZES #include <stdio.h> main() { char str[80]; printf (“Entre com a string: “); gets (str); printf (“A string informada foi %s\n”, str ); } A FORMATAÇÃO %s DIZ PARA A FUNÇÃO printf PARA IMPRIMIR UMA STRING LINGUAGEM C printf - STRING DE FORMATAÇÃO A FORMA GERAL DE UTILIZAÇÃO DA FUNÇÃO printf () É: printf (“string de controle”, lista de argumentos) NA FUNÇÃO printf(), A string de controle CONTÉM CARACTERES QUE SERÃO EXIBIDOS NA TELA, COMANDOS DE FORMATAÇÃO QUE DIZEM AO printf() COMO EXIBIR OS ARGUMENTOS RESTANTES OU AMBOS. CODIGOS DE FORMATAÇÃO VISTO ATÉ O MOMENTO: %d - MOSTRA UM INTEIRO NO FORMATO DECIMAL %f - MOSTRA UM FLOAT EM FORMATO DECIMAL %c - MOSTRA UM CARACTER %s - MOSTRA UMA STRING LINGUAGEM C printf - VARIAÇÕES DE USO #include <stdio.h> main() { int i = 10; float j = 10.123; char k = ‘H’, str[20] = “Bom dia”; printf (“Uma string qualquer\n”); printf (“%d %f %c % s\n\n\n”, i, j, k, str ); printf (“MSG - %d %f, %c, %s\n\n\n”, 102, j, ‘K’, “Boa Tarde”); } LINGUAGEM C scanf - STRING DE FORMATAÇÃO A FORMA GERAL DE UTILIZAÇÃO DA FUNÇÃO scanf() É: scanf (“string de controle”, lista de argumentos); NO MOMENTO VAMOS ASSUMIR QUE NA string de controle PODE CONTER APENAS CÓDIGOS DE FORMATAÇÃO QUE SÃO: %d - LEITURA DE UM NÚMERO INTEIRO %f - LEITURA DE UM NÚMERO COM PONTO FLUTUANTE, SEPARANDO A CASA DECIMAL POR UM PONTO (.) NA LISTA DE ARGUMENTOS, UM & DEVE PRECEDER AS VARIÁVEIS QUE IRÃO RECEBER OS VALORES LIDOS DO TECLADO. LINGUAGEM C COMENTÁRIOS E ENDENTAÇÃO COMENTÁRIOS EM LINGUAGEM C É FEITO DA SEGUINTE FORMA: /* Isto é um Comentário em C */ TUDO QUE ESTIVER EM /* E */ SERÁ CONSIDERADO COMO UM COMENTÁRIO E NÃO SERÁ PROCESSADO PELO COMPILADOR ENDENTAÇÃO É A PRÁTICA DE ALINHAR OS BLOCOS DE COMANDOS PARA FACILITAR A LEITURA. A ENDENTAÇÃO NÃO É NECESSÁRIO NA LINGUAGEM C, MAS É FORTEMENTE RECOMENDADO QUE O FAÇA. UM NÍVEL DE ENDENTAÇÃO É FEITO A PARTIR DA ABERTURA DE UMA CHAVE E O SEU FECHAMENTO. LINGUAGEM C ENDENTAÇÃO - EXEMPLO If (a == 0 ) { b = b * 3; if ( b > 4 ) { g = a * 4; h = a / 4; } } LINGUAGEM C PALAVRAS RESERVADAS LINGUAGEM C IDENTIFICADORES A LINGUAGEM C DEFINE IDENTIFICADORES COMO SENDO NOMES USADOS PARA SE FAZER REFERÊNCIA A VARIÁVEIS, FUNÇÕES, RÓTULOS, E VÁRIOS OUTROS OBJETOS DEFINIDOS PELO USUÁRIO. UM IDENTIFICADOR PODE TER VÁRIOS CARACTERES. O PRIMEIRO DEVE SER SEMPRE UMA LETRA OU UM SUBLINHADO E OS CARACTERES SEGUINTE DEVEM SER LETRAS, NUMEROS OU UM SUBLINHADO UM IDENTIFICADOR PODE TER NO MÁXIMO 32 CARACTERES EXEMPLO: VAR1, VAR_2, VARXYZ, _123VAR - VALIDOS 12VAR, !VAR, %XYZ - NÃO VÁLIDOS. LINGUAGEM C TIPOS DE DADOS TODAS AS VARIÁVEIS DEVEM SER DECLARADAS ANTES DE SER DE SEU USO. ISTO É NECESSÁRIO PORQUE O COMPILADOR C DEVE SABER QUE TIPO DE DADO A VARIÁVEL É ANTES DE COMPILAR QUALQUER COMANDO NA QUAL A VARIÁVEL É UTILIZADA. EM ALGORITMOS GERALMENTE EXISTEM OS SEGUINTES TIPOS: NÚMERO, LITERAL E BOOLEANO EM C EXISTEM OS SEGUINTES TIPOS: CARACTER (char), INTEIRO (int), PONTO FLUTUANTE (float), PONTO FLUTUANTE DE DUPLA PRECISÃO (double), E SEM VALOR (void) LINGUAGEM C TIPOS DE DADOS char - UTILIZADO PARA ARMAZENAR CARACTERES ASCII DE 8 BITS COMO AS LETRAS, ‘A’, ‘a’, ‘b’, ‘B’. int - UTILIZADO PARA ARMAZENAR QUANTIDADES INTEIRAS QUE NÃO REQUEIRAM UM COMPONENTE FRACIONÁRIO, GERALMENTE UTILIZADO PARA CONTROLAR LOOPS E COMANDOS CONDICIONAIS. float, double - UTILIZADO QUANDO É NECESSÁRIO UM COMPONENTE FRACIONÁRIO O QUANDO SEU APLICATIVO NECESSITA DE UM VALOR MUITO GRANDE. A DIFERENÇA ENTRE DOUBLE E FLOAT É A MAGNETUDE DO MAIOR E DO MENOR NÚMERO QUE ELAS PODEM CONTER. LINGUAGEM C TIPOS DE DADOS LINGUAGEM C MODIFICADORES DE TIPO MODIFICADORES DE TIPO É UTILIZADO PARA ALTERAR O SIGNIFICADO DO TIPO-BASE PARA QUE ELE SE ADAPTE DE MANEIRA MAIS PRECISA ÀS NECESSIDADES DAS VÁRIAS SITUAÇÕES OS MODIFICADORES DE TIPO SÃO: signed (com sinal), unsigned (sem sinal), long, short APLICAMOS OS MODIFICADORES signed, unsigned, long e short AOS TIPOS BASE char E int. E TAMBÉM PODEMOS APLICAR long AO TIPO BASE double POR DEFAULT O TIPO BASE int JÁ signed LINGUAGEM C SINALIZAÇÃO DE VARIÁVEIS PARA REPRESENTAR O SINAL DE UMA VARIÁVEL, É UTILIZADO O BIT DE MAIOR GRANDEZA. EXEMPLO: +127 EM BINÁRIO É 00000000 01111111 -127 EM BINÁRIO É 10000000 01111111 * bit de sinal LINGUAGEM C MODIFICADORES DE TIPO LINGUAGEM C EXEMPLO - MODIF. DE TIPOS #include <stdio.h> main() { unsigned int i = 4294967290; int j; j = i; printf (“%u %d \n”, i, j); } EXIBE: 4294967295 -1 %u É UM NOVO CÓDIGO DE FORMATAÇÃO PARA IMPRIMIR UM INTEIRO SEM SINAL LINGUAGEM C DECLARAÇÃO DE VARIÁVEIS FORMA GERAL DE DECLARAÇÃO DE VARIÁVEIS: tipo lista_variaveis; tipo DEVE SER UM TIPO VÁLIDO EM C E lista_variaveis PODE CONSISTIR E UM OU MAIS IDENTIFICADORES SEPARADOS POR VÍRGULA. EXEMPLO: int i, j, k; unsigned int si; float balanco, lucro, prejuizo; REGRAS DE ESCOPO O LUGAR ONDE UMA VARIÁVEL É DECLARADA AFETA EM MUITO A MANEIRA COMO AS OUTRAS PARTES DE SEU PROGRAMA PODEM USAR AQUELA VARIÁVEL. AS REGRAS QUE DETERMINAM COMO UMA VARIÁVEL PODE SER UTILIZADA COM BASE NO LUGAR DE SUA DECLARAÇÃO NO PROGRAMA SÃO CHAMADAS REGRAS DE ESCOPO DA LINGUAGEM. AS VARIÁVEIS PODEM SER DECLARADAS EM TRÊS LOCAIS DE SEU PROGRAMA: - FORA DE TODAS AS FUNÇÕES (VARIÁVEIS GLOBAIS) - DENTRO DE UMA FUNÇÃO (VARIÁVEIS LOCAIS) - DECLARAÇÃO DOS PARÂMETROS FORMAIS DE FUNÇÃO REGRAS DE ESCOPO VARIÁVEIS GLOBAIS PODE SER UTILIZADA EM QUALQUER PARTE DO PROGRAMA VARIÁVEIS LOCAIS PODEM SER UTILIZADAS SOMENTE PELOS COMANDOS QUE ESTIVEREM DENTRO DA MESMA FUNÇÃO. EM ESSÊNCIA, UMA VARIÁVEL LOCAL É CONHECIDA SOMENTE DENTRO DA FUNÇÃO E DESCONHECIDA FORA DAQUELA FUNÇÃO. PARÂMETROS FORMAIS DE FUNÇÃO SÃO UTILIZADOS PARA RECEBER OS ARGUMENTOS QUE SÃO PASSADOS PARA A FUNÇÃO, ESSES PARÂMETROS FUNCIONAM COMO QUALQUER OUTRA VARIÁVEL LOCAL. REGRAS DE ESCOPO - EXEMPLO REGRAS DE ESCOPO COMENTÁRIOS DO PROGRAMA QUALQUER FUNÇÃO PODE ACESSAR A VARIÁVEL sum A FUNÇÃO total() NÃO PODE ACESSAR DIRETAMENTE A VARIÁVEL LOCAL count DA FUNÇÃO main(), QUE DEVE SER PASSADA COMO UM ARGUMENTO. ISTO É NECESSÁRIO PORQUE UMA VARIÁVEL LOCAL SÓ PODE SER USADA PELO CÓDIGO QUE ESTÁ NA MESMA FUNÇÃO NA QUAL ELA É DECLARADA. NA FUNÇÃO display(), A VARIÁVEL count É COMPLETAMENTE SEPARADA DA VARIÁVEL count DA FUNÇÃO main(), NOVAMENTE POR QUE UMA VARIÁVEL LOCAL É CONHECIDA APENAS PELA FUNÇÃO NA QUAL ELA É DECLARADA REGRAS DE ESCOPO OBSERVAÇÕES NÃO PODE EXISTIR DUAS VARIÁVEIS GLOBAIS COM O MESMO NOME UMA VARIÁVEL LOCAL EM UMA FUNÇÃO PODE TER O MESMO NOME DE UMA VARIÁVEL LOCAL EM OUTRA FUNÇÃO. A RAZÃO PARA ISTO É QUE O CÓDIGO E OS DADOS DENTRO DE UMA FUNÇÃO SÃO COMPLETAMENTE SEPARADOS DAQUELES EM OUTRA FUNÇÃO. DUAS VARIÁVEIS DENTRO DE UMA MESMA FUNÇÃO NÃO PODE TER O MESMO NOME OPERADORES DE RELAÇÃO E LÓGICOS OPERADORES DE RELAÇÃO REFERE-SE ÀS RELAÇÕES QUE OS VALORES PODEM TER UNS COM OS OUTROS OPERADORES LÓGICOS REFERE-SE ÀS MANEIRAS COMO AS RELAÇÕES PODEM SER CONECTADAS. OPERADORES DE RELAÇÃO: >, <, <=, >=, ==, != OPERADORES LÓGICOS: && (and) || (or) ! (not) EXEMPLOS: (a > b ), (c <= d), (a == b ), (e != a ) ((a > b) && ( c <= d)), (((e != a ) || ( a == b ))) && (c < d )) OPERADORES DE RELAÇÃO E LÓGICOS A CHAVE PARA O CONCEITO DOS OPERADORES DE RELAÇÃO E LÓGICOS É A IDÉIA DE VERDADEIRO E FALSO EM C, VERDADEIRO É QUALQUER VALOR DIFERENTE DE ZERO, ENQUANTO FALSO É ZERO. AS EXPRESSÕES QUE USAM OPERADORES DE RELAÇÃO E LÓGICOS RETORNARÃO 0 PARA FALSO E 1 PARA VERDADEIRO. OPERADORES DE RELAÇÃO E LÓGICOS main() { int i = 10, j = 20, k; k = (i < j); printf (“O conteúdo de i < j é %d\n”, k ); } COMANDOS DE CONTROLE DE FLUXO - COMANDO if If (condicao) comando/Bloco de comando; else comando/Bloco de comando; if ANINHADOS if (condicao1) if (condicao2) if (condicao3) if condicao4) if ANINHADOS COM else If (x) if (y) printf (“1”); else printf (“2”); if (x) { if (y) printf (“1”) } else printf (“2”); ESCADA if-else-if If (condicao1) comando/bloco de comando else if (condicao2) comando/bloco de comando else if (condicao3) comando/bloco de comando else comando/bloco de comando COMANDO switch A ESCADA if-else-if GERA UM CÓDIGO DIFICIL DE SER SEGUIDO E NÃO GERA UMA SOLUÇÃO ELEGANTE. A LINGUAGEM C TEM UM COMANDO DE VÁRIOS DESVIOS CHAMADO DE SWITCH. EM SWITCH, O COMPUTADOR TESTA UMA VARIÁVEL SUCESSIVAMENTE CONTRA UMA LISTA DE CONSTANTES INTEIRAS OU DE CARACTERES. DEPOIS DE ENCONTRAR UMA COINCIDÊNCIA, O COMPUTADOR EXECUTA O COMANDO OU BLOCO DE COMANDOS QUE ESTEJAM ASSOCIADOS ÀQUELA CONSTANTE COMANDO switch Switch (variável) { case constante1 : sequência de comandos; break; case constante2 : sequência de comandos; break; case constante3 : sequência de comandos; break; default } : sequência de comandos; COMANDO SWITCH ANINHADO switch (x) { case 1 : switch (y ) { case ‘a’ : sequência de comandos; break; case ‘b’ : sequência de comandos; break; } break; case 2 : } LOOP for For ( i = 0; i < 100; i ++ ) comando/Bloco de comandos; for ( i = 0; i < 100; i++ ) for ( j = 0; j < 50, j++); printf (“%d “, matriz[i][j] ); for ( ; ; ) // Looping infinito comando/Bloco de comandos; for (x = 0; x != 123; ) comando/Bloco de comandos LOOP while e do-while while (condicao) comando/Bloco de comandos; while (1) // looping comando/Bloco de comandos; do { comando/Bloco de comandos; } while (condicao) INTERRUPÇÃO DE LOOPS O COMANDO BREAK TEM DOIS USOS. O PRIMEIRO É ENCERRAR UM case NO COMANDO switch. O SEGUNDO É FORÇAR O TÉRMINO IMEDIATO DE UM LOOP, PASSANDO POR CIMA DO TESTE NORMAL DO LOOP. QUANDO O COMPUTADOR ENCONTRA O COMANDO break DETRO DE UM LOOP, ELE IMEDIATAMENTE ENCERRA O LOOP MAIS INTERNO. for ( i = 0 ; i < 1000; i++) { if ( i == 100 ) break; printf (“Estou em looping no for “); } COMANDO continue O COMANDO continue FUNCIONA DE MANEIRA PARECIDA COM O COMANDO break. PORÉM EM VEZ DE FORÇAR O ENCERRAMENTO, continue FORÇA A PRÓXIMA ITERAÇÃO DO LOOP E PULA O CÓDIGO QUE ESTIVER NO MEIO. for (x = 0; x < 100; x++ ) { if ( x % 2 ) continue; printf (“%d\n”, x ); } MATRIZES MULTIDIMENSIONAIS EM LINGUAGEM C, A FORMA MAIS SIMPLES DE UMA MATRIZ MULTIDIMENSIONAL É A MATRIZ BIDIMENSIONAL QUE É DECLARADO DA SEGUINTE FORMA: int multidim[4][3] NO CASO ACIMA FOI DEFINIDO UMA MATRIZ MULTIDIMENSIONAL COM DUAS DIMENSÕES, ISTO É, 4 LINHAS E TRÊS COLUNAS, ONDE O PRIMEIRO ELEMENTO DESTA MATRIZ POSSUI O INDICE [0][0] E O ÚLTIMO ELEMENTO POSSUI O INDICE [3][2]. C ALOCA PERMANENTEMENTE ESPAÇO NA MEMÓRIA PARA TODOS OS ELEMENTOS DA MATRIZ. NO CASO DE UMA MATRIZ BIDIMENTSIONAL, PODEMOS UTILIZA A FÓRMULA ABAIXO PARA ENCONTRAR O NÚMERO DE BYTES DE MEMÓRIA. - BYTES = LINHA * COLUNA * SIZEOF (TIPO_DADO) MATRIZES MULTIDIMENSIONAIS Main() { int x, y; int varmat[5][4]; for (x = 0; x < 5; x++) for (y = 0; y < 4; y++) varmat[x][y] = 0; } MATRIZES DE STRINGS EM PROGRAMAÇÃO NÃO É MUITO RARO USAR UMA MATRIZ DE STRINGS COMO POR EXEMPLO UM BANCO DE DADOS DE ERROS, EXEMPLO 1 - ARQUIVO NÃO ECONTRADO 2 - ARQUIVO BLOQUEADO DEFINIÇÃO DE UMA MATRIZ DE STRING char matriz_de_erro [10][80] ACIMA DEFINIMOS UMA MATRIZ COM 10 LINHAS DE ERRO E MENSAGENS QUE NÃO TÊM MAIS DO QUE 80 COLUNAS. PRIMEIRO INDICE INDICA NÚMERO DE LINHAS E O SEGUNDO INDICE INDICA A QUANTIDADE DE CARACTERES DE CADA LINHA MATRIZES DE STRINGS - FUNÇÃO gets PARA REALIZAR A ENTRADA DE DADOS DE UMA MATRIZ DE CARACTERES UTILIZAMOS A FUNÇÃO gets DA SEGUINTE FORMA: char arraymsg[5][80]; gets (&arraymsg[0][0]); PARA MOSTRAR AS MENSAGENS UTILIZAMOS O CÓDIGO ABAIXO: for (x=0; x < 5; x++) printf (“%s\n”, arraymsg[x][0]; INICIALIZAÇÃO DE MATRIZES A LINGUAGEM C PERMITE A INICIALIZAÇÃO DE MATRIZES DA SEGUINTE FORMA: MATRIZES UNIDIMENSIONAIS int var[5] = {1,2,3,4,5}; char var[5] = {‘a’, ‘b’, ‘c’, ‘d’, ‘\0’ }; ou char var[5]=“abcd” MATRIZES MULTIDIMENSIONAIS int var[2][3] = {1,2,4, 5,6,7} INICIALIZAÇÃO DE MATRIZES MATRIZES SEM TAMANHO DEFINIDO EM ALGUMAS VEZES É NECESSÁRIO CONTAR O NÚMERO DE CARACTERES PARA DEFINIR O TAMANHO DE UMA MENSAGENS: char e1[12]=“read error \n”; char e2[13]=“write error \n”; O COMPILADOR C PERMITE A DETERMINAÇÃO DINÂMICA DO TAMANHO DA MATRIZ QUE INICIALIZADA NO MOMENTO DA SUA CRIAÇÃO, DESTA FORMA NÃO É NECESSÁRIO PREOCUPAR-SE COM O SEU TAMANHO char e1[ ]=“read error \n”; char e2[ ]=“write error”\n”; INICIALIZAÇÃO DE MATRIZES A FUNÇÃO sizeof PODE SER UTILIZADO PARA RESGATAR O ESPAÇO DE MEMÓRIA OCUPADO POR UMA VARIÁVEL EM MEMÓRIA . main() { int x, y[10], z[2] [2], tx, ty, tz; tx = sizeof (x); ty = sizeof (y); tz = sizeof (z); printf (tx = %d, ty = %d, tz = %d\n”, tx, ty, tz) } PONTEIROS PONTEIROS UM PONTEIRO É UMA VARIÁVEL QUE CONTÉM O ENDEREÇO DE MEMÓRIA, OU SEJA, ESSE ENDEREÇO É A LOCALIZAÇÃO DE UMA OUTRA VARIÁVEL NA MEMÓRIA. SE UMA VARIÁVEL CONTÉM O ENDEREÇO DE UMA OUTRA VARIÁVEL, ENTÃO DIZEMOS QUE A PRIMEIRA APONTA PARA A SEGUNDA. PONTEIROS-DECLARAÇÃO DE VARIÁVEIS DECLARAÇÃO DE PONTEIRO: tipo *nome_var; EXEMPLO: int *ptr PONTEIROS-OPERADORES OPERADORES DE PONTEIROS: EXEMPLO: int a = 0; int *ptr; ptr = &a; printf (“Conteúdo da Variavel ptr e %p\n”, ptr ); & - OPERADOR UNÁRIO QUE DEVOLVE O ENDEREÇO DE MEMÓRIA DA VARIÁVEL (a) NO EXEMPLO ACIMA, A VARIÁVEL( ptr) IRÁ CONTER O ENDEREÇO DE MEMÓRIA DA VARIÁVEL (a). SE A VARIÁVEL (a) ESTÁ LOCALIZADO NO ENDEREÇO 2000, ENTÃO O VALOR DE (ptr) SERÁ 2000. PONTEIROS - OPERADORES * - OPERADOR UNÁRIO QUE DEVOLVE O VALOR DA VARIÁVEL LOCALIZADA NO ENDEREÇO QUE SE SEGUE int a = 0, b = 100; int *ptr; ptr = &a; b = *ptr; printf (“Conteúdo da posição apontada por %d\n”, b ); NO EXEMPLO ACIMA, A VARIÁVEL (a) ESTÁ LOCALIZADO NA POSIÇÃO 2000 E A VARIÁVEL (b) ESTÁ NA POSIÇÃO 2002 E A VARIÁVEL (ptr) ESTÁ NA POSIÇÃO 2004, O CONTÉUDO DE (a) É 0, DE (b) É 100 E DE (ptr) 2000, NA INSTRUÇÃO (b=*ptr OU b=*(2000)), O VALOR ARMAZENADO NA POSIÇÃO 2000 ESTÁ SENDO ATRIBUÍDO A VARIÁVEL (b) PONTEIROS - IMPORTÂNCIA DO TIPOS BASE NO EXEMPLO ANTERIOR, O VALOR DE DA VARIÁVEL (a) FOI COPIADA PARA A VARIÁVEL (b) DE FORMA INDIRETA, ISTO É, ATRAVÉS DE PONTEIROS PERGUNTA - COMO A LINGUAGEM C SABE DETERMINAR A QUANTIDADE DE BYTES A SER COPIADO PARA A VARIÁVEL (b) DO ENDEREÇO APONTADO POR (ptr) ???? EM OUTRAS PALAVRAS, COMO É QUE O COMPILADOR TRANSFERE O NÚMERO ADEQUADO DE BYTES PARA QUALQUER ATRIBUIÇÃO QUE USA UM PONTEIRO ? A RESPOSTA A AMBAS AS PERGUNTAS QUESTÕES É QUE O TIPO-BASE DO PONTEIRO DETERMINA O TIPO DE DADOS PARA O QUAL O COMPUTADOR ASSUME QUE O PONTEIRO ESTÁ APONTANDO. PONTEIRO - IMPORTÂNCIA DO TIPO BASE float x=10.1, y; int *p; p = &x; y = *p; printf (“%f %f \n”, x, y); O PROGRAMA ACIMA NÃO IRÁ ATRIBUIR O VALOR DE (x) PARA (y). COMO O PROGRAMA DECLARA (p) COMO SENDO UM PONTEIRO PARA INTERIO, O COMPILADOR IRÁ TRANSFERIR APENAS DOIS BYTES DE INFORMAÇÃO PARA (y) E NÃO 4 BYTES QUE NORMALMENTE FORMAM UM NÚMERO DE FONTO FLUTUANTE EXPRESSÕES COM PONTEIROS EM GERAL AS EXPRESSÕES QUE ENVOLVEM PONTEIROS OBEDECEM ÀS MESMAS REGRAS DAS EXPRESSÕES EM C. - ATRIBUIÇÕES COM PONTEIROS int x; int *p1, *p2; p1 = &x; p2 = p1; printf (“%p %p %d %d \n”, p2, p1, *p1, *p2); EXPRESSÕES COM PONTEIROS PODEMOS USAR APENAS DUAS OPERAÇÕES ARITMÉTICAS EM PONTEIROS: + E -. PARA ENTENDER O QUE OCORRE NA ARITMÉTICA COM PONTEIROS SUPONHA QUE (p1) SEJA UM PONTEIRO PARA UM INTEIRO, COM VALOR CORRENTE DE 2000. DEPOIS DA EXPRESSÃO p1++; O CONTEÚDO DE (p1) SERÁ DE 2002 E NÃO 2001. SE O VALOR CORRENTE DE (p1) É 2000, ENTÃO APÓS A OPERAÇÃO p1--; O VALOR DE (p1) SERÁ DE 1998. OPERAÇÕES COM PONTEIRO char *ch = 2000; int *i = 2000; OPERAÇÕES COM PONTEIROS CADA VEZ QUE O COMPUTADOR INCREMENTA O PONTEIRO, ELE APONTA PARA A LOCALIZAÇÃO DE MEMÓRIA DO PRÓXIMO ELEMENTO DE SEU TIPO-BASE. CADA VEZ QUE O COMPUTADOR DECREMENTA O PONTEIRO, ELE APONTA PARA A LOCALIZAÇÃO DE MEMÓRIA DO ELEMENTO ANTERIOR A LINGUAGEM C PERMITE INCREMENTO E DECREMENTO DE CONSTANTES INTEIRA A UM PONTEIRO: p1 = p1 + 5; SE (p1) É UM PONTEIRO PARA UM int E O SEU CONTEÚDO É 2000, ENTÃO APÓS A OPERAÇÃO O SEU VALOR SERÁ DE 2010 OPERAÇÕES COM PONTEIROS OPERAÇÕES NÃO PERMITIDAS COM PONTEIROS: MULTIPLICAR OU DIVIDIR PONTEIROS; SOMAR OU SUBTRAIR DOIS PONTEIROS; APLICAR AOS PONTEIROS O DESLOCAMENTO DE BIT A BIT APLICAR OPERADORES COM MÁSCARA SOMAR OU SUBTRAIR OS TIPOS double OU float DE OU PARA PONTEIROS OPERAÇÕES COM PONTEIROS - COMPARAÇÕES DE PONTEIROS É POSSÍVEL COMPARAR DOIS PONTEIROS EM UMA EXPRESSÃO DE RELAÇÃO. POR EXEMPLO DADOS DOIS PONTEIROS p1 E p2, O SEGUINTE FORMATO É PERFEITAMENTE VÁLIDO: if (p1 < p2 ) printf (“p1 aponta para uma posição inferior de memória do que p2”); EM GERAL UTILIZAMOS COMPARAÇÕES DE PONTEIROS QUANDO DOIS OU MAIS PONTEIROS ESTÃO APONTANDO PARA UM OBJETO COMUM PONTEIROS E MATRIZES EXISTE UM RELACIONAMENTO MUITO PRÓXIMO ENTRE PONTEIROS E AS MATRIZES. CONSIDERE O FRAGMENTO: char str[80], *p; char *p1; p1 = str; ESTE FRAGMENTO AJUSTA p1 PARA O ENDEREÇO DO PRIMEIRO ELEMENTO DA MATRIZ (str). EM C, O NOME DE UMA MATRIZ SEM UM ÍNDICE É O ENDEREÇO DO INÍCIO DA MATRIZ. EM ESSËNCIA, O NOME DA MATRIZ É UM PONTEIRO PARA AQUELA MATRIZ. PONTEIROS E MATRIZES PARA ACESSAR O QUINTO ELEMENTO str[4] OU *(p1 + 4); É BOM LEMBRAR QUE AS MATRIZES COMEÇAM COM ZERO, PORTANTO ESSES DOIS COMANDOS USAM O NÚMERO 4 PARA INDEXAR (str). PODEMOS TAMBÉM SOMAR 4 AO PONTEIRO (p1) PARA OBTER O QUINTO ELEMENTO, PORQUE (p1) ATUALMENTE APONTA PARA O PRIMEIRO ELEMENTO DE (str). A LINGUAGEM C PERMITE, ESSENCIALMENTE DOIS MÉTODOS DE ACESSO AOS ELEMENTOS DE UMA MATRIZ: A INDEXAÇÃO E A ARITMÉTICA DE PONTEIROS. A ARITMÉTICA DE PONTEIRO É MAIS RÁPIDO QUE A INDEXAÇÃO DE MATRIZES. PONTEIROS E MATRIZES ACESSO ATRAVÉS DE INDEXAÇÃO main() { char str[80] = “Boa Noite Brasil”; int i; for (i = 0; str[i]; i++) printf (“%c”, str[i]); printf (“\n”); } PONTEIROS E MATRIZES ACESSO ATRAVÉS DE PONTEIROS Main() { char str[80] = “Boa Noite Brasil”, *p; p = str; while ( *p ) { printf (“%c”, *p ); p++; } INDEXANDO UM PONTEIRO EM C PODEMOS INDEXAR UM PONTEIRO COMO SE ELE FOSSE UMA MATRIZ. ESSA HABILIDADE INDICA DE FORMA MAIS CLARA O ESTREITO RELACIONAMENTO ENTRE PONTEIROS E AS MATRIZES main() { int i[5] = {1, 2, 3, 4, 5}; int *p, t; p = i; for (t = 0; t < 5; t++) printf (“%d “, p[t] ); ou printf (“%d”, *(p + t)); }