Ementa: Tipos básicos de dados. Listas lineares e suas generalizações: listas ordenadas, listas encadeadas, pilhas e filas. Aplicações de listas.

Documentos relacionados
modificador h instrui a função printf( ) a exibir um short int. Portanto, %hu indica que o dado é do tipo short unsigned int.

Linguagem Estruturada

Entrada de Dados na Linguagem C. Professor Adolfo Neto DAINF UTFPR Agosto de 2008

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

Linguagem C Princípios Básicos (parte 1)

Algoritmos e Programação

A Linguagem C. A forma de um programa em C

ECT1203 Linguagem de Programação

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

LINGUAGEM DE PROGRAMAÇÃO C AULA 2. Professor: Rodrigo Rocha

4. Estruturas Fundamentais de Programação em C

3. Linguagem de Programação C

Laboratório de Programação II

Linguagem C. André Tavares da Silva.

Linguagem C: Introdução

Variáveis, Comandos de Atribuição e Comando de Entrada e Saída

Introdução à Programação

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

LINGUAGEM C: VARIÁVEIS E EXPRESSÕES

Prática de Programação. Prof. Tiago A. E. Ferreira Aula 9 Estruturas, Uniões, Enumerações e Tipos Definidos pelo Usuário

Linguagem C: Variáveis e Operadores. Prof. Leonardo Barreto Campos 1

Programação I A Linguagem C. Prof. Carlos Alberto

Universidade Federal do Espírito Santo. Programação I Tipos de Dados Básicos - C Professora: Norminda Luiza

Programação científica C++

3.1 - Funções para manipular dados de entrada e saída padrão

Linguagem de Programação I. Aula 06 Linguagem C: Tipos de Dados

Linguagens de Programação I

Cap. 2 Expressões na linguagem C

Linguagens de Programação PROGRAMAÇÃO DE COMPUTADORES. Linguagem C. Linguagem C Estrutura Básica. Constante (literais) Linguagem C Primeiro Programa

Programação I Funções. Prof. Carlos Alberto

Capítulo 2 Operadores. A função scanf()

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

Tópicos de hoje: Cap. 2 Expressões na linguagem C. Bits, Bytes e Palavras. Variáveis e Constantes. Números inteiros num Byte

Linguagem de Programação C

Métodos Computacionais

Estruturas de Dados. Módulo 2 Expressões. 9/8/2005 (c) Marco A. Casanova - PUC-Rio 1

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Introdução à Linguagem C Variáveis e Expressões

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Anhanguera Educacional S.A. Centro Universitário Ibero-Americano

Linguagem C Entrada/Saída (console)

FACULDADE BATISTA MINEIRA - CST Banco de Dados Estruturas de Dados - Variáveis

Programação Estruturada

Aula 3 Constantes e funções de E/S

Declarações. Tipos de Acesso, Inicialização e Constantes

Classes o Objetos. Classes, objetos, métodos e variáveis de instância

6 Alguns conceitos e comandos em programação

Programação Estruturada

Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados

Introdução à Computação MAC0110

Fundamentos de Programação. Linguagem C++ aula II - Variáveis e constantes. Prof.: Bruno Gomes

Linguagem de Programação C

A linguagem C (visão histórica)

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

Programação: Vetores

Hello World. Linguagem C. Tipos de Dados. Palavras Reservadas. Operadores Aritméticos. Pré e pós incremento e pré e pós decremento

Princípios de Desenvolvimento de Algoritmos MAC122

Introdução à Programação

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

Programação Estruturada Aula 2 - Introdução

Computação Eletrônica. Tipos de dados, constantes, variáveis, operadores e expressões. Prof: Luciano Barbosa

Ambiente de desenvolvimento

Algoritmos e Estruturas de Dados I IEC012. Linguagem C - Guia de bolso - Prof. César Melo

3. Linguagem de Programação C

Linguagem C. Introdução à Programação C. Variáveis. Identificadores. Identificadores VARIÁVEIS E TIPOS DE DADOS

Linguagem C. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

Algoritmos e Estruturas de Dados I (DCC/003) Introdução à Programação de Computadores. Aula - Tópico 1

PROGRAMAS BÁSICOS EM C++ Disciplina: Introdução à Ciência da Computação Prof. Modesto Antonio Chaves Universidade estadual do Sudoeste da Bahia

Variáveis e Operadores em C

Aula 4 - Operadores. Prof. Laura Silva de Assis. Engenharia de Computação 2 o Período

Conceitos básicos. Computação eletrônica: Gurvan Huiban

Estrutura de Programas e Tipos de Dados Simples

Aula 03 - Linguagem C

Computação Eletrônica. Strings. Prof: Luciano Barbosa. CIn.ufpe.br

Algoritmos e Programação

Disciplina de Algoritmos e Programação

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

Vetores. e o programa deverá ler os valores separadamente:

