Baixe o app para aproveitar ainda mais
Prévia do material em texto
Prof. MsC. Halysson Freitas 01 - Os cinco tipos básicos de dados (char, int, float, double e void) Os cinco tipos básicos de dados dão suporte à representação de alguns dados que usamos no dia à dia. Eles podem formar estruturas de dados mais complexas, mas isso veremos mais à frente. O primeiro tipo de dado básico é o char . Este nome é um encurtamento da palavra character (traduzido do inglês: carácter). Na nossa língua portuguesa e em inúmeras outras línguas, o carácter é a base para construção das palavras. Em C, o suporte a palavra como um dado não é fornecido como um tipo básico de dado, de outra forma, como um tipo de dado composto de vários dados do tipo char, será visto no futuro. Podemos citar como exemplo qualquer letra do alfabeto, números e outros símbolos. Fica bem óbvio que uma letra como ‘a’, ‘i’, ou ‘x’ pode ser classificada como do tipo char. Todavia, nem sempre fica óbvio com números. Dado que lhe seja fornecido o seguinte dado ‘1’, você poderia interpretá-lo como do tipo básico de dado int, mas não é. Duas diferenciações devemos fazer. A primeira está no conceito de caracteres e a segunda na forma de escrita. Um carácter é uma simbologia que representa algo, mas não é este algo, por exemplo: o carácter ‘a’ representa um padrão de sonoridade que pode ser emitido pelos seres humanos e combinado com várias outras sonoridade, mas ‘a’ como símbolo sem semântica não é esta sonoridade. Finalizando o char, todo dado deste tipo é sempre posto entre aspas simples e só pode ter um símbolo dentro destas aspas. Diferentemente, o tipo int não utiliza destas aspas e pode ter uma representação com vários caracteres numéricos, como no número 512. Este número tem o carácter 5, 1 e 2, sobretudo, são indissociáveis, formando uma unidade de dado completa. Matematicamente falando, o tipo int dá suporte à representação dos números inteiros, sejam estes positivos ou negativos. Logo, se tens um número com parte decimal como o 1,28 este não poderá ser estabelecido como do tipo int. Para o 1,28 pode-se utilizar dois dos tipos básico de dados, o float e o double. Este dois tipos suportam dados do tipo real na matemática. Daí surge a pergunta, por quê os dois para representar a mesma coisa? Neste ponto temos que estabelecer uma ideia que permeia toda computação, o recurso disponível e a sua otimização. Vamos a um exemplo simples, sua mochila cabe apenas 4 livros e ela custou R$100 reais, era o preço que você podia pagar. Já a mochila que cabe 6 livros custava R$ 200 reais, lhe atenderia com mais folga de carga, mas você não tinha o dinheiro. Deste modo, você se adapta a carga possível na sua mochila, realiza a tarefa, com o recurso que tens. O float têm menor capacidade que o double e vamos abordar em breve este assunto. Por último, e muito importante, temos o void. Este define que não tem nenhum valor, de forma explícita. Na linguagem C, se isso não fosse feito, em algumas situações será padrão interpretar o dado como int, como no caso do retorno das funções. No padrão ANSI, cada tipo tem um tamanho definido em bits: char (8 bits), int (16 bits), float (32 bits), double (64 bits), e long double (80 bits). 02 - Modificadores de tipos básico (signed, unsigned, long, short). Só explicar a ideia. Como visto anteriormente, cada tipo de dado básico tem um tamanho em bits, ou seja, esse tamanho é o espaço consumido de memória, seja memória RAM, HD, ou o local onde estão armazenados. Existem formas de aumentar ou diminuir esse tamanho padrão. Para isso pode-se usar os modificadores long (para aumentar) e short (para diminuir). Um dado do tipo int utiliza 16 bits de memória, como já visto. Isso significa que ele tem um número máximo de representações, ou seja, tem 65.536 (2^16) arranjos binárias. Isso não significa que teremos números de 1 a 65.536. Nesse número de combinações temos que subtrair um arranjo para representar o 0 (zero) e metade vai para os números negativos. Logo, temos 32.768 arranjos para cada lado. Por padrão, todos os tipos básicos de dados utilizam o modificador signed, sem nem mesmo precisar explicitá-lo. Assim, temos 32.768 arranjos para cada lado. No uso do modificador unsigned não haverá representação dos negativos. 03 - Nomes de Identificadores Os identificadores são os nomes atribuídos a variáveis, rótulos, funções, constantes, etc. Regras: ● primeiro caractere deve ser uma letra ou um sublinhado ● os demais podem ser letras, números ou sublinhado ● no máximo 31 caracteres É importantíssimo ressaltar que a linguagem C é case sensitive , ou seja, “Java” é diferente de “java”. 04 - Variáveis: conceito básico, variáveis e os tipos de dados, inicialização Na construção de um algoritmo dados devem ser armazenados para servirem de parâmetros para as operações. A título de exemplo, um algoritmo que soma dois números digitados pelo usuário deve armazenar esses números antes que a operação ocorra. Para guardar os dois números usamos a memória do computador. Para utilizar a memória do computador deve-se alocar um espaço exato para o tipo de dado desejado, que pode ser desde um dado básico como um int, ou como outras estruturas compostas e mais complexas. O espaço alocado deve receber um identificador (nome) que será usado no restante do algoritmo para o acesso a este espaço de memória específico. Denomina-se variável o espaço de memória nomeado. Ao alocar um espaço de memória, não se sabe o que tem lá, por isso é necessário antes de usar ela em operações fazer uma inicialização, ou seja, atribuir um valor conhecido. Declarando uma variável: int idade; int nota1, nota2, nota3, nota4; char primeiraLetraDoNome; char _classificacao; float altura; Inicializando uma variável: idade = 50; nota1 = nota2 = nota3 = nota4 = 8; primeiraLetraDoNome = ‘H’; _classificacao = ‘1’; altura = 3,742; Declarando e inicializando uma variável: double distanciaAteOSolEmMetros = 149600000000,8; float raioDaMoleculaEmMicrometros = 196,12; 05 - Entrada e saída: o básico do printf e scanf, constantes string, barra invertida (sinais de controle) Os programas construídos em C geralmente são executados na linha de comando de um shell, como o CMD no Windows. São programas textuais que emitem mensagens na tela e aguardam uma entrada de dados vinda do teclado. O comando printf é responsável por imprimir na tela uma mensagem. O verbo imprimir pode te arremeter a impressoras de papel, mas não se engane, aqui será usado como a ação de fazer uma mensagem aparecer na tela. Abaixo um exemplo de como imprimir seu nome na tela: printf (“joão de oliveira”); Este comando fará o texto entre aspas duplas aparecer na tela. Mais para frente vamos estudar que todo texto dentro de aspas duplas formam uma string, um tipo de dado composto. Da forma que escrevemos, se houvesse mais um printf à ser executado, o texto deste novo printf iria aparecer colado no final “joão de oliveira”, à exemplo: printf (“joão de oliveira”); printf (“o mar é azul”); Que resultaria: joão de oliveirao mar é azul Para resolver isso podemos usar caracteres especiais chamados de Constantes Caracteres de Barra Invertida, como à exemplo o ‘\n’, que quebra umalinha na hora da impressão, à exemplo: printf (“joão de oliveira\n”); printf (“o mar é azul”); Que resultaria: joão de oliveira o mar é azul O comando scanf tem a função de capturar uma informação vinda da entrada padrão, o teclado, e atribuir esse dado a uma variável, à exemplo: int numeroDeFolhas; scanf (“%d”, &numeroDeFolhas); Inicialmente declaramos uma variável com identificador numeroDeFolhas. O comando scanf tem dois parâmetros. O primeiro “%d” diz que espera-se que o valor vindo do teclado é do tipo int. O segundo diz que esse valor vindo do teclado será armazenado na variável numeroDeFolhas. No segundo parâmetro o carácter ‘&’ é colocado anterior ao identificador (nome) da variável, isso será explicado bem mais adiante na matéria, mas por hora, se faz necessário para todos os tipos básicos de dados. Agora, para imprimir esse valor que veio do teclado vamos fazer assim: printf (“%d”, numeroDeFolhas); Observe que o %d foi usado entre aspas duplas. Lembre, que no printf e dentro das aspas duplas onde colocamos o texto que vai ser impresso na tela. O %d indica que um valor inteiro vai ser acessado de uma variável expressa logo após as aspas duplas. Desta forma, se digitarmos 10 o scanf atribui este valor a numeroDeFolhas e printf acessa este valor para imprimir na tela. Para ficar mais amigável na tela, pode-se fazer: printf (“O livro de programação tem %d folhas.”, numeroDeFolhas); Dado que numeroDeFolhas tenha o valor 350, na tela aparecerá: O livro de programação tem 350 folhas. Observe 06 - Operador de atribuição: básico, conversão de tipos em atribuições, atribuições múltiplas O operador de atribuição já foi mostrado lá na inicialização de variáveis. Usa-se ele para armazenar um valor dentro de uma variável. Dado que já temos uma variável com nome diaDoMes declarada como int, segue-se: diaDoMes = 5; Neste exemplo o espaço de memória reservado pelo identificador diaDoMes recebe o número 5. Este número é considerado uma constante, somente o número, pois é imutável. No código fonte acrescido de: diaDoMes = 10; Agora, a variável diaDoMes passa a ter o valor de 10. Novamente, 10 e uma constante. A constante 5 foi apagada do espaço de memória reservado por diaDoMes para dar lugar a constante 10. Uma atribuição pode ser feita entre duas variáveis: int x, y; x = 30; y = x; Logo, o valor contido no espaço de memória reservado por y é 30. Perceba que tanto x quanto y são do tipo int, mas isso não é regra. Podemos ter atribuições entre variáveis com tipos diferente. Para isso, devemos nos lembrar que cada tipo de dado básico um tamanho de espaço em memória é reservado. A regra é, o maior tem espaço para aceitar o menor, e o menor corta as casas mais significativas do maior até caber. É importante lembrar que as variáveis do tipo char são na verdade números tabelados (tabela ANSI) que representa os caracteres, logo, um char pode tanto atribuir como ser atribuído por outros tipos. A atribuição múltipla também já foi mostrada na inicialização de variáveis. É simplesmente uma única expressão onde mais que uma variável recebe o mesmo valor, como segue: char indice1, indice2, indice3, indice4; indice1 = indice2 = indice3 = indice4 = ‘B’; 07 - Operadores aritmético: operadores, regras dos operadores de incremento, precedência Os operações aritméticos servem para operações matemáticas já bem conhecidas por nós. Existem os operadores unários, que só precisa de um operando, e os binários, que necessitam de dois operandos. Operador Ação - Subtração, também menos unário + Adição * Multiplicação / Divisão % Módulo da divisão (resto) -- Decremento ++ Incremento Pontos interessantes de serem ressaltado está na divisão e nos operadores de incremento e decremento. A divisão de inteiros sempre retorna um inteiro, o resto não vira casas decimais. Nos operadores de decremento e incremento se postos antes do operando ele tem precedência ao operador de atribuição, se postos pós operando ele não tem precedência ao operador de atribuição. Assim como na matemática, os operadores têm preferências em detrimento de outros operadores. Os parênteses podem ser utilizados para modificar preferências. Precedência dos operadores: Mais alta ++ -- - (menos unário) * / % Mais baixa + - 08 - Exercício sobre variáveis e operadores 1 - Em toda nova linguagem de programação há um rito de passagem que consiste escrever um algoritmo que imprime na tela um “Hello World!” em sua língua. Escreva um código que imprima na tela a mensagem: Olá mundo! 2 - Juliana fechou a prova de programação, ela tirou 10. Só de zueira, Juliana fez um algoritmo em C que declarou uma variável do tipo int, atribuiu 10 a essa variável, e imprimiu esse valor na tela. Faça como Juliana. 3 - A galera que viu o resultado na tela de Juliana não entendeu, ela ficou revoltada, mas se acalmou e percebeu que o problema é que a mensagem não foi amigável. Ajude Juliana e faça um algoritmo com uma mensagem bacana para mostrar sua nota. 4 - Juliana fez mais uma prova, ela não foi tão bem quanto na primeira, tirou 6,5. Juliana resolveu fazer um algoritmo para calcular sua média e concluiu que ficou com 8,25 de média. Exemplifique como Juliana chegou a esse algoritmo fazendo um igual. 5 - O professor de Juliana disse que ela fez o cálculo fora do padrão da faculdade. Todas as notas de prova com número que contenham casas decimais, o próprio aluno deve arredondá-los para cima. O somatórios das notas deve ser dividido por divisão inteira, e o resto da divisão é perdido. Demonstre essa solução. 09 - Operadores Lógicos: tabela verdade, precedência, equação lógica A Lógica Matemática é base para representar muita coisa no nosso universo, no nosso dia a dia, e nos algoritmos é primordial o conhecimento ao mínimo de alguns operadores lógicos mais básicos. São eles os binários a conjunção (&&), a disjunção (||), e o unário a negação (!). Os operandos das equações lógicas são chamados proposições, e podem ter valor de verdade ou falsidade. Em C, 0 é falso e tudo diferente de 0 é verdadeiro. A tabela verdade nos mostra o resultado de uma equação lógica com os operadores básicos que foi apresentado, dado duas proposições, p e q: p q p&&q p||q !p 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 1 A ordem de precedência dos operadores são: negação, conjunção e disjunção. Equações lógica também usam parênteses para alterar precedência. Assim como nas equações aritméticas quando temos um operando dentro de parênteses, o operando externo será multiplicado pelo resultado do parênteses. Para a equação lógica ( a||!b (a&&b) ) um exemplo de equação lógica e seus possíveis resultado: a b a&&b !b !b (a&&b) a||!b (a&&b) 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 0 0 1 10 - Exercícios com equações lógicas Construa a tabela verdade das equações abaixo: a) !(x && y) || (x && y) b) d && e && !f c) (a || b) || (a && b)
Compartilhar