O Compilador de C: Empezando a Programar

De Wiki do Ciclo ASIR do IES de Rodeira
Revisión feita o 26 de xuño de 2014 ás 10:09 por Xavi (conversa | contribucións) (Nova páxina: "== Metodoloxía da Programación. == A principal razón para que as persoas aprendan a programar e o obxectivo xeral das linguaxes de programación, é poder facer uso da computa...")
(dif) ← Revisión máis antiga | Revisión actual (dif) | Revisión máis nova → (dif)
Saltar á navegación Saltar á procura

Metodoloxía da Programación.

A principal razón para que as persoas aprendan a programar e o obxectivo xeral das linguaxes de programación, é poder facer uso da computadora como unha ferramenta para a resolución de problemas. Axudado por unha computadora, a resolución dun problema pódese dividir en tres fases importantes:

  1. Análise do problema.
  2. Deseño ou desenvolvemento dun algoritmo.
  3. Resolución do algoritmo na computadora.

Análise Do Problema.

O propósito da análise dun problema é axudar ó programador para chegar a unha certa comprensión da natureza do problema. O problema debe estar ben definido si se desexa chegar a unha solución satisfactoria. A análise do problema esixe unha lectura previa co fin de obter unha idea xeral do que se solicita. A segunda lectura deberá servir para responder ás preguntas:

  • ¿Que información debe proporcionar a resolución dun problema dado?
  • ¿Que datos se necesitan para resolve-lo?

Deseño do Algoritmo.

En xeral podemos definir un algoritmo como un método que permite resolver un problema dado, no cal se describen os pasos necesarios para conseguir o fin proposto. É importante ter en conta de que a descrición dun algoritmo é totalmente independente da linguaxe de programación que posteriormente se utilice para levar o algoritmo a un ordenador.

As características dun bo algoritmo son:

  1. Preciso: Debe indicar sen ambigüidades a orde e os pasos necesarios para resolver o problema.
  2. Definido: Si se sigue o algoritmo dúas veces en idénticas condicións, débese obter o mesmo resultado.
  3. Finito: Debe chegar a un final nun número finito de pasos.

Á súa vez, a definición dun algoritmo debe ter esencialmente tres partes:

  1. Entrada: Solicítanse os datos necesarios para o problema e para que o algoritmo se inicie.
  2. Proceso: Conxunto de operacións que se realizan sobre os datos de entrada e outros datos internos para dar lugar a un resultado.
  3. Saída: É a fase na que se proporcionan os resultados do algoritmo.

Un ordenador non ten capacidade para solucionar problemas por si mesmo. Só os soluciona cando se lle proporcionan os pasos sucesivos a realizar, ou sexa o algoritmo, traducido a código máquina.

Os problemas complexos se resolven máis eficazmente cando se dividen en sub-problemas (módulos) máis doados de solucionar que o orixinal. A descomposición do problema orixinal noutros máis simples e, a continuación, a división destes noutros aínda máis simples, e así sucesivamente ata chegar á solución completa do problema chámase deseño descendente ou top-down. Normalmente os pasos indicados no primeiro esbozo do algoritmo son xenéricos, incompletos e indicarán só un número reducido de tarefas. Tras esta primeira descrición, estes pasos amplíanse nunha descrición máis detallada con máis pasos máis específicos. Isto é o que se denomina refinamento do algoritmo.

As vantaxes máis importantes do deseño descendente son:

  • Os problemas se entenden con máis facilidade ó dividilos en partes máis simples denominadas módulos.
  • As modificacións e corrección dos módulos son máis sinxelas.
  • A verificación do problema é máis fácil.
  • Facilita a distribución do traballo para ser solucionado entre varios grupos de persoas.
  • Reutilización do código. Algúns módulos poden ser útiles en outros programas

A preocupación do deseñador centrarase en resolver correctamente cada un dos subproblemas (tarefa máis sinxela), coa garantía de que a unión de tódalas solucións dos subproblemas resolverá adecuadamente o problema de partida.