Prof. Marcelo Machado Cunha Faculdade Pio Décimo

Tipos de Dados, Variáveis e Entrada e Saída em C. DCC 120 Laboratório de Programação

Estrutura de Dados Conceitos Iniciais

Classes e Objetos. Sintaxe de classe em Java

Aula 03: Introdução a C

Estruturas. Estruturas. Estruturas. Estruturas. Estruturas. Algoritmos e Lógica de Programação. Estruturas. Uniões Enumerações CANSI

Introdução a Programação de Jogos

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

Curso de C. Declaração de Variáveis 18/3/ :48 1

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

Disciplina de Algoritmos e Programação

Estrutura de Dados. Ricardo José Cabeça de Souza Parte 2

Linguagens de Programação

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Faculdade de Computação

Conhecendo a Linguagem de Programação C

Transcrição:

Ementa: Tipos básicos de dados. Listas lineares e suas generalizações: listas ordenadas, listas encadeadas, pilhas e filas. Aplicações de listas. Árvores e suas generalizações: árvores binárias, árvores de busca, árvores balanceadas (AVL), árvores B e B+. Aplicações de árvores

Linguagem Estruturada Embora o termo linguagem estrutura em dados não seja rigorosamente aplicável a C, ela é normalmente referida simplesmente como linguagem estruturada. C tem muitas semelhanças com outras linguagens estruturadas, como ALGOL, PASCAL e MODULA-2. A característica especial de uma linguagem estruturada é a compartimentação do código e dos dados. Trata-se da habilidade de uma linguagem seccionar e esconder do resto do programa todas as informações necessárias para se realizar uma tarefa específica. Uma das maneiras de conseguir essa compartimentalização é pelo uso de subrotinas que empregam variáveis locais(temporárias). Com uso de variáveis locais é possível escrever subrotinas de forma que os eventos que ocorrem dentro delas não causem nenhum efeito inesperado nas outras partes do programa. Essa capacidade permite que seus programas em C compartilhem facilmente seções de código. Se você desenvolve funções compartimentalizadas, só precisa saber o que uma função faz, não como ela faz. Lembre-se que o uso excessivo de variáveis globais(variáveis conhecidas por todo o programa) pode trazer muitos erros, por permitir efeitos colaterais indesejados. Uma linguagem estruturada permite muitas possibilidades na programação. Ela suporta, diretamente, diversas construções de laços (loops), como while, do-while e for. Em uma linguagem estruturada, o uso de goto é proibido ou desencorajado e também a forma comum de controle do programa, (que ocorre em BASIC e FORTRAN, por exemplo). Uma linguagem estruturada permite que você insira sentenças em qualquer lugar de uma linha e não exige um conceito rigoroso de campo (como em FORTRAN).

A seguir estão alguns exemplos de linguagens estruturadas e não estruturadas. NÃO ESTRUTURADA FORTRAN BASIC COBOL ESTRUTURADA Pascal Ada C++ C Modula-2 Linguagens estruturadas tendem a ser modernas. De fato, a marca de uma linguagem antiga de computador é não ser estruturada. Hoje, a maioria dos programadores considera as linguagens estruturadas mais fáceis de programar e fazer manutenção. O principal componente estrutural de C é a função a sub-rotina isolada de C. Em C, funções 350 03 blocos de construção em que toda a atividade do programa ocorre. Elas admitem que você defina e codifique separadamente as diferentes tarefas de um programa, permitindo, então, que seu programa seja modular. Após uma função ter sido criada, você pode esperar que ela trabalhe adequadamente em várias situações, sem criar efeitos inesperados em outras partes do programa. O fato de você poder criar funções isoladas é extremamente importante em projetos maiores nos quais um código de um programador não deve afetar acidentalmente o de outro.

Tipos de dados Tipos Primitivos Um tipo primitivo (também conhecido por nativo ou básico) é fornecido por uma linguagem de programação como um bloco de construção básico. Dependendo da implementação da linguagem, os tipos primitivos podem ou não possuir correspondência direta com objetos na memória. Tipos primitivos em C Em C existem 5 tipos básicos de dados char, int, float, double e void(caractere, inteiro, ponto flutuante, ponto flutuante de precisão dupla e sem valor). Todos os outros tipo são baseados em um desses tipos, os seus tamanhos variam conforme o tipo de processador e com a implementação do compilador C. O padrão ANSI apenas estipula a faixa mínima de cada tipo de dado, não o seus tamanho em bytes. O tipo void especifica explicitamente uma função que não retorna valor algum ou criar ponteiros genéricos. Lista de tipos(ansi) em C TIPO DE DADO SIGNIFICADO TAMANHO(aprox. ) EM BYTES FAIXA MÍNIMA char caractere(número) 1-128 a 127 signed char caractere não sinalizado 1-128 a 127 unsigned char caractere não sinalizado 1 0 a 255

