apostila c

66
Escola Estadual de Educação Profissional Dr. Solon Tavares Técnico em Gerenciamento de Redes Técnico em Sistemas de Informação Apostila de Linguagens de Programação I e Estruturas de Dados Prof. Alan Malta Rodrigues Guaíba, 2007.

Upload: luiz-paulo

Post on 05-Nov-2015

110 views

Category:

Documents


50 download

DESCRIPTION

Apostila linguagem C

TRANSCRIPT

  • Escola Estadual de Educao Profissional Dr. Solon Tavares Tcnico em Gerenciamento de Redes Tcnico em Sistemas de Informao

    Apostila de

    Linguagens de Programao I e

    Estruturas de Dados

    Prof. Alan Malta Rodrigues

    Guaba, 2007.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    2

    Sumrio

    CAPTULO 1 CONCEITOS BSICOS .................................................................................... 4 1.1. INTRODUO 1.2. COMPILAO DE PROGRAMA C 1.3 . IMPLEMENTAO 1.4. ESTRUTURA DE UM PROGRAMA C 1.5. ANLISE E SOLUO DE PROBLEMAS

    CAPTULO 2 EXPRESSES ................................................................................................... 6 2.1. DADO, INSTRUO E PROGRAMA 2.2. TIPOS DE DADOS 2.3. VARIVEIS 2.4. IDENTIFICADORES DE VARIVEIS EM C 2.5. CONSTANTES 2.6. ATRIBUIO 2.7. OPERADORES ARITMTICOS 2.8. OPERADORES RELACIONAIS 2.9. OPERADORES LGICOS 2.10. OPERADOR BIT A BIT 2.11. OPERADOR ? 2.12. OPERADOR SIZEOF 2.13. PRECEDNCIA 2.14. CASTS 2.15. PARNTESES E ESPAAMENTOS EXERCCIOS

    CAPTULO 3 ENTRADA E SADA DE DADOS .................................................................... 11 3.1. E/S PELO KONSOLE 3.2. PRINTF() 3.3. SCANF()

    EXERCCIOS

    CAPTULO 4 COMANDOS DE SELEO ........................................................................... 13 4.1. DECISES COM IF 4.2. DECISES COM SWITCH 4.3. COMANDOS DE DESVIO INCONDICIONAL EXERCCIOS

    CAPTULO 5 COMANDOS DE REPETIO ........................................................................ 18 5.1. COMANDO DE REPETIO WHILE 5.2. COMANDO DE REPETIO FOR 5.3. COMANDO DE REPETIO DO-WHILE EXERCCIOS

    CAPTULO 6 VETORES E MATRIZES ................................................................................. 22 6.1. VETORES 6.2. VETORES BIDIMENSIONAIS - MATRIZES EXERCCIOS

    CAPTULO 7 CADEIA DE CARACTERES ........................................................................... 25 7.1. CARACTERES 7.2. CADEIA DE CARACTERES - STRINGS 7.3. SADA DE DADOS COM STRINGS 7.4. ENTRADA DE DADOS COM STRINGS 7.5. FUNES DE STRINGS 7.5.1. FUNO STRCPY() 7.5.2. FUNO STRLEN() 7.5.3. FUNO STRCAT() 7.5.4. FUNO STRCMP()

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    3

    7.6. FUNES DE CARACTERES 7.6.1. FUNO ISALNUM()

    7.6.2. FUNO ISALPHA() 7.6.3. FUNO ISDIGIT() 7.6.4. FUNO ISLOWER() 7.6.5. FUNO ISUPPER() 7.6.6. FUNO ISPRINT() 7.6.7. FUNO ISPUNCT() 7.6.8. FUNO TOUPPER() 7.6.9. FUNO TOLOWER()

    EXERCCIOS

    CAPTULO 8 FUNES ........................................................................................................ 32 8.1. DECLARAO DE FUNES 8.2. PROTTIPO DE FUNES 8.3. VARIVEIS LOCAIS E GLOBAIS 8.4. ARGUMENTOS DE FUNES 8.5. COMANDO RETURN

    EXERCCIOS

    CAPTULO 9 PONTEIROS (APONTADORES) ..................................................................... 35 9.1. DECLARAO DE PONTEIROS 9.2. OPERADORES DE PONTEIROS & E * 9.3. PONTEIROS PARA VETORES 9.4. VETORES DE PONTEIROS 9.5. CUIDADOS COM PONTEIROS 9.6. PONTEIROS COMO PASSAGEM DE PARAMETROS 9.7. FUNES DE ALOCAO DINMICA EM C

    EXERCCIOS

    CAPTULO 10 ESTRUTURAS (STRUCTS) .......................................................................... 40 10.1. DECLARAO DE ESTRUTURAS 10.2. OPERADORES PONTO (.) E SETA ()

    EXERCCIOS

    CAPTULO 11 ARQUIVOS .................................................................................................... 43 11.1. FUNES PARA ABRIR E FECHAR ARQUIVOS 11.2. ARQUIVOS EM MODO TEXTO

    11.2.1. FUNES PARA LEITURA DE DADOS EM ARQUIVOS 11.2.2. FUNES PARA ESCRITA DE DADOS EM ARQUIVOS

    11.3. ARQUIVOS EM MODO BINRIO 11.3.1. FUNO DE LEITURA DE ARQUIVOS BINRIOS 11.3.2. FUNO DE ESCRITA EM ARQUIVOS BINRIOS

    CAPTULO 12 - LISTAS ENCADEADAS ................................................................................ 50 12.1. LISTA ENCADEADA 12.2. FUNES DE MANIPULAO 12.3. LISTAS CIRCULARES 12.4. LISTAS DUPLAMENTE ENCADEADAS

    EXERCCIOS

    CAPTULO 13 PILHAS .......................................................................................................... 58 13.1. IMPLEMENTAO DE PILHA COM VETOR 13.2. IMPLEMENTAO DE PILHA COM LISTA ENCADEADA

    EXERCCIOS

    ANEXO A FUNES MATEMTICAS ................................................................................. 63 ALGUMAS FUNES IMPORTANTES EXERCCIOS

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    4

    Objetivo Esta apostila foi construda com o intuito de facilitar o ensino da linguagem de programao C, a ser aplicado na disciplina de Estruturas de Dados do segundo mdulo na Escola Solon Tavares. Poderemos acompanhar o contedo atravs dela, a qual ser composta pelos comandos bsicos de C e muitos exemplos e exerccios, pois sem a prtica da programao, o ensino e a compreenso se tornam mais complexo.

    1. Conceitos bsicos

    1.1. Introduo

    A linguagem C foi criada por Dennis Ritchie, implementada em UNIX. O nome da linguagem se deve a uma linguagem anterior que tinha o nome de B. A linguagem segue um padro estabelecido em 1983 pelo ANSI (American National Standards Institute). C considerada uma linguagem de mdio nvel, podendo trabalhar com bits, bytes e endereos.

    Cdigos escritos em C so altamente portveis, ou seja, programas aplicados em um sistema operacional funcionaro normalmente em outros sistemas operacionais, com pouca ou nenhuma alterao. O C uma linguagem estruturada, ou seja, um programa pode ser dividido em varias sub-rotinas (mini-programa), onde cada sub-rotina cria suas prprias variveis e executa determinada funo.

    Quando voc cria um programa em C, voc obtm o cdigo-fonte, mas para esse programa ser executado pela mquina necessrio compila-lo. Um compilador tem como funo ler um cdigo-fonte e atravs da converso deste criar um cdigo-objeto, ento este cdigo-objeto (tambm conhecido como cdigo-binrio ou cdigo de mquina) pode ser executado pela mquina.

    Em Estruturas de Dados sero discutidas diversas tcnicas de programao, introduzindo os conceitos bsicos da linguagem de programao C, que sero utilizadas para a implementao das estruturas de dados apresentadas. A linguagem C tem sido amplamente utilizada na elaborao de programas e sistemas nas diversas reas em que a informtica atua.

    Utilizaremos nas aulas de programao C o sistema operacional Kubuntu GNU/Linux, os programas sero digitados no Editor de texto Kate e o programa ser compilado e executado atravs do Konsole. Para quem preferir programar no Windows h uma ferramenta muito boa, na qual voc edita o cdigo fonte, compila e tambm executa, chamado de Devc++.

    1.2. Compilao de programas C

    Para compilar um programa em C ser necessrio seguir basicamente trs passos:

    Criar o programa (cdigo fonte); Compilar o cdigo fonte (gerar o cdigo objeto); Executar o cdigo objeto.

    Para estes processos ser necessrio um editor de textos e um compilador. Com o editor escreveremos os programas fontes, que devem ser salvos com a extenso .c. Com o compilador geramos o cdigo objeto atravs do cdigo fonte, para poderem ser executados.

    Para compilar um programa, com o nome p.e. prog.c, digite no Konsole:

    gcc prog.c o prog //pode ser assim: gcc -o prog prog.c

    Se no houver erro de compilao no arquivo fonte, ser gerado um executvel com nome prog. Podemos ento executar o programa da seguinte forma:

    ./prog 1.3. Implementao

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    5

    Traduo do algoritmo para linguagem de programao. Programa um roteiro que orienta o computador, mostrando-lhe a seqncia de operaes necessrias para executar uma determinada tarefa.

    1.4. Estrutura de um programa C

    #include main() { bloco de comandos; }

    #include: esta linha mostra ao compilador que ser usado o arquivo cabealho stdio.h. Este arquivo contm declaraes de funes teis de entrada e sada de dados (std = standard, padro em ingls, io = input/output, entrada/sada em ingls).

    main: define o inicio da execuo em um programa C. a nica funo obrigatria em qualquer programa C e uma palavra reservada da linguagem.

    { }: indicam, respectivamente, o inicio e o termino da funo main. ( ): contem os parmetros da funo (se existir). a palavra reservada main, os parnteses e as chaves so os nicos elementos

    obrigatrios. as palavras reservadas tm um significado pr-definido na linguagem.

    Podem-se inserir comentrios no cdigo fonte, iniciados com /* e finalizados com */, assim como pode ser utilizado tambm o // (mas este s comenta a linha correspondente). Declaraes e comandos em C so terminados pelo caractere ponto-e-vrgula (;).

    1.5. Anlise e soluo de problemas

    A programao consiste de um problema que lanado a ns, o qual temos que resolver computacionalmente, sendo desta forma, temos que guiar o computador para a soluo deste problema, assim seguimos algumas etapas:

    Primeiramente devemos especificar claramente o problema; o O que deve ser resolvido? o Quais os dados e tipos de dados meu programa deve receber (entrada de

    dados)? o Qual a sada e o tipo de dado que o programa deve enviar (sada de dados)?

    Aps analisado os dados de entrada e sada, devemos descobrir uma soluo, criar um algoritmo para a resoluo do problema. Transformar o que deve ser resolvido em como resolve-lo. Um problema computacional geralmente tem mais de uma soluo.

    Escrever a soluo em uma linguagem de programao. Por fim, testar a soluo, ou seja, testar o programa. Se o programa no se comportar como deveria, rever o algoritmo aplicado no problema.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    6

    2. Expresses

    A combinao de variveis, constantes e operadores constituem uma expresso.

    2.1. Dado, instruo e programa

    Um computador manipula informaes ou dados. Uma instruo algo que manipula dados. Isto , uma instruo executa uma determinada operao sobre um ou mais dados. Um programa composto por uma serie de instrues.

    2.2. Tipos de dados

    Em C podemos encontrar cinco tipos bsicos de dados: inteiro, ponto flutuante, ponto flutuante de dupla preciso, caractere e vazio (int, float, double, char e void). Dados do tipo inteiro geralmente so compostos de quatro bytes, mas isto pode variar de acordo com a arquitetura da mquina. Valores do tipo caractere geralmente apresentam o tamanho de 1 byte, definido de acordo com a tabela ASCII. Os dados do tipo ponto flutuante so caracterizados de acordo com sua faixa de preciso. Por fim, o tipo vazio significa que a funo no retorna valores. Os tipos de dados devem ser definidos para cada varivel, sendo que ele define um conjunto de valores que uma varivel pode receber e quais operaes podem ser executadas com ela.

    Tipo Tamanho Faixa int 32 bits -2.147.483.648 a 2.147.483.647 float 32 bits 6 dgitos de preciso char 8 bits -128 a 127 unsigned char 8 bits 0 a 255 double 64 bits 10 dgitos de preciso

    2.3. Variveis Correspondem a uma posio de memria; contedo pode variar ao longo do tempo; armazenam um s valor por vez; armazenam valores de um s tipo (logo, tem tipo definido); devem ser declaradas antes de serem utilizadas; valor inicial imprevisvel (posio de memria);

    Uma varivel uma entidade que possui um valor, sendo conhecida no programa por um nome (identificador). As variveis so declaradas em trs lugares bsicos: no campo de parmetros de funes, no incio de funes e fora de todas as funes. A forma geral de declarao de variveis :

    tipo lista_de_variveis;

    Onde tipo um tipo de dado em C, e lista_de_variveis pode ser composta de apenas 1 varivel ou vrias, separadas por vrgulas.

    Exemplo: int reta, curva, a, b; char nome, turma; short int lado;

    Em C possvel inicializar as variveis junto a declarao, ou seja, no momento que a varivel estiver sendo declarada, ela poder receber um valor inicial, para isto deve-se colocar um sinal de igualdade e uma constante logo aps o nome, por exemplo: int reta = 10, curva = 5; char letra = z;

    2.4. Identificadores de variveis em C

    Para identificar corretamente variveis e funes, os seguintes itens so necessrios:

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    7

    o primeiro caractere deve ser uma letra ou _ (sub-linha) e as demais podem ser letras, numero ou caracteres (sub-linha);

    em C os primeiros 32 caracteres so significativos, ou seja, no adianta colocar identificadores muito extensos porque sero ignorados pelo compilador;

    o C distingue letras maisculas de minsculas; no deve ser utilizado as palavras reservadas da linguagem, assim como no deve ser

    dado nomes a variveis iguais a identificadores de funes.

    2.5. Constantes

    As constantes se caracterizam por valores fixos que no podem ser alterados. As constantes satisfazem os cinco tipos de dados em C, variando sua representao de acordo com o tipo. Para nmeros inteiros e ponto flutuante basta colocar o valor (p.e.: 7, -2.13, 25423). Constantes do tipo caractere so envolvidas por aspas simples (p.e.: a, A, !). Constantes do tipo string so representadas entre aspas duplas (p.e.: ola, ola novamente amigo). Constantes em octal so representadas com um 0 na frente (e seguidas de 0 a 7) e constantes em hexadecimal so representadas com um 0x na frente ( e seguidas de 0 a 9 ou de a at f).

    Em C as constantes podem ser definidas atravs do comando #define. Dessa forma, todas as vezes que o smbolo ou palavra definido logo aps ao #define for encontrado no programa, ele ser automaticamente substitudo pelo valor definido no final do comando #define. Podemos definir vrias constantes em um programa. Sua forma geral :

    #define nome_da_constante valor

    Exemplo: #define PI 3.141592 #define AREA 0.0

    2.6. Atribuio

    A operao de atribuio especifica que a uma varivel ser dado um valor ou o resultado de uma expresso. A atribuio em C indicada pelo smbolo de igualdade =. O lado esquerdo da igualdade ser o destino do valor e deve ser uma varivel ou um ponteiro, o lado direito pode ser uma constante, uma expresso ou uma varivel.

    Exemplo: varivel = expresso; // varivel recebe valor da expresso a = 5; /* armazena o valor 5 em a */ c = 10.3; /* armazena o valor 10.3 em c */ a = b = c = 10; // todas as variveis recebem o valor 10

    2.7. Operadores Aritmticos

    Operadores aritmticos so usados para desenvolver operaes matemticas.

    + Adio - Subtrao * Multiplicao / Diviso % Mdulo (devolve o resto da diviso inteira, e s aceita operandos inteiros). ++ Incremento -- Decremento

    Exemplo: c = a + b; /* armazena a soma do contedo de a e b em c */ i = i + 2; // varivel i recebe contedo de i + 2 n++; // n recebe n + 1; n--; // n recebe n 1;

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    8

    a = 3 % 2; //devolve resto da diviso inteira de 3 por 2, ou seja, a recebe 1 b = 127 % 10; //devolve resto da diviso inteira de 127 por 10, ou seja, b recebe 7 c = b % a; //devolve resto da diviso inteira do contedo de b (7) pelo

    //contedo de a (1), ou seja, 7 mdulo 1 igual a 0, c recebe 0

    Tambm temos operadores reduzidos em C, simplificando a codificao de certas operaes de atribuio. Sua forma geral :

    varivel operador = expresso; // varivel = varivel operador expresso;

    Exemplo: x += 10; // igual a x = x + 10; y *= (10 + 25); // igual a y = y * (10 + 25)

    2.8. Operadores Relacionais

    Os operadores relacionais realizam comparaes entre duas ou mais variveis. O resultado gerado por um operador relacional ou operador lgico um (1) ou zero (0) (verdadeiro ou falso). Em C no existe o tipo booleano (verdadeiro ou falso). O valor zero interpretado como falso e qualquer valor diferente de zero considerado verdadeiro.

    > Maior que >= Maior ou igual a < Menor que > Deslocamento direita

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    9

    Onde expresso1 a expresso que est sendo testada, se ela for verdadeira a expresso2 ser validada, caso contrrio a expresso3 ser validada.

    Exemplo: resultado = (nota>6) ? 10 : 0; // resultado recebe 10 ou 0

    2.12. Operador sizeof

    Este operador unrio retorna o tamanho, em bytes, de uma determinada varivel ou especificador de tipo, porm este ltimo deve estar entre parnteses.

    Exemplo: int a; char b; a = sizeof (float); // armazena o valor 4 em a a = sizeof (b); // armazena o valor 1 em a printf(Um int possui %d bytes.\n,sizeof (int)); printf(Um float possui %d bytes.\n,sizeof (float)); printf(Um double possui %d bytes.\n,sizeof (double)); printf(Um char possui %d byte.\n,sizeof (char));

    2.13. Precedncia Maior precedncia () -> ! ++ -- * / % + -

    < >= == != && || Menor precedncia

    2.14. Casts

    Quando utilizamos tipos de dados diferentes em expresses, o compilador faz converses de operandos que possuem tamanho menor em maiores, se existirem na expresso, porm, podemos garantir um tipo de dado final da expresso com Casts. Este comando ir forar uma expresso a ser de determinado tipo. Onde tipo qualquer tipo de dado vlido em C. Sua forma geral :

    (tipo) expresso;

    2.15. Parnteses e Espaamentos

    Visando tornar expresses e o programa mais legvel, podemos acrescentar espaamentos e tabulaes no cdigo fonte. Assim como parnteses adicionais facilita a compreenso de uma expresso e d mais controle ao programador referente s precedncias de operaes.

    Exerccios: 1) Resolva as expresses abaixo e descubra se o resultado 1 (Verdadeiro) ou 0 (Falso). a) 10 > 3 b) 10 != 10 c) (10 >= 9) || (10 >= 11) d) (10 = 9) e) !(7 >3) || !(5 < 7) f) !(9 < 0) && (9 > 0) g) (23 >= 2) || ! !(13 < 6)

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    10

    2) Determine o valor das seguintes expresses aritmticas: a) 15 * 14 -3 * 7 b) (10 + 2 * 6) / 5 c) 8 * 23 % 14 + 86 23 + 78 / 12 d) 2 + 3 * (4 * (4 (4 8) / 2))

    3) Determine o valor das seguintes expresses aritmticas: a) 15 / 12 e) 15 % 12 b) 24 / 12 f) 24 % 12 c) 123 / 100 g) 123 % 100 d) 200 / 100 h) 200 % 100

    4) Transcreva as seguintes funes matemticas na linguagem de programao C.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    11

    3. Entrada e Sada de dados

    Em C h dois tipos de E/S de dados, a primeira pelo Konsole e a segunda por arquivos.

    3.1. E/S pelo Konsole

    Em C, tudo feito atravs de funes, inclusive as operaes de entrada e sada. Na linguagem C temos uma biblioteca padro que possui as funes bsicas normalmente necessrias. Para isso, devemos incluir o prottipo destas funes no inicio do cdigo.

    #include

    A linguagem C contm um conjunto de instrues que permitem ao operador interagir com o programa fornecendo dados e recebendo mensagens. As funes printf( ) e scanf( ) so responsveis pela entrada e sada de dados, podendo ler e escrever dados em vrios formatos.

    3.2. printf()

    Esta funo escreve dados no vdeo e sua forma geral :

    printf (string_de_controle,lista_de_argumentos);

    A string_de_controle descreve o que a funo printf( ) vai imprimir na tela. Ela mostra no somente a mensagem que deve ser colocada na tela, mas tambm quais as variveis e suas respectivas posies, isto feito usando-se os cdigos de controle que usam a notao %. Na string de controle indicamos quais, de qual tipo e em que posies esto as variveis a serem impressas. Para cada cdigo de controle deve haver uma varivel na lista_de_argumentos, estes dois so combinados na ordem da esquerda para a direita.

    Cdigos de Controle: %d Inteiro %c Caracter %f Ponto flutuante %s String %o Octal %x Hexadecimal %% Imprime o caractere % %p Imprime o endereo da varivel

    Exemplo: int b = 8; float a = 10.4; printf(\n\tO inteiro eh %d e o real eh %f \n, b, a); //imprimi O inteiro eh 8 e o real eh 10.4 printf(\n Ola,eu estou vivo!); // ser impresso no Konsole Ola,eu estou vivo!

    No lugar do %d ser impresso o valor armazenado na varivel b (valor inteiro) e no lugar do %f ser impresso o valor armazenado na varivel a (valor real). O \n significa nova linha e o \t significa tabulao no terminal, sendo assim antes de imprimir a mensagem pularia uma linha e daria uma tabulao para a mensagem ser impressa.

    Para escrever um caracter deve-se utilizar o cdigo %c. Mas se for preciso imprimir uma string deve-se usar o cdigo %s.

    3.3. scanf()

    Responsvel pela entrada de dados via Konsole, sua forma geral :

    scanf(string_de_controle,lista_de_argumentos);

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    12

    Usando a funo scanf( ) podemos ler dados digitados pelo usurio. Para cada cdigo de controle na string_de_controle deve haver uma varivel na lista_de_argumentos, estes dois so combinados na ordem da esquerda para a direita.. Deve-se colocar o & antes de cada argumento da lista_de_argumentos. Os cdigos de controle na string_de_controle so os mesmos da funo printf( ) => ( %d, %f, %c, %s). A funo scanf( ) termina a leitura de um nmero quando um caractere diferente de nmeros for pressionado.

    Para a leitura de uma string devemos utilizar o cdigo %s, no qual acabar a leitura da string quando for encontrado um caractere de espao em branco, porm, se for necessrio controlar a leitura de caracteres de uma string, coloca-se o nmero de caracteres mximo a ser lido pelo scanf( ) para determinada cadeia de caracteres.

    Exemplo: scanf(%20s,str); // ir ler apenas os 20 primeiros caracteres digitados

    scanf(%d %f,&b,&a); // b recebe um nmero inteiro digitado // a recebe um nmero real digitado

    scanf(%c,&smbolo); // smbolo recebe um caractere

    Exerccios: Desenvolva programas em C para as seguintes questes.

    1) Ler dois valores inteiros e imprimi-los.

    2) Ler trs valores reais e imprimir o somatrio deles.

    3) Armazenar o valor 10 na varivel a, o valor 5 na varivel b e trocar seus contedos apresentando a resposta.

    4) Supondo um valor real referente largura e um outro referente ao comprimento de uma sala, escreva um programa que leia esses 2 valores e calcule a rea dessa sala, imprimindo a resposta.

    5) Desenvolva um programa que receba o raio e efetue o clculo do permetro de uma circunferncia, apresentando a medida calculada.

    6) Escreva um programa que leia uma temperatura em graus Fahrenheit e converta-a para graus Celsius. Para isso voc deve utilizar a frmula C = ( F 32 ) * ( 5 / 9 ).

    7) Ler o raio e a altura de um cone, calcular o valor de seu volume e apresentar o resultado, utilizando a seguinte formula: VOLUME = (.R2.ALTURA)/3.

    8) Escreva um programa que faa a leitura de um valor inteiro de segundos, e imprima o equivalente em minutos e horas.

    9) Faa um programa em C que leia uma medida em metros e a converta para polegadas, centmetros e ps, apresentando os resultados ao final. Lembre-se que: 1.0 metro = 100.0 cm 1.0 metro = 10000.0/254.0 (~ 39.3700787402) polegadas

    1.0 metro = 1.0/0.3048 (~ 3.28083989501) ps

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    13

    4. Comandos de Seleo

    Em C encontramos dois comandos de desvio condicional, esse desvio depende do teste de uma expresso, resultando em um valor verdadeiro ou falso, porm, no encontramos esses resultados em C, mas sim valores iguais ou diferentes de zero. Para qualquer valor diferente de zero consideramos que a resposta verdadeira, j um valor falso representado pelo valor 0.

    4.1. Decises com if

    A estrutura bsica do comando if :

    if(condio) { comando ou bloco de comandos; } ou

    if(condio) { bloco de comandos do if; }

    else { bloco de comandos do else; }

    Na primeira estrutura se a expresso produzir um valor diferente de 0 (verdadeiro), o bloco de comandos ser executado, caso contrrio a execuo do programa continua a partir do fecha chaves }. Na segunda estrutura temos duas opes, se o teste for diferente de 0 (verdadeiro) o bloco de comandos do if que est delimitado pelas chaves ser executado, caso contrrio (se a expresso resultar no valor 0), somente o bloco de comandos do else ser executado.

    Os blocos de comando devem ser delimitados por uma chave aberta e uma chave fechada, porm, se o desvio possuir apenas uma instruo (um comando), no se torna obrigatrio o uso de chaves. A indentao (recuo de linha) dos comandos fundamental para uma maior clareza do cdigo.

    Na instruo if-else, ou ser executado o bloco de comandos do if, ou ser executado o bloco de comandos referente ao else. Leia assim, se isto, ento isso, se no aquilo.... Em C, um comando else sempre se refere ao comando if mais prximo.

    Exemplo: /*Recebe 2 valores e acha o maior*/ #include int main() { int n1, n2; // variveis do tipo inteiro printf(\n Entre com 2 valores inteiro\n); scanf(%d %d, &n1, &n2); //armazena 1 dado lido em cada varivel if (n1 > n2) printf(\n Este valor eh o maior %d \n,n1); else printf(\n Este valor eh o maior %d \n,n2); }

    O uso de comandos if aninhados (em cascata) vlido e muito usado. Conforme veremos no exemplo:

    if (expresso) { if (expresso) comando; if (expresso) comando; else comando; }

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    14

    Com a utilizao do comando if podemos construir a chamada escada if-else-if, a qual consiste em um novo teste condicional caso o teste anterior tenha retornado 0 (falso), at que encontre o ltimo else ou satisfaa algum dos testes anteriores, conforme mostra o exemplo:

    if (expresso) comando; else if (expresso) commando; else if (expresso) commando; ...

    else commando;

    4.2. Decises com switch

    O comando switch uma estrutura de controle condicional. Permite que grupos particulares de instrues sejam escolhidas entre grupos possveis. A escolha baseada no valor correspondente de uma varivel ou expresso.

    O comando switch prprio para se testar uma varivel em relao a diversos valores pr-estabelecidos, tanto para constantes inteiras quanto para caracteres.

    Sua forma geral :

    switch(varivel ou expresso) { case constante1: comando1; break; case constante2: comando2; break; .... ....

    .... ....

    case constanteN: comandoN; break; default: comando_default; break; }

    O switch testa a varivel (ou expresso) contra os valores especificados nos comandos case e executa o comando (ou bloco de comandos) cujo case coincidiu com o valor da varivel ou expresso, esses comandos sero executados at que seja encontrado o comando break ou o fim do comando switch. A declarao default opcional e ser executada apenas se a varivel (ou expresso) que est sendo testada no for igual a nenhuma das constantes pr-estabelecidas nos case. O case no pode existir fora do comando switch.

    O break um comando de desvio em C, faz com que o switch seja interrompido passando a execuo do programa a partir da prxima linha de comando aps o fecha chaves do switch. O comando break muito utilizado em laos.

    Duas constantes case no mesmo switch no podem possuir o mesmo valor, exceo de um switch dentro de outro. No caso de constantes caracteres, estas devem estar entre aspas simples, e elas so automaticamente convertidas para seus valores correspondentes inteiro de acordo com a tabela ASCII.

    possvel ter instrues case sem nenhum comando associado, porm, quando isto acontece a execuo do programa cai no prximo case. importante deixar claro que todo o comando switch forma um bloco de comandos e os comandos associados a cada case so uma

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    15

    seqncia de comandos, ou seja, variveis locais so declaradas no incio de blocos de comandos e no podem ser declaradas dentro dos comandos associados aos cases.

    Exemplo: /*Entre com o dia da semana e ser impresso o nome*/ #include int main() { int num; printf(\n Digite um numero entre 1 e 7 \n); scanf(%d,&num); // armazena valor inteiro em num switch(num) { // testa num case 1: printf(\n Domingo\n); break; case 2: printf(\n Segunda-feira\n); break; case 3: printf(\n Terca-feira\n); break; case 4: printf(\n Quarta-feira\n); break; case 5: printf(\n Quinta-feira\n); break; case 6: printf(\n Sexta-feira\n); break; case 7: printf(\n 15onte\n); break; default: //se valor for != dos case entra aqui no default printf(\n Valor digitado invalido\n); break; } }

    4.3. Comandos de Desvio Incondicional

    O C disponibiliza quatro comandos de desvio incondicional, dois deles voc utiliza em comandos de loopings e os outros dois em qualquer parte do programa.

    4.3.1. Comando return

    Comando utilizado para retornar de uma funo, retorna a execuo do programa a partir do ponto em que foi chamado na outra funo. Sempre que for encontrado o primeiro return, a funo ser finalizada, assim como se for encontrado o smbolo } da funo. Este comando pode simplesmente retornar de uma funo, como retornar um valor para a funo que o chamou. Se nenhum valor for especificado, ser retornado zero. A forma geral deste comando :

    return expresso;

    importante enfatizar que em funes do tipo void no poder ser utilizado o comando return.

    4.3.2. Comando goto

    Comando de desvio incondicional, normalmente no utilizado em C devido a ilegibilidade do cdigo fonte. Utilizando este comando voc define um rtulo, este rtulo voc coloca em outra parte do programa seguido de dois pontos :, definindo ali o ponto de salto (destino) do programa. Sua forma geral a seguinte:

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    16

    goto rtulo; ...

    ...

    rtulo:

    4.3.3. Comando break

    Conforme estudado no comando switch, o comando break utilizado para interromper a execuo dos comandos dentro de um case, assim como interromper a continuidade de execuo de um lao.

    4.3.4. Funo exit()

    Utilizando a funo exit() voc sai imediatamente de um programa. Sua forma geral :

    exit(cdigo_de_retorno);

    Onde cdigo_de_retorno contm um valor inteiro retornado para o S.O., se este valor for 0 (zero) significa que o programa teve uma terminao normal, j outros valores normalmente indicam algum tipo de erro.

    Exerccios:

    1) Escreva um programa que faa a leitura de dois valores inteiros e descubra qual o maior, imprimindo a resposta.

    2) Escreva um programa que faa a leitura de dois valores reais e faa a diviso entre eles se o denominador no for zero. Ao final deve ser impresso o resultado ou uma mensagem de erro..

    3) Ler um valor numrico inteiro e descobrir se ele maior ou igual a 10 e menor ou igual a 20 (utilize operadores lgicos). Se ele satisfizer essas condies dever aparecer no vdeo VERDADE, caso contrrio dever aparecer MENTIRA.

    4) Escreva um programa que descubra se trs valores recebidos esto ou no em ordem crescente.

    5) Ler 3 valores numricos inteiros (variveis a, b e c) e descobrir se este tringulo Equiltero, Issceles ou Escaleno. Lembrando que o tringulo ser eqiltero quando todas as arestas (lados) dele forem do mesmo tamanho. Issceles quando apenas duas arestas forem iguais ou ser escaleno quando todas as medidas das arestas forem diferentes. No final dever apresentar a resposta: EQUILTERO, ESCALENO ou ISSCELES.

    6) Escreva um programa que mostre na tela o conceito conforme a nota obtida, de acordo com a tabela seguinte:

    De 9,0 a 10,0 A De 7,5 a 9,0 B De 6,0 a 7,5 C De 4,0 a 6,0 D

    De 0,0 a 4,0 E

    7) Escreva um programa que leia um valor inteiro e descubra se o mesmo par ou mpar, apresentando a resposta.

    8) Escreva um programa que faa a leitura da idade de 2 homens e 2 mulheres (supondo que as idades do mesmo sexo sero diferentes). O programa deve fazer o somatrio da idade do homem mais velho com a idade da mulher mais nova e o

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    17

    produto da idade do homem mais novo pela idade da mulher mais velha. Ao final imprimir os resultados.

    9) Faa um programa que simule uma calculadora padro, com as operaes + soma, - subtrao, * multiplicao e / diviso. Inicialmente o programa deve pedir a operao ao usurio, aps o usurio deve entrar com os 2 operandos. Ao final, o programa deve imprimir a resposta.

    10) Crie um programa que leia 3 valores inteiros e imprima-os em ordem crescente.

    11) Faca um programa que receba hora e minuto inicial e final de uma partida de tnis, a durao do jogo no pode ultrapassar 60 minutos. O programa deve calcular a durao do jogo, considere que o jogo pode comear em um dia e acabar somente no outro.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    18

    5. Comandos de Repetio

    Algoritmos com laos (loopings) definem conjuntos de instrues que devem ser executadas repetidas vezes, ou seja, uma ao deve ser realizada um numero preciso e conhecido de vezes em um ou mais comandos.

    5.1. Comando de Repetio while

    O while um comando de lao, isto , que permite que as instrues que se encontram dentro do lao sejam repetidas. Sua forma geral :

    while (condio) comando; // ou bloco de comandos entre chaves

    Ele faz com que o lao (comando ou bloco de comandos) sejam executados enquanto a condio for verdadeira, onde a condio verdadeira ser sempre que for um valor diferente de zero. Quando a condio for falsa, a execuo do programa passa para o prximo comando aps o bloco de comandos do lao while.

    O lao while seria equivalente a:

    if(condio) { comando; volte para o comando if }

    O while tem a mesma caracterstica que o lao for referente a verificao condicional, que sempre feita no inicio do lao.

    Exemplo: #include // imprime o numero de i de 0 ate 99 int main( ) { int i=0; while(i

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    19

    int contador; for(contador=1;contador0; i=i-1) printf(\n %d , i);

    No exemplo 2 ser impresso todos os valores inteiros entre os nmeros 100 e 1, na ordem decrescente de unidade em unidade, at que o valor 0 seja atingido no contador (i) e interrompa a execuo do looping.

    Exemplo3: for (i=0; i>0; i=i+5) printf(\n Oi );

    Neste exemplo 3 no ser impresso nenhuma vez a mensagem Oi, pois o lao inicializado com 0 e a condio exige que este valor seja maior que zero..

    Exemplo4: for (i=0; i!=666; ) scanf(%d, &i);

    Conforme demonstrado no exemplo 4, partes da definio do lao for no precisam existir. O programa inicializa a varivel i com 0 e testa se ela diferente de 666, enquanto o usurio no digitar este ltimo valor o lao continuar em execuo, sem que seja feito nenhuma operao de incremento na repetio do lao.

    Exemplo5: for ( ; ; ) printf( Looping Infinito);

    O exemplo 5 sinaliza a construo de um lao infinito, ou seja, os comandos associados ao for sero eternamente executados at que o computador estrague, falte energia ou at o fim do mundo.

    5.3. Comando de Repetio do-while

    Em C podemos ver outro comando para a construo de laos, cujo teste avaliado somente no final do lao. O comando do-while garante que pelo menos uma vez ser executado o comando ou bloco de comandos.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    20

    do { comando ou bloco de comandos; }while(condio);

    Este lao repete o comando ou bloco de comandos at que a condio seja falsa, ou seja, at que o valor condicional resultante seja zero. Para esta instruo, procure sempre utilizar as chaves, mesmo que tenha apenas um comando, a fim de evitar confuses futuras.

    Exemplo: do { scanf(%d, &valor); } while( (valor >= 1) && (valor

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    21

    13) Dado um n lido do teclado, calcule a soma da srie: 1/2 + 2/2 + 3/2 + ... + n/2n.

    14) Crie um programa que calcule o valor de ex. O valor de x deve ser lido do teclado. O resultado deve ter uma preciso de no mnimo 0.0001 do resultado obtido atravs da funo exp. Ao final deve ser apresentado o valor de x, o valor calculado atravs da srie e o valor obtido pela funo exp. Utilize a seguinte srie:

    ex = x0 + x1/1! + x2/2! + x3/3! + x4/4! + ...

    15) Escreva um programa que encontre os N primeiros nmeros perfeitos, onde N um valor lido do teclado. Um nmero perfeito aquele cuja soma de seus divisores, exceto ele prprio, igual ao nmero. Ex.: 6 = 1 + 2 + 3.

    16) Dado um nmero N lido do teclado, escreva um programa que imprima os primeiros N nmeros primos.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    22

    6. Vetores e Matrizes

    Vetores e matrizes so conjuntos de variveis que so referenciados pelo mesmo nome, e trabalham com o mesmo tipo de dados. Para ter o acesso a essas diferentes variveis necessrio utilizar ndices. Esses ndices atuam como deslocamentos na memria a partir de um endereo inicial. Vetores e matrizes em C utilizam uma parte contgua da memria, onde o primeiro ndice corresponde ao endereo mais inferior e o ultimo ndice corresponde ao endereo superior da memria.

    6.1. Vetores

    A forma geral para declarar um vetor em C a seguinte:

    tipo_de_dado nome_da_variavel[tamanho];

    Assim como as variveis, vetores tambm devem ser declarados. Esta declarao reserva um espao na memria suficientemente grande para armazenar o nmero de clulas especificadas por tamanho, onde est especificado quantos elementos o vetor poder guardar. No campo tipo_de_dado ser escolhido um dos tipos de dados da linguagem C (inteiro, real, caracter). O nome_da_variavel o identificador do vetor. Na linguagem C, a numerao dos ndices de um vetor ou matriz inicia sempre em zero, ou seja, o primeiro elemento sempre ser referenciado pelo ndice 0. Isto significa que, no exemplo abaixo, os dados sero indexados de 0 a 29.

    Exemplo1: int num[30]; // declara vetor do tipo inteiro que poder armazenar at 30 valores

    num[0]= 10; // armazena 10 na primeira posio do vetor num num[1]= 2; // armazena 2 na segunda posio do vetor num ...

    num[29]= num[1]; // atribui contedo da segunda p/ ltima posio da varivel num

    Nada impede de escrever: num[30]; num[103];

    Em C no verificado se o ndice usado est dentro dos limites vlidos. Este um cuidado que o programador deve tomar, caso contrrio h risco de haver variveis sobre-escritas ou de escrever no prprio cdigo do programa.

    Exemplo2: /*preenchimento de um vetor de tamanho 10*/ #include

    int main() { int vet[10],i; printf(\n Digite um valor inteiro e pressione ENTER \n); for(i=0;i

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    23

    A funo que est sendo chamada, que ir receber o ponteiro para o primeiro elemento do vetor nota, deve estar preparada para isso. A varivel que vai receber este parmetro poder ser declarada de trs formas distintas, conforme o exemplo a seguir:

    Exemplo4: // referente ao exemplo3, parte da funo que receber o parmetro void soma(int aux[5]) { //declarando um vetor de mesmo tamanho ...

    } ou

    void soma(int aux[]) { //declarando um vetor sem tamanho ...

    } ou

    void soma(int *pt) { //declarando um ponteiro ...

    }

    6.2. Vetores Bidimensionais Matrizes

    Em C podemos criar vetores multidimensionais, mas normalmente utilizado bidimensionais. Por exemplo, para declararmos uma matriz de valores reais com 4 linhas e 3 colunas, fazemos:

    float mat[4][3];

    Esta declarao reserva um espao de memria necessrio para armazenar os 12 elementos ( 4 x 3 ) da matriz, que so armazenados de maneira contgua, organizados linha a linha.

    Os elementos da matriz so acessados com indexao dupla. No exemplo acima o primeiro ndice 4, este significa que a matriz apresenta 4 linhas. O segundo ndice 3, este significa que a matriz apresenta 3 colunas. Como em C a indexao comea em zero, o elemento da primeira linha e primeira coluna ser acessado pelos ndices mat[0][0].

    Para declarar uma matriz em C, utilizamos a seguinte forma geral:

    tipo_da_variavel nome_da_variavel[linha][coluna];

    As matrizes tambm podem ser inicializadas na declarao:

    float mat[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12};

    Exemplo1: /*exemplo de preenchimento de matriz 4x3*/ for(i=0; i

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    24

    2) Preencher um vetor de 15 elementos, aps fazer o somatrio destes elementos e apresentar a resposta.

    3) Crie um programa que leia 5 valores de ponto flutuante e calcule a mdia destes. O programa deve apresentar a mdia calculada, assim como o nmero de valores iguais ou superiores mdia.

    4) Preencher um vetor de 5 elementos e imprimir os elementos em ordem decrescente de ndices.

    5) Preencher 2 vetores de 5 elementos cada. Aps fazer a multiplicao entre os mesmos elementos de cada vetor e armazenar a resposta em um terceiro, imprimindo os resultados.

    6) Faa um programa que leia um vetor de 10 nmeros inteiros e informe qual o maior e qual o menor valor digitado.

    7) Preencher um vetor de 5 elementos. Calcular o fatorial de cada elemento e armazenar em um segundo vetor, apresentando o resultado somente no final.

    8) Preencher um vetor de 6 elementos e ordena-los em ordem crescente, apresentando os resultados.

    9) Faa um programa que solicite a digitao de um vetor de 10 nmeros inteiros e em seguida informe se h nmeros repetidos.

    10) Ler uma matriz de 4 linhas por 6 colunas do teclado e fazer sua cpia para uma outra matriz. Ao final, deve ser apresentado os elementos da segunda matriz.

    11) Ler duas matrizes de 4 linhas por 3 colunas do teclado e armazenar sua soma em uma terceira matriz. Ao final, deve ser apresentada a matriz soma.

    12) Faa um programa que solicite a digitao de 3 notas de cada aluno de uma turma de 5 alunos. Em seguida, o programa deve imprimir a mdia de cada aluno.

    13) Ler 20 valores para uma matriz e coloc-los em ordem crescente, apresentando seus elementos.

    14) Ler duas matrizes de 16 elementos inteiros cada e contar quantos elementos so comuns as duas matrizes apresentando o resultado.

    15) Preencha e imprima o contedo de uma matriz identidade de 4 linhas e 4 colunas.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    25

    7. Cadeia de Caracteres

    7.1. Caracteres

    Os caracteres so representados por cdigos numricos. A correspondncia entre os caracteres e seus cdigos numricos feita por uma tabela de cdigos. Em geral, usa-se a tabela ASCII, mas diferentes mquinas podem usar diferentes cdigos.

    Para a utilizao de funes especificas de caracteres, devemos incluir a seguinte biblioteca padro, a qual possui o prottipo das funes de manipulao de caracteres:

    #include

    Em C, a diferena entre caracteres e inteiros feita apenas atravs da maneira pela qual so tratados. Por exemplo, podemos imprimir o mesmo valor de duas formas diferentes usando formatos diferentes. Um constante caractere escrito envolvendo o caractere com aspas simples. Assim, a expresso a representa um constante caractere e resulta no valor numrico associado ao caractere a.

    char c = a; printf(%d %c\n, c, c);

    Para capturarmos o valor de um caractere simples fornecido pelo usurio via teclado, usamos a funo scanf, com o especificador de formato %c.

    char a; scanf(%c, &a);

    Exemplo: /* imprime todos os caracteres e valores da tabela ASCII */ #include int main() { char tmp; printf(\n\t *** Impresso da tabela ASCII ***\n\n);

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    26

    for(tmp=32;tmp

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    27

    Esta funo utilizada para leitura de uma string atravs do dispositivo padro, at que a tecla ENTER seja pressionada. A funo gets() no testa limites do vetor em que chamada.

    Exemplo1: /* funcionalidades do gets e puts */ main() {

    char str[80]; printf(Entre com um string:\n); gets(str); printf(O string lido foi:\n); puts(str); printf(Entre com uma palavra:\n); scanf(%s,str); printf(A palavra lida foi: %s,str);

    }

    Exemplo2: /* impresso caracter a caracter */ int i; for(i=0;str[i]!=\0;i++)

    printf(%c,str[i]); printf(\n);

    O exemplo acima tem a mesma funcionalidade da linha de comando abaixo:

    printf(%s\n,s);

    Exemplo3: /*descobre o comprimento da cadeia de caracteres*/ int i; int n=0; /* contador */ for(i=0;s[i]!=\0;i++)

    n++;

    Para contar o nmero de caracteres da cadeia, basta contarmos o nmero de caracteres at que o caractere nulo (que indica o fim da cadeia) seja encontrado. O caractere nulo em si no deve ser contado.

    Exemplo4: /*copia uma cadeia de caracteres p/ um vetor de caracteres*/ int i; for(i=0;orig[i]!=\0;i++)

    dest[i]=orig[i]; dest[i]=\0; /*fecha a cadeia copiada*/

    Assumimos que a cadeia que receber a cpia tem espao suficiente para que a operao seja realizada. Salientamos a necessidade de fechar a cadeia copiada aps a cpia dos caracteres no nulos. Quando o lao for terminar, a varivel i ter o ndice de onde est armazenado o caractere nulo na cadeia original. A cpia tambm deve conter o \0 nesta posio.

    Exemplo5: /*concatenar um string no final de outra string*/ /*acha o final da cadeia destino*/ i=0; //str1 recebe a segunda string while(str1[i]!=\0)

    i++; /*copia elementos da segunda string para a str1*/ for(j=0;str2[j]!=\0;j++) {

    str1[i]=str2[j]; i++; }

    str1[i]=\0; /*fecha cadeia destino*/

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    28

    Concatenar colocar os caracteres de uma cadeia de caracteres no final de outra cadeia. Assim, se uma cadeia representa inicialmente a cadeia Ola e concatenarmos a ela a cadeia Turma, teremos como resultado a cadeia OlaTurma.

    Funes anlogas s funes comprimento, copia, compara e concatena so disponibilizadas pela biblioteca padro de C. As funes da biblioteca padro so, respectivamente, strlen, strcpy, strcmp e strcat, que fazem parte da biblioteca de cadeias de caracteres (strings), string.h. Existem diversas outras funes que manipulam cadeias de caracteres nessa biblioteca.

    7.5. Funes de Strings

    A biblioteca string.h fornece algumas rotinas para a manipulao de strings em C. Existem rotinas para copiar, concatenar e comparar strings, assim como muitas outras. A seguir sero apresentadas as principais rotinas de manipulao de strings. Entretanto, importante ressaltar que esta no uma lista completa das rotinas de manipulao de strings. Alm destas funes, h outras que podem ser consultadas no manual de referncia da linguagem C.

    7.5.1. Funo strcpy

    Serve para copiar o contedo de uma string para outro. Ela recebe o endereo de duas strings e copia o contedo da segunda string () para dentro da primeira string (). O contedo original da primeira string sobrescrito pelo contedo da segunda string. A segunda string no sofre alteraes. A primeira string deve possuir espao livre suficiente para a cpia.

    strcpy(,);

    7.5.2. Funo strlen

    Serve para contar quantos caracteres existem numa string. Ela recebe o endereo de uma string e retorna o tamanho desta. Esta funo no conta o caracter \0 do fim da string.

    int strlen();

    7.5.3. Funo strcat

    Serve para concatenar o contedo de uma string no fim de outra string. Ela recebe o endereo de duas strings e copia o contedo da segunda string () no fim da primeira string (). A segunda string no sofre alteraes. A primeira string deve possuir espao livre suficiente para a concatenao, j que vai possuir todos os caracteres dela assim como os caracteres que estavam na segunda string.

    strcat(,);

    7.5.4. Funo strcmp

    Serve para comparar duas strings. Ela recebe o endereo de duas strings e compara o contedo de uma string contra a outra. Esta funo ir retornar um valor numrico negativo, zero ou positivo dependendo do resultado da comparao, de acordo com as seguintes regras:

    Retorna um nmero negativo se o for menor que o Retorna zero se o for igual ao Retorna um nmero positivo se o for maior que o

    int strcmp(,);

    Observaes: Letras maisculas so consideradas diferentes de minsculas; O valor de retorno corresponde diferena em ASCII entre os primeiros dois

    caracteres diferentes.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    29

    7.5.5. Funo strstr

    A funo strstr() devolve um ponteiro para a primeira ocorrncia da string () na string (). Ela devolve um ponteiro nulo se no for encontrada nenhuma coincidncia em string1.

    char *strstr(,);

    Exemplo6: //manipulao de strings main() {

    char str1[100],str2[100],str3[100]; //inicializa um string com uma constante strcpy(str1,uma constante string); //copia o contedo de um string para outro vetor strcpy(str2,str1); //concatena um texto ao fim de str1 strcat(str2,que foi concatenada com outra); //inicializa o string str3 strcpy(str3,uma constante string); //compara os tamanhos de strings if(strlen(str1)==strlen(str3))

    printf(str1 tem o mesmo tamanho de str3\n); else

    printf(str1 no tem o mesmo tamanho que str3\n); //compara os strings str1 e str2 if(strcmp(str1,str2)==0)

    printf(str1 e str2 sao iguais\n); else if(strcmp(str1,str2)

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    30

    7.6.3. Funo isdigit (Nmeros)

    Esta funo verifica se o caractere corresponde a um digito de 0 a 9, retornando um valor diferente de zero se for, caso contrrio, esta funo retornar o valor zero.

    int isdigit(char ch);

    7.6.4. Funo islower (Letras minsculas)

    Esta funo verifica se o caractere corresponde a uma letra minscula, retornando um valor diferente de zero se for, caso contrrio, esta funo retornar o valor zero.

    int islower(char ch);

    7.6.5. Funo isupper (Letras maisculas)

    Esta funo verifica se o caractere corresponde a uma letra maiscula, retornando um valor diferente de zero se for, caso contrrio, esta funo retornar o valor zero.

    int isupper(char ch);

    7.6.6. Funo isprint (Caracteres impressos)

    Esta funo verifica se ch corresponde a um caractere que pode ser impresso, incluindo o espao, retornando um valor diferente de zero se for, caso contrrio, esta funo retornar o valor zero. Geralmente os caracteres que podem ser impressos esto na faixa de 0x20 a 0x7E.

    int isprint(char ch);

    7.6.7. Funo ispunct (Caracteres de pontuao)

    Esta funo verifica se ch corresponde a um caractere de pontuao, retornando um valor diferente de zero se for, caso contrrio, esta funo retornar o valor zero. Os caracteres de pontuao, como definido pela funo, inclui todos os caracteres que podem ser impressos e no sejam alfanumricos ou espao.

    int ispunct(char ch);

    7.6.8. Funo toupper

    A funo toupper() devolve o equivalente maisculo de ch se a mesma for uma letra; caso contrrio, devolvido ch sem alterao.

    char toupper(char ch);

    7.6.9. Funo tolower

    A funo tolower() devolve o equivalente minsculo de ch se a mesma for uma letra; caso contrrio, devolvido ch sem alterao.

    char tolower(char ch);

    Exerccios:

    1) Escreva um programa que receba uma string e imprima a mesma (resolver de duas formas, com printf() e scanf(), com puts() e gets()).

    2) Escreva um programa que receba uma string e descubra quantos caracteres foram armazenados, apresentando o resultado (sem a utilizao da funo strlen()).

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    31

    3) Escreva um programa que receba uma string e faa uma cpia dela em outro vetor de caracteres, apresentando o contedo dos dois vetores (sem a utilizao da funo strcpy()).

    4) Escreva um programa que receba duas strings e concatene a segunda na primeira string, apresentando a string concatenada no final (sem a utilizao da funo strcat()).

    5) Escreva um programa que receba duas strings e compare elas, descobrindo se elas SO ou NO SO iguais (sem a utilizao da funo strcmp()).

    6) Escreva um programa que receba uma string e descubra quantos caracteres (espao) foram digitados, apresentando o resultado no final.

    7) Escreva um programa que receba uma string e descubra quantas vogais foram digitadas, apresentando o resultado no final.

    8) Escreva um programa que receba uma string e substitua todos os caracteres (espao) pelo caractere \n (nova linha), apresentando a string modificada.

    9) Escreva um programa que simule um bloco de notas (limite de 10000 caracteres), o programa s deve ser encerrado quando for digitado os caracteres :, q, \n respectivamente.

    10) Escreva um programa que receba uma string e substitua todas as vogais minsculas por vogais maisculas, apresentando a string modificada no final.

    11) Escreva um programa que receba o nome de 5 pessoas e imprima os mesmos em ordem alfabtica.

    12) Escreva um programa que leia uma string de no mximo 100 caracteres e copie as consoantes para um vetor e as vogais para outro vetor. Ao final deve ser impresso a string original, aps o vetor com as consoantes e por final o vetor com as vogais.

    13) Escreva um programa que receba uma string de no mximo 500 caracteres. Aps o usurio ir digitar uma palavra. O programa deve descobrir quantas vezes esta palavra ocorre na string digitada.

    14) Crie um programa que efetue a leitura dos nomes de 10 alunos e tambm de 2 notas de cada aluno. O programa deve calcular a mdia de cada aluno para ver se ele est Aprovado ou Reprovado, utilize mdia igual ou maior a 7. Ao final, o programa dever apresentar somente o nome dos alunos aprovados e sua respectiva nota final.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    32

    8. Funes

    Uma funo um miniprograma dentro de outro. A utilizao de funes caracterstica de uma programao estruturada, pois de qualquer lugar do cdigo fonte pode ser feita a chamada de funo.

    8.1. Declarao de Funes

    Em C, cada funo contm um bloco de comandos que executado separadamente s outras funes. As variveis declaradas dentro de uma funo no so vistas por outras funes. Uma funo jamais dever estar contida no bloco de comandos de outra funo, apenas a chamada a ela deve estar ali. Como exemplo, podemos citar a funo main(), ela sempre ser a primeira funo a ser executada no cdigo, pois a funo principal. A forma geral de utilizao de funes :

    tipo_de_dado nome_da_funo(lista_de_parametros) { corpo da funo ou bloco de comandos; }

    O campo tipo_de_dado especifica o tipo de dado que ser retornado pela funo, atravs do comando return. Se o tipo de dado for void, significa que a funo no retornar nenhum valor. Se no for especificado nenhum tipo de dado de retorno, o compilador assumir que ser retornado dado do tipo inteiro. O campo nome_da_funcao segue as mesmas regras para identificadores de variveis. A lista_de_parmetros conter declarao de variveis separadas por vrgula, essas variveis sero utilizadas para receber os argumentos passados no momento que feito a chamada de funo. Uma funo que no for receber nenhum parmetro, no precisar ter variveis na lista_de_parametros, mas obrigatoriamente dever aparecer o abre e fecha parnteses (). No caso de declarar variveis na lista_de_parmetros devemos tomar uma ateno especial, pois qualquer varivel dever ser precedida pelo seu tipo, conforme o exemplo a seguir:

    Exemplo: void funcao(int a, int b, int c, float aux, char letra) { () }

    Exemplo 1: /*Primeiramente executada a funo main(), a qual faz uma chamada a funo imprime(), ento a execuo do programa passa para a funo imprime(), que mostra no terminal a mensagem e volta para a funo principal, que encerra o programa */

    #include

    void imprime() { //declarando a funo imprime printf("Sou a funcao e estou viva!\n"); } //fechando funo imprime

    main() { imprime(); //chama a funo imprime }

    8.2. Prottipo de Funes

    Tambm conhecido como cabealho de funo, seu objetivo listar as funes que existem no cdigo fonte, possui o seguinte formato:

    tipo_de_dado nome_da_funo(lista_de_parametros);

    Podemos observar que praticamente igual a declarao da funo, exceto pelo corpo da funo que neste caso NO deve aparecer. Este prottipo de funo deve ser encerrado com o caractere ponto e vrgula ; aps a lista_de_parmetros.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    33

    Exemplo: void imprime(); //prottipo da funo acima

    8.3. Variveis Locais e Globais

    As variveis locais so declaradas dentro de uma funo (ou na lista_de_parmetros da funo), somente esta funo tem acesso direto a elas, as variveis locais deixam de existir quando a funo finaliza sua execuo. As variveis locais devem ser declaradas sempre que inicia-se um bloco de comandos, antes de qualquer instruo do programa. As variveis globais normalmente so definidas no inicio do cdigo fonte, devendo estar fora de qualquer funo. Podem ser acessadas diretamente por qualquer funo subseqente, existem permanentemente e guardam seus valores enquanto o programa existir.

    8.4. Argumentos de funes

    Se for necessrio passar argumentos a uma funo, ela dever conter variveis declaradas para receber estes argumentos. Essas variveis possuem as mesmas caractersticas de variveis locais, e devem ser declaradas logo aps o nome da funo e entre parnteses, no caso de declarar variveis na lista_de_parmetros devemos tomar uma ateno especial, pois qualquer varivel dever ser precedida pelo tipo de dado que ser manipulado por ela.

    A passsagem de parmetros para uma funo se d de duas formas:

    passagem por valor, onde passado o contedo de uma varivel de uma funo para outra, isto , o valor original da varivel no alterado, pois passado apenas uma cpia da varivel;

    e passagem por referncia, onde passado o endereo de uma varivel, isto , qualquer alterao no contedo desta varivel ser realmente modificado, pois estamos manipulando diretamente o endereo da varivel atravs de um ponteiro.

    Quando um vetor ou uma matriz passada como argumento para uma funo, apenas um ponteiro para o endereo inicial da matriz passado, e no todo seu contedo.

    8.5. Comando return

    Utilizado para devolver um valor para o programa (ou funo) que o chamou. Tambm utilizada para sair imediatamente de uma funo. Uma funo ser finalizada quando for encontrado o comando return ou quando for encontrado o fecha chaves da funo }.

    Exemplos: return 10; //retorna valor 10 para funo que fez a chamada return aux; //retorna contedo de aux para funo que fez a chamada

    Exerccios:

    1) Escreva um programa que imprima 100 vezes a mensagem Ola, estou vivo!, utilize uma funo (exemplo, imprime()) para imprimir a mensagem.

    2) Escreva um programa que faa a soma de 3 valores inteiros e imprima o resultado, isto deve ser feito em uma funo (exemplo, soma(int n1, int n2, int n3)).

    3) Referente ao exerccio 2, faa a leitura dos 3 valores inteiros e o somatrio em outra funo (exemplo, soma()), mas o resultado deve ser impresso na funo main().

    4) Ainda referente ao exerccio 2, faa a leitura dos 3 valores inteiros na funo main(), a soma em outra funo e o resultado deve ser impresso na funo principal.

    5) Escrever um programa que utilize a funo somaintervalo (int n1, int n2) que retorna a soma dos nmeros inteiros que existem entre n1 e n2 (inclusive ambos). A funo deve funcionar inclusive se o valor de n2 for menor que n1.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    34

    n = somaintervalo(3, 6); /* n recebe 18 (3 + 4 + 5 + 6) */ n = somaintervalo(5,5); /* n recebe 10 (5 + 5) */

    n = somaintervalo(4, 0); /* n recebe 10 (4 + 3 + 2 + 1 + 0) */

    6) Escrever um programa que utilize a funo ampm(int hora, int minutos) que exibe a hora passada por parmetro no formato americano, isto , ao meio-dia, as horas voltam a serem contadas a partir de 00:00, seguida de AM, se for antes de meio-dia, ou PM, se for meio-dia ou depois.

    ampm(1,30); /* 01:30 AM */ ampm(12,5); /* 00:05 PM */ ampm(17,00); /* 05:00 PM */

    7) Fazer um programa em C, que ordena 5 nmeros : a) Em ordem crescente, utilizando a funo crescente(). b) Em ordem decrescente, utilizando a funo decrescente().

    8) Escrever uma funo somavet(int *vetor, int tamanho), que recebe por parmetro o endereo (ponteiro) de um vetor de inteiros e o seu tamanho e retorna a soma de seus elementos.

    9) Escrever uma funo espaco(), que retorna o nmero de espaos em branco contidos em uma string passada como parmetro, mximo de 60 caracteres.

    10) Implementar uma calculadora padro utilizando funes. Primeiramente o programa recebe a operao desejada:

    + soma - subtrao * multiplicao / diviso

    e, logo aps, chama a funo correspondente a operao escolhida, o qual calcula e retorna o resultado para a funo principal.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    35

    9. Ponteiros (apontadores)

    Ponteiros so como uma varivel qualquer, ou seja, possuem um nome e guardam um valor dentro deles, porm seus valores tm um significado diferente do que foi visto anteriormente. Estas variveis apontadoras armazenam um endereo, sendo que este endereo aponta para uma outra posio da memria, onde estar armazenado o dado que ser manipulado.

    9.1. Declarao de Ponteiros

    Para declarar variveis ponteiros o programador deve colocar o * (asterisco) antes do nome da varivel, conforme a seguir:

    tipo_de_valor_apontado *nome;

    Onde tipo_de_valor_apontado qualquer tipo de dado vlido em C e define que tipo de dado a varivel ponteiro ir apontar e o nome o identificador da varivel.

    Exemplo: int *px; //apontador para inteiros float *py; //apontador para ponto flutuante char *pstr; //apontador para caracter ou string

    Um ponteiro referencia um endereo de memria e ao mesmo tempo seu contedo. As principais funes de ponteiros consistem em referenciar rapidamente elementos de uma matriz, permitem modificar seus valores entre funes e suportam estruturas dinmicas de dados.

    9.2. Operadores de Ponteiros & e *

    Normalmente a inicializao de um apontador deve-se a atribuio de um endereo de memria (uma referncia). O operador unrio & devolve o endereo de memria de determinada varivel (unrio porque necessita de apenas um operando).

    Exemplo: int i; float soma; char sexo;

    /* inicializando ponteiros na declarao */ int *px = &i;; //px aponta para endereo da varivel i float *py =&soma; //py aponta para endereo da varivel soma

    /* declarando ponteiros, e somente depois inicializando */ char *pstr; //declarao de apontador para caracter ou string pstr = &sexo; //pstr aponta para endereo da varivel sexo

    O segundo operador unrio *, referencia o contedo da varivel localizada no endereo apontado pelo apontador, como se trabalhasse-mos com uma varivel normal. Para o exemplo a seguir, considere que a varivel i esta localizada no endereo 65000 e possui o valor 7.

    Exemplo: px = &i; // px recebe o endereo da varivel i (65000) num = *px; // num recebe o valor apontado pelo endereo de px (7) *px = 9; // endereo 65000 recebe o valor 9

    Tambm podemos modificar a memria apenas manipulando ponteiros. Ao incrementar ou decrementar um ponteiro, ele passa a apontar para a prxima posio de memria, onde est o prximo dado de determinado tipo.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    36

    Exemplo: /* preenchimento da string str com oi utilizando ponteiros */ ps = str; //ponteiro recebe endereo inicial da string *ps = o; // letra o ser o primeiro elemento da string ps++; //ponteiro aponta para prxima posio da memria *ps = i; //atribui caracter i ao endereo apontado por ps ps++; //ponteiro aponta para prxima posio da memria *ps = \0; //caracter nulo ser o terceiro elemento da string

    9.3. Ponteiros para Vetores

    Voc pode criar um ponteiro para um vetor ou matriz apenas atribuindo ao ponteiro o nome da varivel sem o ndice e os colchetes, assim ser armazenado no apontador o endereo inicial do vetor, pois o nome de uma matriz sem o ndice e os colchetes um ponteiro para o primeiro elemento da matriz.

    A seguir dado o cdigo fonte de um programa que trabalha com ponteiro para manipular um vetor de inteiros. Copie o cdigo fonte, compile e execute para analisar as sadas deste programa.

    Exemplo1: /* manipulao com ponteiros */ #include main() { int vet[5], *pt, i; for(i=0;i

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    37

    9.5. Cuidados com Ponteiros

    Entre os erros mais difceis de serem encontrados em C, est na utilizao incorreta dos ponteiros. Analise o exemplo a seguir:

    Exemplo1: /* programa incorreto */ main() {

    int x=10, *pt; *pt=x; // endereo apontado por pt recebe 10

    }

    A pergunta : mas qual endereo recebe o valor 10?. Estamos colocando um valor em alguma posio da memria, sendo que no temos nem certeza se est posio ou no vlida, o ponteiro pt no foi inicializado, ou seja, ele possui lixo. Portanto, sempre antes de comear a utilizar um ponteiro procure inicializ-lo, de forma que garanta que este ponteiro nunca ir sobrescrever o prprio cdigo do programa, ou a rea de dados ou o sistema operacional.

    A utilizao de ponteiros em C deve-se a dois itens:

    Primeiramente em sua utilizao como argumento de funes; A segunda razo consiste em podermos alocar memria dinamicamente, ou seja,

    criarmos variveis em tempo de execuo.

    9.6. Ponteiros como passagem de parmetros

    Quando for necessrio passar como parmetro o endereo para uma funo ou um apontador para uma varivel, fazemos o uso de ponteiros.

    Ento, para passarmos um parmetro por referncia, no momento da chamada a funo devemos usar o operador & na frente da varivel para se obter o apontador da varivel a qual se quer usar. Alm disso, devemos declarar uma varivel apontadora na lista_de_parmetros da funo que esta sendo chamada.

    Exemplo1: //passando endereo das variveis a e b para a funo void troca(int *pa, int *pb); (...) main() { int a, b; troca(&a,&b);

    Exemplo2: //convertendo um ponteiro para acesso bidimensional void tabela(int nota[5][3]); (...) main() { int *pt; (...) tabela(pt);

    9.7. Funes de Alocao Dinmica em C

    A alocao dinmica uma forma de reservar espao em memria enquanto o programa est em execuo. Muitas vezes nos deparamos com programas usando variveis de tamanho ou muito grande ou muito pequeno, pois no sabemos qual a real necessidade do usurio, causando alto desperdcio de memria ou sua prpria carncia, o que no acontece quando trabalhamos com alocao dinmica. Com as funes de alocao dinmica, essas variveis vo sendo dimensionadas de acordo com a necessidade do usurio.

    H basicamente trs formas de alocarmos espao em memria, a primeira com o uso de variveis globais (estticas), essas variveis existem enquanto o programa estiver em

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    38

    execuo e qualquer funo tem acesso a elas. A segunda forma atravs de variveis locais (estticas), essas existem enquanto a funo que a criou estiver sendo executada e, somente esta funo tem acesso a ela. A terceira maneira de requisitar memria ao sistema , utilizando alocao dinmica, a qual feita em tempo de execuo, este espao permanece reservado at que seja liberado explicitamente, sendo desta forma acessvel por qualquer funo do programa. Se o espao reservado no for liberado explicitamente, ao final da execuo do programa ele ser liberado automaticamente.

    As principais funes de alocao dinmica de C so malloc() e free(). A funo malloc() aloca memria e free() a libera. Para utilizar essas funes de alocao dinmica, devemos inserir a biblioteca stdlib.h.

    #include

    A forma geral da funo malloc :

    void* malloc(numero_de_bytes*sizeof(tipo_de_dado));

    A funo malloc recebe como parmetro o nmero de bytes que se deseja alocar e retorna um ponteiro para o endereo inicial do espao reservado em memria. A funo malloc retorna um ponteiro genrico, de acordo com o tipo de dado requisitado, por isso void*, na atribuio, este tipo convertido automaticamente pela linguagem. O campo numero_de_bytes representa a quantidade de bytes que queremos reservar na memria e o campo sizeof(tipo_de_dado) retorna a quantidade de bytes utilizada por determinado tipo de dado, ficando independente do compilador e da arquitetura da mquina, alocando desta forma o espao correto e garantindo portabilidade de cdigo.

    Exemplo: char *pt; pt = malloc(1000); //aloca 1000 bytes na memria e retorna um apontador para o 1 byte

    int *pt; pt = malloc(25*sizeof(int)); //aloca espao p/ 25 inteiros, 100 bytes, 4 para cada inteiro

    Visto que a linguagem faz a converso automaticamente do tipo de ponteiro a ser retornado, comum encontrarmos um operador cast fazendo esta converso explicitamente, conforme apresentado no exemplo a seguir:

    pt =(int *) malloc(25*sizeof(int));

    Aps a alocao dinmica, devemos testar o valor retornado pela funo malloc, se houver falha na alocao, ser retornado o valor NULL, caso contrrio retornado o ponteiro para a primeira posio da memria reservada. Isto necessrio para no usarmos ponteiros nulos, o que provavelmente provocaria um travamento na mquina.

    A funo free o oposto da malloc, ela desaloca espao reservado da memria, devolvendo aquele espao ao sistema para posteriores requisies de memria novamente. A forma geral da funo free :

    void free(void *pt);

    Esta funo recebe como parmetro o ponteiro para o espao reservado em memria e libera este espao.

    Exemplo: free(pt);

    Podemos alocar memria dinamicamente e manipular os dados como se fossem um vetor, pois qualquer ponteiro pode ser indexado como se fosse um vetor unidimensional.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    39

    Exerccios:

    1) Escreva um programa que leia um nmero digitado do teclado. Aps isto, um ponteiro deve apontar para esta varivel que guardou o valor e imprimi-lo na tela, atravs do ponteiro.

    2) Escreva um programa que leia dois valores inteiros. Aps, com a utilizao de 2 ponteiros, deve ser trocado os valores dessas 2 variveis e impresso na tela.

    3) Crie um vetor de 5 elementos reais e preencha-o com a utilizao de ponteiros. Ao final, imprima os valores digitados novamente com a utilizao de ponteiros.

    4) Preencha um vetor de 7 elementos reais. Aps o programa deve chamar uma funo passando como parmetro o endereo inicial do vetor. Na funo chamada deve ter um ponteiro para receber este endereo inicial, aps deve ser alterado cada valor do vetor pelo seu quadrado. Voltando a funo main(), imprima os elementos do vetor.

    5) Escreva um programa que faa a leitura de duas strings de no mximo 100 caracteres. Aps deve ser chamada uma funo que concatene o contedo da segunda string na primeira string (utilize concatena(char *s1, char *s2)). Ao final deve ser impressa a string concatena na funo main().

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    40

    10. Estruturas (structs)

    Uma estrutura uma coleo de variveis de tipos de dados distintos, referenciados por um mesmo nome. As variveis contidas em uma estrutura so denominadas de campos da estrutura. As variveis dentro da struct ocupam endereos contguos da memria.

    10.1. Declarao de Estruturas

    Quando criamos uma estrutura ela fica como se fosse um esqueleto, um molde, para ser utilizada futuramente. As estruturas so declaradas entre as bibliotecas e as funes do cdigo fonte. Sua forma geral :

    struct nome_da_estrutura { tipo_de_dado nome_da_varivel; tipo_de_dado nome_da_varivel; (...) };

    Onde struct a palavra chave para definir um dado do tipo estrutura, acompanhado do nome_da_estrutura, o qual caracteriza a struct. Entre as chaves encontramos os campos, que consistem nos tipos de dados e nomes de variveis. Como estamos definindo um molde, esta estrutura deve ser finalizada pelo caractere ';'.

    Exemplo: /* declarando um molde de estrutura */ struct cliente { char nome[50]; int idade; char sexo; };

    Neste exemplo, declaramos um formato de estrutura com os seguintes campos: um vetor de caracteres para armazenar o nome do cliente, uma varivel inteira para armazenar a idade e uma varivel caractere para armazenar o sexo (M ou F) do cliente. Repare que apenas definimos um molde, mas ainda no existe nenhuma varivel utilizando essa estrutura. Para declarar uma varivel que utilize esse molde, devemos fazer o seguinte, por exemplo:

    struct cliente c1,c2;

    As variveis c1 e c2 iro utilizar o molde da estrutura cliente. Agora podemos utilizar os campos nome, idade e sexo da estrutura atravs de c1 e c2. Tambm possvel declarar as variveis no momento que definimos o molde da estrutura, conforme mostrado a seguir:

    Exemplo: /* declarando um molde e variveis da estrutura */ struct cliente { char nome[50]; int idade; char sexo; } c1,c2;

    10.2. Operadores Ponto (.) e Seta (->)

    Estes operadores referenciam elementos de estruturas, nos quais so tipos de dados compostos referenciados por um nome. O operador . (ponto) deve ser utilizado quando quisermos ler ou modificar algum campo da estrutura. Sua forma geral :

    nome_da_varivel.nome_do_campo

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    41

    O operador -> (seta p/ direita) utilizado quando trabalhamos com apontadores para estruturas, para declarar um apontador para estrutura fazemos o seguinte:

    struct nome_da_estrutura *nome_do_apontador;

    Assim como apontadores para variveis simples, ponteiros para estruturas devem ser precedidos do operador *, para referenciar o dado apontado pelo apontador, ou, podemos abrir mo do operador * para utilizar o operador ->, o qual deixa o cdigo mais legvel. Devemos tomar cuidado para no utilizar o apontador para a estrutura sem antes inicializ-lo.

    Exemplo: /*cadastro de 2 clientes */ #include

    struct cliente { char nome[50]; int idade; char sexo; };

    main() { struct cliente c1,c2; struct cliente *pc2 = &c2; // inicializando o apontador para a estrutura

    // inicializando a variavel c1 do tipo struct

    strcpy(c1.nome,"Joao"); c1.idade = 21; c1.sexo = 'M'; // inicializando a varivel c2 por referncia (apontador)

    strcpy(pc2->nome,"Maria"); pc2->idade = 18; pc2->sexo = 'F'; // imprimindo o contedo printf("Cliente 1:\n"); printf("\tNome: %s\n",c1.nome); printf("\tIdade: %d\n",c1.idade); printf("\tSexo: %c\n",c1.sexo);

    printf("\n\nCliente 2:\n"); printf("\tNome: %s\n",pc2->nome); printf("\tIdade: %d\n",pc2->idade); printf("\tSexo: %c\n",pc2->sexo); }

    Exerccios:

    1) Crie um programa que cadastre dois funcionrios. As informaes que cada funcionrio deve possuir so: cdigo, nome, idade, profisso, sexo (M ou F) e telefone. Ao final deve ser impresso os dados dos dois funcionrios.

    2) Faa o mesmo que pedido no exerccio 1, mas agora somente com a utilizao de apontadores para a estrutura.

    3) Crie um programa que cadastre 10 produtos de um mercado. Onde cada produto possui um cdigo seqencial, nome de identificao, quantidade em estoque e valor. O programa deve permitir as seguintes operaes:

    Apagar um produto, atravs do cdigo do produto; Listar os produtos cadastrados, mostrando o cdigo e o nome do produto; Alterar o estoque dos produtos;

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    42

    Alterar o valor dos produtos. Antes de um produto ser apagado, o programa deve imprimir o nome do produto e aguardar uma confirmao do usurio para deletar o mesmo.

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    43

    11. Arquivos

    Neste captulo ser apresentado outra forma de entrada e sada de dados, arquivos em disco. Veremos, tambm, alguns conceitos bsicos e detalhes para a manipulao de arquivos, podendo ler, escrever, apagar, criar e salvar arquivos em disco. Assim como entrada e sada de dados pode ser via teclado e vdeo, podemos manipular arquivos para os mesmos fins.

    Um arquivo em disco representa um elemento de informao do dispositivo secundrio de memria. Os arquivos acessados na memria secundria so carregados para a memria principal, onde ficam armazenados em um buffer, este buffer uma rea de transferncia entre o disco e a memria, o qual mantm parte ou todo o arquivo para acessos posteriores. Cada arquivo identificado por seu nome e pelo diretrio onde encontra-se armazenado. Geralmente os nomes dos arquivos so compostos por um nome e uma extenso, esta extenso pode ser usada para identificar a natureza da informao armazenada no arquivo ou para identificar o programa que gerou o arquivo.

    Os arquivos podem ser tratados de duas maneiras pelos sistemas operacionais: em modo texto, onde o arquivo composto de uma seqncia de caracteres, ou em modo binrio, onde o arquivo composto por uma seqncia de bytes.

    A linguagem C disponibiliza um conjunto de funes para manipular arquivos, os principais servios de manipulao so:

    Abertura de arquivo: passado o nome e o caminho, o sistema operacional encontra o arquivo e prepara o buffer na memria.

    Leitura do arquivo: o sistema operacional obtm o contedo do arquivo solicitado. Uma parte ou toda a informao solicitada pode vir do buffer.

    Escrita no arquivo: aps aberto o arquivo, o sistema operacional acrescenta ou altera o contedo dele. A alterao no contedo do arquivo feita inicialmente no buffer para depois ser transferida para o disco.

    Fechamento de arquivo: a informao contida no buffer transferida para o disco e a rea utilizada na memria pelo buffer liberada.

    Para o tratamento destes arquivos necessrio que o sistema operacional mantenha um ponteiro de arquivo (file pointer), o qual ir conter o endereo inicial para o arquivo. Para o processo de leitura de arquivo, este apontador percorre o arquivo do incio at o fim, conforme os dados vo sendo lidos para a memria. Para o processo de escrita em um arquivo, normalmente os dados so acrescentados quando o apontador se encontra no fim do arquivo.

    11.1. Funes para abrir e fechar arquivos

    Todas as funes de C que manipulam arquivos encontram-se na biblioteca padro de entrada e sada, stdio.h.

    Visto que para a abertura de um arquivo necessrio ter um ponteiro de arquivo, o primeiro passo para a manipulao de arquivos a declarao de um ponteiro, conforme apresentado a seguir:

    FILE* nome_do_ponteiro;

    Exemplo: FILE* fp;

    Agora sim podemos abrir um arquivo usando a funo fopen, sua forma geral :

    FILE* fopen(nome_do_arquivo,modo);

    A funo fopen(), responsvel pela abertura do arquivo, tem como valor de retorno um ponteiro para o tipo FILE, onde todas as operaes subseqentes devero utilizar o ponteiro. Se ocorrer algum erro na abertura do arquivo, a funo retornar o valor NULL. Geralmente quando

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    44

    abrimos um arquivo, testamos se o arquivo foi aberto com sucesso antes de continuar a execuo do programa. O campo nome_do_arquivo uma cadeia de caracteres, a qual ser passada o nome do arquivo a ser aberto, podendo ser relativo ou absoluto:

    Nome do arquivo relativo: contm apenas o nome do arquivo, sem o caminho de diretrios para chegar at ele, o sistema ir procurar o arquivo a partir do diretrio corrente, no diretrio que possui o cdigo objeto executado.; ou

    Nome do arquivo absoluto: contm o nome do arquivo, incluindo os diretrios, desde o diretrio raiz, exemplo: /home/aluno/Desktop/meu_arquivo.txt.

    O campo modo tambm uma cadeia de caracteres, onde especificado de qual forma queremos tratar o arquivo. Existem diferentes modos de manipulao de arquivos, podemos abrir um arquivo para leitura ou para escrita, o arquivo pode ser aberto em modo texto ou em modo binrio. Os caracteres interpretados no modo so:

    Modo Significado r read-only Abre arquivo para leitura, o arquivo no pode ser alterado. w write Abre arquivo para escrita, o arquivo no pode ser lido. a append Abre arquivo para escrita ao final do contedo original. t text Abre arquivo em modo texto, tratado caracter a caracter. b binary Abre arquivo em modo binrio, arquivo tratado byte a byte. r+ Abre arquivo texto para leitura/escrita. w+ Cria arquivo texto para leitura/escrita. a+ Abre arquivo texto para leitura/escrita ao final.

    Em casos de abertura de um arquivo em modo de escrita, modo w, se o arquivo j existe, ele apagado e criado um novo arquivo com mesmo nome, mas vazio. Quando for solicitada a abertura em modo a, o contedo do arquivo preservado e os dados so adicionados ao final do contedo. Com ambos os modos, se o arquivo no existe, um novo criado. Os modos b e t podem ser combinados com os demais.

    Todos arquivos que forem abertos, devem ser fechados antes do fim da execuo do programa. A funo utilizada para fechar um arquivo fclose, que recebe como parmetro o ponteiro do arquivo que se deseja fechar. O prottipo da funo :

    int fclose(FILE* nome_do_ponteiro);

    Esta funo retorna um valor inteiro, retornando zero se o arquivo for fechado com sucesso, ou retornando a constante EOF (definida pela biblioteca) em caso de erro.

    Exemplo: fp = fopen(teste.txt,rt); //abre o arquivo em modo leitura e texto if(fp == NULL) { //testa se houve erro na abertura do arquivo printf(Erro na abertura do arquivo\n); exit(1); //aborta o programa } fclose(fp); //fecha o arquivo apontado por fp

    11.2. Arquivos em modo texto

    Veremos as principais funes para manipular arquivos em modo texto:

    Leitura de dados: fscanf(), fgetc() e fgets(); Escrita de dados: fprintf(), fputc() e fputs()..

    Algumas vezes, aps uma leitura ou escrita tanto de arquivos quanto do teclado/vdeo, ser necessrio limpar o buffer para que no haja falha nas operaes subseqentes de leitura ou escrita. A linguagem C trabalha basicamente com 3 streams (arquivos), o stdin que o arquivo

  • Escola Solon Tavares Linguagens de Programao I e Estruturas de Dados

    Copyright 2006,07 Alan Malta Rodrigues

    45

    padro de entrada de dados via teclado e o stdout e stderr que so os arquivos padres de sada de dados no vdeo, esses buffers de dados eventualmente precisam ser esvaziados tambm. Para esses procedimentos temos as seguintes funes:

    __fpurge(parmetro): esta funo esvazia o arquivo passado como parmetro, esta funo deve ser utilizada somente no linux;

    fflush(parmetro): tambm responsvel pelo esvaziamento do arquivo passado como parmetro, deve ser utilizada somente no Devc++.

    Exemplo: fflush(fp); //esvazia arquivo apontado por fp __fpurge(stdin); //esvazia buffer de entrada de dados

    11.2.1. Funes para leitura de dados em arquivos

    Assim como utilizamos a funo scanf() para leitura de dados da entrada padro, o teclado, para leitura de dados em arquivos em modo texto, geralmente utilizada a funo fscanf, responsvel pela captura de dados de um arquivo previamente aberto para leitura. A cada leitura o ponteiro varre todo o arquivo e os dados correspondentes so transferidos para a memria. O prottipo da funo fscanf :

    fscanf(FILE* nome_do_ponteiro,formato,nome_da_varivel);

    O primeiro campo da funo deve ser o ponteiro para o arquivo que queremos efetuar a leitura. O campo formato corresponde a maneira a qual queremos fazer a leitura (%d, %f, %c, %s), geralmente utilizamos %s para ler o contedo do arquivo, porm, este l somente uma palavra. O ltimo campo corresponde a varivel que ir receber o contedo lido do arquivo. A funo fscanf() possui como valor de retorno o numero de dados lidos com sucesso.

    Exemplo: fscanf(fp,"%s",str); //l contedo do arquivo e armazena em str printf(%s,str); //imprime contedo lido do arquivo

    Exemplo1: /* Abertura do seguinte arquivo em modo leitura */ Escola 3 1.99 Solon 50 2.99 Tavares 35 3.99

    #i