Baixe o app para aproveitar ainda mais
Prévia do material em texto
Linguagem de Programação Estruturada Aula 01: Introdução a linguagem C Prof. André Alves Nogueira, MSc. SUMÁRIO ▪Conceitos Básicos de C/C++ ▪Declaração de variáveis ▪Printf e Scanf ▪Operadores ▪Constantes ▪Comentários ▪Operadores relacionais e lógicos 2 MAS ANTES DE COMEÇARMOS, VOCÊ SABE O QUE É LÓGICA? • Segundo o Dicionário Aurélio: • “Filos.: Conjunto de estudos que visam determinar os processos intelectuais que são condição geral do conhecimento verdadeiro.” • Segundo o Dicionário Houaiss: • “Filos.: Parte da filosofia que estuda as formas de pensamento emgeral.” • Coerência de raciocínio, ideias, encadeamento de acontecimentos, etc. • FORBELLONE: • A lógica busca colocar “ordem nopensamento”; EXEMPLOS DE APLICAÇÃO DE LÓGICA ▪Asala está fechada e meu livro está na sala. Então, preciso primeiro abrir a salaparapegaro livro. ▪Todo mamífero é animal e todo cavalo é mamífero. Então, todo cavaloé um animal. ▪Para trocar uma lâmpada, preciso desligar o interruptor, pegar uma escada, subir com uma lâmpadanova, trocar a queimada pelanova,e ligar o interruptor novamente. ALGUNS CONCEITOS BÁSICOS ▪ Lógica de programação: é a técnica usada para encadear logicamente instruçõespara o desenvolvimento de programas. ▪ Instrução: é a informação que indica a ação elementar a ser executada. ▪ Programa: é a implementação das instruções de um algoritmo em uma linguagem deprogramação. ▪ Ambiente de Desenvolvimento Integrado (ou IDE – Integrated Development Environment): é um programa de computador que reúne características e ferramentas de apoio ao desenvolvimento de software como objetivo de agilizar este processo. ▪ Algoritmos: sequência lógica e não ambígua de instruções que levam à solução deum problema num tempo finito. ▪ Deve possuir um objetivo bemdefinido. ▪ Sequência finita de passos que nos levam a um objetivodesejado. ALGORITMOS ▪ Receita de Bolo Definir claramente os ingredientes Sequencia de passos à serem definidos Resultado Final ALGORITMOS - CARACTERÍSTICAS ▪ Sequência Lógica: as instruções devem seguir uma ordem correta para execução. ▪ Não Ambígua: a sequência lógica e as instruções não devem dar margem à dupla interpretação. ▪ Solução de um problema: a sequência lógica deverá resolver exatamente o problema identificado. ▪ Tempo Finito: a sequência lógica não deve possuir iterações infinitas. ▪ Lembre-se que um problema pode ser resolvido de várias formas, ou seja, não obrigatoriamente existe um algoritmo único para solucionar um problema ALGORITMOS – EXEMPLOS ▪ Receitas de Comidas ▪ Manuais de Instalação ▪ Somar dois números quaisquer ▪ Mascar Chiclete ▪ Trocar Pneu ▪ Tomar banho ▪ Escovar os Dentes ▪ Trocar uma Lâmpada POR QUE ESCREVER ALGORITMOS? ▪ Gerar uma solução para um determinado problema, independente da linguagem deprogramaçãoa ser usada. ▪ Oalgoritmo irá facilitar a implementação do programa. ▪ Pseudocódigo: é uma forma genérica de escrever um algoritmo, utilizando uma linguagemsimples (nativa aquemo escreve, de forma aser entendida por qualquer pessoa) sem necessidade de conhecer a sintaxe de nenhuma linguagem de programação. MÉTODOS GRÁFICOS DE CONSTRUÇÃO DE ALGORITMOS ▪ Fluxograma 10 Para fazer bons fluxogramas, useo programa Microsoft Visio. TABELA DE FLUXOGRAMAS 11 11 AGORA SIM, VAMOS PARA O C... BREVE HISTÓRICO ▪ A linguagem C foi criada por Dennis Ritchie em 1972 na BELL Telephone Lab. (hoje AT&T), com a finalidade de permitir a escrita de um sistema operacional (que viria a ser o UNIX), utilizando uma linguagem de relativo alto nível, evitando o uso do Assembly. ▪ Devido as suas capacidades e através da divulgação do sistema UNIX pelas universidades do EUA, logo a linguagem C disseminou-se e tornou- se conhecida por todos os programadores (graças também ao livro de Dennis e Brian Kernighan). ▪ A linguagem C teve esse nome e evolução da linguagem B, desenvolvida pelo seu amigo e chefe na Bell, Ken Thompson. Figura 1: Ken Thompson e Dennis Ritchie (da esquerda para direita), os criadores das linguagens B e C, respectivamente. Dennis Ritchie morreu em 12 de outubro de 2011, 2 semanas depoisdeSteve Jobs. EVOLUÇÃO DO C E C++ C VERSUS C++ ▪ O C++ é uma derivação do C com suporte a objetos e classes (OOL), sendo que C é um subconjunto de C++, ou seja, contem todas as características do C mais um conjunto de características próprias. ▪ Assim, podemos utilizar o compilador C++ para executar programas em C. ▪ Virtualmente se você conhece C, você conhece C++ em sua raiz, o que é necessário para se dar um salto a programação em C. ▪ Mais porque o C ainda é muito usado? ▪ Performance não alcançada por linguagens OO; ▪ Todos os hardwares fabricados hoje em dia tem 99% de compatibilidade com a linguagem C; ▪ Processadores ARM, EXYNOS, QUALCOMM, INTEL, AMD são construídos em C e VHDL; ▪ Fácil de aprender; ▪ Comunidade e bibliografia muito extensa; ▪ Capacidade de evolução (?). CICLO DE DESENVOLVIMENTO DE UMA APLICAÇÃO ▪Tradicionalmente, o ciclo engloba 4 fases: 1) Edição do Código-fonte; 2) Compilação do programa; 3) “Linkagem” do(s) objeto(s); 4) Execução do programa. EDIÇÃO DO CÓDIGO-FONTE ▪Nessa fase é toda feita manualmente pelo programador com ajudar de algum editor de texto; ▪Nessa fase é feita a escrita de códigos em arquivos com extensão .c (.cpp para C++); COMPILAÇÃO DO PROGRAMA • Depois de feito, o programa deve ser verificado se este foi corretamente escrito (isto é, se a sintaxe das instruções está ou não correta). • Esse processo, denominado Compilação, é realizado pelo Compilador. Caso seja detectado algum erro, o processo de compilação é interrompido. O programador deve retornar ao ponto de erro e consertar o problema indicado pelo compilador. • O compilador também é capaz de detectar e avisar (warnings) problemas no código que podem deixar o programa mais lento, com possíveis falhas e bugs, etc. Contudo, o programa será lido se ignorar os avisos. • Caso não seja encontrado nenhum erro (mesmo se houver warnings) o compilador executar o programa e irá criar o arquivo Objeto .obj (no DOS) ou .o (no UNIX/LINUX). “LINKAGEM” DO OBJETO ▪ A fase de compilação serve simplesmente para a verificação sintática e para a criação do arquivo objeto. ▪ O arquivo executável é criado a partir do arquivo objeto, obtido através do processo de compilação, e através das bibliotecas (extensões .LIB em DOS e .a em UNIX) que contem o código já compilado das funções da própria linguagem C, que são necessárias ao executável final (Windows .exe ou sem extensão no UNIX). O responsável dessa fase é o Linker. EXECUÇÃO DO PROGRAMA ▪ Nessa fase é feita a execução do programa em si. ▪ Caso o programa não executa o que foi esperado, é porque o elemento mais fraco do processo (o programador) se enganou. O ciclo inteiro deve ser reiniciado através da reconstrução do código- fonte. Esse ciclo de programação é verdadeiro na maioria das linguagens. No entanto, emCainda existe umaoutra fase antes dacompilação,aqual tema missãodaexpansãodetodas as Macrose a execução de todasaslinhasde códigoparao pré-processador. FLUXO DE EXECUÇÃO AMBIENTE DE PROGRAMAÇÃO EM C MEU 1º PROGRAMA EM C Isso irá gerar a seguinte saída: olá mundo!! Dicadeprogramação:devidoousodeumcompiladorC++,parafacilitar ousodo programa,no lugar devoidmain()coloque int main(void)enofinal doprograma(antes do ultimo ‘}’), coloque a linha return 0; . Isso deve fazer parte de TODOSos seus programas em C apartir deagora. MEU 1º PROGRAMA EM C ▪ A linha: printf(“olá mundo!!”); é a responsável por imprimir na tela o que vemos. ▪ O printf = print + formatado, que é a função básica de saída do C e tem necessariamente ser escrita com parênteses – prinf(). ▪ Toda instrução de linha em C deve ser informada o seu termino com ponto-e-vírgula (;). ▪ Note também que a String “olá mundo!!” está contida sobre aspas duplas (“) e não pode ser substituído por aspas simples (‘). ▪ A linha: #include <stdio.h> não pertence ao C (por isso não termina com ; ), mas sim é uma diretiva que indica ao compilador (mas propriamente ao pré-processador) que deverá inserir na compilação o arquivo stdio.h, de forma que o compilador tenha acesso a uma série de funções que irá precisar (como o printf). ▪ Esses arquivos tem a extensão .h, pois não tem código, mas são apenas cabeçalhos (headers) das funções que representam. São chamadas de headers files. ▪ A função: void main() é a função principal do programa, toda a função deve ser seguida de parênteses. Parênteses vazios significam que a função não irá receber nenhuma informação do mundo exterior. A palavra void indica que a função não retornar NADA (mais tarde você saberá o motivo!) ▪ Todo o bloco de construção de funções deve ter inicio com ({) e fechamento com (}). ▪ Lembrando que o C é case-sensitive, isto é, existe diferença entre mAIN(), Main(), mAIn(),etc. MEU 1º PROGRAMA EM C CARACTERE ESPECIAL “\” OU SEQUENCIA DE ESCAPE ▪ O programa poderia ser escrito também dessa forma: \n significa newline ▪ Exemplo 1. Escreva a linha: Hoje está um “LINDO” dia!!!. ▪ 1ª Tentativa: #include <stdio.h> int main(void) { printf("Hoje está um "LINDO" dia!!!\n"); return 0; } ▪ O que há de errado acima? CARACTERE ESPECIAL “\” OU SEQUENCIA DE ESCAPE CARACTERE ESPECIAL “\” OU SEQUENCIA DE ESCAPE ▪ Exemplo 1. Escreva a linha: Hoje está um “LINDO” dia!!!. ▪ 2ª Tentativa: CARACTERE ESPECIAL “\” OU SEQUENCIA DE ESCAPE ▪ Exemplo 2: fazer um programa que escreva a frase: “aqui vai um apito” e no final emite um sinal sonoro. CARACTERE ESPECIAL “\” OU SEQUENCIA DE ESCAPE TIPOS DE DADOS Os dados podem assumir cinco tipos básicos em C que são: char: Caractere: O valor armazenado é um caractere. Caracteres geralmente são armazenados em códigos (usualmente o código ASCII). int: Número inteiro é o tipo padrão e o tamanho do conjunto que pode ser representado normalmente depende da máquina em que o programa está rodando. float: Número em ponto flutuante de precisão simples. São conhecidos normalmente como números reais. double: Número em ponto flutuante de precisão dupla. Bool(_Bool): para indicar true (verdadeiro) ou false (falso), utiliza 1 byte; Presente apenas no padrão C99 em diante. void: Este tipo serve para indicar que um resultado não tem um tipo definido. Uma das aplicações deste tipo em C é criar um tipo vazio que pode posteriormente ser modificado para um dos tipos anteriores. DECLARAÇÃO DE TIPOS #include <stdio.h> #include <stdlib.h> int main(void) { int x = 3; char y = 'e'; double a = 3.8; float b = 9.9; return 0; } MODIFICADORES DE TIPOS Tipo de dado Significado Tamanho (em bytes) Intervalo de valores aceitos char Caractere 1 de -128 a 127 unsigned char Caractere não sinalizado 1 0 à 255 short int Inteiro curto 2 de -32768 a 32767 unsigned short int Inteiro curto não sinalizado 2 de 0 a 65535 int Inteiro 2 (no processador de 16 bits) 4 (no processador de 32 bits) de -32768 a 32767 de -2.147.483.648 a 2.147.483.647 unsigned int Inteiro não sinalizado 2 (no processador de 16 bits) 4 (no processador de 32 bits) de 0 a 65535 de 0 a 4.294.967.295 long int Inteiro longo 4 de -2.147.483.648 a 2.147.483.647 unsigned long int Inteiro longo não sinalizado 4 de 0 a 4.294.967.295 float Flutuante (real) 4 3.4*10-38 à 3.4*1038 double Flutuante duplo 8 de 1.7*10-308 a 1.7*10308 long double Flutuante duplo longo 10 3.4*10-4932 à 3.4*104932 NUMERO INTEIRO - INT ▪ Um número inteiro é um número sem vírgula, que pode ser expresso em diferentes bases: ▪ Base decimal: o número inteiro é representado por uma sequência de unidades (de 0 a 9), que não deve começar com o dígito 0. ▪ Base hexadecimal: o número inteiro é representado por uma sequência de unidades (de 0 a 9 ou de A a F (ou de a a f)), que deve começar com 0x ou 0X. ▪ Base octal: o número inteiro é representado por uma sequência de unidades (incluindo apenas os dígitos de 0 a 7), que deve começar com 0. ▪ Os inteiros são assinados por padrão, o que significa que eles têm um sinal. Para armazenar informações sobre o sinal (em binário), os computadores usam o complemento de dois. ▪ Exemplos: ▪ 9551 ▪ 1 ▪ 0 ▪ -2 ▪ 02 (octal) ▪ 0x9F (hexadecimal) NUMERO COM PONTO - FLOAT ▪ Um número com ponto flutuante é um número com ponto, porém, ele pode ser representado de várias maneiras: ▪ um inteiro decimal: 895 ▪ um número com um ponto (e não uma vírgula): 845.32 ▪ uma fração: 27/11 ▪ um número exponencial, ou seja, um número (possivelmente com ponto) seguido da letra e (ou E) e de um inteiro correspondente à potência de 10 (assinado ou não, isto é, precedido por um "+" ou um "-"): 2.75e-2 35.8E+10 .25e-2 ▪ Os números do tipo float são codificados em 32 bits, incluindo: ▪ 23 bits para a mantissa ▪ 8 bits para o expoente ▪ 1 bit para o sinal ▪ Os números do tipo duplo são codificados em 64 bits, incluindo: ▪ 52 bits para a mantissa ▪ 11 bits para o expoente ▪ 1 bit para o sinal ▪ Os números do tipo longo duplo são codificados em 80 bits, incluindo: ▪ 64 bits para a mantissa ▪ 15 bits para o expoente ▪ 1 bit para o sinal ▪ A precisão dos números reais é aproximada. Ela depende do número de casas decimais; dependendo do tipo de real, ela será no mínimo: ▪ de 6 números para o tipo float ▪ de 15 números para o tipo double ▪ de 17 números para o tipo long double NUMERO COM PONTO - FLOAT CARACTERE - CHAR ▪ O tipo char (do inglês character) armazena o valor ASCII de um caractere, ou seja, um número inteiro! ▪ Por padrão, os números são assinados, isso significa que eles têm um sinal. Para armazenar informações sobre o sinal (em binário), os computadores usam o complemento de dois. Então, um dado de tipo char é assinado, isso não significa que tem um sinal, mas simplesmente que, na memória, o valor que codifica o caractere pode ser negativo (entre -128 a 127). ▪ Se quisermos, por exemplo, armazenar a letra B (seu código ASCII é 66), poderemos definir este dado, seja pelo número 66, seja anotando o 'B', onde as aspas simples significam código ASCII de B. ▪ Não existe um tipo de dado para as cadeias de caracteres (strings) em linguagem C. TABELA ASCII Tabela ASCII CONVERSÕES ▪ Chamamos de conversão de tipo de dados, o fato de alterar o tipo de um dado para outro. Pode acontecer, por exemplo, que queiramos trabalhar com um tipo de variável e, em seguida, usar em outro tipo. Imagine que trabalhemos, por exemplo, com uma variável de vírgula flutuante (tipo float), pode ser que queiramos "remover as casas decimais", ou seja, converter um float em int. Isto pode ser feito de duas maneiras: ▪ Implícita ▪ Explicita CONVERSÃO IMPLÍCITA ▪ uma conversão implícita é uma mudança do tipo de dado efetuado, automaticamente, pelo compilador. Isto significa que quando vamos armazenar um tipo de dado na variável declarada com outro tipo, o compilador não retornará um erro, mas efetuará umaconversão implícita do dado, antes de atribuí-lo à variável. int x; x = 8.324; printf(“%d”, x); ▪ x conterá o valor 8 depois da alocação. CONVERSÃO EXPLÍCITA (CASTING) ▪ uma conversão explícita (também chamada operação cast) é uma modificação do tipo de dado forçado. Isso significa que você usa um operador, dito, de cast para especificar a conversão. O operador de cast é simplesmente o tipo de dado, no qual se deseja converter uma variável, entre parênteses, antes da variável. ▪ int x; ▪ x = (int) 8.324; ▪ x conterá o valor 8 depois da alocação. CONSTANTES ▪ Muitas vezes é desejável que além de uma variável possuir um valor pré- definido, este valor não deve ser modificado por nenhuma função de um programa. ▪ Para que isto aconteça deve-se colocar a palavra const antes da definição da variável, indicando ao compilador que quando detectar uma mudança de valor da variável, seja emitida uma mensagem de erro. ▪ Este instrumento é muito utilizado para documentar a passagem de parâmetros de uma função, indicando que um determinado parâmetro não será alterado pela função. const float FSALARIO = 5000; /* Se for constante nunca receberei aumento ???*/ const char CSEXO = 'M'; /* Com certeza !!! */ Boa prática de programação é sempre usar constante com identificadores MAIUSCULOS e variáveis com identificadores MINUSCULOS. CONSTANTES ▪ Há também a capacidade de pedir ao pré-processador para definir uma constante usando a diretiva #define. Abaixo segue um exemplo do seu uso: #include <stdio.h> #define IDADE 34 int main() { printf("Sua idade é %d anos",IDADE); return(0); } ▪ No exemplo acima, toda ocorrência da constante IDADE no código do programa será substituída pelo valor inteiro 34. É importante observar que entre #define e IDADE deve haver apenas um espaço, e entre IDADE e 34 também só deve haver um espaço. COMENTÁRIOS ▪ Sempre que podemos fazemos alguma anotação ou mandamos algum lembrete para nos informar sobre algo mais tarde. ▪ No código-fonte se faz necessário colocar tais notas se preciso. ▪ Sintaxe: ▪ // - Para apenas uma linha ▪ /* (inicio) e */ (fim) – Para mais de uma linha ▪ Ex: // Isso é um comentário de uma linha /* Meu Primeiro programa em C: Isso é um comentário De várias linhas */ OPERADORES ARITMÉTICOS OPERADORES ARITMÉTICOS – NÍVEIS DE PRECEDÊNCIA OPERADORES ARITMÉTICOS Dica de prevenção de erro Evite identificadores que comecem por sublinhado (_) simples ou duplo, porque aqueles gerados pelo compilador e os da biblioteca-padrão podem usar nomes semelhantes SCANF ▪ Perceba que o scanf do exemplo anterior tem dois argumentos, "%d" e &inteiro1. ▪ O primeiro argumento, a string de controle de formato, indica o tipo de dado que deve ser digitado pelo usuário. ▪ O especificador de conversão %d indica que os dados devem ser um inteiro (a letra d significa ‘inteiro decimal’). ▪ O %, nesse contexto, é tratado pelo scanf (e pelo printf como veremos adiante) como um caractere especial, que inicia um especificador de conversão. ▪ O segundo argumento de scanf começa com um (&) - chamado de operador de endereço em C -, seguido pelo nome da variável. ▪ O (&), quando combinado com o nome da variável, informa à scanf o local (ou endereço) na memória em que a variável inteiro1 está armazenada. ▪ O computador, então, armazena o valor de inteiro1 nesse local. ESPECIFICADOR DE CONVERSÃO - SCANF ESPECIFICADOR DE CONVERSÃO - SCANF PRINTF ▪ É a função principal de saída na tela ▪ A função printf tem a forma: printf (string-de-controle-de-formato, outros-argumentos); ▪ string-de-controle-de-formato descreve o formato da saída, e outros- argumentos (que são opcionais) correspondem a cada uma das especificações de conversão na string-de-controle-de- formato. ESPECIFICADOR DE CONVERSÃO - PRINTF ESPECIFICADOR DE CONVERSÃO – PRINTF PARA PONTO FLUTUANTE - EXEMPLO IMPRESSÃO COM LARGURA DE CAMPO ▪ O tamanho exato de um campo em que os dados são impressos é especificado por uma largura de campo. ▪ Se a largura do campo for maior que os dados a serem impressos, eles normalmente serão alinhados à direita dentro desse campo. ▪ Um inteiro que representa a largura do campo é inserido entre o sinal de porcentagem (%) e o especificador de conversão (por exemplo, %4𝑑). ▪ A largura do campo é aumentada para que se possa imprimir valores maiores que o campo, e o sinal de subtração para um valor negativo usa uma posição de caractere na largura do campo. ▪ As larguras de campo podem ser usadas com todos os especificadores de conversão. IMPRESSÃO COM LARGURA DE CAMPO IMPRESSÃO COM PRECISÃO ▪ A precisão-padrão para inteiros é 1. ▪ Quando usada com os especificadores de conversão de ponto flutuante e, E e f, a precisão será o número de dígitos que aparece após o ponto decimal. ▪ Quando usada juntamente com os especificadores de conversão g e G, a precisão será o número máximo de dígitos significativos a serem impressos. ▪ Quando usada com o especificador de conversão s, a precisão será o número máximo de caracteres a serem escritos a partir da string. ▪ Para usar a precisão, coloque um ponto decimal (.), seguido por um inteiro representando a precisão entre o sinal de porcentagem e o especificador de conversão. ▪ Quando um valor de ponto flutuante é impresso com uma precisão menor que o número original de casas decimais no valor, o valor é arredondado. IMPRESSÃO COM PRECISÃO OPERADORES RELACIONAIS TOMADA DE DECISÕES - IF PRECEDÊNCIA DE EXECUÇÃO EM LINHA DOS OPERADORES PALAVRAS RESERVADAS/CHAVES1 1Palavras-chaves podem aumentar dependendo das bibliotecas usadas EXERCÍCIOS 1. Escreva em C um programa com a seguinte saída: 2. Faça uma calculadora em C para somar, subtrair, multiplicar, dividir e retirar o módulo de duas variáveis inseridas pelo usuário e mostrar o resultado (em int e float se cabível). 3. Implemente um programa que desenhe um "pinheiro" na tela, similar ao abaixo. Enriqueça o desenho com outros caracteres, simulando enfeites (use impressão por precisão aqui). REFERÊNCIAS ▪ DEITEL, Harvey M.; DEITEL, P. J. C: como programar. 6.ed. São Paulo: Pearson, 2011. ▪ DAMAS, Luís. Linguagem C. 10.ed. São Paulo: LTC, 2013. ▪ BACKES, André. Linguagem C: Completa e Descomplicada. Rio de Janeiro: Elsevier, 2012.
Compartilhar