short int inteiro curto 2-32768 a 32767 signed short int inteiro curto sinalizado 2-32768 a 32767 unsigned short int inteiro curto não sinalizado 2 0 a 65535 int inteiro 2-32.768 a 32.767 signed int inteiro sinalizado 2-32.768 a 32.767 unsigned int inteiro não sinalizado 2 0 a 65.535 long int inteiro sinalizado 4-2.147.483.648 a 2.147.483.647 signed long int inteiro longo sinalizado 4-2.147.483.648 a 2.147.483.647 unsigned long int inteiro longo não sinalizado 4 0 a 4.294.967.295 float flutuante (real) 4 seis dígitos de precisão double flutuante duplo 8 dez dígitos de precisão long double flutuante duplo longo 10 dez dígitos de precisão

Modificadores Modificadores de dados Todos os dados básicos podem ter vários modificadores precedendo-os, exceto o void. Um modificador é usado para alterar o significado de um tipo básico para adaptá-lo melhor às necessidades, os modificadores são: signed unsigned long short Os modificadores signed, short, long e unsigned podem ser aplicados aos tipos básicos caractere e inteiro. Contudo, long também pode ser aplicado a double. (O padrão ANSI não tem o long float pos seria a mesma coisa que o double) Variáveis Variável é uma posição nomeada na memória, que é usada para guardar um valor que pode ser modificada pelo programa. A forma geral de uma declaração é: tipo lista_de_variaveis; Exemplos:

Variáveis Locais São variáveis declaradas dentro de uma função; Só podem ser referenciadas por comandos que estão dentro do bloco no qual as variáveis foram declaradas, um bloco de código inicia-se em { e termina em }. Ou blocos de código: Como uma variável é criada na entrada do bloco e destruídas na saída seu valor é perdido quando o bloco deixa de ser executado,. Variáveis Globais São variáveis reconhecidas pelo programa inteiro e podem ser usadas por qualquer bloco de código; As variáveis globais são criadas declarando-as fora de do escopo principal.

As variáveis globais encontram-se armazenadas em uma região fixa da memória, separada para esse propósito pelo compilador C; Variáveis globais são úteis quando o mesmo dado é usado em muitas funções em seu programa; Alerta: Variáveis globais ocupam memória durante todo o tempo em que seu programa estiver executando, portanto, evite usar variáveis globais desnecessárias.

Leitura e escrita em C Printf() Quase todos os programas exemplo vistos até agora, que realizam saída para a tela, usaram a função printf( ). Vamos dar uma olhada mais formal nela agora. A forma geral da função printf( ) é: printf( string de controle, lista de argumentos); Na função printf( ), a string de controle contém tanto caracteres para serem impressos na tela como códigos de formato que especificam como apresentar o restante dos argumentos. Existem códigos de formato que você já deve ter aprendido até aqui: Código Significado tipos aceitos %c Exibe um caractere char, int, %d Exibe um inteiro em formato decimal char, int, %i Exibe um inteiro char, int, %e Exibe um número em notação científica (com e minúsculo) float, double %E Exibe um número em notação científica (com E maiúsculo) float, double %f Exibe um ponto flutuante em formato decimal float, double %g Usa %e ou %f, o que for menor float, double %G O mesmo que %g, só que um E maiúsculo é usado se o formato %e for escolhido float, double %o Exibe um número em notação octal char, int,

%s Exibe uma string char*, int* %u Exibe um decimal sem sinal char, int, %x Exibe um número em hexadecimal com letras minúsculas char, int, %X Exibe um número em hexadecimal com letras maiúsculas char, int, %% Exibe um sinal de % char, int, %p Exibe um ponteiro char, int, %hd Exibe um short int em formato decimal char, int, %hi Exibe um short int char, int, %ho Exibe número em formato octal curto char, int, %hu Exibe short unsigned int char, int, %hx Exibe em formato octal curto em minúscula char, int, %hx Exibe em formato octal curto em maiúscula char, int, %ld Exibe um inteiro longo em formato decimal char, int, %li Exibe um inteiro longo char, int, %lo Exibe em formato octal longo char, int, %lu Exibe unsigned long int char, int, %lx Exibe em formato hexadecimal longo em minúscula char, int, %lx Exibe em formato hexadecimal longo em maiúscula char, int, %Le Exibe um número longo em notação científica (com e minúsculo) double**

%LE Exibe um número longo em notação científica (com e maiúscula) double** %Lg Usa %le ou %lf, o que for menor double** %LG O mesmo que %Lg, só que um E maiúsculo é usado se o formato %e for escolhido double** %hhu Exibe em formato inteiro longo longo sem sinal char, int, %hhi Exibe em inteiro longo longo char, int, %hhd Exibe em inteiro longo longo em formato decimal char, int, %lld exibe longo longo inteiro char, int, float, double %lli exibe longo longo inteiro em formato decimal *vetor de, **com modificador long Exemplos: 1) 2)

