Curso Ciencia Da Computaçao

Embed Size (px)

Citation preview

  • 8/21/2019 Curso Ciencia Da Computaao.

    1/20

    Curso: Cincia da Computao

    Nome: Cleyber Fernandes de Matos Ra: 3713642976Atps de programao estruturada II

    Professor: Jefferson Microni

    Anpolis

    03 de junho de 2014

  • 8/21/2019 Curso Ciencia Da Computaao.

    2/20

    Introduo

    Neste trabalho sero apresentadas algumas sugestes a respeito da construo de captulospara estruturar um novo livro sobre a linguagem de programao C, com o objetivo de tornar

    mais fcil o aprendizado na linguagem. A todos que tenham o interesse de programar em C,linguagem muito utilizada para desenvolvimento de sistemas operacionais. Toda estruturaodos captulos sero baseados em exerccios prticos propostos, seguido de uma possvelsoluo computacional aplicvel ao problema em questo.

  • 8/21/2019 Curso Ciencia Da Computaao.

    3/20

    1.1 Captulo 1

    Na programao estruturada os algoritmos so desenvolvidos levando em conta algunsrequisitos bsicos:Primeiramente o algoritmo dever ser desenvolvido em diferentes fases de detalhamentocrescente, do geral ao particular, por refinamentos sucessivos, apesar de se poder escrever umalgoritmo que poderia dar por exemplos 100 linhas em uma linha delimitando as instruescom ;. Porm para deixar o cdigo mais legvel, devemos optar por usar as boas prticas de

    programao colocando apenas um comando por linha, sem esquecer de delimitar cadacomando com ;.

    Desenvolvendo assim o programa em C de cima para baixo. O segundo passo modularizar,isto , devemos dividir o programa em pequenos mdulos funcionais e organizados. Nalinguagem C para realizar esta tarefa temos as funes, que uma unidade de cdigo de

    programa autnoma desenhada para cumprir uma tarefa particular e agrupadas com um nomeespecfico para podermos referenciar. So utilizadas as funes para diminuir a complexidadeda implementao de grandesprogramas uma vez que dividir um grande problema em vrios

    problemas menores se torna mais fcil a resoluo de todos o pequenos problemas, desta

    forma solucionando todo o problema ao final. Essa diviso do sistema em mdulos trazemvrias outras vantagens adicionais, tais como na parte dos testes do software, porque iremostestar cada parte do programa de cada vez tornando mais simples a implementao, e outragrande vantagem que podemos reutilizar cada mdulo cada vez que se fizer necessrioevitando a repetio de linhas de cdigo para uma tarefa que faa uma mesma coisa qual j foi

    implementada anteriormente tornando a programao sempre uma tarefa mais fcil.A chamada de uma funo em C, muito simples, porm em alguns casos chega a ser maiscomplexo. A chamada de uma funo em C, corresponde a uma solicitao para que o

    programa desvie o fluxo de execuo e execute uma serie de instrues que pertence a funochamada, e aps o termino da execuo volte e siga para a prxima posio aps a chamadada funo. A linguagem C conta com vrias funes que foram criadas por diversos

    programadores e que esto disponveis como o printf(), scanf(), dentre outras vrias

    funes que foram desenvolvidas por outros programadores e que so fornecidas por padropelo sistema. Porm ns podemos criar as nossas prprias funes para realizar as tarefas quemelhor adequem aos programasquais queremos desenvolver.

    Em um programa podemos criar uma ou vrias funes, porm sempre deve conter a funoprincipal: main(). A execuo do programa sempre inicia pela execuo da funo main(), equando reconhecido a chamada de uma funo ento a sequencia de execuo automaticamente desviada para a sequncia de instrues contidas na funo chamada, paraento voltar e seguir para a prxima instruo contida no cdigo.As funes simples no so necessrias a declarao podemos simplesmente chama las desdeque esteja dentro do mesmo cdigo ou ento em arquivos separadas, sabendo que em caso dearquivo separado o arquivo dever ser salvo como extenso nome_do_arquivo.h, e feito aincluso no incio do cdigo com a seguinte instruo: #include nome_do_arquivo.h.

    Antes de podermos chamar ou invocar uma funo necessrio que seja feita a declarao oudefinio da funo. Em algum momento antes da execuo de um programa todas as funesdeclaradas devem tambm estar definidas. A definio de uma funo envolve vrios

  • 8/21/2019 Curso Ciencia Da Computaao.

    4/20

    conceitos. Uma funo pode retornar ou no um valor. Quando a funo no retorna nenhumvalor, podemos utilizar a palavra chave voidno cabealho da definio. Uma funo poderetornar um valor do tipo int, double, float, ou um ponteiro ou no retornar nenhum

    valor e neste caso podemos utilizar a palavra chave void. As funes podem serdefinidasem diferentes permutaes. Em tempo de execuo, ao ser chamada ou invocadauma funo , o fluxo de controle desvia para o primeiro comando da funo (mas antes dodesvio reservada e inicializada uma rea especial da memria). Quando executado oltimo comando de uma funo, o fluxo de controle volta para o ponto posterior ao pontoonde a funo foi chamada. O sistema de execuo prepara uma rea especial de memriadenominada registro de ativao ou quadro de ativao (activation frame) para controlar asatividades de chamada, execuo e retorno de uma funo.

    Na compilao de um programa em C o compilador gera cdigo para cada chamada defuno. Alm disso gera cdigo para que seja construdo, de forma adequada, um registro de

    ativao, quando as funes existentes forem invocadas, ou seja, o cdigo correspondente alinha correspondente, entre outros aspectos, salva no registro de ativao o endereo deretorno. O endereo de retorno o endereo para onde desvia o fluxo de controle quando afuno termina.Os parmetros so elementos similares a variveis e ficam disponveis no registro deativao de uma funo. O programador de uma funo pode usar os parmetros da mesmaforma que podem usar uma varivel declarada localmente funo.As variveis definidas dentro de uma funo, da mesma forma que os parmetros, tm seuespao definido dentro do registro de ativao e, portantotodas as variveis definidas dentro

    de uma funo (juntamente com os parmetros) sero destrudas quando for destrudo oregistro de ativao correspondente. As variveis locais e os parmetros s podem serutilizados na funo onde foram definidos. Este tipo de varivel local s funes soconhecidas como variveis automticas. Observe, portanto que as variveis locais ou

    automticas tm um ciclo de vida amarrado ao ciclo de vida dos registros de ativao dafuno correspondente. A linguagem C tem um mecanismo de definio de variveis externasou globais s funes. Estas variveis podem ser utilizadas por todas as funes. A ideia

    que existem variveis comum a todas as funes e comum s diferentes vidas chamadas deuma mesma funo. As variveis definidas fora de uma funo variveis globais tm um

    ciclo de vida amarrado ao ciclo de vida do programa, ou seja, enquanto o programa estiver em

    execuo elas esto disponveis.O modelo de passagem de parmetro da linguagem C denominado passagem de parmetro

    por valor. Os parmetros e as variveis declaradas dentro de uma funo s esto disponveisno escopo desta funo. O registro de ativao contm os parmetros e ir conter todas asvariveis locais que forem definidas. Quando o registro de ativao destrudo as variveislocais e parmetros deixam de existir. Se quisermos que uma funo altere uma varivel achamadadesta funo dever que passar o endereo da varivel ponteiro e a definio destamesma funo tem que levar isto em conta. O compilador quando encontra uma definio devetor na lista de parmetros formais no trata de forma semelhante definio de vetores no

    corpo das funes. Um vetor definido na lista de parmetros passa a ser tratado como umponteiro.A tentativa de definir um vetor bidimensional (ou n-dimensional) tambm tratada da mesma

  • 8/21/2019 Curso Ciencia Da Computaao.

    5/20

    forma ao invs de ser definido um vetor ser definido um ponteiro. A diferena que asdimenses so consideradas de forma diferente tornando mais complexo a forma de tratarcom parmetros com este tipo.Para uma funo poder retornar um valor. necessrio colocar no cabealho de definio dafuno, o tipo do valor que ela ir retornar. A expresso especificada no comando de retornarreturn deve ser de tipo compatvel na definio do cabealho da funo. Quando o fluxo de

    controle atinge um return obtido o endereo de retorno do registro de ativao corrente,

    este registro de ativao corrente destrudo e o fluxo de controle retorna para o comandoseguinte invocao onde tornado disponvel o valor retornado. Quando o tipo da funo void a funo deve usar somente o comando return sem a expresso. Sempre que possvel aconselhvel utilizar a forma de passagem por valor, para evitar"efeitos colaterais", mas h situaesonde esses efeitos so desejveis, por exemplo, quandodesejamos criar uma funo que retorne mais de um valor. Poderamos fazer uma funo para

    retornar apenas a parte real, e outra para retornar apenas a parte imaginria. Mas o C permitecriar uma funo que retorne os dois valores simultaneamente.Como j foi dito uma funo pode retornar um valor, e esse valor pode ou no ser guardadoem uma varivel, isso depende de como queremos lidar com isso. Para retornarmos um valorusamos o comando return. Toda vez que retornamos um valor porque terminamos a

    funo.Resumindo quando desejamos criar uma funo que devolva mais de um valor precisamostrabalhar com ponteiros da seguinte forma, precisamos definir esses parmetros com umcaractere * no prottipo da funo, e ao chamar a funo, os parmetros utilizados na

    chamada correspondentes sada precisam ser precedidos pelo caractere & para indicar queeles podem ser modificados pela funo chamada.O uso de funes muito til para podermos reaproveitar cdigo sem ter que ficarimplementando algo que j existe, quando se trata de programas maiores altamentenecessrio o uso de funes, de forma que o cdigo fique mais organizado sem instruesrepetidas em diferentes partes do programa, consequentemente muito menos linhas de cdigoao final do projeto. Programas feitos com sub-rotinas ou funes so programados e testadosuma svez, embora possam ser usados em vrias partes do programa em quantas vezes sonecessrios.Pode-se criar uma biblioteca com as funes e sub-rotinas que podem ser usados em outros

    programas ou at por outros programadores. Com o uso de funes, ou seja modularizandoconseguimos preservar os refinamentos conseguidos em uma parte especifica do cdigo eestender a toda parte do sistema que ira usar a funo ou sub-rotina. Onde teremos um ganhoconsidervel em relao a economia de memria do computador, uma vez que um moduloutilizado em diferentes partes do programa armazenado uma nica vez.Permite em qualquer instante da execuo do programa, estejam na memria principal apenaso mdulo ou os mdulos necessrios para execuo desse trecho de programa. Permitetambm ocultar o cdigo, uma vez que apenas as rotinas e sub-rotinas fiquem disponveis paraoutros programadores.

    2.1 Problemas propostos

    1. Desenvolva um programa utilizando trs funes simples para a criao de uma tela de

  • 8/21/2019 Curso Ciencia Da Computaao.

    6/20

    boas vindas, aps dever ser chamada uma funo que escreva na tela Primeira funo emC, e aps a tecla enter ser pressionada dever exibir uma mensagem de saudao e encerrar.2. Desenvolva um programa em C utilizando funes simples que crie um menu de opescontendo duas opes. E ao selecionar uma opo aparea a opo selecionada e encerre.3. Desenvolva um programa com passagem deparmetros para os alunos de Matemticaaplicada II, que auxilie na resoluo de problemas que calcule o seno e o cosseno de umngulo, passando o valor do ngulo em radianos como parmetro por valor.4. Desenvolva um programa em c que receba trs valores inteiros e aps sejam passados por

    parmetro o valor e ento imprimir o quadrado de cada um dos nmeros e a soma dosquadrados dos trs nmeros.5. Desenvolva um programa em linguagem c com passagem de parmetros por referencia quedado o valor de custo de uma mercadoria, seja passado por referncia e ento adicionada 65%sobre este valor, ento imprima na tela o valor referente ao preo de venda.

    6. Desenvolva um programa em linguagem c com passagem de parmetros por referncia quedado o valor de um raio de uma circunferncia, seja calculada e impresso o valor referente area desta circunferncia.

    3.1 Implementao em linguagem C dos problemas propostos

    Exemplo 1:#include#include

    main(){ system("color 9f");int boasvindas();int primeirafuncao();int saudacoes();

    boasvindas();primeirafuncao();system("pause");saudacoes();}

    int boasvindas()//funo que cria a tela de boas vindas do programa{ printf("\n Bem Vindo \n"); }int primeirafuncao()//Funo que imprime a frase primeira funo{ printf("\n Primeira Funcao em C! \n"); }int saudacoes(){ printf("\n Obrigado Volte Sempre \n"); }

    Exemplo 2:#include

    #include#includemain()

  • 8/21/2019 Curso Ciencia Da Computaao.

    7/20

    {char opt;void menu();void opcao1();void opcao2();menu();opt = getche();if(opt == '1')opcao1();else if(opt == '2') opcao2();else printf("\n OPCAO INVALIDA");system("pause");}void menu()

    {printf("\n\t MENU \n");printf("\n OPCAO \xAF 1");printf("\n OPCAO \xAF 2 \n");printf("\n OPCAO \xAF ");}void opcao1(){ system("cls");

    printf("\n OPCAO \xAF 1 \xAF SELECIONADA\n");

    }void opcao2(){ system("cls");

    printf("\n OPCAO \xAF 2 \xAF SELECIONADA\n");}

    Exemplo 3:

    #include#include

    #define PI 3.141592654main (){float angulo, resultado;void seno(float angulo, float result);void coseno(float angulo, float result);

    printf("Digite o valor do angulo em graus que deseja saber o seno e cosseno\n");scanf("%f", &angulo);angulo=(2*PI*angulo)/360;//converso para radiano

    seno(angulo, resultado);coseno(angulo, resultado);

  • 8/21/2019 Curso Ciencia Da Computaao.

    8/20

    system("pause");}void seno(float angulo, float result){

    result = sin(angulo);printf ("O seno de angulo e %.2f .\n", result);

    }void coseno(float angulo, float result){result = cos(angulo);

    printf ("O coseno do angulo e %.2f . \n",result);

    }

    Exemplo 4:#include#includemain()

    { int num1, num2, num3;void quadrado( int n1, int n2, int n3);printf("\nInforme trs numeros inteiros\n");scanf("%i%i%i", &num1, &num2,&num3);quadrado( num1, num2, num3);}void quadrado( int n1, int n2, int n3){ printf("\nPrimeiro inteiro ao quadrado:\xAF %i\n", n1 * n1);

    printf("\nSegundo inteiro ao quadrado:\xAF %i\n", n2 * n2);printf("\nTerceiro inteiro ao quadrado:\xAF %i\n", n3 * n3);

    printf("\nSoma dos tres inteiros ao quadrado:\xAF %i\n", (n1 * n1)+(n2 * n2)+(n3 * n3));}

    Exemplo 5:#includemain(){ void preco(float *preco);float prec;

    printf("Informe o preco de compra\n");

    scanf("%f",&prec);preco(&prec);printf("Preco de venda :\xAF %.2f",prec);

  • 8/21/2019 Curso Ciencia Da Computaao.

    9/20

    }void preco(float *preco){ *preco= *preco+ ( *preco * 0.65);}

    Exemplo 6#include#include#define PI 3.141592654main(){ void area(float * raio);float r;

    printf("Informe o valor do raio da circunferencia\n");

    scanf("%f",&r);area(&r);

    printf("\n%.2f",r);system("pause");}void area(float *raio){ *raio=PI *(*raio * *raio); }

    4.1 Captulo 2

    Neste captulo iremos falar sobre os conceitos de registros, conhecidas como struct

    estruturas, que so ferramentas que o programador pode tem para agrupar variveis quepossuem caractersticas em comum, para determinado grupo de dados que estejamrelacionados, podendo agrupar tipos diferentes de variveis em uma mesma struct estrutura

    de dados. Sua sintaxe simples sempre antes da declarao da funo principal declara se aestrutura com o uso dapalavra reservada struct seguida do nome da estrutura.Estruturas ou registro representado em linguagem C pela sintaxe struct um tipo de dado

    estruturado heterogneo, uma coleo de variveis que so referenciadas por um mesmo

    nome, funciona de forma semelhante as matrizes , porm as estruturas tem uma vantagem emralao as matrizes que o fato de poderem agrupar elementos de diversos tipos enquantomatrizes agrupam apenas um determinado tipo. Cada elemento de uma estrutura chamadode campos ou membros da struct. Servem para armazenar informaes de um determinado

    objetoComo uma estrutura pode agrupar vrias variveis em uma estrutura. Funciona como umregistro pessoal tal como uma agenda de contatos pessoal que tenha nome de todos oscontatos e o respectivo nmero de telefone deste contato. Cada contato seria uma estrutura.Desta forma podemos dizer que uma estrutura tem a funo de agrupar um conjunto de dados

    diferentes que tem caractersticas semelhantes mas cada registro nico. Para se criar uma estrutura utilizado o comando struct. A Sintaxe funciona da seguinte

    forma: struct nome_do_tipo_da_estrutura { O nome do tipo da estrutura o nome para a

  • 8/21/2019 Curso Ciencia Da Computaao.

    10/20

    estrutura. As variveis dentro da estrutura so declaradas neste espao antes de fechar achave, e podem ser nomes de variveis que o usurio normalmente iria declarar de outrasformas, e funciona do mesmo jeito asregras so as mesma por exemplo para declarar umavarivel do tipo inteiro seria int num;.

    Outra caracterstica bastante importante que podemos tambm fazer o uso de estruturasdentro de outras estruturas existentes podemos agrupar desta forma tambm diversasestruturas em uma nica estrutura, o que podemos chamar de estruturas aninhadas.Para podermos acessar um campo de uma estrutura um passo pouco diferente como o que jestamos acostumados a utilizar, primeiramente, devemos apontar o campo referente aoendereo da estrutura a qual estiver trabalhando, dentro deste campo, iremos ento apontar ocampo especfico qual queremos acessar. Por exemplo: Para acessar o campo de umaestrutura chamada carro, onde tem um campo chamado modelo, para acessarmos este campo

    deveramos colocar carro.modelo. tambm possvel a declarao de matrizes de estruturas o que pode ser muito til ao

    programador. Uma estrutura funciona da mesma forma que qualquer outro tipo de dado emlinguagem C. O que facilita se caso houver a necessidade de armazenar diversos dados

    poderamos fazer isto de outras formas, porm usando uma estrutura alm de ocupar menosespao, com certeza o acesso ao dado ficar muito mais rpido.Para declarar uma matriz de uma estrutura semelhante ao de uma declarao de uma matriz ,funciona da seguinte forma: a palavra reservada struct seguida do nome da estrutura onome

    do vetor de registro e [tamanho]. Ex: struct carro car[10];

    Uma caracterstica importante do uso de estruturas o fato de um caso como no caso devetores no era possvel copiar um vetor diretamente usando a sigla =, em estrutura, isso possvel desde que as duas estruturas que sero copiadas forem iguais. Porm temos que tercuidado com esta tcnica, quando na atribuio de estruturas que contenham campos ponteiro.Todos os campos sero copiados na segunda. Nas estruturas criar uma cpia desta forma muito mais fcil.Qualquer elemento de uma estrutura pode tambm ser passado para uma funo de formamuito simples. Podemos tambm passar para uma funo uma estrutura inteira. A passagemda estrutura feita por valor.Structs so muito usadas quando temos elementos em nossos programas que precisam e

    fazem uso de vrios tipos de variveis e caractersticas. Usando struct, podemos trabalharcom vrios tipos de informaes de uma maneira mais fcil, rpida e organizada, uma vez queno temos que nos preocupar em declarar e decorar o nome de cada elemento da struct.

    Principalmente se usarmos funes passando as structs como parmetro , referncia ou

    valor, muito til para se trabalhar com ponteiros.A definio de uma estrutura pode ser feita sem indicar o seu nome, mas nesses caso, todas asvariveis desta estruturas tem que ser declaradas no momento da definio.5.1 Problemas

    propostos

    1. Criar uma estrutura para armazenar datas e horrios de compromissos e descrio docompromisso com 6 campos (dia, ano , ms, hora, minutos, descrio).2. Crie uma estrutura que receba os dados de um aluno contendo seu RA, Nome, Nota 1 VA,

  • 8/21/2019 Curso Ciencia Da Computaao.

    11/20

    Nota 2 VA, e aps faa o clculo da mdia sabendo que a nota 1 VA tem peso 4, e a 2 VApeso 6. E apenas diga se o aluno foi aprovado ou no.3. Crie uma estrutura categoria que contenha o nome, cdigo da categoria e uma estrutura de

    produto que contenha o cdigo do produto e descrio. O usurio dever cadastrar a categoriae o produto e aps, dever imprimir todos os dados do produto.4. Crie um programa que permita armazenar os dados de alunos de uma faculdade contendo aestrutura pessoa que dever armazenar o nome, Ra, curso, durao e uma estrutura datascontendo a data de nascimento, data incio curso e data previso de concluso, a data deconcluso deve ser a mesma somando apenas o ano com a durao do curso. Ao final deveraimprimir o nome o Ra, data de nascimento e a data previso de concluso.

    Exemplo 1:#include

    struct compromisso{int Dia, Ano; char Mes[20],desc[30];int hora,min;};main(){struct compromisso d1;

    printf("Entre com o dia:");scanf("%d",&d1.Dia);fflush(stdin);

    printf("Entre com o mes:");

    gets(d1.Mes);printf("Entre com o ano:");scanf("%d",&d1.Ano);

    printf("Entre com ahora:");scanf("%d",&d1.hora);

    printf("Entre com os minutos:");scanf("%d",&d1.min);fflush(stdin);

    printf("Entre com a descricao:");fgets(d1.desc,30,stdin);

    printf("O compromisso digitada e:");printf("%d/%s",d1.Dia,d1.Mes);printf("/%d %d:%d ",d1.Ano,d1.hora,d1.min);puts(d1.desc);system(pause);}

    Exemplo 2:

    #include

  • 8/21/2019 Curso Ciencia Da Computaao.

    12/20

    struct aluno{int ra;float n1,n2,media; char nome[30];};main(){struct aluno aluno1;

    printf("Entre com o Ra:");scanf("%d",&aluno1.ra);fflush(stdin);

    printf("Entre com o nome:");fgets(aluno1.nome,30,stdin);fflush(stdin);

    printf("Entre com a nota 1 VA:");scanf("%f",&aluno1.n1);

    printf("Entre com a nota 2 VA:");scanf("%f",&aluno1.n2);aluno1.media=((aluno1.n1*4)+(aluno1.n2*6))/10;if(aluno1.media>=5){puts(aluno1.nome);printf("Aprovado\n");}else {puts(aluno1.nome);printf("Reprovado\n");}

    system("pause");}

    Exemplo 3:#includestruct produto{char codigo[6], desc[30];};struct categoria{

    char nome[30], cod[6];struct produto produto1;};main(){struct categoria cat1;

    printf("Informe o codigo da categoria ");fgets(cat1.cod, 6, stdin);fflush(stdin);

    printf("Informe o nome da categoria ");fgets(cat1.nome, 30, stdin);fflush(stdin);

  • 8/21/2019 Curso Ciencia Da Computaao.

    13/20

    printf("Informe o codigo do produto ");fgets(cat1.produto1.codigo, 6, stdin);fflush(stdin);

    printf("Informe o nome do produto ");fgets(cat1.produto1.desc, 30, stdin);puts(cat1.cod); puts(cat1.nome); puts(cat1.produto1.codigo);puts(cat1.produto1.desc);

    }

    Exemplo 4:

    #includestruct datas{

    int dini,dnasc,dprev,mesini,mesnas,mesprev,anoini,anonasc,anoprev;};struct aluno{

    char nome[30], ra[11];int duracao;struct datas data;;};

    main(){struct aluno aluno1;

    printf("Informe o nome do aluno ");

    fgets(aluno1.nome, 30, stdin);fflush(stdin);

    printf("Informe o RA do aluno ");fgets(aluno1.ra, 6, stdin);fflush(stdin);

    printf("Informe a duraao do curso ");scanf("%i",&aluno1.duracao);fflush(stdin);

    printf("Informe a data mes e ano de inicio do curso seguido de enter ");

    scanf("%i%i%i",&aluno1.data.dini,&aluno1.data.mesini,&aluno1.data.anoini);printf("Informe a data mes e ano de nascimento seguido de enter ");scanf("%i%i%i",&aluno1.data.dnasc,&aluno1.data.mesnas,&aluno1.data.anonasc);

  • 8/21/2019 Curso Ciencia Da Computaao.

    14/20

    aluno1.data.anoprev=0;aluno1.data.dprev=aluno1.data.dini;aluno1.data.mesprev=aluno1.data.mesini;aluno1.data.anoprev=aluno1.data.anoini+aluno1.duracao;

    printf("\nAluno \xAF ");puts(aluno1.nome);printf("Ra \xAF ");puts(aluno1.ra);

    printf("Data nascimento \xAF%i/%i/%i\n",aluno1.data.dnasc,aluno1.data.mesnas,aluno1.data.anonasc);

    printf("Previso concluso \xAF%i/%i/%i\n",aluno1.data.dprev,aluno1.data.mesprev,aluno1.data.anoprev);system("pause");

    }

    ETAPA 3

    Passo 1

    Contador de linhas de cdigo, de comentrio simples e comentrio multilinhas:

    /**

    * Programa para o ATPS segundo semestre.* Contador de linhas de programa.*/

    //Inicio

    #include#include#include

    enum boolean {true = 1, false = 0

    };typedef enum boolean bool;//Submodulo - rotina de contagem de linhasvoid contar(char *filename){

    printf("Analizando: \"%s\"\n", filename);FILE * pFile;

    int c;int totalLinhaCodigo = 0;int totalLinhaComentario = 0;

  • 8/21/2019 Curso Ciencia Da Computaao.

    15/20

    int totalLinhaEmBranco = 0;bool comentarioEsperado = false;bool emComentarioLinha = false;bool emComentarioMultiLinha = false;bool fechamentoComentarioMultilinhaEsperado = false;bool emLinhaDeCodigo = false;bool fechouComentarioMultiLinha = false;pFile = fopen (filename, "r");

    // Analiza o arquivo

    if (pFile != NULL){

    do{

    c = fgetc(pFile);if (c == '\n')

    {if (emComentarioLinha || emComentarioMultiLinha ||

    fechouComentarioMultiLinha){totalLinhaComentario++;fechouComentarioMultiLinha = false;}

    else if (emLinhaDeCodigo)totalLinhaCodigo++;else

    totalLinhaEmBranco++;emComentarioLinha = false;emLinhaDeCodigo = false;fechamentoComentarioMultilinhaEsperado = false;

    }else if (c == '/' && comentarioEsperado){

    comentarioEsperado = false;emComentarioLinha = true;

    }else if (c == '*' && comentarioEsperado){

    comentarioEsperado = false;emComentarioMultiLinha = true;

    }else if (c == '*' && emComentarioMultiLinha)

    {fechamentoComentarioMultilinhaEsperado = true;

    }

  • 8/21/2019 Curso Ciencia Da Computaao.

    16/20

    else if (c == '/' && fechamentoComentarioMultilinhaEsperado){

    fechamentoComentarioMultilinhaEsperado = false;emComentarioMultiLinha = false;fechouComentarioMultiLinha = true;

    }else if (c == '/' && !emLinhaDeCodigo){

    comentarioEsperado = true;}

    else if (c != ' ' && c != '\t' && !emComentarioLinha&& !emComentarioMultiLinha)

    {

    emLinhaDeCodigo = true;comentarioEsperado = false;

    }else if (c != '/' && fechamentoComentarioMultilinhaEsperado){

    fechamentoComentarioMultilinhaEsperado = false;}else if (c == EOF){

    if (emComentarioLinha || emComentarioMultiLinha ||fechouComentarioMultiLinha){totalLinhaComentario++;fechouComentarioMultiLinha = false;}

    else if (emLinhaDeCodigo)totalLinhaCodigo++;

    elsetotalLinhaEmBranco++;

    emComentarioLinha = false;emLinhaDeCodigo = false;

    fechamentoComentarioMultilinhaEsperado = false;}

    }while (c != EOF);fclose(pFile);

    printf("Nmero de linhas de comentarios = %d.\n", totalLinhaComentario);printf("Nmero de linhas de cdigo = %d.\n", totalLinhaCodigo);printf("Nmero de linhas em branco = %d.\n", totalLinhaEmBranco);

    printf("Nmero total de linhas = %d.\n", totalLinhaComentario + totalLinhaCodigo +

    totalLinhaEmBranco);}

    }

  • 8/21/2019 Curso Ciencia Da Computaao.

    17/20

    //Modulo Principalinicio do programaint main(int argc, char *args[]){

    printf("\n");if (argc > 1)

    if((strstr(args[1], "-h"))!= NULL ){

    printf("Para executar contagem digite: conta texto.extensao\n\n");printf("Para ajuda digite: conta -h\n");}elsecontar(args[1]);

    return 0;}

    ETAPA 4

    Relatrio de funcionamento

    O programa para contagem de linha serve para uma anlise rpida sobre as quantidades decaracteres e suas funes dentro de um cdigo fonte em C. Evidenciando nmeros que podemajudar na produo de estatsticas que caracterizam a escassez ou excesso de comentrios noscdigos, analisados.

    No caso do programa desenvolvido, construmos seguindo os seguintes passos:

    Verificao dos parmetros do programa;

    Consiste na interpretao da string de entrada do programa, na qual, o usurio utiliza paraexecuta-lo e em seguida, na mesma linha, dizer se quer ajuda sobre o mesmo ou insere areferencia cdigo que deseja analisar.

  • 8/21/2019 Curso Ciencia Da Computaao.

    18/20

    int main(int argc, char *args[]){

    printf("\n");if (argc > 1)

    if((strstr(args[1], "-h"))!= NULL ){

    printf("Para executar contagem digite: conta texto.extensao\n\n");printf("Para ajuda digite: conta -h\n");}elsecontar(args[1]);

    return 0;}

    Abaixo exemplificamos a string de entrada do programa.

    Ex.:

    C:\>conta conta.hExecuta nome do cdigo a analizarC:\>contah

    Executa ajuda

    Obs.: Para que funcione como mencionado o programa deve chamar-se conta, casocontrrio ser necessrio modificar ocdigo.

    Sinalizao da atual posio do cursor e validao;

    Atravs de um lgica booleana inicialmente defina, sinalizamos comotrue(verdade) ou false(falso) situaes que podem identificar ou representar umadeterminada posio do cursor dentro do codigo fonte, conforme ele corrido caractere acaractere.

    Abaixo exemplificamos uma situao de sinalizao.

    Ex.:else if (c == '*' && emComentarioMultiLinha){

  • 8/21/2019 Curso Ciencia Da Computaao.

    19/20

    seno, se o caractere atual * e j foi sinalizado que estamos em um comentriomultilinha, ou seja, emComentarioMultilinha true ento...

    fechamentoComentarioMultilinhaEsperado = true;}

    Declaramos que agora esperado um fechamento de comentrio multilinha, ou seja,fechamentoComentarioMultilinhaEsperado agora true.

    else if (c == '/' && fechamentoComentarioMultilinhaEsperado){

    ...seno, se o caractere atual / e j foi sinalizado que esperamos por um fechamento decomentrio multilinha, ou seja, fechamentoComentarioMultilinhaEsperado true ento ...

    fechamentoComentarioMultilinhaEsperado = false;

    emComentarioMultiLinha = false;}

    Declaramos que no estamos mais em um comentrio multilinha e que o fechamento docomentrio multilinha j foi confirmado, por isso no mais esperado. Portanto,fechamentoComentarioMultilinhaEsperado agora false e emComentarioMultiLinha

    tambm, agora, false

    Note, no cdigo, que se qualquer outro caractere que no / for localizado aps

    sinalizarmos que esperamos por um fechamento de comentrio multilinha, este serimediatamente definido como false ou seja, no esperamos mais por um fechamento decomentrio multilinha.

    Identificao e contagem da quebra de linha

    Nesta parte, o programa conta separadamente cada situao de linha, sendo cdigo,comentrio simples, comentrio multilinha ou linhas em branco. Para isto, verificado assituaes sinalizadas a cada quebra de linha (\n).

    Abaixo a situao para quebra de linha.

  • 8/21/2019 Curso Ciencia Da Computaao.

    20/20

    if (c == '\n')

    ...se estamos em uma quebra de linha (c \n), ento...

    {

    if (emComentarioLinha || emComentarioMultiLinha)totalLinhaComentario++;

    ...se estamos em um comentrio de linha simples (emComentarioLinha true) ou em

    um comentriomultilinha (emComentrioMultiLinha true) ento o total de linhas decomentrio acrescentado (totalLinhaComentario++).

    else if (emLinhaDeCodigo)totalLinhaCodigo++;

    ...seno, se estamos em linha de cdigo (emLinhaDeCodigo true), ento o total delinhas de cdigo acrescentado (totalLinhaCodigo++).

    elsetotalLinhaEmBranco++;

    emComentarioLinha = false;

    emLinhaDeCodigo = false;fechamentoComentarioMultilinhaEsperado = false;}

    ...seno, deduzimos que estamos em uma linha em branco e acrescentamos seu contador(totalLinhaEmBranco++). Consequentemente, declara-se que no estamos em linha de cdigo(emLinhaDeCodigo agora false), no estamos em linha de comentrio simples

    (emComentarioLinha agora false) e por final, no esperamos por um fechamento de

    comentrio multilinha (fechamentoComentarioMultilinhaEsperado agora false).

    Apresentao das informaes

    Por final, aps executado, o programa imprime em tela as quantidades contadas

    printf("Nmero de linhas de comentarios = %d.\n", totalLinhaComentario);printf("Nmero de linhas de cdigo = %d.\n", totalLinhaCodigo);printf("Nmero de linhas em branco = %d.\n", totalLinhaEmBranco);printf("Nmero total de linhas = %d.\n", totalLinhaComentario +

    totalLinhaCodigo + totalLinhaEmBranco);