Cando se diseñan os distintos módulos convén non perder de vista a posibilidade de reutilización que pode presentar o módulo e deseñalo tendo esto en conta. Deste xeito conseguiremos ir xuntando unha librería de módulos que nos axudarán nos novos traballos.

Existen varias ferramentas que permiten o deseño e a representación dun algoritmo. Dúas delas son os diagramas de fluxo e o pseudocódigo.

Resolución do Algoritmo na Computadora.

Unha vez que o algoritmo está deseñado débese pasar á fase de resolución práctica do problema coa computadora. Esta fase descomponse á súa vez nas seguintes subfases:

  1. Codificación do algoritmo nun programa.
  2. Compilación e execución.
  3. Verificación e depuración.
Codificación

Consiste en transcribir o algoritmo a unha linguaxe de alto nivel. Dado que os algoritmos son deseñados independentemente das linguaxes de programación, o código pode ser escrito con igual facilidade nunha linguaxe ou outra.

Compilación

Unha vez que o algoritmo se converteu nun programa fonte, mediante o proceso de codificación, é necesario traducilo a código ou linguaxe máquina, única que o computador é capaz de entender e executar. O encargado de realizar esta función é un programa traductor (compilador ou intérprete) que indicará se o programa fonte presenta erros de sintaxe, nese case deberanse corrixir e volvelo a compilar, ata que non existan erros.

Verificación e depuración

A verificación e depuración son procesos sucesivos mediante os que se proba un programa cunha ampla variedade de datos de entrada, chamados datos de proba, que determinan se o programa ten erros lóxicos.

E imprescindible realizar as probas unha vez compilado o programa con éxito, xa que é moi difícil conseguir programas libres de erros de lóxica. As probas deben facerse sempre intentando que o programa falle, e e aconsellable que as faga unha persoa distinta á que realizou o programa.

A depuración consiste en, unha vez establecido que existe un erro de lóxica, localizalo e correxilo. Para axudar nesta tarefa existen utilidades chamadas depuradores (debuggers).

Ferramentas e Notacións para o Deseño de Algoritmos.

Existen varias ferramentas que permiten o deseño e a representación dun algoritmo. Aquí destacamos dúas delas que son:

Diagramas de Fluxo.

Os Diagramas de fluxo foron unha das ferramentas máis usadas debido ó seu caracter gráfico, xa que tódolos algoritmos son representados a través de figuras ou símbolos estándar que teñen asociado un significado particular. Cada paso do algoritmo é representado a través dun símbolo adecuado e o orden en que estes pasos se executan indícase conectándoos con frechas chamadas liñas de fluxo. Este sistema proporciona unha perspectiva visual do fluxo de execución do programa.

Símbolos básicos dos diagramas de fluxo ou ordinogramas:

Ficheiro:Diafluxo.png

Por exemplo o seguinte diagrama representa un algoritmo para visualizar os factores primos dun número solicitado ó usuario:

Ficheiro:Fluxofacprimos.png

Pseudocódigo.

O Pseudocódigo xurdiu como alternativa ós diagramas de fluxo. É unha linguaxe algorítmica similar ó idioma natural, pero máis conciso e que permite unha redacción rápida do algoritmo, carecendo, loxicamente, da precisión nas súas operacións que posúen as linguaxes de programación.

Estructuras Básicas dos Programas.

Para implementar os programas utilízanse sempre as mesmas estructuras básicas, que nos proporcionan as ferramentas para almacenar valores, variar o fluxo de execución do algoritmo, ou agrupar un conxunto de instruccións que proporcionan unha funcionalidade de xeito que sexa posible reutilizalas cando sexa convinte: variables, estructuras de control e as funcións.

Variables e Constantes

Unha variable é un sitio donde se pode almacenar un valor. En calquera momento se pode modificar o valor da variable almacenando un novo valor.