3) 4) 5) 6)

Os comandos de formato podem ter modificadores que especificam o tamanho do campo, o número de casas decimais e um indicador de justificação à esquerda. Um inteiro colocado entre o sinal % e o comando de formato atua como um especificador de largura mínima do campo. Esse especificador preenche a saída com brancos ou zeros para assegurar que o campo esteja com pelo menos um certo comprimento mínimo. Se a string ou o número é maior que o mínimo, será impresso por completo, mesmo se o mínimo for ultrapassado. O preenchimento padrão é feito com espaços. Se você quiser preencher com zeros coloque um 0(zero) antes do especificador de comprimento de campo. Por exemplo, %05d preencherá um número de menos de cinco dígitos com zeros de maneira que seu tamanho total seja 5. Para especificar o número de casas decimais impressas num número em ponto flutuante, coloque um ponto decimal depois do especificador de tamanho de campo seguido pelo número de casas decimais que deseja mostrar. Por exemplo, %10.4f exibirá um número de, no mínimo, dez caracteres de comprimento com quatro casas decimais. Quando isso é aplicado a strings ou inteiros, o número seguinte ao ponto especifica o comprimento máximo do campo. Por exemplo, %5.7s exibirá uma string que terá, no mínimo, cinco caracteres de comprimento e não excederá sete. Se for maior que o campo de tamanho máximo, a string será truncada. Por definição, toda saída é justificada à direita: se a largura do campo é maior que o dado impresso, o dado será colocado na extremidade direita do campo. Você pode forçar a informação a ser justificada à esquerda colocando um sinal de menos diretamente depois do %. Por exemplo, %-10.2f justificará à esquerda um número em ponto flutuante, com duas casas decimais, em um campo de 10 caracteres. Existem dois modificadores de comando de formato que permitem à função printf( ) exibir inteiros short e long. Esses modificadores podem ser aplicados aos especificadores d, i, o, u e x. O modificador l diz à função printf( ) que um tipo de dados long o segue. Por exemplo, %ld indica que um long int deve ser exibido. O

modificador h instrui a função printf( ) a exibir um short int. Portanto, %hu indica que o dado é do tipo short unsigned int. O modificador l também pode prefixar os comandos em ponto flutuante de e, f e g para indicar que um double o segue. O modificador L especifica um long double. Com a função printf( ), você pode enviar virtualmente qualquer formato de dado que desejar. Veja os exemplos abaixo. Scanf() A função scanf( ) é uma das funções de entrada de dados da linguagem C. Ainda que possa ser usada para ler virtualmente qualquer tipo de dado inserido por meio do teclado, frequentemente você a usará para a entrada de números inteiros ou de ponto flutuante. A forma geral da função scanf( ) é: scanf ( string de controle, lista de argumentos); Os especificadores de formato de entrada são precedidos por um sinal % e dizem à função scanf( ) qual tipo de dado deve ser lido em seguida. Esses códigos são listados na tabela a seguir. Por exemplo, %s lê uma string enquanto %d lê um inteiro.

Código Significado %c Lê um único caractere %d Lê um decimal inteiro %i Lê um decimal inteiro (não pode ser octal ou hexadecimal) %u Lê um decimal sem sinal %e Lê um número em ponto flutuante com sinal opcional %f Lê um número em ponto flutuante com ponto opcional %g Lê um número em ponto flutuante com expoente opcional %o Lê um número em base octal %s Lê uma string %x Lê um número em base hexadecimal %p Lê um ponteiro %ld %li %lu %le %lf %lg %lo %lx %hd Lê um decimal inteiro longo Lê um decimal inteiro (não pode ser octal ou hexadecimal) longo Lê um decimal sem sinal longo Lê um número em double com sinal opcional longo Lê um número em double com ponto opcional longo Lê um número em double com expoente opcional longo Lê um número em base octal longo Lê um número em base hexadecimal longo Lê um decimal inteiro longo

%hi %hu %ho %hx Lê um decimal inteiro (não pode ser octal ou hexadecimal) curto Lê um decimal sem sinal curto Lê um número em base octal curto Lê um número em base hexadecimal curto Os caracteres de conversão d, i, o, u e x podem ser precedidos por h para indicarem que um apontador para short ao invés de int aparece na lista de argumentos, ou por l (letra ele) para indicar que um apontador para long aparece na lista de argumentos. Semelhantemente, os caracteres de conversão e, f e g podem ser precedidos por l (letra ele) para indicarem que um apontador para double ao invés de float está na lista de argumentos. A cadeia de formato geralmente contém especificações de conversão, que são usadas para controlar a conversão da entrada. A cadeia de formato pode conter: espaços, tabulações e novas linhas, que serão ignorados; caracteres comuns (não %), que devem combinar com o próximo caractere não espaço do fluxo de entrada; especificações de conversão, consistindo no caractere %, um caractere * opcional de supressão de atribuição, um número opcional especificando um tamanho máximo do campo, um h ou l opcional indicando o tamanho do destino, e um caractere de conversão. Um caractere que não seja um espaço em branco faz com que a função scanf( ) leia e descarte o caractere correspondente. Por exemplo, %d,%d faz com que a função scanf( ) leia um inteiro, então, leia uma vírgula (que será descartada) e, finalmente, leia outro inteiro. Se o caractere especificado não é encontrado, a função scanf( ) terminará.

