c_pag_87_199

Upload: eneias-oliveira-de-liz

Post on 14-Apr-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/29/2019 C_pag_87_199

    1/113

    unIDADE III

    ESTRuTuRAS DE REPETIO

    Objetivos de Aprendizagem

    Estudar asestruturasderepetiocontroladasecondicionais.

    Construir programasutilizandoestruturasderepetio.

    Plano de EstudoA seguir, apresentam-se os tpicos que voc estudar nesta unidade:

    EstruturadeRepetio EstruturaFOR EstruturaWHILE EstruturaDOWHILE Problema1 Problema2

  • 7/29/2019 C_pag_87_199

    2/113

  • 7/29/2019 C_pag_87_199

    3/113

    89

    InTRODuO

    Nesta unidade voc estudar a construo de programas com a repetio de um trecho

    de cdigo. A repetio permite executar um conjunto de instrues quantas vezes forem

    necessrias sem ter que precisar reescrever trechos de cdigos idnticos.

    Aprenderemos como utilizar as estruturas de repetio com laos contados e laos condicionais.O uso de laos contados restrito a situaes em que sabemos previamente quantas vezes

    as instrues precisam ser executadas. Na linguagem C a estrutura de repetio com lao

    contado o for.

    Nos laos condicionais no sabemos previamente o nmero de execues e atrelamos a

    repetio a uma condio. Trataremos os casos com condio no incio e no final do lao,

    estudando as estruturas: while e do while.

    Para facilitar o aprendizado construiremos algoritmos utilizando cada uma dessas estruturas.Ao final desta unidade voc estar apto a construir programas com estruturas de repetio

    e poder responder s seguintes questes: como repetir um trecho de cdigo um nmero

    determinado de vezes? Como repetir um trecho de cdigo com base em uma condio? Que

    estrutura de repetio mais adequada para cada problema? Quando utilizar estruturas de

    repetio encadeadas?

  • 7/29/2019 C_pag_87_199

    4/113

    90

    ESTRuTuRA DE REPETIO

    H situaes em nossos programas que precisamos repetir um determinado trecho de cdigo

    ou todo o cdigo um determinado nmero de vezes. Nestes casos, utilizaremos uma estrutura

    de repetio que nos permite criar um loop para efetuar o processamento de um trecho de

    cdigo quantas vezes for necessrio. Na literatura essas estruturas de repetio (loop) so,

    tambm, denominadas de laos de repetio e malhas de repetio (MANZANO; OLIVEIRA,

    1997).

    A vantagem da estrutura de repetio que no precisamos reescrever trechos de cdigo

    idnticos, reduzindo assim o tamanho do algoritmo. Alm disso, podemos determinar repetiescom nmero de vezes varivel (LOPES; GARCIA, 2002).

    Nas estruturas de repetio o nmero de repeties pode ser fixo ou estar relacionado a

    uma condio. Isto , os laos de repetio podem ser classificados em laos contados e

    laos condicionais. O lao contado utilizado quando conhecemos previamente o nmero

    de iteraes que precisa ser realizado. J em um lao condicional este nmero de iteraes

    Fonte:SHu

    TTERSTOCK.C

    OM

  • 7/29/2019 C_pag_87_199

    5/113

    91

    desconhecido e para controlar o loop utilizamos a estrutura condicional (ASCENCIO;

    CAMPOS, 2010).

    Na linguagem C utilizamos o comando forpara laos contados e os comandos while e do

    while para laos condicionais. Nas sees seguintes estudaremos cada uma destas estruturas

    de repetio da linguagem C, destacando sua sintaxe e aplicao.

    ESTRuTuRA FOR

    uma estrutura do tipo lao contado, isto , utilizada para um nmero definido de repeties.

    Devemos utilizar essa estrutura quando sabemos previamente o nmero de vezes que o trecho

    de cdigo precisa ser repetido. A sintaxe desta estrutura :

    for ( i= valor inicial; condio;

    incremento ou decremento de i){

    ;

    }

    Na primeira parte temos a inicializao da varivel i, que tem como funo controlar o nmero

    de repeties do lao. Essa inicializao executada em primeiro lugar e uma nica vez. A

    segunda parte consiste em uma expresso relacional que, ao assumir valor falso, determinar

    o fim da repetio. A terceira par te responsvel por atualizar (incrementar ou decrementar) ovalor da varivel utilizada para controlar a repetio. A atualizao executada ao fim de cada

    iterao (ASCENCIO; CAMPOS, 2010).

    Quando temos a execuo de apenas uma linha de comando podemos suprimir as chaves.

    Neste caso, o compilador entender que a estrutura de repetio finaliza quando for encontrado

    o primeiro ;.

  • 7/29/2019 C_pag_87_199

    6/113

    92

    Para facilitar o entendimento vamos construir um programa que efetua a leitura de um nome e

    o imprime dez vezes na tela. Como sabemos, o nmero de iteraes que deve ser realizado

    utilizamos a estrutura for, em que temos a inicializao da varivel i com valor 1, a expresso

    relacional que controla a execuo do lao i

  • 7/29/2019 C_pag_87_199

    7/113

    93

    Figura 20-ProgramaemC-SadaComo temos a execuo de uma nica instruo podemos suprimir as chaves, conforme

    programa apresentado no Quadro 39.

    Quadro 39 - Programa em C

    #include

    main ()

    {char nome[30];

    int i ;

    printf(\n Informe o nome:);

    scanf(%s, nome);

    for (i=1; i

  • 7/29/2019 C_pag_87_199

    8/113

    94

    Lembre-se, s podemos suprimir as chaves nas situaes em que queremos executar apenas

    uma instruo.

    ESTRuTuRA WHILE

    A estrutura while uma estrutura do tipo lao condicional, isto , o loop baseia-se na anlise

    de uma condio. Essa estrutura utilizada quando temos um nmero indefinido de repeties

    e se caracteriza por realizar um teste condicional no incio. Como o teste condicional

    executado no incio, podem ocorrer casos em que as instrues da estrutura de repetio

    nunca sejam executadas. Isso acontece quando o teste condicional da estrutura resulta em

    falso logo na primeira comparao (ASCENCIO; CAMPOS, 2010).

    A sintaxe da estrutura while :

    while (condio){

    ;

    }

    Os comandos delimitados pelas chaves so executados enquanto a condio for verdadeira.

    Vamos analisar o funcionamento desta estrutura utilizando o exemplo apresentado na seo

    anterior, receber um nome e imprimi-lo dez vezes.

    Na estrutura while temos que representar o critrio de parada (dez iteraes) utilizando uma

    condio. Para tanto, definimos uma varivel que ir controlar o nmero de repeties. Essa

    varivel precisa ser inicializada fora da estrutura de repetio e incrementada no interior do

    lao. No Quadro 40 apresentado o programa.

  • 7/29/2019 C_pag_87_199

    9/113

    95

    Quadro 40 - Programa em C

    #include

    main ()

    {

    char nome[30];

    int i ;

    printf(\n Informe o nome:);

    scanf(%s, nome);

    i = 0;

    while (i != 10)

    {

    printf(\n %d - %s, i, nome);

    i++;

    }

    return (0);

    }

    A Figura 21 ilustra o resultado da execuo do programa, em que o lao repetido at que a

    expresso relacional (i != 10) se torne falsa.

  • 7/29/2019 C_pag_87_199

    10/113

    96

    Figura21

    -Programa

    em

    C

    -Sada

    Neste ponto voc pode estar se questionando por que a varivel i no foi inicializada com

    o valor um ao invs de zero. Voc j sabe o porqu? Quando o valor de i igual a 10 as

    instrues contidas no interior do lao no so executadas, pois a expresso relacional resulta

    em falso. Deste modo, teramos a impresso do nome apenas nove vezes. Se quisermos

    inicializar a varivel i em um temos que alterar a expresso relacional para i != 11.

    ESTRuTuRA DO WHILE

    A estrutura do while uma estrutura do tipo lao condicional, isto , o loop baseia-se na

    anlise de uma condio. Essa estrutura utilizada quando temos um nmero indefinido de

    repeties e precisamos que o teste condicional seja realizado aps a execuo do trecho de

    cdigo. Nesse tipo de estrutura, o trecho de cdigo executado pelo menos uma vez, pois o

    teste condicional realizado no fim (ASCENCIO; CAMPOS, 2010).

  • 7/29/2019 C_pag_87_199

    11/113

    97

    A sintaxe dessa estrutura dada por:

    do

    {

    ;

    }

    while (condio);

    A diferena entre a estrutura while e do while o momento em que o teste condicional

    analisado. No primeiro caso, temos a anlise da condio e a execuo do trecho de cdigo

    apenas se o resultado do teste for verdadeiro. No segundo caso temos a execuo do trecho e

    depois a anlise da condio, o que implica que o trecho de cdigo ser executado no mnimo

    uma vez.

    Para esclarecer o funcionamento da estrutura apresentado no Quadro 41 o programa para oproblema descrito na seo anterior utilizando a estrutura do while.

  • 7/29/2019 C_pag_87_199

    12/113

    98

    Quadro 41 - Programa em C

    #include

    main ()

    {

    char nome[30];int i ;

    printf(\n Informe o nome:);

    scanf(%s, nome);

    i = 0;

    do

    {

    printf(\n %d - %s, i, nome);

    i++;

    }

    while (i != 10);

    return (0);

    }

    Se voc ficou com dvidas quanto ao funcionamento desta estrutura, fique tranquilo!! Veremos

    mais aplicaes.

    PROBLEMA 1

    O problema consiste em ler um conjunto de nmeros inteiros e contar a quantidade de nmeros

    pares e mpares. A leitura dos nmeros deve ser realizada at que seja lido o valor zero.

    A entrada de dados consiste na leitura de nmeros inteiros repetidas vezes, at que o valor

  • 7/29/2019 C_pag_87_199

    13/113

    99

    zero seja digitado. O processamento contar a quantidade de nmeros pares e mpares. E a

    sada informar quantos dos nmeros lidos na entrada so pares e quantos so mpares. No

    Quadro 42 apresentado um programa para este problema utilizando a estrutura while e no

    Quadro 43 utilizando a estrutura do while.

    Quadro 42 - Programa em C

    #include

    main ()

    {

    int par, impar, num;

    par = 0;

    impar = 0;

    printf (\n Informe o numero:);

    scanf (%d, &num);

    while (num !=0)

    {

    if (num % 2 == 0)

    par++;

    else

    impar++;

    printf (\n Informe o numero:);

    scanf (%d, &num);

    }printf (\n A quantidade de par e : %d, par);

    printf (\n A quantidade de impar e : %d, impar);

    return (0);

    }

  • 7/29/2019 C_pag_87_199

    14/113

    100

    Note que como a estrutura while realiza o teste no incio, temos que efetuar a leitura do

    nmero antes do lao de repetio e no interior do lao tambm. O que aconteceria se no

    tivssemos a leitura do nmero dentro do lao de repetio? Nesse caso teramos um lao

    infinito, pois a condio num != 0 sempre resultaria em verdadeiro.

    Na estrutura do while a leitura do nmero realizada apenas no interior da estrutura de

    repetio, pois o teste realizado ao final. Observe que se o primeiro nmero fornecido

    pelo usurio for igual a zero as instrues internas ao lao sero executadas, pois o teste

    realizado pelo menos uma vez. Deste modo, teremos como sada a quantidade um para o

    nmero de pares.

    Fo

    nte:SHuTTERSTOCK.C

    OM

  • 7/29/2019 C_pag_87_199

    15/113

    101

    Quadro 43 - Programa em C

    #include

    main ()

    {

    int par, impar, num;par = 0;

    impar = 0;

    do

    {

    printf (\n Informe o numero:);

    scanf (%d, &num);

    if (num % 2 == 0)

    par++;

    else

    impar++;

    }

    while (num !=0);

    printf (\n A quantidade de par e : %d, par);

    printf (\n A quantidade de impar e : %d, impar);

    return (0);

    }

    Agora que voc j estudou como utilizar as estruturas de repetio baseadas em lao

    condicional, execute os dois programas e compare as sadas.

    Fique atento!! No interior da estrutura de repetio while e do while precisamos ter uma

    instruo que altere o valor da expresso relacional. Caso contrrio, o lao entrar em loop,

    sendo executado infinitamente.

  • 7/29/2019 C_pag_87_199

    16/113

    102

    PROBLEMA 2

    O problema consiste em auxiliar um professor no fechamento das notas de uma turma. Para

    tanto, deve ser construdo um programa que leia o cdigo do aluno, o nmero de notas da

    disciplina e as notas. Calcule a mdia final de cada aluno e informe o nmero de alunos

    aprovados e reprovados. Para ser aprovado o aluno precisa obter mdia maior ou igual a 6. O

    programa encerrado quando informado o cdigo de aluno 0.

    A entrada de dados consiste em ler o nmero de notas, o cdigo do aluno e as notas. O

    processamento consiste em a partir do nmero de notas informado para a disciplina efetuar a

    repetio da leitura de notas, som-las e calcular a mdia aritmtica do aluno. Se a mdia for

    maior ou igual a seis devemos incrementar a varivel que controla o nmero de aprovados,

    seno temos que incrementar a varivel que controla o nmero de reprovados. Como sada

    temos o nmero de alunos aprovados e reprovados.

    No Quadro 44 temos a resoluo do problema utilizando a estrutura do while e no Quadro 45

    com a estrutura while.

  • 7/29/2019 C_pag_87_199

    17/113

    103

    Quadro 44 - Programa em C

    #include

    main ()

    {

    float nota, soma, media;

    int cod, i, nnota, naprovado, nreprovado;naprovado = 0;

    nreprovado = 0;

    printf(\n Informe o numero de notas da disciplina:);

    scanf(%d, &nnota);

    do

    {

    printf (\n Informe o codigo do aluno:);

    scanf (%d, &cod);

    soma = 0;

    if (cod != 0)

    {

    for (i=1; i=6)

    naprovado ++;

    else

    nreprovado ++;

    }

    }

    while (cod !=0);

    printf (\n O numero de aprovados e : %d, naprovado);

    printf (\n O numero de reprovados e : %d, nreprovado);

    return (0);}

  • 7/29/2019 C_pag_87_199

    18/113

    104

    Observe que ao utilizar a estrutura do while precisamos inserir uma condio que verifique

    se o cdigo informado diferente de zero, pois como o teste condicional executado ao final

    teramos a execuo de todas as instrues de leitura de notas.

  • 7/29/2019 C_pag_87_199

    19/113

    105

    Quadro 45 - Programa em C

    #include

    main ()

    {

    float nota, soma, media;

    int cod, i, nnota, naprovado, nreprovado;

    naprovado = 0;

    nreprovado = 0;

    printf(\n Informe o numero de notas da disciplina:);

    scanf(%d, &nnota);

    printf (\n Informe o codigo do aluno:);

    scanf (%d, &cod);

    while (cod != 0)

    {

    soma = 0;

    for (i=1; i=6)

    naprovado ++;

    else

    nreprovado ++;

    printf (\n Informe o codigo do aluno:);

    scanf (%d, &cod);

    }

    printf (\n O numero de aprovados e : %d, naprovado);

    printf (\n O numero de reprovados e : %d, nreprovado);

    return (0);}

  • 7/29/2019 C_pag_87_199

    20/113

    106

    Na construo utilizando a estrutura while foi realizada a leitura do cdigo do aluno antes

    da estrutura de repetio, pois a condio testada no incio do lao. Alm disso, a leitura

    deve ser realizada no interior da estrutura para que o valor da expresso relacional possa ser

    alterado, seno teramos um lao infinito.

    Observe que utilizamos encadeamento de estrutura de repetio, isto , uma estrutura de

    repetio dentro da outra. No primeiro caso, o encadeamento utilizou as estruturas do while efore no segundo caso while e for.

    Ao utilizar encadeamento tome cuidado para que todas as instrues da construo interna

    estejam embutidas na construo externa (MANZANO; OLIVEIRA, 1997; LOPES; GARCIA,

    2002).

    COnSIDERAES FInAIS

    Nesta unidade, voc aprendeu a construir algoritmos utilizando estruturas de repetio, que

    permitem a execuo de um trecho de cdigo repetidas vezes. As estruturas de repetio

    tambm so chamadas de lao de repetio.

    Estudamos os laos de repetio contados e os laos condicionais. Nos laos de repetio

    contados conhecemos a estrutura forque utilizada nos casos em que sabemos quantas

    vezes o trecho de cdigo precisa ser repetido. A sintaxe da estrutura for:

    for ( i= valor inicial; condio;incremento ou decremento de i)

    {

    ;

    }

    Nos laos de repetio condicionais vimos as estruturas while e do while. A estrutura while

    utilizada quando no sabemos previamente o nmero de repeties que deve ser executado e

    impomos uma condio que realizada no incio. A sintaxe da estrutura while :

  • 7/29/2019 C_pag_87_199

    21/113

    107

    while (condio)

    {

    ;

    }

    A estrutura do while utilizada quando temos um nmero indefinido de repeties, no entanto,

    o teste lgico realizado no final. A sintaxe desta estrutura :

    do

    {

    ;

    }

    while (condio);

    Estudamos que as estruturas baseadas em laos condicionais so mais flexveis e que

    podem ser substitudas uma pela outra, isto , podemos resolver um problema com algoritmo

    utilizando a estrutura while ou com a estrutura do while. Destaca-se que a estrutura forpode

    ser substituda pelo uso de estruturas baseadas em laos condicionais.

    Ao longo desta unidade construmos algoritmos utilizando todos os conceitos aprendidos e,

    tambm, discutimos as particularidades de cada estrutura de repetio enfatizando a forma de

    uso de cada uma delas.

    As estruturas while e do while podem ser substitudas uma pela outra, alm de poderem substituirperfeitamente a estrutura for.

  • 7/29/2019 C_pag_87_199

    22/113

    108

    Para saber um pouco mais sobre as estruturas de repetio em C, acesse: .

    ATIvIDADE DE AuTOESTuDO

    1. Faa um programa que leia nmeros inteiros at que seja informado o valor 0. Apresente amdia dos valores, o maior e o menor valor e a quantidade de nmeros pares e mpares.

    2. Construa um programa que leia o nmero de termos da srie e imprima o valor de S.

    3. Elabore um programa que imprima a tabuada do 1 ao 10.

    4. Faa um programa que apresenta a soma de todos os nmeros inteiros mpares entre 200e 500.

    5. Construa um programa que apresente todos os nmeros divisveis por 3 e por 7 que sejammenores que 30.

    6. Elabore um programa que leia uma frase e o nmero de vezes que deseja imprimi-la.

    7. Faa um programa que leia um conjunto de pedidos e calcule o total da compra. O pedidopossui os seguintes campos: nmero, data (dia, ms e ano), preo unitrio e quantidade. Aentrada de pedidos encerrada quando o usurio informa zero como nmero do pedido.

    8. Elabore um programa que receba a idade, peso, sexo e o estado civil de vrias pessoas eimprima a quantidade de pessoas casadas, solteiras, separadas e vivas. Apresente a m-diadeidadeedepeso.Oalgoritmofnalizaquandoforinformadoovalorzeroparaidade.

    9. Construa um programa que possibilite calcular a rea total de uma residncia (sala, cozi-

    nha, banheiro, quartos etc.). O programa deve solicitar a entrada do nome, a largura e ocomprimento de um determinado cmodo at que o nome do cmodo seja FIM. O progra-ma deve apresentar o valor total acumulado da rea residencial.

  • 7/29/2019 C_pag_87_199

    23/113

    109

    EXERCCIOS DE FIXAO

    1. Faa um programa que leia um nmero inteiro e calcule o seu fatorial.

    Quadro 46 - Programa em C

    #include

    main ()

    {

    int num,i, fat;

    printf (\n Informe o numero:);

    scanf (%d, &num);

    fat = 1;

    for (i=1; i

  • 7/29/2019 C_pag_87_199

    24/113

    110

    3. Construaumprogramaque recebaumnmero inteiromaiorque1everifqueseeleprimo.

    Quadro 48 - Programa em C

    #include

    main ()

    {

    int num, i, qtdade;

    printf(\n Informe o numero: );

    scanf(%d, &num);

    qtdade = 0;

    for (i=1; i

  • 7/29/2019 C_pag_87_199

    25/113

    111

    Quadro 49 - Programa em C

    #include

    main ()

    {

    int filhos, npessoas;

    float salario, somas, somaf, msalario;

    npessoas = 0;

    somaf = 0;

    somas = 0;

    msalario = 0;

    printf (\n Informe o salario:);

    scanf (%f, &salario);

    printf (\n Informe o numero de filhos:);

    scanf (%d, &filhos);

    while (salario != -1)

    {

    npessoas++;

    if (salario > msalario)

    msalario = salario;

    somaf = somaf + filhos;

    somas = somas + salario;

    printf (\n Informe o salario:);scanf (%f, &salario);

    printf (\n Informe o numero de filhos:);

    scanf (%d, &filhos);

    }

    printf (\n A media de salarios e : %.2f, somas/npessoas);

    printf (\n A media de filhos e : %.2f, somaf/npessoas);

    printf (\n O maior salario e : %.2f, msalario);

    return (0);

    }

  • 7/29/2019 C_pag_87_199

    26/113

    112

    5. Escreva um programa que receba a idade e altura de vrias pessoas, calcule e apresente amdia de altura e idade das pessoas. A entrada de dados encerrada quando for digitadoo valor 0 para a idade.

    Quadro 50 - Programa em C

    #include main ()

    {

    int idade, npessoas;

    float altura, somaa, somai;

    char sexo;

    somaa = 0;

    somai = 0;

    npessoas = 0;

    printf (\n Informe a idade:);

    scanf (%d, &idade);

    printf (\n Informe a altura:);

    scanf (%f, &altura);

    while (idade != 0)

    {

    npessoas ++;

    somai = somai + idade;

    somaa = somaa + altura;

    printf (\n Informe a idade:);

    scanf (%d, &idade);

    printf (\n Informe a altura:);

    scanf (%f, &altura);

    }

    printf (\n A media de altura e : %.2f, somaa/npessoas);

    printf (\n A media de idade e : %.2f, somai/npessoas);

    return (0);

    }

  • 7/29/2019 C_pag_87_199

    27/113

    113

    6. Em uma avaliao de um produto o cliente responde sua opinio (1 satisfatrio; 2 in-diferente; 3 insatisfatrio). Faa um programa que leia a idade e opinio e apresente: onmero de clientes que respondeu satisfatrio, a mdia de idade dos clientes que opinaramcomo satisfatrio e o nmero de quem respondeu insatisfatrio. O programa se encerraquando for digitado o valor 0 para idade.

  • 7/29/2019 C_pag_87_199

    28/113

    114

    Quadro 51 - Programa em C

    #include main (){

    int idade, npessoas, npessoasi, npessoass, opiniao;float somai, media;npessoas = 0;

    npessoass = 0;npessoasi = 0;somai = 0;printf (\n Informe a idade:);scanf (%d, &idade);do{

    printf (\n Informe a opiniao:);scanf (%d, &opiniao);

    }while ((opiniao != 1) && (opiniao!=2) && (opiniao!=3));while (idade != 0)

    { npessoas ++;if (opiniao == 1)

    {somai= somai + idade;npessoass ++;

    }else{

    if (opiniao == 3){

    npessoasi ++;}

    }printf (\n Informe a idade:);scanf (%d, &idade);do{printf (\n Informe a opiniao:);scanf (%d, &opiniao);

    }while ((opiniao != 1) && (opiniao!=2) && (opiniao!=3));

    }media = (somai/npessoass);printf (\n O numero de pessoas insatisfeitas e : %d, npessoasi);

    printf (\n O numero de pessoas satisfeitas e: %d, npessoass);printf (\n A media de idade das pessoas satisfeitas e : %.2f, media);return (0);

    }

  • 7/29/2019 C_pag_87_199

    29/113

    115

    OLIVEIRA, U. Programando em C. Editora Cincia Moderna, 2008.

    Sinopse: descrevea linguagemCdomodocomo foidefnidapelopadroANSI.Paraauxiliarnoaprendizado da programao em C, o livro faz uma introduo com exemplos para os programadoresiniciantes na linguagem. Os exemplos so programas completos que, alm de ensinar a linguagem,ilustram algoritmos, estruturas de dados e tcnicas de programao importantes. As principais rotinasde I/O so apresentadas e inclui um utilssimo Manual de Referncia C.

  • 7/29/2019 C_pag_87_199

    30/113

  • 7/29/2019 C_pag_87_199

    31/113

    unIDADE Iv

    vETORES, STRINGS, MATRIZES E ESTRuTuRAS

    Objetivos de Aprendizagem

    Estudar oconceitodevetores.

    Conhecermtodosdeordenaoepesquisaemvetores.

    Entenderoconceitodestrings e como manipul-las.

    Estudar o

    conceito

    de

    matrizes

    e

    suas

    aplicaes.

    Entendereaplicarestruturas(structs).

    Plano de Estudo

    A seguir, apresentam-se os tpicos que voc estudar nesta unidade:

    Vetores OrdenaodeVetores PesquisaemVetores Strings Matrizes Estruturas(structs) Problema

  • 7/29/2019 C_pag_87_199

    32/113

  • 7/29/2019 C_pag_87_199

    33/113

    119

    InTRODuO

    Nesta unidade voc estudar estruturas de dados homogneas (vetores e matrizes), strings e

    estruturas de dados heterogneas (structs).

    As estruturas de dados homogneas permitem a representao de diversas informaes do

    mesmo tipo, sendo divididas em unidimensionais (vetores) e multidimensionais (matrizes).Veremos como atribuir valores, realizar a leitura e entrada de dados utilizando vetores e

    matrizes. Em relao aos vetores aprenderemos como realizar a classificao e a pesquisa

    por um determinado elemento.

    Estudaremos as cadeias de caracteres (strings), como declarar e manipul-las. Veremos

    as estruturas de dados heterogneas, structs, que agregam informaes de diversos tipos.

    Abordando, especificamente, como realizar atribuio, entrada, sada de dados e vetores de

    structs.

    Ao trmino desta unidade voc saber construir programas utilizando vetores, matrizes,

    strings e structs. Entender, tambm, qual a importncia desses conceitos e como utiliz-los

    em aplicaes prticas.

    vETORES

    Um vetor consiste em um arranjo de elementos armazenados na memria principal,

    sequencialmente, todos com o mesmo nome. um conjunto de variveis de um mesmo tipo dedado as quais so acessadas e referenciadas por meio de ndices (LOPES; GARCIA, 2002).

    Em C os vetores so identificados pela existncia de colchetes aps o nome da varivel no

    momento da declarao. O valor contido nos colchetes representa o nmero de posies do

    vetor (LOPES; GARCIA, 2002).

  • 7/29/2019 C_pag_87_199

    34/113

    120

    A declarao de um vetor dada por:

    tipo_da_varivel nome_da_varivel [tamanho];

    Um vetor de inteiros declarado do seguinte modo, por exemplo:

    int vetorA[20];

    Neste caso, temos um vetor de inteiros denominado vetorA o qual possui 20 posies,

    conforme ilustra a Figura 22. Esse tipo de declarao faz com que seja reservado um espao

    na memria suficientemente grande para armazenar o nmero de clulas especificadas em

    tamanho.

    Figura 22 - vetor

    Fique atento!! Em C a numerao inicia sempre em zero, ou seja, os nd ices utilizados para

    identificar as posies comeam em zero e vo at o tamanho do vetor menos uma unidade.

    Podemos acessar cada componente de um vetor por meio de ndices associados ao

    identificador do vetor. Este ndice pode ser referenciado diretamente ou por meio de uma

    Fonte:SHuTTERSTOCK.C

    OM

  • 7/29/2019 C_pag_87_199

    35/113

    121

    expresso que resulte em um valor inteiro (ROCHA, 2006).

    Em nossos programas devemos verificar se os valores atribudos a um ndice esto dentro

    dos limites definidos na declarao, pois o compilador no faz essa verificao, o que pode

    ocasionar em erros durante a execuo do programa.

    No Quadro 52 apresentado um exemplo de manipulao de vetores em que possvel

    visualizar como realizada a leitura e como so mostrados os elementos de um vetor.

    Quadro 52 - Programa em C

    #include

    main ()

    {

    int vetorA[10];

    int i;

    for (i=0;i

  • 7/29/2019 C_pag_87_199

    36/113

    122

    No exemplo acima, observe que o inteiro i inicializado em 0 tanto para a operao de

    atribuio quanto para a exibio dos elementos do vetor, pois a numerao de ndices de um

    vetor sempre inicia em 0. Tanto a operao de leitura quanto a exibio realizada por meio

    de um lao de repetio.

    O resultado da execuo do programa apresentado na Figura 23. O que aconteceria se

    lssemos mais de 10 elementos? O programa tentar ler normalmente, mas os escrever emuma parte no alocada de memria, o que pode resultar em diversos erros durante a execuo

    do programa.

    Figura23-ProgramaemC-Sada

  • 7/29/2019 C_pag_87_199

    37/113

    123

    No Quadro 53 temos um exemplo de manipulao de vetores em que a leitura e a exibio

    extrapolam o valor definido para o vetor. Copie o cdigo abaixo e compile. Note que a

    compilao efetuada com sucesso, isto , o compilador no verifica se estamos manipulando

    o vetor fora dos limites definidos na declarao.

    Quadro 53 - Programa em C

    #include

    main ()

    {

    int vetorA[10];

    int i;

    for (i=0;i

  • 7/29/2019 C_pag_87_199

    38/113

    124

    A Figura 24 ilustra o resultado da execuo do programa (Quadro 53). Note que a leitura foi

    realizada normalmente. Na sada de dados ocorreu um erro. Portanto, atente para os limites

    do vetor no momento de manipul-lo.

    Figura24-ProgramaemC-Sada

  • 7/29/2019 C_pag_87_199

    39/113

    125

    ORDEnAO EM vETOR

    A ordenao o processo de rearranjar os elementos de acordo com um critrio especfico

    com o objetivo de facilitar a localizao (WIRTH, 1999). Na literatura existem diversos mtodos

    de ordenao, sendo o mtodo da bolha (Bubble Sort) o mais conhecido.

    O mtodo da bolha consiste em percorrer o vetor repetidas vezes, comparando os elementos

    vizinhos. Se eles esto fora de ordem, efetuada uma troca de posio.

    No Quadro 54 temos um exemplo de ordenao utilizando o mtodo da bolha. O primeiro lao

    de repetio (for) efetua a leitura dos dez elementos do vetor. Em seguida, temos dois laos

    de repetio (for) aninhados, os quais so responsveis por percorrer o vetor comparando os

    elementos vizinhos (i e j) e se eles esto desordenados efetuada a troca de posio. Por fim,

    o terceiro lao exibe os elementos do vetor j ordenados.

    Fonte:SHu

    TTERSTOCK.C

    OM

  • 7/29/2019 C_pag_87_199

    40/113

    126

    Quadro 54 - Programa em C

    #include

    main ()

    {

    int vetorA[10];

    int i, j, troca;

    for (i=0;i

  • 7/29/2019 C_pag_87_199

    41/113

    127

    A Figura 25 mostra a sada obtida na execuo do programa (Quadro 54).

    Figura25-ProgramaemC-Sada

    PESQuISA EM vETOR

    Em muitas situaes temos que pesquisar por um determinado elemento em um vetor. Quando

    temos um grande nmero de elementos, realizar a pesquisa manual um processo invivel.

    Existem mtodos que nos permitem verificar a existncia de um valor dentro de um vetor

    (MANZANO; OLIVEIRA, 1997).

    Estudaremos a pesquisa sequencial que consiste em percorrer o vetor a partir do primeiro

    elemento, sequencialmente, at o ltimo realizando testes lgicos verificando se o elemento

    do vetor, posio a posio, igual ao elemento procurado. A pesquisa se encerra quando o

    elemento for encontrado ou quando todo o vetor foi percorrido e o elemento no foi encontrado

    (WIRTH, 1999).

  • 7/29/2019 C_pag_87_199

    42/113

    128

    A implementao da pesquisa sequencial apresentada no Quadro 55. Agora que voc

    conhece o funcionamento e a implementao da pesquisa sequencial, execute o programa a

    seguir e analise o resultado de sua sada.

  • 7/29/2019 C_pag_87_199

    43/113

    129

    Quadro 55 - Programa em C

    #include

    main ()

    {

    int vetorA[10];

    int i, acha, busca;

    for (i=0;i

  • 7/29/2019 C_pag_87_199

    44/113

    130

    STRINGS

    A stringconsiste em uma cadeia de caracteres, um agregado de caracteres, terminando com

    o caractere especial \0, que indica o fim da string. A declarao de uma string dada por:

    char nome_string[tamanho];

    Note que no h um tipo stringem C, mas sim um vetor tipo char. Como ao final da string

    armazenado o \0 temos que declarar a stringsempre com uma posio a mais do que o

    nmero de caracteres que desejamos. Alm disso, devemos lembrar que as constantes strings

    aparecem entre aspas e no necessrio acrescentar o \0, isso realizado pelo compilador

    (ROCHA, 2006).

    A linguagem C no possui um operador que atue com operandos do tipo string. Deste modo,

    a manipulao de strings realizada por meio de funes. No Quadro 56 so apresentadas

    algumas funes para manipulao de strings.

  • 7/29/2019 C_pag_87_199

    45/113

    131

    Quadro56-Funesparamanipulaodestrings

    retorna a diferena em ASCII entre os dois primeiroscaracteres diferentes, ou zero para igualdade.

    armazena em x os n primeiros caracteres de y.

    l caracteres at encontrar o de nova linha (\n) que gerado quando se pressiona a tecla [enter].

    Fique tranquilo quanto ao modo de utilizar essas funes, veremos exemplos utilizando cada

    uma delas.

  • 7/29/2019 C_pag_87_199

    46/113

    132

    O Quadro 57 apresenta um programa que l um nome completo utilizando a funo gets e

    exibe o comprimento da string. O tamanho da string obtido com a funo strlen.

    Quadro 57- Programa em C

    #include

    #include

    main ()

    {

    char nome[80];

    int tamanho;

    printf (\n Digite o seu nome completo:);

    gets(nome);

    tamanho = strlen(nome);

    printf (\n O comprimento do nome e: %d, tamanho);

    return (0);

    }

  • 7/29/2019 C_pag_87_199

    47/113

    133

    A Figura 26 ilustra a sada obtida com a execuo do programa (Quadro 55).

    Figura26-ProgramaemC-Sada

  • 7/29/2019 C_pag_87_199

    48/113

    134

    O programa do Quadro 58 demonstra o uso das funes strcat, strstr, strupre strlwr.

    Quadro 58 - Programa em C.

    #include

    #include

    main ()

    {

    char nome[80], sobrenome[80];

    printf (\n Digite o seu nome:);

    gets(nome);

    printf (\n Digite o seu sobrenome:);

    gets(sobrenome);

    strcat(nome, sobrenome);

    printf(\n Apos concatenar as strings temos que nome e %s:, nome);

    if (strstr(sobrenome, nome) == 0)

    {

    printf (\n Agora o sobrenome esta contido na variavel nome);

    }

    strlwr(nome);

    printf(\n O nome em minusculo e: %s, nome);

    strupr(nome);

    printf(\n O nome em maiusculo e: %s, nome);return (0);

    }

    O resultado da execuo do programa (Quadro 58) mostrado na Figura 27. Ao concatenar

    as duas strings o nome e sobrenome ficaram juntos. O que devemos fazer para que fique com

  • 7/29/2019 C_pag_87_199

    49/113

    135

    um espao entre o nome e o sobrenome? Antes de concatenar o valor da varivel sobrenome

    devemos concatenar um espao em branco e, em seguida, concatenar o sobrenome.

    Figura27-ProgramaemC-SadaNote que quando utilizamos as funes para manipulao de stringdevemos inserir o contedo

    da biblioteca .

    MATRIZES

    Uma matriz um tipo de dado formado por uma sequncia de variveis do mesmo tipo, com o

    mesmo nome e alocadas sequencialmente na memria. O acesso aos elementos da matriz

    utilizando ndices os quais podem ser referenciados diretamente ou por meio de uma expresso

    que resulte em um valor inteiro. Para cada dimenso da matriz devemos ter um ndice.

  • 7/29/2019 C_pag_87_199

    50/113

    136

    A sintaxe para declarao de uma matriz dada por:

    tipo_da_varivel nome_da_varivel [tamanho][tamanho]...;

    Como exemplo de declarao de matrizes temos:

    int matriz[2] [3];

    Neste caso, temos a declarao de uma matriz de inteiros composta por duas linhas e trs

    colunas.

    Nas operaes de atribuio, leitura e escrita devemos utilizar o nmero de repeties relativo

    ao tamanho das dimenses. Isto , uma matriz de duas dimenses deve ser controlada por dois

    laos de repetio, de trs dimenses trs laos e assim por diante (MANZANO; OLIVEIRA,

    1997).

    O programa do Quadro 59 exemplifica a leitura e impresso de elementos de uma matriz.

  • 7/29/2019 C_pag_87_199

    51/113

    137

    Quadro 59 - Programa em C

    #include

    main ()

    {

    int matrizA[2][10];int i, j;

    for (i=0;i

  • 7/29/2019 C_pag_87_199

    52/113

    138

    ESTRuTuRAS

    Ao utilizar vetores e matrizes conseguamos manipular uma grande quantidade de dados por

    meio de um acesso indexado, no entanto tnhamos a limitao de que todos os elementos

    deveriam ser do mesmo tipo. Em diversas situaes nos deparamos com o fato de ter que

    armazenar informaes relacionadas entre si, mas de tipos distintos (ROCHA, 2006).

    A estrutura permite agregar diversas informaes, que podem ser de diferentes tipos.

    Possibilita gerar novos tipos de dados, alm dos definidos pelas linguagens de programao

    (ASCENCIO; CAMPOS, 2010).

    Em uma estrutura o acesso aos elementos no realizado por meio de sua localizao, mas

    sim por meio do nome do campo que se pretende acessar. Cada informao da estrutura

    denominada de campo, os quais podem ser de diferentes tipos.

    A sintaxe para declarao de uma estrutura :

    struct nome_da_estrutura

    {

    tipo_de_dado do campo 1;

    tipo_de_dado do campo 2;

    . . .

    tipo_de_dado do campo n;

    };

    A partir da definio da estrutura o programa pode considerar que existe um novo tipo de

    dado a ser utilizado (nome_da_estrutura). Esse novo tipo de dado capaz de armazenar

    informaes que podem ser de tipos distintos (ASCENCIO; CAMPOS, 2010).

  • 7/29/2019 C_pag_87_199

    53/113

    139

    Consideremos como exemplo a definio de uma estrutura que armazena a ficha de um

    produto, conforme ilustra a Figura 28. As informaes a serem armazenadas so o cdigo do

    produto, a descrio, o preo e o saldo em estoque, as quais representam os campos que a

    estrutura deve conter.

    Figura 28 - Ficha de produto

    A declarao da estrutura para a ficha do produto :

    struct produto

    {

    int codigo;

    char descricao[50];

    float preco;

    int saldo;

    };

    Essa declarao indica que o programa poder utilizar um novo tipo de dado que contm

    quatro informaes. Ascencio e Campos (2010) destacam que a structs pode ser utilizada

    dentro do bloco em que foi definida. Isto , uma structdefinida dentro das chaves que delimitam

    a funo main s poder ser utilizada por variveis que tambm estejam neste bloco. Para que

  • 7/29/2019 C_pag_87_199

    54/113

    140

    a structseja acessvel de qualquer parte do programa temos que defini-la fora da funo main,

    preferencialmente aps os includes.

    Para utilizar uma structtemos que declarar uma varivel deste tipo do seguinte modo:

    nome_da_estrutura nome_da_varivel;

    No caso da ficha de produto teramos a seguinte declarao:

    produto ficha;

    Essa declarao nos indica que temos uma varivel denominada ficha que do tipo produto.

    Nas operaes de atribuio, leitura e escrita utilizamos o nome da varivel structe seu campo

    correspondente separado por um caractere . (ponto).

    No Quadro 60 temos um programa que exemplifica as operaes leitura e escrita utilizando

    struct. Observe que inicialmente temos a declarao da struct aps a diretiva include e nointerior da funo main temos a declarao de uma varivel do tipo produto. O acesso a cada

    um dos campos realizado por meio do nome da varivel mais o caractere ponto e o nome

    do campo.

  • 7/29/2019 C_pag_87_199

    55/113

    141

    Quadro 60 - Programa em C

    #include

    struct produto

    {

    int codigo;

    char descricao[50];

    float preco;

    int saldo;

    };

    main ()

    {

    produto ficha;

    printf(\n Digite o codigo do produto:);

    scanf(%d, &ficha.codigo);

    printf(\n Digite a descricao do produto:);

    scanf(%s, ficha.descricao);

    printf(\n Digite o preco do produto:);

    scanf(%f, &ficha.preco);

    printf(\n Digite o saldo do produto:);

    scanf(%d, &ficha.saldo);

    printf(\n Codigo : %d, ficha.codigo);

    printf(\n Descricao : %s, ficha.descricao);printf(\n Preco : %.2f, ficha.preco);

    printf(\n Saldo : %d, ficha.saldo);

    return (0);

    }

  • 7/29/2019 C_pag_87_199

    56/113

    142

    O exemplo anterior ilustra a leitura e escrita da ficha de um produto. E se quisermos armazenar

    a ficha de 10 produtos, precisamos criar 10 variveis do tipo produto? No, podemos criar um

    vetor de struct.

    O Quadro 61 exemplifica o uso de um vetor de structcom operaes de leitura e escrita.

    Fonte:SHuTTERSTOCK.C

    OM

  • 7/29/2019 C_pag_87_199

    57/113

    143

    Quadro 61 - Programa em C

    #include

    #include

    struct produto

    {

    int codigo;char descricao[50];

    float preco;

    int saldo;

    };

    main ()

    {

    produto ficha [10];

    int i;

    for (i=0; i> ficha[i].codigo;

    printf(\n Digite a descricao do produto:);

    gets(ficha[i].descricao);

    printf(\n Digite o preco do produto:);

    cin >> ficha[i].preco;

    printf(\n Digite o saldo do produto:);

    cin >> ficha[i].saldo;

    }

    for (i=0; i

  • 7/29/2019 C_pag_87_199

    58/113

    144

    PROBLEMA

    O problema consiste em elaborar um cadastro para 20 livros contendo as seguintes informaes:

    cdigo, ttulo, autor, rea, ano e editora. Desenvolver um menu com as seguintes opes:

    1. Cadastrar os livros.

    2. Imprimir as informaes dos livros.

    3. Pesquisar livros por cdigo.

    4. Ordenar os livros por ano.

    5. Sair do programa.

    No Quadro 62 temos o programa para o problema acima descrito. Na soluo empregamos

    o conceito de structpara criar a ficha do livro, vetor de structpara armazenar as informaes

    dos 20 livros, o mtodo de pesquisa sequencial para efetuar a busca de um livro por cdigo eo mtodo de ordenao da bolha para classificar os livros de acordo com o ano.

  • 7/29/2019 C_pag_87_199

    59/113

    145

    Quadro 62 - Programa em C

    #include

    #include

    #include

    struct livro

    {

    int codigo;

    char titulo[50];

    char autor[30];

    char area[30];

    int ano;

    char editora[30];

    };

    main ()

    {

    livro ficha [20];

    livro troca;

    int busca, i, j, acha, op;

    op = 0;

    while (op !=5)

    {

    printf(\n 1 - Cadastrar os livros);printf(\n 2 - Imprimir os livros cadastrados);

    printf(\n 3 - Pesquisar livros por area);

    printf(\n 4 - Ordenar os livros por ano);

    printf(\n 5 - Sair);

    printf(\n Digite a opcao desejada: );

    scanf(%d, &op);

    if (op == 1)

    {

    clrscr();

    for (i=0; i

  • 7/29/2019 C_pag_87_199

    60/113

    146

    {

    printf(Digite o codigo do livro %d:, i+1 );

    cin >> ficha[i].codigo;

    printf(Digite o titulo do livro: );

    cin >> ficha[i].titulo;

    printf(Digite o nome do autor: );

    cin >> ficha[i].autor;

    printf(Digite a area do livro: );

    cin >> ficha[i].area;

    printf(Digite o ano : );

    cin >> ficha[i].ano;

    printf(Digite o nome da editora: );

    cin >> ficha[i].editora;

    }

    }

    else

    {

    if (op == 2)

    {

    clrscr();

    for (i=0; i

  • 7/29/2019 C_pag_87_199

    61/113

    147

    {

    clrscr();

    printf(Digite o codigo que deseja buscar :);

    scanf (%d, &busca);

    i = 0;

    acha =0;

    while ((i

  • 7/29/2019 C_pag_87_199

    62/113

    148

    {

    if (ficha[i].ano > ficha[j].ano)

    {

    troca = ficha[i];

    ficha[i]= ficha[j];

    ficha[j] = troca;

    }

    }

    }

    for (i=0; i

  • 7/29/2019 C_pag_87_199

    63/113

    149

    COnSIDERAES FInAIS

    Nesta unidade voc aprendeu a construir programa utilizando vetores, strings, matrizes e

    estruturas. Vimos que vetores e matrizes so estruturas de dados homogneas que agrupam

    diversas informaes, do mesmo tipo, em uma nica varivel. O acesso a essas estruturas

    indexado, de modo que nos vetores temos um nico ndice e no caso de matrizes o nmero de

    dimenses determina o nmero de ndices.

    Aprendemos como efetuar classificao e pesquisa em vetores. O mtodo de classificao

    estudado foi o Bubble Sort, que varre o vetor repetidas vezes, comparando os elementos

    vizinhos. Se eles esto fora de ordem, efetuada uma troca de posio. Esse mtodo

    utilizado quando queremos rearranjar o vetor segundo algum critrio. No que se refere

    pesquisa, vimos o mtodo de pesquisa sequencial que nos permite verificar se um dado

    elemento encontra-se no vetor ou no.

    Estudamos o conceito de strings, como efetuar leitura e escrita e conhecemos funes que

    permitem concatenar, comparar, copiar, armazenar, imprimir, converter para um valor numrico

    e outros. Em relao s stringsno podemos esquecer de declar-la com uma posio a mais

    que o nmero de caracteres que desejamos armazenar, pois ao final inserido o \0 que

    indica o fim da string.

    Trabalhamos a definio de novos tipos de dados utilizando estruturas (structs), que so

    capazes de armazenar informaes de tipos diferentes. Estudamos como manipular estas

    estruturas e como construir vetores de estruturas.

    No decorrer desta unidade revisamos os conceitos vistos nas unidades anteriores,

    principalmente as estruturas de repetio, pois elas so utilizadas nas operaes de atribuio,

    leitura e escrita. Por fim, construmos programas envolvendo todos os conceitos abordados.

    Para saber um pouco mais sobre ordenao pelo mtodo da bolha, acesse os vdeos disponveis em:

    .

  • 7/29/2019 C_pag_87_199

    64/113

    150

    Para saber um pouco mais sobre a declarao e construo de structs, acesse: .

    As constantes stringsaparecemsempreentreaspasedevemosacrescentarocaracteredefmdestring\0 (ROCHA, 2006).

    ATIvIDADE DE AuTOESTuDO

    1. Faa um programa que leia dois vetores A e B e apresente a diferena entre os elementos.

    2. Escreva um programa que leia um vetor A e o apresente em ordem decrescente.

    3. Elabore um programa que leia uma palavra e se a palavra tiver nmero mpar de caracte-res, imprima todas as suas consoantes.

    4. Faa um programa que leia uma palavra e o nmero de vezes que se deseja imprimi-la.

    5. Construa um programa que recebe duas matrizes inteiras de ordem 5 e imprima a soma ea diferena entre elas.

    6. Faa um programa que efetua a leitura dos nomes de 5 alunos e tambm de suas quatronotasbimestrais.Calculeamdiadecadaalunoeapresenteosnomesclassifcadosem

    ordem crescente de mdia.

    7. Elabore um programa para efetuar o cadastro de 20 livros e imprimi-los. O cadastro deveconter as seguintes informaes: ttulo, autor, editora, edio e ano.

    8. Faa um programa para efetuar o cadastro de 30 contatos. O cadastro deve conter asseguintes informaes: nome, telefone e e-mail. Apresente todos os cadastros.

  • 7/29/2019 C_pag_87_199

    65/113

    151

    EXERCCIOS DE FIXAO

    1. Escreva um programa que leia um vetor com 30 elementos inteiros e escreva-os em ordemcontrria a da leitura.

    Quadro 63 - Programa em C

    #include

    main ()

    {

    int vetorA[30];

    int i;

    for (i=0;i=0;i--)

    {

    printf(\n %d, vetorA[i]);

    }

    return (0);

    }

    2. Faa um programa que leia dois vetores A e B, com 20 nmeros inteiros. Efetue a soma dosdois vetores em um vetor C e imprima o vetor C em ordem crescente.

  • 7/29/2019 C_pag_87_199

    66/113

    152

    Quadro 64 - Programa em C

    #include

    main ()

    {

    int vetorA[30], vetorB[30], vetorC[30];

    int i, j, troca;

    for (i=0;i

  • 7/29/2019 C_pag_87_199

    67/113

    153

    3. Faa um programa que leia um nome e apresente as letras que se encontram nas posiespares.

    Quadro 65 - Programa em C

    #include

    #include main ()

    {

    char nome[30];

    int tam, i;

    printf (\n Digite o nome:);

    gets(nome);

    tam = strlen(nome);

    for (i=0;i

  • 7/29/2019 C_pag_87_199

    68/113

    154

    4. Construa um programa que leia uma palavra e a escreva de trs para frente.

    Quadro 66 - Programa em C

    #include

    #include

    main ()

    {

    char nome[30];

    int tam, i;

    printf (\n Digite o nome:);

    gets(nome);

    tam = strlen(nome);

    for (i=tam;i>=0; i--)

    {

    printf (%c, nome[i]);

    }

    return (0);

    }

  • 7/29/2019 C_pag_87_199

    69/113

    155

    5. Faa um programa que leia uma palavra e a imprima quantas vezes forem o nmero decaracters.

    Quadro 67 - Programa em C

    #include

    #include main ()

    {

    char nome[30];

    int tam, i;

    printf (\n Digite o nome:);

    gets(nome);

    tam = strlen(nome);

    for (i=0;i

  • 7/29/2019 C_pag_87_199

    70/113

    156

    6. Construa um programa que efetue a leitura de quatro notas de vinte alunos, calcule a mdiade cada aluno e a mdia da turma.

    Quadro 68 - Programa em C

    #include

    main (){

    float media[20];

    float notas[20] [4];

    float somat, mediat, soma;

    int i, j;

    somat = 0;

    mediat =0;

    for (i=0;i

  • 7/29/2019 C_pag_87_199

    71/113

    157

    7. Construa um programa que leia informaes (matrcula, nome, setor e salrio) de 20 fun-cionrios. Deve ser permitido executar quantas consultas o operador desejar, em que eledigita a matrcula e apresentado o setor e o salrio. Se a matrcula digitada no existir,informar o usurio.

    Quadro 69 - Programa em C

    #include

    #include

    struct funcionario

    {

    int matricula;

    char nome[50];

    char setor[30];

    float salario;

    };

    main (){

    funcionario ficha [20];

    int busca, i, acha;

    char op;

    for (i=0; i> f icha[i].matricula;

    printf(\n Digite o nome:);gets(ficha[i].nome);

    printf(\n Digite o setor:);

    cin >> ficha[i].setor;

    printf(\n Digite o salario:);

    cin >> ficha[i].salario;

    }

    do

    {

    printf(Deseja realizar busca (S/N):);

    cin >> op;

    }

  • 7/29/2019 C_pag_87_199

    72/113

    158

    while ((op != S) && (op!=s) && (op !=n) && (op !=N));

    while ((op==S) || (op==s))

    {

    printf(\n Informe a matricula que deseja buscar:);

    cin >> busca;

    i = 0;

    acha = 0;while ((i> op;

    }

    while ((op != S) && (op!=s) && (op !=n) && (op !=N));

    }

    return (0);

    }

  • 7/29/2019 C_pag_87_199

    73/113

    159

    HERBERT, S. C Completo e Total. Editora Makron, 3. ed, 1997.

    Sinopse: C Completo e Total, 3 est dividido em cinco partes, cada uma abordando um aspectoimportante de C. Parte 1 - Apresenta uma discusso detalhada da linguagem C, incluindo palavras-

    -chave, tipos de dados, operadores, funes, ponteiros, E/S, alocao dinmica e muito mais. Parte2 - Apresenta uma extensa descrio das funes de biblioteca por categoria. Abrange as funes de-fnidaspelopadroANSIemuitasextensescomuns,comoaschamadasdearquivosUnix,grfcos

    e as funes de interface com o sistema operacional. Parte 3 - Mostra como aplicar C, concentrando--se em algoritmos teis e aplicaes interessantes da linguagem C. Parte 4 - Trata do ambiente dedesenvolvimentoC,incluindoefcincia,portabilidade,depuraoeinterfacecomocdigoassembler.

    Parte5-DesenvolveuminterpretadorC,comvriosediversifcadosexemplosqueesclarecemcada

    conceito apresentado neste livro e que o diferenciam de qualquer outra obra de referncia sobre C.

  • 7/29/2019 C_pag_87_199

    74/113

  • 7/29/2019 C_pag_87_199

    75/113

    unIDADE v

    FunES E ARQuIvOS

    Objetivos de Aprendizagem

    Conheceredesenvolverfunes.

    Estudar apassagemdeparmetrosporvaloreporreferncia.

    Entenderoconceitoderecursividade.

    TrabalharcommanipulaodearquivosemC.

    Plano de Estudo

    A seguir, apresentam-se os tpicos que voc estudar nesta unidade:

    Funes EscopodeVariveis PassagemdeParmetros PassagemdeParmetrosporValor PassagemdeParmetrosporReferncia ProttipodeFunes Recursividade Arquivos

  • 7/29/2019 C_pag_87_199

    76/113

  • 7/29/2019 C_pag_87_199

    77/113

    163

    InTRODuO

    Chegamos ltima unidade da disciplina de Algoritmos e Lgica de Programao II. Nesta

    unidade, voc aprender a construir programas utilizando o conceito de modularizao e a

    manipular arquivos.

    Para aplicar o conceito de modularizao estudaremos a construo de funes na linguagemC, destacando sua sintaxe e modo de aplicao. Ao trabalhar com funes precisaremos

    entender o conceito de escopo de variveis, compreender o que so variveis locais e variveis

    globais e como elas influenciam nossos programas.

    Estudaremos como construir funes que recebem parmetros e como podemos realizar a

    passagem desses parmetros (por valor ou por referncia). Veremos como construir funes

    recursivas. Conheceremos o conceito de arquivos e como manipul-los utilizando operaes

    de que possibilitem consultar, inserir, modificar e eliminar dados.

    Ao final desta unidade voc saber construir programas utilizando funes e poder responder

    a questes do tipo: quando utilizar uma funo? Quando declarar uma varivel local ou global?

    Quando utilizar prottipo de uma funo? Como deve ser realizada a passagem de parmetros?

    Como acessar um arquivo? Como percorrer um arquivo?

  • 7/29/2019 C_pag_87_199

    78/113

    164

    FunES

    Para solucionar problemas complexos e abrangentes, em geral, temos que dividir o problema

    em subproblemas mais simples e especficos e com isto, dividimos sua complexidade e

    facilitamos o processo de resoluo. Esse processo de decomposio denominado de

    refinamento sucessivo ou abordagem top-down (FORBELLONE; EBERSPACHER, 2005).

    No particionamento dos problemas complexos utilizamos sub-rotinas para resolver cada

    subproblema, permitindo assim a modularizao. A linguagem C possibilita a modularizao

    por meio de funes.

    Uma funo uma sub-rotina que tem como objetivo desviar a execuo do programa principal

    para realizar uma tarefa especfica e retornar um valor. So estruturas que possibilitam ao

    usurio separar seus programas em blocos (ASCENCIO; CAMPOS, 2010).

    Um programa em C um conjunto de funes que so executadas a partir da execuo de uma

    funo denominada main(). Cada funo pode conter declaraes de variveis, instrues e

    ou at mesmo outras funes.

    O objetivo de uma funo realizar alguma subtarefa especfica, isto , podemos escrever

    Fonte:SHuTTERSTOCK.C

    OM

  • 7/29/2019 C_pag_87_199

    79/113

    165

    funes para a entrada de dados, processamento e sada de dados.

    A sintaxe de uma funo dada por:

    tipo_de_retorno nome_da_funo (declarao_de_parmetros)

    {

    corpo_da_funo

    }

    Em que:

    tipo_de_retorno: indica o tipo de varivel que a funo retornar.

    declarao_de_parmetros:especifcaodasvariveisdeentradadafuno.Devemos

    especifcarotipodecadaumadasvariveis.

    corpo_da_funo: conjunto de instrues que realizam a subtarefa, isto , instrues querealizam o processamento dos dados de entrada e geram a sada de dados.

    Em nossas funes utilizamos o comando return, o qual responsvel por encerrar funo

    e retornar o valor informado. Lembre-se: o valor informado no comando returndeve ser

    compatvel com o tipo declarado para a funo.

    No Quadro 70 temos um programa que utiliza uma funo denominada soma() para efetuar

    a leitura, processamento e sada de dados. A funo foi declarada como int e no apresenta

    parmetros de entrada. Na funo principal (main) temos a chamada para a funo soma, a

    qual realiza a entrada de dois valores numricos, os soma e exibe o resultado. Observe que

    as variveis foram declaradas no interior da funo soma, logo estudaremos o escopo das

    variveis, a voc entender a diferena entre declarar a varivel dentro da funo ou fora dela.

  • 7/29/2019 C_pag_87_199

    80/113

    166

    Quadro 70 - Programa em C

    #include

    #include

    int soma ()

    {

    float num1, num2, total;

    printf(Digite o primeiro numero :);

    scanf (%f, &num1);

    printf(Digite o segundo numero :);

    scanf (%f, &num2);

    total = num1+num2;

    printf (A soma e %.2f, total);

    return (0);

    }

    main ()

    {

    clrscr();

    soma();

    return (0);

    }

    A linguagem C possui o tipo void. Esse tipo quer dizer vazio e nos permite escrever funesque no retornam nada e no possuem parmetros. A sintaxe de uma funo que no retorna

    nada dada por:

    void nome_da_funo (declarao_de_parmetros)

  • 7/29/2019 C_pag_87_199

    81/113

    167

    Um exemplo utilizando o tipo void apresentado no Quadro 71. Observe que em funes do

    tipo void no utilizamos o comando return, pois no temos valor de retorno. Alm disso, note

    que inserimos o tipo voidpara a funo main.

    Quadro 71 - Programa em C

    #include

    #include

    void soma ()

    {

    float num1, num2, total;

    printf(Digite o primeiro numero :);

    scanf (%f, &num1);

    printf(Digite o segundo numero :);

    scanf (%f, &num2);

    total = num1+num2;

    printf (A soma e %.2f, total);

    }

    void main ()

    {

    clrscr();

    soma();

    }

    Na seo seguinte estudaremos o escopo das variveis.

  • 7/29/2019 C_pag_87_199

    82/113

    168

    ESCOPO DE vARIvEIS

    O escopo de uma varivel relacionado a sua visibilidade em relao s sub-rotinas de um

    programa. As variveis declaradas no interior de uma funo so chamadas de variveislocais, pois podem ser utilizadas apenas dentro da funo. Ao final da execuo da funo

    essas variveis so destrudas e seus contedos so perdidos (ASCENCIO; CAMPOS, 2010).

    As variveisglobais so aquelas declaradas fora das funes. Elas esto acessveis emqualquer parte do programa e so destrudas apenas ao final da execuo do programa

    (ASCENCIO; CAMPOS, 2010).

    O que acontece se declararmos todas as variveis como global? Esse tipo de varivel ocupa

    memria durante toda a execuo do programa e o torna mais difcil de ser entendido. Deste

    modo, devemos evitar ao mximo o uso desse tipo de varivel.

    Fonte:SHuT

    TERSTOCK.C

    OM

  • 7/29/2019 C_pag_87_199

    83/113

    169

    PASSAGEM DE PARMETROS

    As funes com passagem de parmetros so aquelas que recebem valores no momento

    em que so chamadas. O Quadro 72 apresenta um programa utilizando a passagem de

    parmetros.

    A funo soma do tipo float e possui dois parmetros n1 e n2, os quais tambm so do tipofloat. Note que a entrada de dados realizada na funo

    leitura. Aps a leitura realizada uma chamada funo soma, passando como parmetros

    num1 e num2. A funo soma realiza a operao de adio dos dois valores obtidos como

    parmetro e retorna o total.

    Como a funo soma retorna um valor do tipo float sua chamada foi realizada diretamente

    em uma instruo de atribuio. Isto significa que o valor retornado pela funo atribudo

    diretamente para a varivel resposta.

  • 7/29/2019 C_pag_87_199

    84/113

    170

    Quadro 72 - Programa em C

    #include

    #include

    float soma (float n1, float n2)

    {

    float total;

    total = n1+ n2;

    return (total);

    }

    void main ()

    {

    float num1, num2, resposta;

    clrscr();

    printf(Digite o primeiro numero :);

    scanf (%f, &num1);

    printf(Digite o segundo numero :);

    scanf (%f, &num2);

    resposta = soma(num1, num2);

    printf (A soma e %.2f, resposta);

    }

    Na passagem de parmetros temos que os valores das variveis num1 e num2 foram copiadospara as variveis n1 e n2, respectivamente. Na passagem de parmetros h distino entre

    parmetros reais e parmetros formais. Os parmetros reais so os valores obtidos na entrada

    de dados e os formais so os parmetros exigidos na funo. Com isto, temos que num1 e

    num2 so os parmetros reais e n1 e n2 so parmetros formais.

    A passagem de parmetro ocorre quando realizada a substituio dos parmetros formais

  • 7/29/2019 C_pag_87_199

    85/113

    171

    pelos reais no momento da execuo da funo. A passagem de parmetros pode ser realizada

    por valor ou por referncia, a seguir veremos cada uma delas.

    PASSAGEM DE PARMETROS POR vALOR

    A passagem de parmetro por valor caracterizada pela no alterao do valor do parmetro

    real quando o parmetro formal manipulado na funo. Isto , qualquer alterao na varivel

    local da funo no afetar o valor do parmetro real correspondente. Na passagem de

    parmetros por valor a funo trabalha com cpias dos valores passados no momento de sua

    chamada (MANZANO; OLIVEIRA, 1997; ASCENCIO; CAMPOS, 2010).

    No Quadro 73 apresentado um programa em C que recebe um nmero inteiro, calcula o seu

    dobro e exibe.

    Quadro 73 - Programa em C

    #include

    #include

    int calcdobro (int x)

    {

    x = 2 * x;

    return x;

    }

    void main ()

    {

    int x, resposta;

    clrscr();

    printf(Digite um numero inteiro :);

    scanf (%d, &x);

    resposta = calcdobro(x);

    printf (O dobro do numero %d e %d, x, resposta);

    }

    O parmetro formal da funo calcdobro sofre alteraes no interior da funo, mas a varivel

    x da funo main permanece inalterada, como pode ser visto na Figura 29.

  • 7/29/2019 C_pag_87_199

    86/113

    172

    Figura29

    -Programa

    em

    C

    -Sada

    PASSAGEM DE PARMETROS POR REFERnCIA

    Na passagem de parmetro porrefernciaos parmetros passados para a funo consistemem endereos de memria ocupados por variveis. O acesso a determinado valor realizado

    por apontamento do endereo. Na passagem por referncia o valor do parmetro real alterado

    quando o parmetro formal manipulado dentro da funo (ASCENCIO; CAMPOS, 2010).

    A passagem de parmetros por referncia exemplificada no programa do Quadro 74.

  • 7/29/2019 C_pag_87_199

    87/113

    173

    Quadro 74 - Programa em C

    #include

    #include

    int calcdobro (int *x)

    {

    *x = 2 * (*x);

    return *x;

    }

    void main ()

    {

    int x, resposta;

    clrscr();

    printf(Digite um numero inteiro :);

    scanf (%d, &x);

    resposta = calcdobro(&x);

    printf (O dobro do numero %d e %d, x, resposta);

    }

    Fonte:SHuTTERSTOCK.C

    OM

  • 7/29/2019 C_pag_87_199

    88/113

    174

    Observe que na chamada da funo calcdobro temos que passar o endereo de memria

    ocupado pela varivel x. Isto realizado pelo operador & que obtm o endereo de memria

    de uma varivel. Note, tambm, que as operaes realizadas no interior da funo so sobre

    ponteiros, deste modo temos que inserir o caractere * antes do nome das variveis. E ao final,

    o que muda em relao execuo?

    A Figura 30 ilustra a sada obtida com a execuo do programa. Podemos observar que aoutilizar a passagem de parmetros por referncia temos a alterao do valor da varivel x, que

    inicialmente tinha o valor 5 e ao final da execuo da funo calcdobro ficou com o valor 25.

    Por que isto acontece?

    Figura30-ProgramaemC-SadaPor que no temos uma cpia do valor de x na passagem de parmetros e sim o seu endereo

    de memria. Com isto, temos que a alterao realizada sobre x, conforme Figura 30.

  • 7/29/2019 C_pag_87_199

    89/113

    175

    PROTTIPO DE FunES

    Voc observou que at o momento todas as nossas funes foram escritas antes da funo

    main? Podemos inserir nossas funes aps a funo main? Em qualquer programa podemos

    escrever as funes antes ou aps a funo main. No entanto, se optarmos por escrev-las

    depois da funo main temos que utilizar prottipo de funes.

    O prottipo de uma funo uma linha igual ao cabealho da funo acrescido de ponto e

    vrgula que deve ser escrito antes da funo main. Esta linha responsvel por informar ao

    compilador que outras funes devero ser encontradas ao trmino do main (ASCENCIO;CAMPOS, 2010).

    A sintaxe do prottipo de uma funo dada por:

    tipo_de_retorno nome_da_funo (declarao_de_parmetros);

    Fonte:SHuTTERSTOCK.C

    OM

  • 7/29/2019 C_pag_87_199

    90/113

    176

    O programa da Figura 31 apresenta um exemplo de programa com uma funo escrita depois

    da funo main. Para que o compilador reconhea esta funo temos que aplicar o conceito

    de prottipo de uma funo, em que declaramos o cabealho da funo calcdobro seguido de

    ponto e vrgula antes da funo main (conforme Figura 31).

    Figura 31 - Programa em C

    RECuRSIvIDADE

    Do mesmo modo que em outras linguagens, em C possvel elaborar uma funo que chama

    a si mesma, isto , uma funo recursiva. A recursividade um mecanismo que permite uma

    funo chamar a si mesma direta ou indiretamente. Uma funo recursiva quando possui

    uma chamada a si prpria (ZIVIANE, 2004).

    Ao construir funes recursivas devemos nos certificar de que h um critrio de parada, o qual

    determinar o momento que a funo ir parar de fazer chamadas a si mesmo, impedindo que

    entre em um loop.

  • 7/29/2019 C_pag_87_199

    91/113

    177

    No Quadro 75 temos a implementao da funo recursiva para clculo do fatorial utilizando

    a linguagem C.

    Quadro 75 - Programa em C

    #include

    #include int fatorial (int x)

    {

    if (x == 0)

    return 1;

    else

    return x*(fatorial(x-1));

    }

    void main (){

    int num, resposta;

    clrscr();

    printf(Digite um numero inteiro :);

    scanf (%d, &num);

    resposta = fatorial(num);

    printf (O fatorial e %d, resposta);

    }

  • 7/29/2019 C_pag_87_199

    92/113

    178

    O Quadro 76 apresenta a funo recursiva para o clculo da srie de Fibonacci.

    Quadro 76 - Programa em C

    #include

    #include

    int fibonacci (int x){

    if ((x == 0) || (x==1))

    return x;

    else

    return fibonacci(x-2) + fibonacci(x-1);

    }

    void main ()

    {int num, resposta;

    clrscr();

    printf(Digite um numero inteiro :);

    scanf (%d, &num);

    resposta = fibonacci(num);

    printf (O fibonacci e %d, resposta);

    }

    ARQuIvOS

    Os arquivos so utilizados no armazenamento de uma grande quantidade de informaes

    por um grande perodo de tempo. Um arquivo pode ser lido ou escrito por um programa,

    sendo constitudo por uma coleo de caracteres (arquivo texto) ou bytes (arquivo binrio)

  • 7/29/2019 C_pag_87_199

    93/113

    179

    (ASCENCIO; CAMPOS, 2010).

    A biblioteca stdio.h oferece suporte utilizao de arquivos. Essa biblioteca fornece funes

    para manipulao de arquivos, define novos tipos de dados a serem usados especificamente

    com arquivos, como o tipo FILE (ASCENCIO; CAMPOS, 2010).

    Uma varivel do tipo ponteiro FILE identifica um arquivo no disco e direciona para ele todas as

    operaes. A declarao deste tipo de varivel dada por:

    FILE *arq, *pont;

    Para abrir um arquivo utilizamos a funo fopen(), a qual abre um arquivo e retorna o ponteiro

    associado a ele. Sua sintaxe :

    FILE *p;

    p = fopen(nome_do_arquivo, modo_de_abertura);

    Em que:

    p: varivel que armazena o endereo inicial de memria ocupado por um arquivo;

    nome_do_arquivo: nome do arquivo que se deseja abrir;

    modo_da_abertura: representa como o arquivo ser aberto.

  • 7/29/2019 C_pag_87_199

    94/113

    180

    Quadro 77 - Modos para abertura de arquivos

    Fonte: adaptado de (ASCENCIO; CAMPOS, 2010)

    A funo fopen() quando utilizada no modo escrita, cria o arquivo especificado. Se esse no

    existir ou se j existe um arquivo com o mesmo nome, ser sobreposto por um novo arquivo

    vazio. O resultado da funo fopen() o endereo de memria ocupado pelo arquivo ou NULLquando ocorre algum erro e o arquivo no aberto (ROCHA, 2006; ASCENCIO; CAMPOS,

    2010).

    Para fechar um arquivo utilizamos a funo fclose(), que possui a seguinte sintaxe:

    fclose(arq);

    Em que o argumento arq a referncia para o arquivo. A funo fclose() retorna um valor

    inteiro. Um retorno igual a zero indica que o arquivo foi fechado corretamente.

    A escrita de um caractere em uma arquivo realizada por meio da funo fputc(), que possui

    a seguinte sintaxe:

    fputc(char ch, FILE *arq);

  • 7/29/2019 C_pag_87_199

    95/113

    181

    em que:

    ch: corresponde ao caractere que ser escrito no arquivo;

    arq: referncia do arquivo em que o caractere ser escrito.

    A operao de leitura de um caractere realizada utilizando a funo fgetc(). Sua sintaxe :

    int fgetc(FILE *arq);

    Se a execuo desta funo for bem-sucedida, o caractere ser armazenado em uma varivel

    do tipo int ou char.

    A escrita de uma cadeia de caracteres realizada por meio da funo fputs(), que apresenta

    a seguinte sintaxe:

    fputs(char *cadeia, FILE *arq);

    O argumento cadeia armazena a cadeia de caracteres que ser escrito no arquivo e o

    argumento arq a referncia para o arquivo em que a cadeia ser escrita.

    Na leitura de uma cadeia de caracteres utilizamos a funo fgets(), cuja sintaxe :

    fgets(char *cadeia, int tam, FILE *arq);

    Onde:

    cadeia: armazena a cadeia de caracteres obtida do arquivo;

    tam: indica que a quantidade mxima de caracteres lidos ser tam-1;

    arq: referncia para o arquivo.

  • 7/29/2019 C_pag_87_199

    96/113

    182

    Se quisermos gravar qualquer tipo de dado no arquivo podemos utilizar a funo fwrite(). Sua

    sintaxe dada por:

    fwrite(void *mem, size_t qtd_bytes, size_t cont, FILE *arq);

    Em que:

    mem: representa a varivel que armazena o contedo a ser gravado;

    qtd_bytes: total de bytes a ser gravado no arquivo;

    cont: nmero de blocos de tamanho qtd_bytes que ser armazenado;

    arq: referncia para o arquivo.

    Se a execuo da funo for bem-sucedida seu retorno ser igual ao valor de cont, isto , o

    nmero de gravaes realizadas. Se ocorrer algum erro o retorno ser menor que cont.

    Para efetuar a leitura de qualquer tipo de caractere de um arquivo utilizamos a funo fread(),

    que apresenta a seguinte sintaxe:

    fread(void *mem, size_t qtd_bytes, size_t cont, FILE * arq);

    Onde:

    mem: representa a varivel que receber o contedo lido;

    qtd_bytes: tamanho do bloco que ser lido em bytes;

    cont: nmero de blocos que ser lido;

    arq: referncia para o arquivo.

    De modo anlogo, a funo fwrite(), se sua execuo for bem-sucedida, o retorno ser igual

    ao nmero de leituras, isto , o valor de cont. Seno, o valor ser menor que cont.

  • 7/29/2019 C_pag_87_199

    97/113

    183

    No Quadro 78 so apresentadas algumas funes para manipulao de arquivos.

    Quadro78-Funesparamanipulaodearquivos

    feof(arq);Verifica se o fim do arquivo foi atingido.

    Um valor de retorno igual a zero indica que o

    rewind() rewind(FILE *arq); Posiciona o cursor no incio do arquivo.

    remove() remove(char *nomearq); Apaga um arquivo.

    rename()rename(char *nome_atual, char

    *nome_novo)Altera o nome de um arquivo.

    feof()fim do arquivo ainda no foi atingido.

    Funo Sintaxe Obejtivo

    Fique tranquilo!!! Veremos o funcionamento destas funes. O Quadro 79 apresenta um

    programa que exemplifica a manipulao de arquivos. realizada a operao de abertura

    do arquivo, verificao de erro, leitura de um caractere e fechamento de arquivo. A leitura decaractere realizada at que seja digitado o caractere f. Execute o cdigo a seguir e ao final,

    abra o arquivo com nome arquivo.txt e verifique o seu contedo.

  • 7/29/2019 C_pag_87_199

    98/113

    184

    Quadro 79 - Programa em C

    #include

    #include

    #include

    void main()

    {

    FILE *arq;char letra;

    arq = fopen(C:\\arquivo.txt, w);

    if (arq == NULL)

    {

    printf (\n O arquivo nao foi aberto. Ocorreu um erro!);

    }

    else

    {

    printf (\n Digite um caractere: );

    cin >> letra;while ((letra != f) && (letra !=F))

    {

    fputc(letra, arq);

    if (ferror(arq))

    {

    printf(\n Erro na gravacao !!);

    }

    else

    {

    printf (\n Gravacao efetuada com sucesso!! );

    }

    printf (\n Digite outro caractere: );

    cin >> letra;

    }

    }

    fclose(arq);

    }

  • 7/29/2019 C_pag_87_199

    99/113

    185

    No Quadro 80 temos um exemplo de manipulao de arquivo com a gravao

    de cadeias de caracteres at que seja informada a palavra fm.

    Quadro 80 - Programa em C

    #include

    #include

    #include #include

    void main()

    {

    FILE *arq;

    char palavra[50];

    arq = fopen(C:\\arquivo.txt, w);

    if (arq == NULL)

    {

    printf (\n O arquivo nao foi aberto. Ocorreu um erro!);

    }

    else{

    printf (\n Digite uma palavra: );

    gets(palavra);

    while ((stricmp(palavra,fim) != 0))

    {

    fputs(palavra, arq);

    if (ferror(arq))

    {

    printf(\n Erro na gravacao !!);

    }

  • 7/29/2019 C_pag_87_199

    100/113

    186

    else

    {

    printf (\n Gravacao efetuada com sucesso!! );

    }

    printf (\n Digite uma palavra: );

    gets(palavra);

    }

    }

    fclose(arq);}

    Um exemplo de operao de leitura de um arquivo texto apresentado no Quadro 81. A leitura

    do arquivo realizada at que seja encontrado o fim do arquivo. De modo que so efetuadas

    leituras com 50 caracteres.

  • 7/29/2019 C_pag_87_199

    101/113

    187

    Quadro 81 - Programa em C

    #include

    #include

    #include

    #include

    void main()

    {

    FILE *arq;

    char frase[50];

    arq = fopen(C:\\teste.txt, r);

    if (arq == NULL)

    {

    printf (\n O arquivo nao foi aberto. Ocorreu um erro!);

    }

    else

    {

    while (!feof(arq))

    {

    fgets(frase, 50, arq);

    if (ferror(arq))

    {

    printf(Erro na leitura do arquivo);}

    else

    {

    printf(\n Leitura realizada com sucesso. A cadeia e : %s ,

    frase);

    }

    }

    }fclose(arq);

    }

  • 7/29/2019 C_pag_87_199

    102/113

    188

    Observe que quando queremos realizar a leitura ou escrita de um arquivo devemos utilizar as

    funes de abertura, verificao de erro e fechamento. Em relao abertura do arquivo no

    podemos esquecer de modificar o modo de acesso de acordo com o que desejamos realizar.

    Nos programas do Quadro 79 e Quadro 80 a abertura do arquivo foi realizada utilizando o

    modo de acesso de gravao (w) e no Quadro 81 foi realizada utilizando o modo de acesso

    apenas de leitura (r). Podemos abrir um arquivo para realizar leitura e escrita? Sim, basta

    identificar o modo de acesso como r+. Para relembrar os modos de acesso a arquivos verifique

    o Quadro 77.

    COnSIDERAES FInAIS

    Nesta unidade voc aprendeu como modularizar os programas utilizando funes. Vimos

    que as funes so sub-rotinas que nos permitem desviar a execuo do programa principal

    para realizar uma tarefa especfica e retornam um valor. Alm disso, estudamos que um

    programa em C um conjunto de funes que so executadas a partir da execuo da funo

    denominada main() e que cada funo pode conter declaraes de variveis, instrues e/ou

    at mesmo outras funes.

    Aprendemos que a sintaxe de uma funo dada por:

    tipo_de_retorno nome_da_funo (declarao_de_parmetros)

    {

    corpo_da_funo}

    Ainda em relao a funes vimos o uso do comando return, responsvel por encerrar funo

    e retornar o valor informado, sendo que no comando deve ser compatvel com o tipo declarado

    para a funo.

    Conhecemos o conceito de escopo de variveis e vimos que as variveis podem ser locais ou

    globais. Sendo que uma varivel local aquela que est acessvel apenas dentro da funo,

    enquanto que uma varivel global acessvel de qualquer parte do programa.

    Estudamos a passagem de parmetros por valor e por referncia. Na passagem de parmetros

  • 7/29/2019 C_pag_87_199

    103/113

    189

    por valor no h alterao do valor do parmetro real, pois a funo trabalha com cpias dos

    valores passados no momento de sua chamada. J na passagem de parmetros por referncia,

    esses valores so alterados, pois os parmetros passados so endereos de memria.

    Abordamos o conceito de prottipo de uma funo, que informa ao compilador que outras

    funo devero ser encontradas ao trmino do main. Este conceito nos permite escrever

    funes depois da funo main.

    Estudamos o conceito de recursividade e construmos programas para as funes recursivas

    de clculo de fatorial e srie de Fibonacci.

    Por fim, trabalhamos com a manipulao de arquivos realizando operaes de leitura e escrita.

    Aprendemos como abrir arquivos, quais os modos de operao, como verificar erros durante

    a abertura, como realizar leitura e escrita de caractere e cadeia de caracteres e construmos

    programas para colocar em prtica os conceitos vistos.

    HERBERT, S. C Completo e Total. Editora Makron, 3. ed, 1997.

    Sinopse: C Completo e Total, 3 est dividido em cinco partes, cada uma abordando um aspectoimportante de C. Parte 1 - Apresenta uma discusso detalhada da linguagem C, incluindo palavras--chaves, tipos de dados, operadores, funes, ponteiros, E/S, alocao dinmica e muito mais. Parte

    2 - Apresenta uma extensa descrio das funes de biblioteca por categoria. Abrange as funes de-fnidaspelopadroANSIemuitasextensescomuns,comoaschamadasdearquivosUnix,grfcose as funes de interface com o sistema operacional. Parte 3 - Mostra como aplicar C, concentrando--se em algoritmos teis e aplicaes interessantes da linguagem C. Parte 4 - Trata do ambiente dedesenvolvimentoC,incluindoefcincia,portabilidade,depuraoeinterfacecomocdigoassembler.

  • 7/29/2019 C_pag_87_199

    104/113

  • 7/29/2019 C_pag_87_199

    105/113

    191

    7. Construa um programa que permita ao usurio gravar 10 palavras em um arquivo e, emseguida, efetue a leitura do arquivo.

    EXERCICIOS DE FIXACO

    1. Escreva um programa utilizando funo que converta uma dada temperatura lida emCelsius para Fahrenheit.

    Quadro 82 - Programa em C

    #include

    #include

    float convertet (float celsius);

    void main ()

    {

    float celsius, resposta;

    clrscr();

    printf(Informe a temperatura em graus Celsius :);

    scanf (%f, &celsius);

    resposta = convertet(celsius);

    printf (A temperatura %.2f em Fahreneit e %.2f, celsius, resposta);

    }

    float convertet (float celsius)

    {

    float temp;

    temp = celsius * 1.8 + 32;

    return temp;

    }

  • 7/29/2019 C_pag_87_199

    106/113

    192

    2. Escreva um programa utilizando funo que recebe o peso de um peso em quilogramas econverte para libras.

    Quadro 83 - Programa em C

    #include

    #include float convertep (float peso);

    void main ()

    {

    float peso, resposta;

    clrscr();

    printf(Informe o peso em quilogramas :);

    scanf (%f, &peso);

    resposta = convertep(peso);printf (O peso %.2f em libras e %.2f, peso, resposta);

    }

    float convertep (float peso)

    {

    peso = peso * 2.68;

    return peso;

    }

  • 7/29/2019 C_pag_87_199

    107/113

    193

    3. Faa uma funo que receba como parmetro um vetor com 10 nmeros inteiros e retorne--os ordenado em forma crescente.

    Quadro 84 - Programa em C

    #include

    #include

    void ordena(int v[]){

    int i, j, aux;

    for (i=0;i vet[i]

    }

    ordena(vet);

    printf (\n Vetor ordenado);

    for (i=0;i

  • 7/29/2019 C_pag_87_199

    108/113

  • 7/29/2019 C_pag_87_199

    109/113

    195

    COnCLuSO

    Caro(a) aluno (a), chegamos ao final de nossa disciplina de Algoritmos e Lgica de Programao

    II, em que voc aprendeu os conceitos bsicos da Linguagem de Programao C.

    Na Unidade I vimos o histrico da Linguagem C, suas caractersticas e como o cdigo de um

    programa convertido em um arquivo executvel. Conhecemos a estrutura bsica de umprograma em C, que dada por:

    #include

    main()

    {

    conjunto de instrues;

    }

    Aprendemos que todo programa possui uma funo main, que chamada quando o programa

    executado, como inserir comentrios em nossos cdigos e as regras para a nomeao dos

    identificadores. Conhecemos os tipos bsicos de dados (char, int, float, double, enum, void

    e pointer), operadores e funes intrnsecas disponveis na linguagem C. Vimos, tambm, que

    os tipos de dados bsicos podem gerar outros tipos a partir da aplicao dos modificadores

    unsigned, short e long. Trabalhamos como realizar atribuio, entrada e sada de dados.

    Vimos que a atribuio realizada pelo sinal de igualdade (=), a funo para entrada de dados

    o scanfe a sada o printf. Alm disso, estudamos como utilizar os especificadores de

    formato e cdigos especiais.

    A Unidade II abordou a construo de programas utilizando a estrutura condicional, isto ,

    programas com desvio fluxo. Estudamos a estrutura condicional simples, a estrutura condicional

    composta e a estrutura case. Aprendemos que a estrutura condicional simples utilizada em

    situaes em que um conjunto de instrues deve ser executado apenas se uma condio

    for verdadeira. Vimos que na estrutura condicional composta realizada a avaliao de uma

    nica expresso lgica, no entanto temos dois caminhos para seguir, um para o resultado

    verdadeiro e outro para falso. A sintaxe desta estrutura :

  • 7/29/2019 C_pag_87_199

    110/113

    196

    if()

    {

    ;

    }

    else{

    ;

    }

    Vimos que esta estrutura case deve ser utilizada em situaes mutuamente exclusivas e sua

    sintaxe :

    switch ()

    {

    case : ;

    break;

    case : ;

    break;

    case : ;

    break;

    default: ;

    }

    Colocamos em prtica a construo de programas utilizando cada uma das estruturas

    condicionais.

    Na Unidade III vimos como construir algoritmos utilizando estruturas de repetio, que

    permitem a execuo de um trecho de cdigo repetidas vezes. Estudamos a estrutura forque

    utilizada quando sabemos quantas vezes o trecho de cdigo precisa ser repetido. A sintaxe

    da estrutura for:

  • 7/29/2019 C_pag_87_199

    111/113

    197

    for ( i= valor inicial; condio; incremento ou

    decremento de i);

    {

    ;

    }

    Vimos que a estrutura while utilizada quando no sabemos previamente o nmero de

    repeties que deve ser executado e impomos uma condio que realizada no incio. A

    sintaxe da estrutura while :

    while (condio);

    {

    ;

    }

    Aprendemos que a estrutura do while utilizada quando temos um nmero indefinido de

    repeties, no entanto o teste lgico realizado no final. A sintaxe desta estrutura :

    do

    {

    ;

    }

    while (condio);

    A Unidade IV apresentou os conceitos relacionados a vetores, strings, matrizes e estruturas.

    Estudamos que os vetores e matrizes so estruturas de dados homogneas que agrupam

    diversas informaes, do mesmo tipo, em uma nica varivel e o acesso a essas estruturas

    indexado. Aprendemos como efetuar classificao e pesquisa em vetores. Estudamos como

    efetuar leitura e escrita de strings e conhecemos funes que permitem concatenar, comparar,

    copiar, armazenar, imprimir, converter para um valor numrico e outros. Trabalhamosa definio de novos tipos de dados utilizando estruturas (structs), que so capazes de

    armazenar informaes de tipos diferentes. Estudamos como manipular essas estruturas e

  • 7/29/2019 C_pag_87_199

    112/113

    198ALGORITMOS E LGICA DE PROGRAMAO II | Educao a Distncia

    como construir vetores de estruturas.

    Por fim, na Unidade V, aprendemos a construir programas modulares com o uso de funes,

    cuja sintaxe :

    tipo_de_retorno nome_da_funo (declarao_de_parmetros)

    {

    corpo_da_funo

    }

    Estudamos o conceito de escopo de variveis e a passagem de parmetros por valor e por

    referncia. Vimos que na passagem de parmetros por valor no h alterao do valor do

    parmetro real e que na passagem de parmetros por referncia esses valores so alterados.

    Abordamos a construo de programas utilizando prottipo de uma funo, recursividade e

    manipulao de arquivos.

    Nestas cinco unidades consolidamos o aprendizado dos conceitos inicias da Linguagem de

    Programao C.

    Muito sucesso a voc!

    Professora Camila

  • 7/29/2019 C_pag_87_199

    113/113

    REFERnCIAS

    ASCENCIO, A. F. G.; CAMPOS, E. A. V. Fundamentos da programao de computadores.

    5. ed. So Paulo: Prentice Hall, 2010.

    FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lgica de Programao. 3. ed. So Paulo:

    Makron Books, 2005.

    GUIMARES, A. M.; LAGES, N. A. C. Algoritmos e Estruturas de Dados. Rio de Janeiro:

    LTC, 1994.

    KERNINGHAN, B. W.; RITCHIE, D. M. C Programming Language. 2. ed. Prentice Hall

    Software Series, 1988.

    LOPES, A.; GARCIA, G. Introduo Programao. Rio de Janeiro: Elsevier, 2002.

    MANZANO, J. A. N. G.; OLIVEIRA, J. F. Estudo dirigido de algoritmos. 3. ed. So Prica, 1997.

    PAPPAS, C. H.; MURRAY, W. H. Turbo C++ Completo e Total. So Paulo: Makron, Mc

    Hill, 1991.

    ROCHA, A. A. Introduo Programao usando C. Editora FCA, 2006.

    WIRTH, N. Algoritmos e Estruturas de Dados. Rio de Janeiro: Editora LTC, 1999.

    ZIVIANE, N. ProjetodeAlgoritmoscomimplementaesemPascaleC. 2. ed. So Paulo:Pioneira Thomson Learning, 2004.