Unha constante é un nome que se lle da a un valor fixo. Por exemplo PI pra representar 3.14159, este valor polo tanto non varía.

As variables as identificaremos cun nome, que empezará por unha letra e non levará espacios en branco. Convén elexir nomes para as variables que definan a información que van a almacenar, por exemplo: edade é un bo nome de variable, pero w non.

As instruccións típicas con variables son :

  • ASIGNACIÓNS: E o proceso de almacenar un valor a unha varible. Se realizará poñendo variable = valor ou variable = expresión matemática.
  • EXPRESIÓNS: Pódense utilizar variables en expresións matemáticas ou lóxicas. Nese caso utilizarase o valor que ten en ese momento a variable para realizar o cálculo ou evaluar a expresión.

En moitas linguaxes de programación as variables teñen asociado un tipo de datos que define o tipo de información que é capaz de almacenar.

Estructuras de control

Os programas normalmente se executan en secuencia, dende a primeira instrucción ata a última. Para variar o fluxo de execución do programa empréganse as estructuras de control.

Todas as linguaxes de programación proporcionan o mesmo tipo de estructuras de control básicas, o único que cambia e a forma de escribilas e as palabras empregadas. Aquí faremos unha posible descripción de modo que as podamos utilizar dun xeito independiente da linguaxe de programación que utilicemos posteriormente, facilitando así o deseño do seudocódigo dos programas.

Selección (Condicionais)

As estructuras de selección permiten seleccionar que instruccións executar segun o resultado dunha condición. As habituais en case todas as linguaxes de programación son:

  Si (condición)             Si (condición)              Según (variable)
    <instruccións>;             <instruccións>;             No caso VALOR: <instruccións>;
  Se non                     Fin-Si                         No caso VALOR: <instruccións>;
    <instruccións>                                                ......
  Fin-Si                                                    Noutro caso: <instruccións>;
                                                         Fin-Según

A sentencia Según permite seleccionar un grupo de instruccións dependendo do valor dunha variable. As sentencias Si permiten executar un grupo de instruccións so si se cumple a condición indicada. Tamén é posible decir que grupo de instruccións alternativa queremos executar si a condición non se cumple coa palabra Se non.

A sentencia Según en realidade e unha forma de abreviar varios Si anidados.

A representación en diagramas de fluxo sería:

Ficheiro:Símbolo Si.png

Iteracións (Bucles ou Ciclos)

<c> Mentras (condición) Facer

 <instruccións>              <instruccións>
 ...                         ...

Fin-Mentras Mentras (condición); </c> A sentencia Mentras permite repetir a execución dun grupo de instruccións mentras se cumple a condición indicada. A diferencia con Facer é que esta última executa as instruccións antes de evaluar a condición a primeira vez.

A súa representación en diagramas de fluxo permite unha mellor comprensión:

Ficheiro:Simbolo Mentras.png

Funcións

As funcións consisten en agrupar unha serie de instruccións que proveen unha certa funcionalidade baixo un nome. Esto permite o deseño descendente dunha maneira efectiva e facilita a reutilización do código, xa que esa funcionalidade pode ser necesaria noutros programas. As funcións normalmente reciben os datos de entrada necesarios para realizar o seu traballo nunhas variables chamadas parámetros e producen un resultado de saída. Unha forma de representar as funcións pode ser o seguinte:

       Función <nomedafunción>
          RECIBE : variable: Descripción, variable: Descripción, variable: Descripción, ...
          DEVOLVE: descripción
            <instruccións>
            ...
       Fin-Función <nomedafunción>

Normalmente as variables utilizadas na función existen so dentro da función (locais), e non teñen nada que ver con outras variables que se utilicen fora aínda que se chamen igual. Para utilizar a función únicamente é necesario chamala polo seu nome e con a lista de parámetros entre paréntese e almacenar (si e necesario) o valor devolto nunha variable:

      variable = <nomedafunción> (dato1, dato2, dato3, ....)


