UFCG - Apostila de Linguagem de Programacao C

download UFCG - Apostila de Linguagem de Programacao C

of 40

Transcript of UFCG - Apostila de Linguagem de Programacao C

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    1/40

    Agosto/2002

    UNIVERSIDADE FEDERAL DE CAMPINA GRANDE

    CENTRO DE CINCIAS E TECNOLOGIA

    DEPARTAMENTO DE SISTEMAS E COMPUTAO

    INTRODUO PROGRAMAO

    Linguagem de Programao CRoberto Medeiros de Faria

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    2/40

    Linguagem de Programao C

    2

    NDICE

    INTRODUO 04

    REGRAS E COMANDOS DA LINGUAGEM C 06

    Principais Extenses 06

    Bloco De Cdigo (Marcadores de Bloco {} ) 06

    Ponto-e-vrgula (;) 06

    Comentrios(/* comentrio */ ) 06

    Identificadores 06

    Tipos de Dados 07Modificadores de Tipos 07

    Definio de Variveis 08

    Atribuio e Inicializao de Variveis 09

    Operadores 09

    Incremento e Decremento 09

    Expresses de Atribuio 10

    Atribuies Mltiplas 10

    Prioridade dos Operadores 11

    Notao Hexadecimal e Octal 12

    Constante Caractere 12

    Constante de Caracteres Especiais 12

    Constante Cadeia de Caracteres (String) 13

    Converso de Tipo 13

    SADA DE DADOS 15

    ENTRADA DE DADOS 17

    CONTROLE DE FLUXO 18

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    3/40

    Linguagem de Programao C

    3

    Comando if 18

    Expresso Condicional (forma compacta para oif ) 18

    Comando switch 19

    Comandowhile 19

    Comando for 20

    Comandobreak 21

    Comando continue 21

    DIRETIVAS DE COMPILAO 22

    Diretiva #define 22Diretiva #include 22

    VETORES 24

    Vetores de uma dimenso 24

    Sem Verificao de Limites 25

    Vetores unidimensionais so conjuntos 25

    Vetores bidimensionais ou matrizes 26

    STRINGS (cadeias de caracteres) 27

    Lendo uma string pelo teclado 27

    Algumas funes de bibliotecas com strings 28

    A funo strcpy() 28

    A funo strcat() 28

    A funo strcmp() 28

    A funo strlen() 29

    Usando o terminador \0 (NULL) 29

    APONTADORES 30

    Varivel Apontador 30

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    4/40

    Linguagem de Programao C

    4

    Operadores de Apontadores 30

    Expresses com Apontadores 31

    Atribuio com Apontadores 31

    Aritmtica com apontadores 32Inicializao de apontadores 32

    Alocao dinmica 32

    As funes malloc() e free() 33

    FUNES 35

    ESTRUTURAS 36

    Operador de Seleo 36

    Rtulo 36

    Inicializao de Estruturas 37

    ARQUIVOS 38

    Funo fopen() 38

    Funo fwrite() 39

    Funo fread() 39

    Macro feof() 39

    Funo fclose() 39

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    5/40

    Linguagem de Programao C

    5

    INTRODUO

    C uma linguagem de programao desenvolvida nos Laboratrios Bell, por voltade 1972, tendo sido projetada e escrita por Dennis Ritchie, que trabalhava junto com KenThompson no sistema operacional UNIX. Esse sistema foi concebido como um conjuntode ferramentas para engenheiros de software, das quais C se tornou a mais bsica.Quase todos os utilitrios do UNIX, seu ncleo e o compilador C so escritos em C.

    A grande fora de C a habilidade para construir programas complexos comoelementos simples, tanto que seu lema poderia ser "muito com pouco".

    O C destinado a construo de software bsico, ou seja, linguagens deprogramao, sistemas operacionais, geradores de programas, processadores de texto,etc.

    A linguagem C pode ser considerada uma linguagem de mdio nvel. O C oferece

    recursos de baixo nvel permitindo a especificao de todos os detalhes na lgica de umprograma, alcanando a mxima eficincia computacional, como tambm possui umrelativo alto nvel para abstrair os detalhes da arquitetura do computador.

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    6/40

    Linguagem de Programao C

    6

    REGRAS E COMANDOS DA LINGUAGEM C

    Principais Extenses

    Os tipos arquivos mais comuns envolvidos na edio, compilao, linkedio eexecuo de um programa C, tm as seguintes terminaes padro:

    .C - Arquivo contendo o Cdigo Fonte do programa representado por umaseqncia de caracteres ASCII;

    .H - Arquivos cabealhos (header). Definies em cdigo fonte para o programa eBibliotecas pr-compiladas.

    .OBJ - Arquivo objeto gerado a partir da compilao do cdigo fonte.

    .EXE - Cdigo executvel. Resultado da juno de um ou mais arquivos objetos ebibliotecas padres pelo processo de linkedio.

    Bloco de Cdigo (Marcadores de Bloco {} )

    Um bloco de cdigo um grupo de comandos de programa, conectadoslogicamente, que o compilador trata como uma unidade. A sintaxe da linguagem C paracrio de um bloco uma seqncia de comando entre chaves. As chaves so usadaspara delimitar um comando composto ou bloco de comandos - equivalente aobegin ...end da linguagem Pascal.

    Ponto-e-Vrgula (;)O ponto-e-vrgula um terminador de comando e indica o final de um comando.

    Comentrios ( /* comentrio */ )

    Tudo que estiver entre /* e */ considerado um comentrio e ser ignorado pelocompilador. Os comentrios no interferem na execuo do programa. Os comentriospodem aparecer em qualquer parte do programa.

    Identificadores

    A linguagem C define identificadores como sendo nomes usados para se fazerreferncia a entidades do programa (variveis, funes, rtulos, etc.) definidas peloprogramador. Em C, um identificador composto de um ou mais caracteres, sendo que,para identificadores internos, os 31 primeiros so significativos. O primeiro caractere deveser uma letra ou um sublinha (_) e os caracteres subseqentes devem ser letras, nmerosou sublinhas. Alguns compiladores C tambm permitem que voc use um cifro ($) dentrode um identificador, mas no como o caractere inicial. Eis aqui alguns exemplos deidentificadores corretos e incorretos:

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    7/40

    Linguagem de Programao C

    7

    Corretos Incorretos

    cont 1contvalor23 al

    total_geral total..geraltotalGeral valor-total

    Isto quer dizer que se duas variveis tm em comum os 31 primeiros caracteres ediferem apenas a partir do trigsimo segundo, o compilador C no ser capaz dedistingui-Ias. Por exemplo, esses dois identificadores so iguais:

    isto_e_um_exemplo_de_um_nome_longoisto_e_um_exemplo_de_um_nome_longo_tambm

    Uma outra observao que em C as letras maisculas e minsculas so tratadasde maneira diferentes. Por exemplo, cont, Cont e CONT so trs identificadores distintos.

    Um identificador no pode ser igual a uma palavra reservada do C e no deve ter omesmo nome das funes que voc escreveu ou daquelas que esto pr-definidas nasbibliotecas do C.

    Quando um identificador for composto por vrias palavras, deve-se separa-las comsublinha ou iniciar cada palavra, a partir da segunda, com letra maiscula.

    Exemplos:

    valor_convertido_para_celciusvalorConvertidoParaCelcius

    Tipos de Dados

    Existem cinco tipos primitivos de dados em C: caractere, inteiro, ponto flutuante,ponto flutuante de preciso dupla e sem valor. As palavras reservadas usadas paradeclarar variveis desse tipo so char, int, float, double, void, respectivamente. A tabelaabaixo representa o valor e a escala de cada tipo de dado em C.

    Tipo Blts Valor char 8 -128 a 127Int 16 -32768 a 32767float 32 3.4E -38 a 3.4E+38doubl 64 1.7E-308 a 1.7E+308void 0 sem valor

    Modificadores de Tipos

    Com exceo do tipo void , os tipos primitivos podem ser precedidos pormodificadores. O modificador usado para alterar o significado do tipo-base para que ele

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    8/40

    Linguagem de Programao C

    8

    se adapte de maneira mais precisa s necessidades das vrias situaes. Osmodificadores de tipo so:

    signedunsignedlong

    short

    Abaixo esto todas as possibilidades para relacionar os tipos primitivos com osmodificadores de tipo. Embora permitido, o uso designed com Inteiros redundante.porque a declarao revelia (default) dos inteiros assume um nmero com sinal.

    Tipo Bits Valor Char 8 -128 a 127unsigned char 8 o a 255signed char 8 -128 a 127Int 16 -32768 a 32767unsigned int 16 0 a 65535signed int 16 -32768 a 32767short int 16 -32768 a 32767unsigned short int 16 0 a 65535signed short int 16 -32768 a 32767long int 32 -2147483648 a 2147483647signed long int 32 -2147483648 a 2147483647

    unsigned long int 32 0 a 4294967295Float 32 3.4E-38 a 3.4E+38Doubl 64 1.7E-308 a 1.7E+308long double 90 3.4E-4932 a 1.1 E+4932Void 0 sem valor

    A diferena entre inteiros com sinal e inteiros sem sinal est na maneira com que ocomputador interpreta o bit de ordem superior (mais esquerda) do inteiro. Se vocespecificar um inteiro com sinal, ento o compilador do C gerar um cdigo que assumirque ele deve usar o bit de ordem superior de um inteiro para representar o sinal. Se o bitde sinal zero, ento o nmero positivo; se o bit de sinal um, ento o nmero negativo. Para o inteiro sem sinal, o bit de maior ordem representa um dgito binrio comoos demais e no h representao de sinal o valor sempre positivo.

    Definio de Variveis

    Definir uma varivel cria-la na memria (aloca-la), dar a ela um nome eespecificar o tipo de dado que nela vai armazenar.

    Sintaxe:

    tipo lista-de-identificadores;

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    9/40

    Linguagem de Programao C

    9

    O tipo deve ser um tipo de dado vlido em C, e lista-de-identificadores podeconsistir em um ou mais identificadores separados por vrgula. Exemplos:

    int soma ;unsigned char i,j,k ;float salrio;

    signed long [int] x;unsigned int idade;short int y;long caminho, estado;unsigned valor;

    Atribuio e Inicializao de Variveis

    O smbolo usado como operador para atribuir o valor de uma expresso a umavarivel o igual (=). Exemplos:

    soma = 10;d e l t a = b * b 4 * a * c ;

    A atribuio tambm pode ser feita diretamente na declarao. Exemplos:

    int soma = 10;char i = 3 + 2;

    Operadores

    Relacionais:== (igual a);!= (diferente de);> (maior do que);< (menor do que);>= (maior ou igual a);

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    10/40

    Linguagem de Programao C

    10

    && (conjuno and e).

    Incremento e Decremento

    Na linguagem C existem operadores especiais para as operaes de incremento(adicionar um) e decremento (subtrair um) de variveis.

    Suponha que uma varivel y deva ser incrementada de uma unidade antes de seuvalor ser atribudo varivel x, temos ento o seguinte trecho de programa:

    y = y + 1 ;x = y ;

    Usando o operador de incremento pr-fixado, o mesmo trecho do programa acimapode ser reduzido a:

    x = ++y;

    Com a operao de incremento ps-fixado, temos:

    x = y++;

    Dessa formal y atribudo a x para depois ser incrementado, ou seja:

    x = y ;

    y = y + 1 ;

    O mesmo raciocnio se aplica quando se trata de uma operao de decremento. Ooperador de decremento subtrai um do valor de uma varivel. O operador de decrementopode ser tambm, pr-fixado e ps-fixado.

    Expresses de Atribuio

    usada para substituir trechos de programas, como por exemplo:

    x = x + y ;

    Usando expresso de atribuio teramos o mesmo trecho, escrito como:

    x += y;

    Ou seja, quando a varivel a que se atribuir o valor da expresso igual aoprimeiro operando e na expresso s se tem um nico operador, pode-se utilizarexpresses e atribuio.

    Esta forma se aplica as quatro operaes elementares e ao resto da diviso inteira(+=, -=, *=, /=, %= ).

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    11/40

    Linguagem de Programao C

    11

    Atribuies Mltiplas

    Usadas para na iniclalizar vrias variveis com um nico valor de uma expresso.Exemplo:

    x = y = z = 0;

    importante observar que o valor zero atribudo s variveis em ordem da direitapara esquerda. Ento, a mesma expresso, com parnteses (para indicar aassociatividade) seria:

    x = (y = (z = 0));

    Ou seja, seria o mesmo que escrever as atribuies separadamente:

    z = 0 ;y = 0 ;x = 0 ;

    Prioridade dos Operadores

    multo importante que saibamos a precedncia e associatividade dos operadores,para que uma expresso seja avaliada e tenha o resultado esperado. A tabela abaixo listatodos os operadores que iremos trabalhar. Alguns, voc j conhece.

    OPERADOR NVEL NOME [ ] arrav( ) funo-> membro.

    1

    membro! negao~ complemento++ incremento-- decremento- menos unrio

    (tipo) Cast* indireco& endereo

    Sizeof

    2

    tamanho do objeto* multiplicao / diviso% resto da diviso inteira+ adio-

    3

    subtrao

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    12/40

    Linguagem de Programao C

    12

    >> deslocamento direita< menor que maior que>=

    5

    maior ou igual a== igual a!= 6 diferente de& 7 e para bits^ 8 ou para bits (exclusivo)| 9 ou para bits

    && 10 e lgico|| 11 ou lgico? 12 expresso condicional

    = 13 atribuico, 14 multipla expresso

    Notao Hexadecimal e Octal

    Dependendo do tipo de aplicao que estamos trabalhando, as vezes, maiscmodo usar a notao hexadecimal ou a octal.

    Para indicarmos que um valor est escrito em hexadecimal, devemos inici-Io com0x.

    Exemplo:

    vbit = 0xFA14;flag = 0xFF;

    Para valores octais basta iniciar com 0.

    Exemplo:

    voct = 0123;

    masc = 088;

    Note que 09 um nmero em octal e portanto diferente de 9 em decimal.

    Constante Caractere

    Uma constante caractere em C delimitada por apstrofo (').

    Exemplo:

    'a', 'b', '1', '0' , 9

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    13/40

    Linguagem de Programao C

    13

    Constante de Caracteres Especiais

    As constantes de caracteres especiais so representadas da mesma forma que asconstantes de caracteres comuns, porm, caso o caractere no tenha representaovisual ou seu uso confunda a verificao sinttica da linguagem C, usa-se o caracterecontra-barra (barra invertida) para auxiliar na sua representao. A tabela abaixo ilustraalguns dos usos do caractere contra-barra ('\') na representao na representao decaracteres especiais.

    SEQNCIA VALOR SIGNIFICADO '\0' 0 finalizador de um string(NULL)'\8' 0x07 apito sonoro (bell)'\b' 0x08 retrocesso (backspace)

    '\f 0x0C avano para o incio de outra folha'\n' 0x0A avano de linha (new line)'\r' 0x0D retorno do cursor (return) \t' 0x09 tabulao horizontal (tab)'\v' 0x0B tabulao vertical'\\' 0x5C barra invertida (contra-barra)\ 0x27 apstrofo\ 0x22 aspas

    Constante Cadeia de Caracteres (String)Toda seqncia de caracteres que estiver entre aspas (").

    Exemplos:

    "Empresa de Demonstrao", "123.456"

    Converso de Tipo

    Quando operadores de tipos diferentes aparecem em expresses aritmticas, elesso convertidos para um tipo comum (default), de acordo com as seguintes converses:

    char e short so convertidos para int;

    float convertido para double.

    Argumentos passados para uma funo tambm esto sujeitos a regras deconverso.

    H ainda a possibilidade de converso forada (cast) em uma expresso, com a

    construo:

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    14/40

    Linguagem de Programao C

    14

    (tipo)expresso;

    Esta construo converte a expresso para o tipo "tipo". Por exemplo, a funosqrt() da biblioteca C, espera sempre um argumento em preciso dupla assim se tivermosuma varivel numero do tipo inteiro sua raiz deve ser calculada como:

    raiz =sqrt((double)numero);

    Exemplo:

    char i;unsigned char k;int j;i = (char)j;k = (unsigned char)i;j = (unsigned char)calcxy(); /* converte o retorno da funo

    */

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    15/40

    Linguagem de Programao C

    15

    SADA DE DADOS

    Sintaxe:

    printf("cadeia de controle", lista-de-argumentos) ;

    A cadeia de controle especifica o formato de sada da lista-de-argumentos. Atabela abaixo mostra os cdigos que podem ser usados na cadeia de controle comoespecificao de formato:

    CDIGO FORMATAO %c caractere%d decimal%f ponto flutuante

    %u decimal sem sinal%x hexadecimal%o octal%p apontador%s Cadeia de caracteres (string)%e notao cientfica (exponencial)

    Os cdigos de formatos podero ter especificaes da largura do campo, nmerode casas decimais e o indicador de alinhamento esquerda. Um inteiro colocado entre o

    sinal (%) e o comando de formatao atua como especificador da largura de campomnima, o que preenche a sada com brancos ou zeros para assegurar que tenha aomenos um campo mnimo. Caso uma srie ou um nmero sejam maiores que o mnimo,sero completamente impresso, mesmo que ultrapasse o mnimo. O preenchimentonormal feito com espao, Caso voc queira preencher com zeros, basta colocar um zeroantes do especificador de largura de campo. Por exemplo %05d vai preencher um nmerocomo menos de cinco dgito, com 0's a esquerda.

    Para especificar o nmero de casas decimais impressas para um nmero empontos flutuante. coloque um ponto decimal seguido pelo nmero de casas decimais quevoc quer apresentar, aps o especificador de largura de campo. Por exemplo %10.4fapresentar um nmero com pelo menos 10 caracteres de comprimento, com quatrocasas decimais. Esse mtodo tambm funciona quando voc quer especificar ocomprimento mxImo do campo, para string e valores inteiros. Por exemplo, %5.75apresentara um string com pelo menos cinco caracteres de comprimento e que noexceda sete. Caso o string seja mais comprido que a mxima largura do campo. oscaracteres sero truncados na extremidade final.

    Como condio normal, toda sarda alinhada pela direita: se a largura do campofor mais larga que os dados impresso, os dados sero colocados no lado direito docampo. Voc pode formatar a informao a ser colocada no lado esquerdo, pelacolocao de um sinal de menos logo aps %. Por exemplo, %-10.2f far um alinhamento esquerda.

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    16/40

    Linguagem de Programao C

    16

    Exemplos:

    printf( "Empresa de Demonstrao ) ;printf( "%s", "Empresa de Demonstrao);printf( %c", B);printf("%5d", 100);

    printf("%-05d", 100);

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    17/40

    Linguagem de Programao C

    17

    ENTRADAS DE DADOS

    Sintaxe:

    scanf("cadeia de controle", )

    A cadeia de controle especifica o tipo de dados que se deseja ler do teclado. Atabela abaixo mostra os cdigos que podem ser usados na cadeia de controle:

    CDIGO SIGNIFICADO %c ler um caractere%d ler um inteiro%f ler um nmero em ponto flutuante%x ler um nmero em hexadecimal%o ler um nmero em octal%s ler uma cadeia de caracteres (string)

    Todos os argumentos devem ser precedido do sinal &. Por exemplo se voc quiserler um inteiro para a varivel inteira cont, dever utilizar o seguinte comando:

    scanf("%d", &cont);

    Os comandos de formatao podem utilizar modificadores de largura de campo,formados por nmeros inteiros colocados entre o sinal % e o cdigo de formatao. Se for

    colocado um *, a funo scanf() avanar para o prximo campo de entrada.Exemplos:

    scanf("%c", &op);scanf("%30s", &nome);scanf("%d", &idade);scanf("%d %c", &ld, &ch);

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    18/40

    Linguagem de Programao C

    18

    CONTROLE DE FLUXO

    Comando if

    Sintaxe:if(condio)

    comando1;else

    comando2;

    Caso a condio seja verdadeira, ou seja, o valor da expresso condicional sejadiferente de zero, o comando1 ser executado; caso contrrio, ser executado ocomando2.

    A clusulaelse opcional.Os comandos, tanto no if quanto noelse , podem ser comandos de blocos.

    Exemplo:

    void main() {int valorA, valorB;scanf("%d %d", &valorA, &valorB);if(valorA > valorB) {

    printf("%d ", valorA);

    }else {

    printf("%d ", valorB);}

    }

    Expresso Condicional (forma compacta para o if )

    Existe uma forma mais prtica, porm menos legvel, para uma expressocondicional. Essa forma bastante usada na definio de macros.

    Sintaxe:

    identificador = condio ? exp1 : exp2;

    Exemplo:

    m a x = a > b ? a : b ;

    A expresso acima equivalente a:

    if(a > b) {max = a;

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    19/40

    Linguagem de Programao C

    19

    }else {

    m a x = b ;}

    Comando switch

    Sintaxe:

    switch(expresso-inteira) {case constante-inteira-1:

    comando1;break;

    case constante-inteira-2:comando2;break;

    default:comandoN;

    }

    O comandos break e a clusula default so opcionais.

    O switch executar o primeiro bloco de comando em que a varivel coincidir com aconstante at encontrar um break. Caso nenhuma constante seja igual ao valor davarivel a clusula default ser avaliada.

    Exemplo:

    switch(ch) {case '1':

    printf("opo um escolhida");break;

    case '2':printf("opo dois escolhida");

    break;case '3':case '4':

    printf("opo escolhida foi trs ou quatro");

    default: printf("escolha um, dois, trs ou quatro");}

    Comando while

    Sintaxe:

    while(condio)comando;

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    20/40

    Linguagem de Programao C

    20

    O comando pode ser um nica declarao ou um bloco de comandos que devemser repetidos. A condio pode ser qualquer expresso em que a verdade qualquervalor diferente de zero.

    Exemplo:

    void main() {int valor = 10;while(valor >= 10) {

    printf("%d", valor);}

    }

    Comando for

    Dos comandos vistos at agora, o comando for o mais completo. Sua sintaxe esemntica difere, e muito, das outras linguagens.

    Sintaxe:

    for([lista-de-exp1]; [exp2]; [lista-de-exp3>])comando;

    Onde:

    lista de exp1 - uma lista de expresses de inicializao;

    exp2 uma expresso condicional;lista de exp3 uma lista de expresses de reinicializao.

    Semntica:

    1o.) as expresses de Inlcializao so executadas.

    2o.) a expresso condicional avaliada; se for zero (falsa), o lao terminar; se fordiferente de zero (verdadeira), os comandos internos sero executados, e em seguida, executada a lista de expresses de reinicializaao.

    Exemplos:

    for(i=0; i

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    21/40

    Linguagem de Programao C

    21

    c++;}

    for(; ; ); /* comando vazio lao eterno */

    Comando break

    O comando break usado para interromper o lao dos comandos while, for edo...while.

    Comando continue

    O comando continue provoca uma nova avaliao da expresso de controle doscomandos de repetio.

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    22/40

    Linguagem de Programao C

    22

    DIRETIVAS DE COMPILAO

    O Pr-processador

    Conceitualmente, o pr-processador C um filtro que executado antes docompilador. Ele executa substituies textuais, incluso de arquivos, e capaz deprocessamento condicional. Todas as diretivas para o pr-processador comeam comosinal cardinal #, que deve ocorrer no comeo da linha.

    Diretiva #define

    Existem duas formas da diretiva define. A primeira #define identificador string-chave e faz com que o identificador seja substitudo pela cadeia de caracteres chave ondequer que ele ocorra no mdulo fonte:

    #define identificador(identificador,...) string-chave

    A segunda forma :

    No permitido espao em branco entre o primeiro identificador e o parntesesesquerdo. Esta forma capas de substituies mais complexas; assim

    #define min(A,B) A

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    23/40

    Linguagem de Programao C

    23

    pesquisa primeiros no seu prprio diretrio. Como regra geral, use < > para incluirarquivos gerais do C, como:

    #include

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    24/40

    Linguagem de Programao C

    24

    VETORES

    Um vetor uma coleo de variveis do mesmo tipo que so referenciadas pelomesmo nome. Na Linguagem C, um vetor consiste em locaes contguas de memria. Oendereo mais baixo corresponde ao primeiro elemento, e o mais alto corresponde aoltimo elemento. Um vetor pode ter de uma a vrias dimenses. Voc acessa umdeterminado elemento em um vetor usando ndice.

    O vetor que voc vai usar a de caracteres. Como C no tem tipo de dadosstring intrnseco, ele usa os vetores de caracteres. Como voc ver em breve esse mtodo delidar com strings concede mais fora e flexibilidade que as linguagens que usam tiposstrings especiais.

    Vetores de Uma Dimenso

    A forma geral da declarao de um vetor :tipo nome-var [tamanho];

    Aqui, tipo declara o tipo base do vetor. O tipo base determina o tipo de dado decada elemento do vetor. O tamanho define quantos elementos o vetor conter. Porexemplo, segue.se a declarao de um vetor de inteiros chamado amostra que temtamanho de 10 elementos:

    int amostra[10];

    Em C, todas os vetores usam zero como ndice do primeiro elemento. Portanto oexemplo acima declara um vetor de inteiros que ter 10 elementos: amostra[0] atamostra[9]. Por exemplo, o programa a seguir carrega um vetor de inteiros com nmerosde 0 a 9:

    main() {int x[10]; /* isto reserva 10 elementos inteiros */int t;for (t=0; t

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    25/40

    Linguagem de Programao C

    25

    main() {int amostra[10], i, med;for (i=0; i

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    26/40

    Linguagem de Programao C

    26

    main () {char ch[7];int i;for (i=O; i

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    27/40

    Linguagem de Programao C

    27

    STRINGS (Cadeias de Caracteres)

    At agora, o uso mais comum dos vetores unidimensionais criar strings (cadeias)de caracteres. Em C, um string consiste em um vetor de caracteres terminada em zero.Um zero especificado como '\0'. Por essa razo, voc deve declarar os vetores decaracteres como sendo um caractere maior que o maior string que voc quer que elescontenham. Por exemplo, se voc declarar um vetor str que conter um slring de dezcaracteres, voc escrever:

    char str[11];

    Esta declarao deixa espao para o zero no final do string.

    O C, embora no tenha o tipo de dado string, ainda assim permite constantesstring. Lembre-se que uma constante string uma lista de caracteres que aparecem entreaspas. Eis aqui dois exemplos:

    "bom dia""isto um teste"

    Voc no precisa acrescentar o zero manualmente no final das constantes string. Ocompilador C faz automaticamente. Assim, o string "bio" ficar na memria da seguintemaneira:

    Lendo um string pelo teclado

    A melhor maneira de inserir uma string atravs do teclado usar a funo debiblioteca gets(). A forma geral de gets() :

    gets(nome-do-vetor);

    Para ler um string, voc chama gets() com o nome-do-vetor, sem qualquer ndicecomo argumento. De acordo com o retorno de gets(), o vetor conter o string introduzidopelo teclado. A funo gets() continuar at que voc insira um carriage return.

    void main() {char str[80];

    gets(str);printf("%s", str);

    }

    Note que voc pode usar str como argumento de printf(). Note tambm que oprograma usa o nome do vetor sem um ndice. Por motivos que ficaro claros

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    28/40

    Linguagem de Programao C

    28

    posteriormente, voc tambm pode usar o nome de um vetor de caracteres sem ndice,desde que ela contenha um string em qualquer lugar onde voc possa usar umaconstante string.

    Tenha em mente que gets() no efetua nenhuma verificao de limites no vetorcom o qual ela e chamada. Portanto, se voc inserir um string maior que o tamanho dovetor, esse vetor ser sobrescrito.Algumas funes de bibliotecas para usar com strings

    A funo strcpy()

    A chamada da funo strcpy() tem a forma geral:

    strcpy(destino, origem);

    Voc usa a funo strcpy() para copiar o contedo do string origem para destino.

    Lembre-se de que o vetor destino deve ser grande o bastante para conter o stringem origem. Se destino no for suficientemente grande, o vetor ser transposto eprovavelmente danificar seu programa. Por exemplo:

    void main() {char str[80];

    strcpy(str, "bio");}

    A funo strcat()

    Para se chamar a funo strcat(), usa-se esta forma:

    strcat(s1, s2)

    A funo strcat() anexa s2 ao final de s1; s2 fica inalterada. Ambos os stringsdevern ser encerrados por um \0, e o resultado tambm ser encerrado por \0.

    void main() {

    char primeiro[20], segundo[10];

    strcpy(primeiro, "bom");strcpy(segundo. "dia");strcpy(primeiro, segundo);printf("%s", primeiro);

    }

    A funo strcmp()

    Para chamar a funo strcmp(), usa-se esta forma geral:

    strcmp(s1, s2);

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    29/40

    Linguagem de Programao C

    29

    A funo strcmp() compara dois strings e devolve 0 se eles forem iguais. Se s1 forlexicograficamente maior que s2, ento a funo devolver um nmero positivo; se s1 formenor que s2, a funo devolver um nmero negativo.

    A funo strlen()

    A forma geral da chamada de uma funo strlen() strlen(s) onde s um string. Afuno strlen() devolve o comprimento de um string para a qual s aponta.

    Exemplo:

    void main() {char str[80];

    printf(digite um string: )gets(str);printf("%d", strlen(str));

    }

    Usando o terminador \0 (NULL)

    Voc pode fazer bom uso do fato de todos os strings terminarem em \0 parasimplificar vrias operaes com strings. Por exemplo, veja como voc precisar depouco cdigo para tornar maisculo cada caractere de uma string:

    void main() {char str[80];int i;

    strcpy(str, "isto um teste");for (i=0; str(i); i++) {

    str[i] = toupper(str[i];}printf("%s", str);

    }

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    30/40

    Linguagem de Programao C

    30

    APONTADORES

    Um apontador uma varivel que contm um endereo de memria. Ou seja, esseendereo a localizao de uma outra varivel na memria. Se uma varivel contm oendereo de uma outra varivel, ento detemos que a primeira aponta para a segunda.Analise o esquema abaixo:

    Endereo na memria Varivel na memria1000 10031001100210031004

    Memria

    Varivel Apontador

    Se uma varivel ir conter um apontador, ento voc precisa declara-la como umavarivel do tipo apontador. A forma geral :

    tipo *nome-da-varivel

    onde o tipo pode ser qualquer tipo base vlido em C, e nome-da-varivel umidentlficador vlido. Por exemplo, estes comandos declaram apontadores a inteiros ecaracteres:

    char *p;

    int *temp, *inicio;

    Operadores de Apontadores

    Existem dois operadores especiais de apontadores:* e &, que so operadoresunrios. Por exemplo:

    x = &y;

    Coloca em x o endereo de memria da varivel y. Esse endereo a localizaointerna da varivel na memria do computador. O endereo no tem nada a ver com ovalor de y. Voc pode se lembrar da operao de & devolvendo "o endereo de" para a

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    31/40

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    32/40

    Linguagem de Programao C

    32

    printf("%p", p2); /* exibe o valor do endereo de x,no o valor de x */

    }

    Aritmtica com apontadores

    Em C, voc pode ter apenas duas operaes aritmticas com apontadores: + e -.para entender o que ocorre na aritmtica com apontadores, suponha que p1 seja umapontador para um inteiro com valor corrente de 2000. Depois da expresso:

    p1++;

    o contedo de p1 ser 2002 e no 2001. Cada vez que o computador incrementap1, ele aponta para o prximo inteiro. O mesmo verdade para os decrementos. Porexemplo:

    p1--;

    far com que p1 tenha o valor 1998, se anteriormente tivesse o valor 2000.

    Cada vez que o computador incrementa um apontador, ele aponta para alocalizao de memria do prximo elemento de seu tipo-base. Cada vez que ocomputador decrementa, ele aponta para a localizao do elemento anterior. No caso dosapontadores para caracteres, a aritmtica com apontadores, em geral, se parece com a"normal". Porm, todos os outros apontadores aumentam ou diminuem de acordo como ocomprimento do tipo de dado para o qual aponta.

    Inicializao de apontadores

    Depois que voc declara um apontador, mas antes de lhe atribuir um valor, eleconter um valor desconhecido. Se tentar usar um apontador antes de atribuir-Ihe umvalor, voc provavelmente danificar no apenas o programa mas tambm o sistemaoperacional. Por conveno, voc deve dar a um apontador que no aponta para lugarnenhum o valor nulo (null), para indicar esse fato. Porm o fato de um apontador tersimplesmente o valor nulo no o torna "seguro" para ser usado. Se voc usar umapontador nulo ao lado esquerdo de um comando de atribuio, ainda correr o risco dedanificar seu programa.

    Por enquanto, a forma mais segura de nicializar um apontador atribuir-Ihe oendereo de uma varivel declarada. Como por exemplo:

    int x = 4;int *y;y = &x;

    Alocao dinmica

    Existem dois mtodos principais por meios dos quais um programa em C podearmazenar informaes na memria principal do computador. O primeiro usa as variveis

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    33/40

    Linguagem de Programao C

    33

    locais e globais que C define. No caso das variveis globais, o armazenamento fixadodurante o tempo de execuo de seu programa. Para essas variveis, o programa alocaarmazenamento no espao da pilha do computador. Embora as variveis locais sejameficientemente implementadas em C. elas exigem que voc saiba, de antemo, omontante de memria necessria para cada situao.

    O segundo mtodo que o programa pode usar para armazenar informaes atravs das funes de alocao dinmica do C,malloc() e free() . Nesse mtodo umprograma aloca armazenamento para informaes da rea de memria livre chamadaheap (ou rea de alocao dinmica), que fica entre seu programa, com sua rea dearmazenamento permanente, e a pilha. Examine a figura a seguir:

    A figura mostra a forma conceitual como um programa aparece na memria. Apilha cresce de cima para baixo na medida em que o programa a usa; portanto o desenhodo programa determina a quantidade de memria que ele precisa. Por exemplo, umprograma com muitas funes recursivas demandar muito mais memria da pilha queum programa que no tenha funes recursivas, porque as variveis locais e osendereos de retorno esto armazenados na pilha. Lembre-se de que o computador alocapermanentemente a memria exigida para o programa e dados globais durante a suaexecuo. O computador obtm memria da rea de memria livre para satisfazer umpedido de malloc() , iniciando exatamente acima das variveis globais e crescendo emdireo pilha.

    As funes malloc() e free()As funesmalloc() e free() formam o sistema de alocao dinmica do C e

    so parte de sua biblioteca. Elas trabalham juntas usando a regio de memria livre quefica entre seu programa e o comeo da pilha, para estabelecer e manter uma lista dememria disponvel.

    Cada vez que voc fizer um pedido de memriamalloc() , esta alocar uma partedo restante da memria livre. Cada vez que voc pedir uma liberao de memriafree() , esta devolver memria para o sistema.

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    34/40

    Linguagem de Programao C

    34

    A funomalloc() retorna um apontador do tipovoid , que significa que vocdever usar um cast explcito quando atribuir o apontador devolvido a um apontador dotipo que voc deseja. Depois de uma chamada bem sucedida,malloc() devolver umapontador para o primeiro byte da regio de memria que foi alocada. Se no houvermemria suficiente disponvel para satisfazer o pedidomalloc() , ocorrer um fracassona alocao e malloc() devolver um apontador nulo. Voc pode usarsizeof paradeterminar O nmero exato de bytes de que cada tipo de dado precisa. Fazendo isto,voc torna seus programas portteis a uma variedade de sistemas.

    Depois de usar free() para liberar memria, voc pode reus-Ia atravs de umaseqente chamada a malloc1(). Exemplo:

    void main() {int *p, t;p = (int *) malloc(40 * sizeof(int));if (!p) {printf(memria insuficiente\n);}else {for (t = 0; t < 40; ++t) {*(p+t) = t;}for (t = 0; t < 40; ++t) {prlntf("%d ", *(p+t));}free(p);}

    }

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    35/40

    Linguagem de Programao C

    35

    FUNES

    Sintaxe:

    tipo-r nome-da-funo(lista-de-declaraes-dos-parmetros) {declarao-de-variveis-locais;corpo-da-funo;

    }

    O tipo-r especifica tipo da expresso de retorno. Pordefault , quando o tipo-r omitido, o C assume que a funo do tipoint , ou seja a expresso de retorno inteira.Quando uma funo no retorna nenhum valor, dizemos que ela do tipovoid . Exemplo:

    max(int x, y) {int aux;

    i f ( x > y ) {aux = x;}else {

    a u x = y ;}return(aux);

    }

    A funo acima retornar o maior valor entre dois nmeros inteiros. Uma possvelchamada dessa funo seria:

    printf("O maior valor entre %d e %d %d",a, b, max(a,b));

    Todos sabemos que h duas formas de chamar uma funo. A primeira forma chamada por valor (ou passagem por valor). Esse mtodo copia o valor dos argumentosnos parmetros formais (parmetros declarados na funo). A funo max() declaradaacima um exemplo de chamada por valor.

    A segunda forma de passagem de argumentos para uma funo chamada porreferncia, onde o endereo de cada argumento compartilhado pelos parmetrosformais. Isso significa que as alteraes feitas nos parmetros afetam a os respectivosargumentos (variveis) utilizados para chamar a funo.

    Na chamada por referncia os parmetros devem ser declarados comoapontadores Veja o exemplo abaixo:

    troca(int x, y) {int aux;aux = *x;*x = *y;*y = aux;

    }

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    36/40

    Linguagem de Programao C

    36

    ESTRUTURAS

    Estruturas so grupos de variveis. Diferentemente de matrizes, podem sercompostas de tipos diferentes (inteiros, reais, ...). Elas so comparveis aos registro emoutras linguagens. Cada estrutura pode ser tratada como um todo ou por cada um deseus componentes.

    Sintaxe:

    struct rtulo {declarao-de-varivel;nome-da-varivel;

    };

    O rtulo opcional e ser discutido posteriormente. As declaraes de variveisso as mesmas j vistas. O nome da estrutura segue as mesmas regras dos nomes de

    variveis simples. Por exemplo:struct {

    char mes[10];int dia;int ano;

    } feriado;

    esse exemplo declara feriado como sendo uma estrutura que tem trs variveis.

    Operador de Seleo

    Cada membro da estrutura o equivalente a uma varivel simples de seu tipo. ooperador de seleo (.) utilizado para referenciar um membro de um estrutura. Porexemplo:

    feriado.mes[0] = 'B';feriado.dia = 1;feriado.ano = 94;

    Rtulo

    Uma estrutura pode receber um rtulo. Uma vez definida, ela pode ser utilizadapara declarar outras estruturas como os mesmos membros. Veja o seguinte exemplo:

    struct data {char mes[10];int dia;int ano;

    };

    Uma vez que data esteja definida, ela pode ser utilizada para declarar outrasvariveis. Por exemplo:

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    37/40

    Linguagem de Programao C

    37

    struct data diaDoAno, feriado;

    Inicializao de Estruturas

    A iniclalizao de estruturas assemelha-se muito como a inicializao de matrizes:

    struct data feriadao = {"FEVEREIRO", 1, 1994};

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    38/40

    Linguagem de Programao C

    38

    ARQUIVOS

    Os arquivos em C precisam ser explicitamente abertos e referenciados. As funesfopen() e fclose() so utilizadas, respectivamente para abrir e fechar arquivos.

    Cada arquivo aberto referenciado por um identificador de arquivo que deve ser dotipo FILE (estrutura definida no arquivo stdio.h no diretrio INCLUDE).

    Exemplo de declarao de um identificador de arquivo:

    FILE *id-arq;

    A tabela abaixo mostra algumas das funes e macros para manipulao comarquivos:

    FUNO AO fopen abre um arquivofwrite escreve dados em um arquivoFread ler dados de um arquivofclose fechar um arquivoFeof verifica se o apontador do arquivo atingiu a marca final do arquivo

    Funo fopen()

    Sintaxe:

    fopen("nome-arquivo", modo-de-acesso");

    Abre um arquivo e retorna um estrutura FILE que identificar arquivo ou streamassociado. Se fopen() no abrir o arquivo, um NULL retornado.

    O modo de acesso especificado pelos caracteres:

    r" abre um arquivo para leitura e o apontador posicionado no incio-do-arquivo."w abre um arquivo apenas para gravao; o arquivo ser criado se no existir;se o arquivo existir, todo o contedo do arquivo ser perdido (reset).

    a" abre um arquivo no modo de incluso; se o arquivo no existir, um arquivoser criado; caso exista, todas incluses sero feitas no final do arquivo.

    ilegal ler de arquivos que estejam abertos nos modos "w" ou "a", ou gravar emarquivos abertos no modo "r". Caso se deseje abrir um arquivo tanto para leitura comopara escrita, deve-se usar um "+" logo aps o modo desejado. Assim temos os seguintesmodos:

    "r+" abre um arquivo para leitura; o apontador posicionado no incio-do-

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    39/40

    Linguagem de Programao C

    39

    arquivo; gravao tambm permitida."w+ abre um arquivo para gravao; leitura tambm permitida."a+" abre um arquivo no modo de incluso; leitura tambm permitida.

    Funo fwrite()Sintaxe:

    fwrite(p, bytes, nmero, stream);

    A funo fwrite() usada para gravar um nmero de itens, do tamanhoespecificado em bytes, no stream (no traduzido), comeando na localizao de memriap. A funo retorna um nmero inteiro informando a quantidade de bytes realmentegravados. Se um zero for retornado, houve um erro na operao.

    Funo fread()Sintaxe:

    fread(p, bytes, nmero, stream);

    Para ler os dados gravados com fwrite() deve-se usar a funo fread(). A funoretornar um zero se ocorrer um erro, Caso contrrio, o numero de bytes realmentegravados.

    Macro feof()

    Retorna um inteiro deferente de zero ser o fim-de-arquivo foi lido no stream, ouseja, se o apontador de arquivo est posicionado no EOF (End-Of-File).

    Funo fclose()

    Sintaxe:

    fclose(stream)

    Fechar um arquivo descarregando o buffer a ele associado.Exemplo

    #include #include

    char buffer[] = "Ncleo de Informtlca

    int main (void) {FILE *id-arq;

    char buf-str[22];/* abre o arquivo no modo de escrita */

  • 8/2/2019 UFCG - Apostila de Linguagem de Programacao C

    40/40

    Linguagem de Programao C

    if ((id-arq = fopen("TEXTO.DAT, w )) == NULL) {printf("Erro na abertura do arquivo TEXTO.DAT");return 1;

    }/* escreve um string no arquivo */if (fwrite(buffer, sizeof(buffer), 1, id-arq) != 1) {

    printf( "Erro de escrita no arquivo TEXTO.DAT")return 1;

    }/* fecha o arquivo */if (fclose(id-arq) != 0) {

    printf("Erro no fechamento do arquivo TEXTO.DAT");return 1;

    }/* abre o arquivo no modo de incluso e leitura */if ((id-arq = fopen("TEXTO.DAT", "a+")) == NULL) {

    printf("Erro na abertura do arquivo TEXTO.DAT")

    return 1;/* l um string do arquivo */if (fread(buf_str, 22, 1, id-arq) != 1) {

    printf("Erro de leitura no arquivo TEXTO.DAT);return 1;

    }/* adiciona final de string */buf-str[22] = '\0';printf("\n%s", buf-str);

    }