Todas as variáveis usadas para receber valores por meio da função scanf( ) deverão ser passadas pelos seus endereços. Por exemplo, para ler um inteiro em uma variável count, você poderia usar a seguinte chamada à função scanf( ) : As strings serão lidas em vetores (cadeias de caracteres) e o nome do vetor é o endereço do primeiro elemento do vetor. Então, para ler uma string no vetor de caracteres nome, você deve usar o seguinte comando: operador &. Nesse caso, nome já tem um endereço e não precisa ser precedido pelo Os itens de dados de entrada devem ser separados por espaços, tabulações ou novas linhas. Pontuações como vírgula, ponto-e-vírgula e semelhantes não contam como operadores. Isso significa que... Aceitará uma entrada dos números 10 20, mas falhará com 10,20. Como na função printf( ), os códigos de formato da função scanf( ) devem ser correspondidos na ordem com as variáveis que estão recebendo a entrada na lista de argumento. Um * colocado depois do % e antes do código de formato lerá um dado de um tipo especificado, mas suprimirá a sua atribuição. Assim, dando-se a entrada 10/20, colocará o valor 10 em x descartando o sinal de divisão, e dará a y o valor 20. Os comandos de formato podem especificar um campo modificador de comprimento máximo. Esse modificador é um número inteiro colocado entre o sinal

% e o código de comando de formato, que limita o número de caracteres lidos para qualquer campo. Por exemplo, para ler não mais que 20 caracteres em str, você pode escrever: Se o apontador de entrada é maior do que 20 caracteres, uma chamada subsequentes para entrada começará onde ela pára. Por exemplo, se você digitar ABCDEFGHIJKLMNOPQRSTUVWXYZ em resposta à chamada scanf( ), nesse exemplo, somente os 20 primeiros caracteres, até o T, serão colocados em str por causa do especificador de tamanho máximo. Isso significa que os caracteres restantes UVWXYZ não são usados. Se uma outra chamada à função scanf( ) é feita, tal como: Então UVWXYZ é colocado em str. A entrada para o campo pode ser terminada, antes que o campo de comprimento máximo seja alcançado, se um caractere de espaço em branco é encontrado. Nesse caso, a função scanf( ) move-se para o próximo campo. Ainda que espaços, tabulações e novas linhas sejam usados como separadores de campos, quando da leitura de um único caractere, estes últimos são lidos como qualquer outro caractere. Por exemplo, com uma entrada de x y ; retornará com o caractere x em a, um espaço em b e o caractere y em c. Você não pode usar a função scanf( ) para exibir uma mensagem ao usuário. Portanto, todas as mensagens devem ser feitas explicitamente antes da chamada à função scanf( ).

A função scanf( ) inclui também uma característica muito poderosa chamada scanset. Um scanset define uma lista de caracteres que serão correspondidos por scanf( ). A função scanf( ) continuará a ler caracteres enquanto eles estiverem no scanset. Assim que um caractere entrado não corresponder a qualquer um do scanset, a função scanf( ) segue para o próximo especificador de formato (se existir). Um scanset é definido colocando-se uma lista de caracteres que você quer que seja examinada entre chaves. A chave inicial deve ser prefixada por um sinal de porcentagem. Por exemplo, este scanset diz à função scanf( ) para ler somente os dígitos de 0 a 9: Experimente esse programa usando a entrada 123456789abcdefg987654, seguida por um retorno de carro. O programa exibirá, então: Uma vez que a não faz parte do scanset, a função scanf( ) pára de ler os caracteres em s1 quando ele é encontrado e os caracteres restantes são colocados em s2. Você pode especificar um intervalo dentro de um scanset usando um hífen. Por exemplo, isto diz à função scanf( ) para aceitar os caracteres de A a Z: Você pode especificar um conjunto invertido se o primeiro caractere é um ^. Quando está presente, o ^ instrui a função scanf( ) a aceitar quaisquer caracteres

que não estão definidos no scanset. Um ponto importante a lembrar é que o scanset difere letras minúsculas de maiúsculas. Portanto, se você quiser examinar tanto letras maiúsculas como minúsculas, deve especificá-las individualmente.