Técnicas de Programación.

Programación 'Convencional'.

A programación estructurada é unha metodoloxía de programación que fundamentalmente trata de construír programas que sexan facilmente comprensibles. Esta metodoloxía está baseada na técnica de desenvolvemento de programas por refinamentos sucesivos: inicialmente plantéxase a operación global a realizar polo programa, e descomponse noutras máis sinxelas. Á súa vez, estas últimas volven ser descompostas novamente noutras accións aínda máis elementais. Este proceso de descomposición continúa hasta que todo se pode escribir utilizando tres estructuras básicas de control (as estructuras de control determinan a orde na que deben realizarse as distintas accións):

  1. Secuencia.
  2. Selección.
  3. Iteración.
Secuencia

Cando se deben executar sucesivamente distintas accións, escribirase a lista destas accións na orde na que deban ser executadas.

Selección

Son aquelas que controlan a execución ou a non execución dunha ou máis instruccións en función de que se cumpra ou non unha condición previamente establecida. a.- Alternativa simple. b.- Alternativa dobre. c.- Alternativa múltiple.

Iteración

A estructura de control iterativa permite expresar que unha mesma acción ou composición de accións se debe executar unha ou máis veces e de forma consecutiva: a.- Estructura Mentres. b.- Estructura Repetir - Mentres c.- Estructura Para

Programación Orientada a Obxectos.

A programación orientada a obxectos (OOP) pretende solucionar os problemas enfocandoos dende o punto de vista dos obxectos que interveñen no problema e a forma de relacionarse entre eles. Baixo este punto de vista, un obxecto está composto de atributos ou propiedades (información que almacenan) e de métodos (accións que poden realizar sobre os seus atributos). Destes métodos, algúns son públicos (accesibles por outros obxectos) e outros privados (para uso interno do propio obxecto), os atributos públicos reciben o nome de interface do obxecto. Os obxectos se comunican entre eles invocando métodos doutros obxectos, no que se chama normalmente unha mensaxe.

Os métodos en realidade son funcións que forman parte do obxecto. Os obxectos se deseñan pensando únicamente no obxecto e nas funcionalidades que debe proporcionar.

Para crear un obxecto é necesario diseñar unha clase de obxecto, que é a que vai a definir qué atributos e métodos van a ter todos os obxectos que pertenezcan a esa clase. Por exemplo, si diseñamos a clase coche, que ten como atributos a cor, a cilindrada, o número de portas e o tipo de combustible e como métodos arrancar, parar e cambiar de marcha poderemos crear obxectos de tipo coche, como poden ser wvpolo, scenic ou golf. Ó proceso de crear un obxecto coñécese como instanciación e dise que se crea unha instancia da clase á que pertence o obxecto.

As características máis importantes da programación orientada a obxecto son a herdanza e o polimorfismo:

  • A herdanza permite o deseño de novas clases a partir de outras existentes, herdando de modo automático toda a funcionalidade (métodos e atributos).
  • O polimorfismo indica que un método pode ter distintas funcionalidades. Si definimos unha nova clase a partir de outra (herdanza) herdaremos os seus métodos. É posible reescribir a funcionalidade destes métodos herdados de modo que teremos novas versións dos mesmos métodos con comportamentos distintos. A posibilidade de ter distintas versións do mesmo método dentro dunha clase, diferenciándose únicamente no tipo de información que reciben coñécese como sobrecarga.

