Baixe o app para aproveitar ainda mais
Prévia do material em texto
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos primitivos de dados Aula 11 Prof. Renan Albuquerque Marks Faculdade de Computação Universidade Federal de Mato Grosso do Sul Algoritmos e Programação I Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 1 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conteúdo da aula 1 Introdução 2 Tipos inteiros 3 Números com ponto flutuante 4 Caracteres 5 Tipos de dados definidos pelo programador 6 Operador sizeof 7 Exercícios Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 2 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introdução I a linguagem C suporta fundamentalmente dois tipos de dados numéricos: inteiros e ponto flutuante I além desses, temos também o tipo caractere, que é um número inteiro em um intervalo finito mais restrito que o dos tipos inteiros I veremos os especificadores desses tipos, seus especificadores de conversão para entrada e saída de dados, as conversões entre valores de tipos distintos, além de definir nossos próprios tipos Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 3 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introdução I a linguagem C suporta fundamentalmente dois tipos de dados numéricos: inteiros e ponto flutuante I além desses, temos também o tipo caractere, que é um número inteiro em um intervalo finito mais restrito que o dos tipos inteiros I veremos os especificadores desses tipos, seus especificadores de conversão para entrada e saída de dados, as conversões entre valores de tipos distintos, além de definir nossos próprios tipos Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 3 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introdução I a linguagem C suporta fundamentalmente dois tipos de dados numéricos: inteiros e ponto flutuante I além desses, temos também o tipo caractere, que é um número inteiro em um intervalo finito mais restrito que o dos tipos inteiros I veremos os especificadores desses tipos, seus especificadores de conversão para entrada e saída de dados, as conversões entre valores de tipos distintos, além de definir nossos próprios tipos Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 3 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I o tipo int é chamado de tipo inteiro com sinal I na linguagem C temos palavras reservadas chamadas de especificadores de tipos, do inglês type specifiers, sendo eles (para números inteiros): signed , unsigned , short e long : short int unsigned short int int unsigned int long int unsigned long int I a ordem que os especificadores ocorrem não tem influência sobre o resultado final I em alguns casos a linguagem C permite que a palavra reservada int seja omitida Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 4 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I o tipo int é chamado de tipo inteiro com sinal I na linguagem C temos palavras reservadas chamadas de especificadores de tipos, do inglês type specifiers, sendo eles (para números inteiros): signed , unsigned , short e long : short int unsigned short int int unsigned int long int unsigned long int I a ordem que os especificadores ocorrem não tem influência sobre o resultado final I em alguns casos a linguagem C permite que a palavra reservada int seja omitida Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 4 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I o tipo int é chamado de tipo inteiro com sinal I na linguagem C temos palavras reservadas chamadas de especificadores de tipos, do inglês type specifiers, sendo eles (para números inteiros): signed , unsigned , short e long : short int unsigned short int int unsigned int long int unsigned long int I a ordem que os especificadores ocorrem não tem influência sobre o resultado final I em alguns casos a linguagem C permite que a palavra reservada int seja omitida Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 4 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I o tipo int é chamado de tipo inteiro com sinal I na linguagem C temos palavras reservadas chamadas de especificadores de tipos, do inglês type specifiers, sendo eles (para números inteiros): signed , unsigned , short e long : short int unsigned short int int unsigned int long int unsigned long int I a ordem que os especificadores ocorrem não tem influência sobre o resultado final I em alguns casos a linguagem C permite que a palavra reservada int seja omitida Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 4 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I o tipo int é chamado de tipo inteiro com sinal I na linguagem C temos palavras reservadas chamadas de especificadores de tipos, do inglês type specifiers, sendo eles (para números inteiros): signed , unsigned , short e long : short int unsigned short int int unsigned int long int unsigned long int I a ordem que os especificadores ocorrem não tem influência sobre o resultado final I em alguns casos a linguagem C permite que a palavra reservada int seja omitida Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 4 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros Em máquinas de 64 bits (com compiladores 64 bits): Tipo Menor valor Maior valor short int −32.768 32.767 unsigned short int 0 65.535 int −2.147.483.648 2.147.483.647 unsigned int 0 4.294.967.294 long int −9.223.372.036.854.775.808 9.223.372.036.854.775.807 unsigned long int 0 18.446.744.073.709.551.615 Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 5 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros Em máquinas de 64 bits (com compiladores 64 bits): Tipo Menor valor Maior valor short int −32.768 32.767 unsigned short int 0 65.535 int −2.147.483.648 2.147.483.647 unsigned int 0 4.294.967.294 long int −9.223.372.036.854.775.808 9.223.372.036.854.775.807 unsigned long int 0 18.446.744.073.709.551.615 Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 5 / 39 . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I podemos escrever constantes numéricas inteiras nas bases: I decimal: 75 -264 32767 I octal: 075 0367 07777 I hexadecimal: 0xf 0x8aff 0X12Acf I podemos misturar notações: 117 + 077 + 0xf0 resulta em 420 na base decimal. I números sempre são armazenados na memória na base binária! Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 6 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I podemos escrever constantes numéricas inteiras nas bases: I decimal: 75 -264 32767 I octal: 075 0367 07777 I hexadecimal: 0xf 0x8aff 0X12Acf I podemos misturar notações: 117 + 077 + 0xf0 resulta em 420 na base decimal. I números sempre são armazenados na memória na base binária! Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 6 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I podemos escrever constantes numéricas inteiras nas bases: I decimal: 75 -264 32767 I octal: 075 0367 07777 I hexadecimal: 0xf 0x8aff 0X12Acf I podemos misturar notações: 117 + 077 + 0xf0 resulta em 420 na base decimal. I números sempre são armazenados na memória na base binária! Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 6 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I podemos escrever constantes numéricas inteiras nas bases: I decimal: 75 -264 32767 I octal: 075 0367 07777 I hexadecimal: 0xf 0x8aff 0X12Acf I podemos misturar notações: 117 + 077 + 0xf0 resulta em 420 na base decimal. I números sempre são armazenados na memória na base binária! Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 6 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I podemos escrever constantes numéricas inteiras nas bases: I decimal: 75 -264 32767 I octal: 075 0367 07777 I hexadecimal: 0xf 0x8aff 0X12Acf I podemos misturar notações: 117 + 077 + 0xf0 resulta em 420 na base decimal. I números sempre são armazenados na memória na base binária! Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 6 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I por padrão, o compilador tenta armazenar uma constante inteira na base decimal nessa ordem: int → long int → unsigned long int I para constantes nas bases octal ou hexadecimal: int → unsigned int → long int → unsigned long int I podemos obrigar que o compilador trate constantes como: I unsigned : 22u 072U 0xa09DU I long : 22L 055l 0xffffL I unsigned long int : 22ul 07777UL 0xFFFFAALU Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 7 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I por padrão, o compilador tenta armazenar uma constante inteira na base decimal nessa ordem: int → long int → unsigned long int I para constantes nas bases octal ou hexadecimal: int → unsigned int → long int → unsigned long int I podemos obrigar que o compilador trate constantes como: I unsigned : 22u 072U 0xa09DU I long : 22L 055l 0xffffL I unsigned long int : 22ul 07777UL 0xFFFFAALU Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 7 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I por padrão, o compilador tenta armazenar uma constante inteira na base decimal nessa ordem: int → long int → unsigned long int I para constantes nas bases octal ou hexadecimal: int → unsigned int → long int → unsigned long int I podemos obrigar que o compilador trate constantes como: I unsigned : 22u 072U 0xa09DU I long : 22L 055l 0xffffL I unsigned long int : 22ul 07777UL 0xFFFFAALU Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 7 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros Considerando que a função printf tem o seguinte formato: printf(cadeia, expressão 1, expressão 2, . . .); onde cadeia é a cadeia de caracteres de formatação, podemos utilizar as seguintes especificações de conversão: Especificador e tipo Especificador de conversão short int %hd ou %hi unsigned short int %hu int %d ou %i unsigned int %u long int %ld ou %li unsigned long int %lu Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 8 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I forma geral de um especificador de conversão na da função printf : %[flags][comprimento][.precisão][hl]conversor I onde as flags podem ser: Flag Significado - Valor alinhado à esquerda + Valor precedido por + ou - espaço Valor positivo precedido por espaço 0 Número preenchido com zeros à esquerda I podemos ainda utilizar os conversores o , x ou X com os modificadores de tamanho h ou l . Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 9 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I forma geral de um especificador de conversão na da função printf : %[flags][comprimento][.precisão][hl]conversor I onde as flags podem ser: Flag Significado - Valor alinhado à esquerda + Valor precedido por + ou - espaço Valor positivo precedido por espaço 0 Número preenchido com zeros à esquerda I podemos ainda utilizar os conversores o , x ou X com os modificadores de tamanho h ou l . Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 9 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I forma geral de um especificador de conversão na da função printf : %[flags][comprimento][.precisão][hl]conversor I onde as flags podem ser: Flag Significado - Valor alinhado à esquerda + Valor precedido por + ou - espaço Valor positivo precedido por espaço 0 Número preenchido com zeros à esquerda I podemos ainda utilizar os conversores o , x ou X com os modificadores de tamanho h ou l . Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 9 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros #include <stdio.h> int main(void) { short int i1 = 159; unsigned short int i2 = 630u; int i3 = -991023; unsigned int i4 = 98979U; long int i5 = 8393202L; unsigned long int i6 = 34268298UL; printf("%hd %d %ho\n", i1, i1, i1); printf("%hu %i %hx\n", i2, i2, i2); printf("%+d % d %09d\n", i3, i3, i3); printf("%X%d %u\n", i4, i4, i4); printf("%+ld %ld %10ld\n", i5, i5, i5); printf("%lu %10.8lu %-lu\n", i6, i6, i6); return 0; } Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 10 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros Forma geral de um especificador de conversão na da função scanf : %[comprimento][hl]especificador Especificador Significado d valor a ser lido é um inteiro em notação decimal i como %d, mas aceita base octal (começando com 0) ou hexadecimal (começando com 0x ou 0X,), sinal opcional u valor a ser lido é um inteiro não sinalizado em notação decimal o valor a ser lido é um inteiro não sinalizado em notação octal e pode opcionalmente ser precedido por 0 x valor a ser lido é um inteiro não sinalizado em notação hexadecimal e pode opcionalmente ser precedido por 0x ou 0X Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 11 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros Forma geral de um especificador de conversão na da função scanf : %[comprimento][hl]especificador Especificador Significado d valor a ser lido é um inteiro em notação decimal i como %d, mas aceita base octal (começando com 0) ou hexadecimal (começando com 0x ou 0X,), sinal opcional u valor a ser lido é um inteiro não sinalizado em notação decimal o valor a ser lido é um inteiro não sinalizado em notação octal e pode opcionalmente ser precedido por 0 x valor a ser lido é um inteiro não sinalizado em notação hexadecimal e pode opcionalmente ser precedido por 0x ou 0X Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 11 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I a função scanf finaliza uma leitura sempre que o usuário informa um branco (whitespace), que pode ser: I o caractere 32 (espaço ou ' ' ) I o caractere 9 (tabulação horizontal ou '\t' ) I o caractere 10 (tabulação vertical ou '\v' ) I o caractere 11 (retorno de carro/cursor ou '\r' ) I o caractere 12 (mudança de linha ou '\n' ) I o caractere 13 (avanço de página ou '\f' ) I ao executar um scanf("%d%d", &a, &b); , tanto: 4 7 , 47 ou 4 7 resultam nos valores 4 e 7 armazenados nas variáveis a e b , respectivamente Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 12 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos inteiros I a função scanf finaliza uma leitura sempre que o usuário informa um branco (whitespace), que pode ser: I o caractere 32 (espaço ou ' ' ) I o caractere 9 (tabulação horizontal ou '\t' ) I o caractere 10 (tabulação vertical ou '\v' ) I o caractere 11 (retorno de carro/cursor ou '\r' ) I o caractere 12 (mudança de linha ou '\n' ) I o caractere 13 (avanço de página ou '\f' ) I ao executar um scanf("%d%d", &a, &b); , tanto: 4 7 , 47 ou 4 7 resultam nos valores 4 e 7 armazenados nas variáveis a e b , respectivamente Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 12 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Números com ponto flutuante I temos três tipos de dados numéricos com ponto flutuante: float Ponto flutuante de precisão simples double Ponto flutuante de precisão dupla long double Ponto flutuante de precisão estendida I pelo padrão 754 da IEEE: Tipo Menor valor (positivo) Maior valor Precisão float 1.17549× 10−38 3.40282× 1038 6 dígitos double 2.22507× 10−308 1.79769× 10308 15 dígitos I 1 bit de sinal, 8 bits de expoente e 23 bits da mantissa Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 13 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Números com ponto flutuante I temos três tipos de dados numéricos com ponto flutuante: float Ponto flutuante de precisão simples double Ponto flutuante de precisão dupla long double Ponto flutuante de precisão estendida I pelo padrão 754 da IEEE: Tipo Menor valor (positivo) Maior valor Precisão float 1.17549× 10−38 3.40282× 1038 6 dígitos double 2.22507× 10−308 1.79769× 10308 15 dígitos I 1 bit de sinal, 8 bits de expoente e 23 bits da mantissa Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 13 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Números com ponto flutuante I temos três tipos de dados numéricos com ponto flutuante: float Ponto flutuante de precisão simples double Ponto flutuante de precisão dupla long double Ponto flutuante de precisão estendida I pelo padrão 754 da IEEE: Tipo Menor valor (positivo) Maior valor Precisão float 1.17549× 10−38 3.40282× 1038 6 dígitos double 2.22507× 10−308 1.79769× 10308 15 dígitos I 1 bit de sinal, 8 bits de expoente e 23 bits da mantissa Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 13 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Números com ponto flutuante I constantes podem ser definidas de diversas formas: 391.0 391. 391.0e0 391E0 3.91e+2 .391e3 3910.e-1 I por padrão, o compilador tenta armazenar uma constante com ponto flutuante na memória com um double I podemos obrigar que o compilador trate constantes como: I float : 391.0f 391.0F I long double : 391.0l 391.0L Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 14 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Números com ponto flutuante I constantes podem ser definidas de diversas formas: 391.0 391. 391.0e0 391E0 3.91e+2 .391e3 3910.e-1 I por padrão, o compilador tenta armazenar uma constante com ponto flutuante na memória com um double I podemos obrigar que o compilador trate constantes como: I float : 391.0f 391.0F I long double : 391.0l 391.0L Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 14 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Números com ponto flutuante I constantes podem ser definidas de diversas formas: 391.0 391. 391.0e0 391E0 3.91e+2 .391e3 3910.e-1 I por padrão, o compilador tenta armazenar uma constante com ponto flutuante na memória com um double I podemos obrigar que o compilador trate constantes como: I float : 391.0f 391.0F I long double : 391.0l 391.0L Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 14 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Números com ponto flutuante I forma geral do especificador de conversão na função printf : %[flags][comprimento][.precisão][lL]conversor I forma geral do especificador de conversão na função scanf : %[flags][comprimento][.precisão][L]conversor I %e : mostra um númerocom ponto flutuante no formato exponencial ou notação científica I %f : mostra um número com ponto flutuante no formato com casas decimais fixas, sem expoente I %g : mostra o número com ponto flutuante no formato exponencial ou com casas decimais fixas, dependendo de seu tamanho I No scanf os especificadores %e , %f e %g são equivalentes: solicitam um número com ponto flutuante em qualquer formato Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 15 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Números com ponto flutuante I forma geral do especificador de conversão na função printf : %[flags][comprimento][.precisão][lL]conversor I forma geral do especificador de conversão na função scanf : %[flags][comprimento][.precisão][L]conversor I %e : mostra um número com ponto flutuante no formato exponencial ou notação científica I %f : mostra um número com ponto flutuante no formato com casas decimais fixas, sem expoente I %g : mostra o número com ponto flutuante no formato exponencial ou com casas decimais fixas, dependendo de seu tamanho I No scanf os especificadores %e , %f e %g são equivalentes: solicitam um número com ponto flutuante em qualquer formato Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 15 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Números com ponto flutuante I forma geral do especificador de conversão na função printf : %[flags][comprimento][.precisão][lL]conversor I forma geral do especificador de conversão na função scanf : %[flags][comprimento][.precisão][L]conversor I %e : mostra um número com ponto flutuante no formato exponencial ou notação científica I %f : mostra um número com ponto flutuante no formato com casas decimais fixas, sem expoente I %g : mostra o número com ponto flutuante no formato exponencial ou com casas decimais fixas, dependendo de seu tamanho I No scanf os especificadores %e , %f e %g são equivalentes: solicitam um número com ponto flutuante em qualquer formato Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 15 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Números com ponto flutuante I forma geral do especificador de conversão na função printf : %[flags][comprimento][.precisão][lL]conversor I forma geral do especificador de conversão na função scanf : %[flags][comprimento][.precisão][L]conversor I %e : mostra um número com ponto flutuante no formato exponencial ou notação científica I %f : mostra um número com ponto flutuante no formato com casas decimais fixas, sem expoente I %g : mostra o número com ponto flutuante no formato exponencial ou com casas decimais fixas, dependendo de seu tamanho I No scanf os especificadores %e , %f e %g são equivalentes: solicitam um número com ponto flutuante em qualquer formato Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 15 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Números com ponto flutuante I forma geral do especificador de conversão na função printf : %[flags][comprimento][.precisão][lL]conversor I forma geral do especificador de conversão na função scanf : %[flags][comprimento][.precisão][L]conversor I %e : mostra um número com ponto flutuante no formato exponencial ou notação científica I %f : mostra um número com ponto flutuante no formato com casas decimais fixas, sem expoente I %g : mostra o número com ponto flutuante no formato exponencial ou com casas decimais fixas, dependendo de seu tamanho I No scanf os especificadores %e , %f e %g são equivalentes: solicitam um número com ponto flutuante em qualquer formato Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 15 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Números com ponto flutuante I forma geral do especificador de conversão na função printf : %[flags][comprimento][.precisão][lL]conversor I forma geral do especificador de conversão na função scanf : %[flags][comprimento][.precisão][L]conversor I %e : mostra um número com ponto flutuante no formato exponencial ou notação científica I %f : mostra um número com ponto flutuante no formato com casas decimais fixas, sem expoente I %g : mostra o número com ponto flutuante no formato exponencial ou com casas decimais fixas, dependendo de seu tamanho I No scanf os especificadores %e , %f e %g são equivalentes: solicitam um número com ponto flutuante em qualquer formato Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 15 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I variáveis do tipo caractere ocupam 1 byte (8 bits) na memória: I caractere sem sinal ( unsigned char ): {0, . . . , 255} I caractere com sinal ( signed char ): {−128, . . . ,−1, 0, 1, . . . , 127} I para char c, d, e; podemos fazer c = 122; d = 59; e = 51; ou c = 'z'; d = ';'; e = '3'; Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 16 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I variáveis do tipo caractere ocupam 1 byte (8 bits) na memória: I caractere sem sinal ( unsigned char ): {0, . . . , 255} I caractere com sinal ( signed char ): {−128, . . . ,−1, 0, 1, . . . , 127} I para char c, d, e; podemos fazer c = 122; d = 59; e = 51; ou c = 'z'; d = ';'; e = '3'; Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 16 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres Alguns caracteres não imprimíveis e imprimíveis: caractere constante símbolo gráfico 0 '\0' caractere nulo 9 '\t' tabulação horizontal 10 '\n' mudança de linha 11 '\v' tabulação vertical 12 '\f' quebra de página 13 '\r' retorno do carro/cursor 32 ' ' espaço 55 '7' 7 92 '\\' \ 97 'a' a Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 17 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I a função scanf trata qualquer branco (whitespace) como se fosse ' ' : '\t' , '\n' , '\v' , '\f' , '\r' e ' ' I na função scanf , o especificador de conversão %c lê um único caractere, mesmo que este seja um branco I para desconsiderar espaços em branco antes da leitura de um caractere, utilizamos qualquer um branco: scanf(" %c", &c); Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 18 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I a função scanf trata qualquer branco (whitespace) como se fosse ' ' : '\t' , '\n' , '\v' , '\f' , '\r' e ' ' I na função scanf , o especificador de conversão %c lê um único caractere, mesmo que este seja um branco I para desconsiderarespaços em branco antes da leitura de um caractere, utilizamos qualquer um branco: scanf(" %c", &c); Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 18 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I a função scanf trata qualquer branco (whitespace) como se fosse ' ' : '\t' , '\n' , '\v' , '\f' , '\r' e ' ' I na função scanf , o especificador de conversão %c lê um único caractere, mesmo que este seja um branco I para desconsiderar espaços em branco antes da leitura de um caractere, utilizamos qualquer um branco: scanf(" %c", &c); Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 18 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres #include <stdio.h> /* Recebe um frase e conta o número de vogais minúsculas */ int main(void) { char c; int conta; printf("Digite uma frase: "); conta = 0; do { scanf("%c", &c); if (c == 'a'|| c == 'e'|| c == 'i'|| c == 'o'|| c == 'u') conta++; } while (c != '\n'); printf("A frase tem %d vogais minúsculas\n", conta); return 0; } Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 19 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I quando a função scanf não consegue “casar” algum caractere lido de acordo com o esperado, ela para imediatamente I considere o trecho de código: int a, b; float x, y; scanf("%d%d%f%f", &a, &b, &x, &y); I suponha que o usuário informou valores da seguinte forma: -10 2 0.33 27.8e3 I a função scanf enxerga a entrada acima da seguinte maneira: ␣␣␣␣␣␣␣-10•2␣␣␣0.33•␣27.8e3• Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 20 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I quando a função scanf não consegue “casar” algum caractere lido de acordo com o esperado, ela para imediatamente I considere o trecho de código: int a, b; float x, y; scanf("%d%d%f%f", &a, &b, &x, &y); I suponha que o usuário informou valores da seguinte forma: -10 2 0.33 27.8e3 I a função scanf enxerga a entrada acima da seguinte maneira: ␣␣␣␣␣␣␣-10•2␣␣␣0.33•␣27.8e3• Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 20 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I quando a função scanf não consegue “casar” algum caractere lido de acordo com o esperado, ela para imediatamente I considere o trecho de código: int a, b; float x, y; scanf("%d%d%f%f", &a, &b, &x, &y); I suponha que o usuário informou valores da seguinte forma: -10 2 0.33 27.8e3 I a função scanf enxerga a entrada acima da seguinte maneira: ␣␣␣␣␣␣␣-10•2␣␣␣0.33•␣27.8e3• Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 20 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I quando a função scanf não consegue “casar” algum caractere lido de acordo com o esperado, ela para imediatamente I considere o trecho de código: int a, b; float x, y; scanf("%d%d%f%f", &a, &b, &x, &y); I suponha que o usuário informou valores da seguinte forma: -10 2 0.33 27.8e3 I a função scanf enxerga a entrada acima da seguinte maneira: ␣␣␣␣␣␣␣-10•2␣␣␣0.33•␣27.8e3• Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 20 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I considere ainda o trecho de código e valores dados pelo usuário: int a, b; float x, y; scanf("%d%d%f%f", &a, &b, &x, &y); -10 2 0.33W25 27.8e3 I após a execução do código acima: I a contém -10 I b contém 2 I x contém 0.33 I y permanece inalterado, contendo o valor anterior à chamada da função, como lixo de memória, zero, ou um valor previamente armazenado I a sequência de caracteres W25•␣27.8e3• permanece pendente de leitura Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 21 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I considere ainda o trecho de código e valores dados pelo usuário: int a, b; float x, y; scanf("%d%d%f%f", &a, &b, &x, &y); -10 2 0.33W25 27.8e3 I após a execução do código acima: I a contém -10 I b contém 2 I x contém 0.33 I y permanece inalterado, contendo o valor anterior à chamada da função, como lixo de memória, zero, ou um valor previamente armazenado I a sequência de caracteres W25•␣27.8e3• permanece pendente de leitura Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 21 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I considere ainda o trecho de código e valores dados pelo usuário: int a, b; float x, y; scanf("%d%d%f%f", &a, &b, &x, &y); -10 2 0.33W25 27.8e3 I após a execução do código acima: I a contém -10 I b contém 2 I x contém 0.33 I y permanece inalterado, contendo o valor anterior à chamada da função, como lixo de memória, zero, ou um valor previamente armazenado I a sequência de caracteres W25•␣27.8e3• permanece pendente de leitura Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 21 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I considere ainda o trecho de código e valores dados pelo usuário: int a, b; float x, y; scanf("%d%d%f%f", &a, &b, &x, &y); -10 2 0.33W25 27.8e3 I após a execução do código acima: I a contém -10 I b contém 2 I x contém 0.33 I y permanece inalterado, contendo o valor anterior à chamada da função, como lixo de memória, zero, ou um valor previamente armazenado I a sequência de caracteres W25•␣27.8e3• permanece pendente de leitura Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 21 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I considere ainda o trecho de código e valores dados pelo usuário: int a, b; float x, y; scanf("%d%d%f%f", &a, &b, &x, &y); -10 2 0.33W25 27.8e3 I após a execução do código acima: I a contém -10 I b contém 2 I x contém 0.33 I y permanece inalterado, contendo o valor anterior à chamada da função, como lixo de memória, zero, ou um valor previamente armazenado I a sequência de caracteres W25•␣27.8e3• permanece pendente de leitura Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 21 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I considere ainda o trecho de código e valores dados pelo usuário: int a, b; float x, y; scanf("%d%d%f%f",&a, &b, &x, &y); -10 2 0.33W25 27.8e3 I após a execução do código acima: I a contém -10 I b contém 2 I x contém 0.33 I y permanece inalterado, contendo o valor anterior à chamada da função, como lixo de memória, zero, ou um valor previamente armazenado I a sequência de caracteres W25•␣27.8e3• permanece pendente de leitura Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 21 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I considere ainda o trecho de código e valores dados pelo usuário: int a, b; float x, y; scanf("%d%d%f%f", &a, &b, &x, &y); -10 2 0.33W25 27.8e3 I após a execução do código acima: I a contém -10 I b contém 2 I x contém 0.33 I y permanece inalterado, contendo o valor anterior à chamada da função, como lixo de memória, zero, ou um valor previamente armazenado I a sequência de caracteres W25•␣27.8e3• permanece pendente de leitura Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 21 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I suponha que temos uma leitura como abaixo: scanf("%d/%d", &dia, &mes); e a seguinte entrada: ␣2/␣33• a função scanf : I salta o primeiro espaço e associa %d com 2 I casa / e / I salta o espaço e associa %d com 33 Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 22 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I suponha que temos uma leitura como abaixo: scanf("%d/%d", &dia, &mes); e a seguinte entrada: ␣2/␣33• a função scanf : I salta o primeiro espaço e associa %d com 2 I casa / e / I salta o espaço e associa %d com 33 Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 22 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I por outro lado, se temos uma leitura como abaixo: scanf("%d/%d", &dia, &mes); e a entrada é: ␣2␣/␣33• a função scanf : I salta o espaço e associa %d com 2 I tenta casar o caractere / da cadeia de caracteres de formatação com um espaço ␣ da entrada e como esses caracteres não casam, a função termina I o restante ␣/␣33• da entrada permanecerá armazenado na memória até que uma próxima chamada à função scanf seja realizada. Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 23 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I por outro lado, se temos uma leitura como abaixo: scanf("%d/%d", &dia, &mes); e a entrada é: ␣2␣/␣33• a função scanf : I salta o espaço e associa %d com 2 I tenta casar o caractere / da cadeia de caracteres de formatação com um espaço ␣ da entrada e como esses caracteres não casam, a função termina I o restante ␣/␣33• da entrada permanecerá armazenado na memória até que uma próxima chamada à função scanf seja realizada. Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 23 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I se c é uma variável do tipo char , as linhas a seguir: scanf("%c", &c); printf("%c", c); são equivalentes às linhas abaixo: c = getchar(); putchar(c); Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 24 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres I se c é uma variável do tipo char , as linhas a seguir: scanf("%c", &c); printf("%c", c); são equivalentes às linhas abaixo: c = getchar(); putchar(c); Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 24 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversão de tipos I na linguagem C, há dois tipos de conversão de tipos: I conversões implícitas I conversões explícitas Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 25 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversão de tipos I conversões implícitas são realizadas nas seguintes situações: I quando os operandos em uma expressão não são do mesmo tipo: float a = 2.5; a = a + 1; I quando o tipo do valor resultante da avaliação de uma expressão ao lado direito de um comando de atribuição não é compatível com o tipo da variável do lado esquerdo de um comando de atribuição: int a; a = 11 / 2.0; I quando o tipo de um argumento em uma chamada de uma função não é compatível com o tipo do parâmetro correspondente I quando o tipo do valor resultante de uma expressão de devolução de uma função, junto da palavra reservada return , não é compatível com o tipo da função Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 26 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversão de tipos I conversões implícitas são realizadas nas seguintes situações: I quando os operandos em uma expressão não são do mesmo tipo: float a = 2.5; a = a + 1; I quando o tipo do valor resultante da avaliação de uma expressão ao lado direito de um comando de atribuição não é compatível com o tipo da variável do lado esquerdo de um comando de atribuição: int a; a = 11 / 2.0; I quando o tipo de um argumento em uma chamada de uma função não é compatível com o tipo do parâmetro correspondente I quando o tipo do valor resultante de uma expressão de devolução de uma função, junto da palavra reservada return , não é compatível com o tipo da função Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 26 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversão de tipos I conversões implícitas são realizadas nas seguintes situações: I quando os operandos em uma expressão não são do mesmo tipo: float a = 2.5; a = a + 1; I quando o tipo do valor resultante da avaliação de uma expressão ao lado direito de um comando de atribuição não é compatível com o tipo da variável do lado esquerdo de um comando de atribuição: int a; a = 11 / 2.0; I quando o tipo de um argumento em uma chamada de uma função não é compatível com o tipo do parâmetro correspondente I quando o tipo do valor resultante de uma expressão de devolução de uma função, junto da palavra reservada return , não é compatível com o tipo da função Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 26 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversão de tipos I conversões implícitas são realizadas nas seguintes situações: I quando os operandos em uma expressão não são do mesmo tipo: float a = 2.5; a = a + 1; I quandoo tipo do valor resultante da avaliação de uma expressão ao lado direito de um comando de atribuição não é compatível com o tipo da variável do lado esquerdo de um comando de atribuição: int a; a = 11 / 2.0; I quando o tipo de um argumento em uma chamada de uma função não é compatível com o tipo do parâmetro correspondente I quando o tipo do valor resultante de uma expressão de devolução de uma função, junto da palavra reservada return , não é compatível com o tipo da função Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 26 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversão de tipos I conversões implícitas são realizadas nas seguintes situações: I quando os operandos em uma expressão não são do mesmo tipo: float a = 2.5; a = a + 1; I quando o tipo do valor resultante da avaliação de uma expressão ao lado direito de um comando de atribuição não é compatível com o tipo da variável do lado esquerdo de um comando de atribuição: int a; a = 11 / 2.0; I quando o tipo de um argumento em uma chamada de uma função não é compatível com o tipo do parâmetro correspondente I quando o tipo do valor resultante de uma expressão de devolução de uma função, junto da palavra reservada return , não é compatível com o tipo da função Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 26 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversão de tipos Regras para conversões implícitas: I pelo menos um dos operandos é de ponto flutuante: utiliza-se o menor tipo de ponto flutuante que “acomode” os operandos, portanto seguindo a ordem: float → double → long double I nenhum dos operandos é do tipo ponto flutuante: utiliza-se o menor tipo que “acomode” os operandos, excluindo-se tipos de tamanhos menores que int , portanto seguindo a ordem: int → unsigned int → long int → unsigned long int Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 27 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversão de tipos Regras para conversões implícitas: I pelo menos um dos operandos é de ponto flutuante: utiliza-se o menor tipo de ponto flutuante que “acomode” os operandos, portanto seguindo a ordem: float → double → long double I nenhum dos operandos é do tipo ponto flutuante: utiliza-se o menor tipo que “acomode” os operandos, excluindo-se tipos de tamanhos menores que int , portanto seguindo a ordem: int → unsigned int → long int → unsigned long int Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 27 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversão de tipos É preciso ter cuidado com operandos unsigned ! #include <stdio.h> int main(void) { int i = -1; unsigned int j = 1; printf("i = %+d i = %u\n", i, (unsigned int) i); printf("j = %+d j = %u\n", (int) j, j); if (i < j) printf("i < j\n"); else printf("j < i\n"); return 0; } i = -1 i = 4294967295 j = +1 j = 1 j < i Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 28 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversão de tipos É preciso ter cuidado com operandos unsigned ! #include <stdio.h> int main(void) { int i = -1; unsigned int j = 1; printf("i = %+d i = %u\n", i, (unsigned int) i); printf("j = %+d j = %u\n", (int) j, j); if (i < j) printf("i < j\n"); else printf("j < i\n"); return 0; } i = -1 i = 4294967295 j = +1 j = 1 j < i Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 28 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversão de tipos Conversões explícitas: I a linguagem C possui operadores de conversão de tipo, ou casts: (nome-do-tipo) expressão I por exemplo: float f, frac; f = 123.4567f; frac = f - (int) f; Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 29 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversão de tipos Conversões explícitas: I a linguagem C possui operadores de conversão de tipo, ou casts: (nome-do-tipo) expressão I por exemplo: float f, frac; f = 123.4567f; frac = f - (int) f; Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 29 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de dados definidos pelo programador I usamos a palavra reservada typedef no seguinte formato geral: typedef tipo-primitivo tipo-novo; I por exemplo: typedef int Logic; Logic primo, crescente; Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 30 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de dados definidos pelo programador I usamos a palavra reservada typedef no seguinte formato geral: typedef tipo-primitivo tipo-novo; I por exemplo: typedef int Logic; Logic primo, crescente; Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 30 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operador sizeof I o operador unário sizeof permite que verificar quanto de memória é necessário para armazenar valores de algum tipo: sizeof (nome-do-tipo) #include <stdio.h> int main(void) { printf("Caracteres: %lu\n", sizeof(char)); printf("Inteiros:\n"); printf(" short: %lu\n", sizeof(short int)); printf(" int: %lu\n", sizeof(int)); printf(" long int: %lu\n", sizeof(long int)); printf("Números de ponto flutuante:\n"); printf(" float: %lu\n", sizeof(float)); printf(" double: %lu\n", sizeof(double)); printf(" long double: %lu\n", sizeof(long double)); return 0; } Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 31 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operador sizeof I o operador unário sizeof permite que verificar quanto de memória é necessário para armazenar valores de algum tipo: sizeof (nome-do-tipo) #include <stdio.h> int main(void) { printf("Caracteres: %lu\n", sizeof(char)); printf("Inteiros:\n"); printf(" short: %lu\n", sizeof(short int)); printf(" int: %lu\n", sizeof(int)); printf(" long int: %lu\n", sizeof(long int)); printf("Números de ponto flutuante:\n"); printf(" float: %lu\n", sizeof(float)); printf(" double: %lu\n", sizeof(double)); printf(" long double: %lu\n", sizeof(long double)); return 0; } Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 31 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operador sizeof Caracteres: 1 Inteiros:short: 2 int: 4 long int: 8 Números de ponto flutuante: float: 4 double: 8 long double: 16 Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 32 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exercícios Exercícios para treinar os conceitos aprendidos nesta aula. Faça muitos testes com suas entradas e saídas. 1. Dadas n triplas compostas por um símbolo de operação aritmética (+,−, ∗ ou /) e dois números reais, calcule o resultado ao efetuar a operação indicada para os dois números. Faremos esse exercício usando a estrutura condicional switch , que compara uma expressão com uma sequência de valores. Essa estrutura tem o seguinte formato: Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 33 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exercícios 1. switch (expressão lógica) { case constante: ... /* instruções */ break; case constante: ... /* instruções */ break; ... default: ... /* instruções */ break; } Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 34 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exercícios #include <stdio.h> /* Recebe um operador aritmético e dois operandos inteiros e devolve o resultado da operação sobre os dois operandos */ int main(void) { char operador; int n; float op1, op2, result; printf("Informe n: "); scanf("%d", &n); for ( ; n > 0; n--) { printf("Informe a expressão (ex.: 5.3 * 3.1): "); scanf("%f %c%f", &op1, &operador, &op2); Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 35 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exercícios switch (operador) { case '+': result = op1 op2; break; case '-': result = op1 - op2; break; case '*': result = op1 * op2; break; case '/': result = op1 / op2; break; default: break; } printf("%f %c %f = %f\n", op1, operador, op2, result); } return 0; } Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 36 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exercícios 2. Um matemático italiano da idade média conseguiu modelar o ritmo de crescimento da população de coelhos através de uma sequência de números naturais que passou a ser conhecida como sequência de Fibonacci. A sequência de Fibonacci é dada pela seguinte sequência de números: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, . . . Observe que um elemento arbitrário da sequência é resultante da soma dos dois elementos imediatamente anteriores. Dessa forma, a sequência de Fibonacci também pode ser descrita pela seguinte fórmula de recorrência: F1 = 1 , F2 = 1 , Fi = Fi−1 + Fi−2 , para i > 3 . Escreva um programa que dado n > 1 calcule e exiba Fn. Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 37 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exercícios 3. Os babilônios descreveram a mais de 4 mil anos um método para calcular a raiz quadrada de um número. Esse método ficou posteriormente conhecido como método de Newton. Dado um número x, o método parte de um chute inicial y para o valor da raiz quadrada de x e sucessivamente encontra aproximações desse valor calculando a média aritmética de y e de x/y. O exemplo a seguir mostra o método em funcionamento para o cálculo da raiz quadrada de 3, com chute inicial 1: x y x/y (y+ x/y)/2 3 1 3 2 3 2 1.5 1.75 3 1.75 1.714286 1.732143 3 1.732143 1.731959 1.732051 3 1.732051 1.732051 1.732051 Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 38 / 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exercícios 3. Escreva um programa que receba um número real positivo x e um número real ε e calcule a raiz quadrada de x usando o método de Newton, até que o valor absoluto da diferença entre dois valores consecutivos de y seja menor que ε. Mostre também na saída a quantidade de passos realizados para obtenção da raiz de x. Prof. Renan A. Marks (FACOM) Tipos primitivos de dados Algoritmos e Programação I 39 / 39 Introdução Tipos inteiros Números com ponto flutuante Caracteres Tipos de dados definidos pelo programador Operador sizeof Exercícios
Compartilhar