Conversão de tipos A conversão de tipos é o ato de forçar uma expressão a utilizar e retornar um determinado tipo. Também chamamos esta modalidade de Casting. A conversão de um tipo de dado em número ou em literal é muito comum em situações de programação. Podemos ter dois tipos de conversões de tipos, pode ser implícita ou explícitas, que são conversões especificadas. conversão de tipos implícita(em expressões) Quando constantes e variáveis de tipos diferentes são misturadas em uma expressão, elas são convertidas para o mesmo tipo. O compilador C converterá todos os operandos para o tipo do operando maior. Isso é feito na base de operação a operação, como descrito nestas regras de conversão de tipos: Todos os chars e shor ints são convertidos para ints. Todos os floats são convertidos para doubles; Para todos os pares de operandos, se um deles é um long double, o outro operando é convertido para uma long double. Se um dos operandos é double, o outro é convertido para double. Se um é long, o outro é convertido para long. Se um é unsigned, o outro é convertido para unsigned. Uma vez que essas regras de conversão tenham sido aplicadas, cada par de operandos será do mesmo tipo e o resultado de cada operação terá o mesmo tipo dos dois operandos. Note que a regra 2 tem muitas condições que devem ser aplicada em sequência.

Por exemplo, considere a conversão de tipos que ocorre na expressão a seguir. Primeiro, o caractere ch é convertido para um inteiro e float f é convertido para double. Então, o resultado de ch/i é convertido para um double, já que f * d é um double. O resultado final é um double, tendo em vista que, neste caso, os dois operandos são double. Conversão Explícita(casting/cast) É possível forçar uma expressão a ser de um tipo específico usando-se uma construção chamada de modelador. A forma geral de um modelador é: (tipo) expressão; Onde tipo é um dos tipos dado-padrão da linguagem C. Por exemplo, se x é um inteiro e você quer certificar-se de que a expressão x/2 resulta em um tipo float, garantindo um componente fracionário, pode escrever Aqui, o cast (float) é associado com o x, o que faz com que o 2 seja elevado ao tipo float e o resultado seja um float. Entretanto, tome cuidado: se você escrever a expressão acima como segue, o componente fracionário não será considerado:

Neste caso, uma divisão de inteiros é levada a cabo e o resultado é transformado em float.

Modificadores de Acesso Existem mais dois modificadores, também chamado que quantificadores, eles controlam a maneira de como as variáveis podem ser acessadas ou modificadas. Const Uma variável const é uma constante, constantes são usadas para armazenar valores que NÃO podem ser modificadas durante a execução de um programa. Volatile O modificador volatile diz ao compilador que a variável em questão pode ser alterada sem que este seja avisado. Isto evita "bugs" seríssimos. é possível usar const e volatile juntos. Por exemplo uma variável associada a uma porta que é modificada por condições externas, ao usar esses dois modificador é possível evitar efeitos colaterais indesejados. Especificador de Tipos de dados de classe de Armazenamento Os especificador informam ao compilador a forma de armazenamento de uma variável. Eles precedem o tipo que eles modificam. Temos quatro classes de armazenamento diferentes em um programa C.: auto register static extern

Auto A classe de armazenamento auto (automático) é a classe de armazenamento padrão para todas as variáveis locais.ou seja caso a mesma não tenha um tipo de classe a variável será por padrão auto. Exemplo: O exemplo acima é igual ao abaixo: locais. Lembrando que auto só pode ser usado em funções, ou seja, variáveis Register A classe de armazenamento register é usada para definir variáveis locais que devem ser armazenadas no local de mais rápido acesso possível, ou seja, char e int serão armazenados nos registradores, e outros tipos serão tratados.

O registro só deve ser usado para variáveis que requerem acesso rápido, como contadores. Deve também notar-se que definir "registrar" não significa que a variável será armazenada em um registro. Static A classe de armazenamento static instrui o compilador a manter uma variável local existente durante a vida útil do programa em vez de criá-la e destruí-la cada vez que ela entra e sai do escopo. Portanto, tornar as variáveis locais estáticas permitem que eles mantenham seus valores entre chamadas de função. O modificador estático também pode ser aplicado a variáveis globais. Quando isso é feito, ele faz com que o escopo dessa variável seja restrito ao arquivo no qual ele é declarado. Na programação C, quando estática é usada em uma variável global, faz com que apenas uma cópia desse membro seja compartilhada por todos os objetos de sua classe.

resultado - Quando o código acima é compilado e executado, ele produz o seguinte Extern A classe de armazenamento extern é usada para fornecer uma referência de uma variável global visível para todos os arquivos do programa. Quando você usa 'extern', a variável não pode ser inicializada no entanto, ele aponta o nome da variável em um local de armazenamento previamente definido. Quando você possui vários arquivos e você define uma variável ou função global, que também será usada em outros arquivos, então extern será usado em outro arquivo para fornecer a referência de variável ou função definida. Apenas para