Un exemplo de polimorfismo pode ser o seguinte: Temos a clase base Paxaro, que ten un método chamado camiña, que fai que o paxaro camiñe. Podemos crear novas clases derivadas de Paxaro (Gorrión, Paloma e Pingüín) que heredan os métodos e atributos de Paxaro (son paxaros). Sen embargo o xeito de camiñar dos Pingüíns é distinto do dos demáis Paxaros, co que é necesario reescribir a funcionalidade do método camiña dentro da clase Pingüín, non así cos Gorrións e Palomas xa que camiñan como todos os Paxaros. Desde o punto de vista do programa, todos os Paxaros poden camiñar (invocando ó metodo camiña) o polimorfismo encárgase de que cada Paxaro poda facelo da maneira axeitada.

Este tipo de programación facilita moito a reutilización do código, xa que as clases deseñadas poden formar parte de varios problemas, e a herdanza proporciona unha forma de desenvolvemento moi rápida.

O obxectivo da programación orientada a obxectos é a creación de obxectos, mentres que na programación por procedementos é a xeración de fluxos de programa e liñas de código. Cando se pensa en orientación a obxectos estase facendo referencia a compoñentes software que posúen unha determinada estructura de datos e son capaces de responder a distintos estímulos.

Mentres que na programación clásica o importante son os procedementos, o que hai que facer, a funcionalidade do sistema e, pensando nela créanse as estructuras de datos. En cambio, na programación orientada a obxectos o importante son estes, a súa identificación e definición. Máis tarde tense en conta o código como un elemento que serve para facilitar a interacción entre obxectos.

Frente á programación por procedementos, as clases teñen as seguintes vantaxes: Facilítase a reutilización do código, a realización de modificacións e introducción de melloras na aplicación, o reparto das tarefas de desenvolvemento entre varios programadores e a corrección de erros.

Programación Visual e Ferramentas Case.

Coa chegada das interfaces gráficas de usuario (GUI (Graphical User Iterface)) naceu o desenvolvemento visual e orientado a eventos. Neste tipo de desenvolvemento o usuario limítase a colocar na pantalla dun xeito visual os distintos compoñentes do programa programando so a resposta que debe dar o compoñente a certos eventos permitindo deste xeito un rápido desenvolvemento da interface do usuario. Por exemplo, podería colocar na pantalla un botón, e programar a acción a realizar cando se pulse ese botón (evento de botón pulsado). Este tipo de ferramentas para programar chámanse RAD (Rapid Application Development) e garda unha certa relación cos entornos de cuarta xeración e as ferramentas CASE.

En principio calquera programa que se poida empregar nos procesos de análise, desenvolvemento, implantación e mantemento de aplicacións informáticas pode incluírse dentro da categoría de ferramenta CASE. Non obstante, existe todo un conxunto de utilidades, entornos e outras ferramentas especificamente CASE que proporcionan ó enxeñeiro de software a capacidade de automatizar as actividades manuais e de mellorar o seu enfoque de traballo.

Entornos de cuarta xeración

Un tipo de ferramentas CASE que se utilizan en tarefas de programación son os entornos de cuarta xeración.

As técnicas de cuarta xeración son un conxunto de ferramentas que permiten a obtención de código fonte a partir de especificacións a alto nivel. Canto maior sexa o nivel de especificación maior será a velocidade de programación. As técnicas de cuarta xeración tenden a estar cada vez máis cerca da linguaxe natural.

Dentro das técnicas de cuarta xeración pódense atopar: deseño visual de bases de datos, das súas táboas, de formularios e informes, xeración de código a partir de especificacións gráficas ou textuais, xeración automática da documentación dun proxecto, etc.

Entre as vantaxes do uso de técnicas de cuarta xeración está o incremento da productividade derivado dunha maior velocidade de desenvolvemento.

Como inconveniente proponse que as técnicas de cuarta xeración non producen o código máis eficiente en cada caso, nin reducen o tempo de desenvolvemento, unicamente modifícase a duración de cada fase, aumenta o tempo dedicado á análise e disminúe o da programación. Deste xeito, en sistemas de pequeno ou mediano tamaño redúcese o tempo total, xa que non se necesita unha análise moi complexa, disminuíndo así o tempo dedicado á programación.