entender, extern é usado para declarar uma variável ou função global em outro arquivo. O modificador extern é mais usado quando há dois ou mais arquivos compartilhando as mesmas variáveis ou funções globais, conforme explicado abaixo. Primeiro arquivo: main.c Segundo arquivo: suporte.c Quando os dois arquivos são compilados juntos, o programa produz o resultado count is 5.

Tipo de dados Derivados ou Compostos Tipos de dados derivados são aqueles que são definidos em termos de outros tipos de dados, chamados de tipos base. A linguagem C permite criar diversos tipos diferentes de dados particulares, de cinco formas: Struct Struct Campo de bit(não veremos Union Enum typedef Na linguagem C, uma estrutura é uma coleção de variáveis referenciadas sobre um nome, provendo um meio conveniente de manter informações relacionadas juntas. Uma declaração de estrutura forma uma fonte que pode ser usada para criar variáveis de estruturas. As variáveis que compreendem a estrutura são chamadas de campos. Em geral, todos os campos na estrutura estão logicamente relacionados uns aos outros. Por exemplo, a informação sobre o nome eo endereço em uma lista de endereços deve ser normalmente representada em uma estrutura. O seguinte fragmentos de código declara uma estrutura-fonte que define os campos nome e endereço de tal estrutura. A palavra reservada struct diz ao compilador que uma estrutura está sendo definida.

No código acima a declaração termina com um ponto-e-vírgula. É por isso que uma estrutura é uma declaração. Ainda, a etiqueta endereço identifica essa estrutura de dado particular e é o seu especificador de tipo. Neste ponto do código, nenhuma variável foi declarada. Somente a forma dos dados foi definida. Para declarar uma variável com essa estrutura, você deve escrever dentro da main : Isso declarará uma variável estrutura do tipo endereço chamada inf_ende. Quando declaramos uma estrutura, estamos definindo um tipo de variável complexa composto por campos. Até que se declare uma variável desse tipo, ela não existe. Você também pode declarar uma ou mais variáveis enquanto declara uma estrutura. Por exemplo:

Referenciando os campos da estrutura Campos da estrutura são referenciados pelo uso do operador de seleção de campo: o ponto. Por exemplo, o seguinte código atribui o cep 12345777 ao campo cep da variável estrutura info_ende declarada anteriormente: O nome da variável estruturada seguido por um ponto e o nome do campo para referenciar um campo individual da estrutura. Todos os campos da estrutura são acessados da mesma maneira. A forma geral é: nome_da_variável_estruturada.nome_do_campo; Portanto, para imprimir o cep na tela, você pode escrever: Isso imprimirá o cep contido no campo cep da variável estrutura inf_ende. Da mesma maneira, a matriz de caracteres inf_ende.nome pode ser usada em uma chamada à função gets( ), como mostrada aqui:

Isso passará um ponteiro para caractere para o começo do campo nome. Se você quisesse acessar os elementos individuais de inf_ende.nome, poderia indexar nome. Por exemplo, você pode imprimir o conteúdo da inf_ende.nome, um caractere por vez, usando este código: Union Em C, uma union é uma localização de memória usado por muitos tipos de variáveis diferentes. A declaração de uma union é similar ao de uma estrutura, como mostrado neste exemplo: Assim como com estruturas, essa declaração não declara qualquer variável. Pode-se declarar uma variável tanto colocando-se o nome dela no fim da declaração como pelo uso de uma declaração em separado. Para declarar uma variável union, chamada unic, do tipo u_tipo, usando a declaração dada anteriormente, você pode escrever: Em unic, o inteiro i e o caractere ch compartilham a mesma localização de memória. A Figura a seguir mostra como i e ch compartilham o mesmo endereço.

Quando uma variável union é declarada, o compilador cria automaticamente uma variável grande o bastante para armazenar o tipo da variável de maior tamanho na union. Para acessar um elemento union deve-se usar a mesma sintaxe das estruturas: os operadores ponto e seta. Quando se opera diretamente na union, usa-se o operador ponto. Se a variável union é acessada por meio de um ponteiro, usa-se o operador seta. Por exemplo, para atribuir o inteiro 10 ao elemento i de unic, deve-se escrever Uniões são usadas freqüentemente quando são necessárias conversões de tipos, uma vez que elas permitem que se considere uma região de memória de mais de uma maneira. Enum Uma enumeração é um conjunto de constantes inteiras que especifica todos os valores legais que uma variável de um tipo específico pode ter. As enumerações não são incomuns no dia-a-dia. Por exemplo, uma enumeração das moedas usadas nos Estados Unidos é: penny, nickel, dime, quarter, half_dollar, dollar. As enumerações são definidas muito semelhantemente às estruturas com a palavra reservada enum usada para indicar o início de um tipo enumerado. A forma geral é mostrada aqui: enum nome_do_tipo_enumerado {lista_de_enumeração} lista de variáveis; A lista de enumeração é uma lista de nomes separados por vírgulas que representam os valores que uma variável da enumeração pode ter. Tanto o nome do tipo enumerado como a lista de variáveis são opcionais. Assim como com estruturas, o nome do tipo enumerado é usado para declarar variáveis do seu tipo.

O fragmento seguintes define uma enumeração chamada moeda e declara dinheiro para ser desse tipo: Dadas essas declarações, as seguintes utilizações são perfeitamente válidas: O ponto-chave para entender as enumerações é que cada um dos símbolos é representado por um valor inteiro. Assim sendo, eles podem ser usados em qualquer expressão válida com inteiros. A menos que seja inicializado de outra maneira, o valor do primeiro símbolo da enumeração é zero, o valor do segundo símbolo é 1, e assim por diante. Portanto exibe 0 2 na tela. É possível especificar o valor de um ou mais símbolos usando-se um inicializador. Isso é feito seguindo-se o símbolo com um sinal de igual e um valor inteiro. Sempre que um inicializador é usado, aos símbolos que aparecem depois dele são associados valores maiores que o valor de inicialização anterior. Por exemplo, a linha seguintes atribui o valor 100 para quarter. Agora, os valores desses símbolos são os seguintes: penny 0 nickel 1 dime 2

quarter 100 half_dollar 101 dollar 102 Uma suposição comum, mas errônea, feita a respeito das enumerações é que os símbolos podem ser atribuídos e exibidos diretamente. Esse não é o caso. Por exemplo, o seguinte fragmento de código não procederá como desejado. LEMBRE-SE: O símbolo dollar é simplesmente um nome para um inteiro; não é uma string. Pelo mesmo motivo, não é possível usar este código para se obter os resultados desejados. Isto é, uma string que contém o nome de um símbolo não é convertida automaticamente naquele símbolo. Criar um código para entrada e saída de símbolos enumerados é bastante monótono (a menos que se esteja disposto a tornar claro os seus valores inteiros). Por exemplo, o código seguinte é necessário para exibir, em palavras, o tipo de moeda que dinheiro contém:

Algumas vezes, é possível declarar uma matriz de strings e usar o valor de uma enumeração como índice na transformação de uma valor enumerado na sua string correspondente. Por exemplo, este código também produzirá a string apropriada: ; Esse código funcionará se nenhuma inicialização de símbolos for usada, uma vez que a matriz de strings deve ser indexada começando em zero. Por exemplo, este programa imprime os nomes das moedas: Como os valores enumerados devem ser convertidos manualmente nos valores correspondentes em português para E/S no console, eles encontram grande uso em rotinas que não fazem tais conversões. É comum ver uma enumeração ser usada para definir uma tabela de símbolos de um compilador, por exemplo, que não requer interações com usuários.

Typedef A linguagem C permite definir explicitamente novos nomes de tipos de dados usando-se a palavra reservada typedef. Não se cria um novo tipo de dado, mas, ao contrário, define-se um novo nome para um tipo existente. Este processo pode auxiliar programas dependentes de máquinas a serem portáveis; somente a declaração typedef tem de ser modificada. Ele também auxilia na documentação do seu código por permitir nomes descritivos para tipos de dados padrões. A forma geral da declaração typedef é: typedef tipo_nome; Onde tipo é qualquer tipo de dado permitido e nome é o novo nome para esse tipo. O novo nome definido é uma adição, não uma substituição, ao nome existente. Por exemplo, pode-se criar um novo nome para o tipo float usando-se Essa declaração diz ao compilador para reconhecer flutuante como um outros nome para float. A seguir, pode-se criar uma variável float usando-se flutuante: Aqui, atraso é uma variável de ponto flutuante do tipo flutuante, que é um sinônimo para float. Por exemplo: Pode-se usar typedef para criar nomes para tipos mais complexos também.

Nesse exemplo, cliente não é uma variável do tipo cliente_tipo mas, ao contrário, um outro nome para struct cliente_tipo. A utilização de typedef pode ajudar a tornar códigos mais fáceis de serem lidos e portados para outro computador. Não está sendo criado qualquer tipo de dado novo.

Referências DEVMEDIA. Conversões de dados implícitas e explícitas em C#. Disponível em: <http://www.devmedia.com.br/conversoes-de-dados-implicitas-e-explicitas-em-c/268 13>. Acesso em: 31 jul. 2017. FACULDADE DE CIêNCIAS APLICADAS DE CASCAVEL (Pr). Linguagem c/c++. Cascavel: União Pan-americana de Ensino, 2004. MICROSOFT. Tipos de dados primitivos e derivados. Disponível em: <https://msdn.microsoft.com/pt-br/library/ms761405(v=vs.85).aspx>. Acesso em: 01 ago. 2017. SCHILDT, Hebert. C: Completo e Total. 3. ed. São Paulo: Makron Books, 1996.