Sie sind auf Seite 1von 6

Tema 1. Introducción.

Objetivos de la programación.
o CORRECCIÓN. Un programa debe realizar el tratamiento esperado, y no producir resultados
erróneos
o CLARIDAD. Prácticamente todos los programas han de ser modificados después de haber sido
desarrollados inicialmente. Es fundamental que sus descripciones sean claras y fácilmente
inteligibles por otras personas.
o EFICIENCIA. Una tarea de tratamiento de información puede ser programada de muy diferentes
maneras sobre un computador determinado, es decir, habrá muchos programas distintos que
producirán los resultados deseados.
Compiladores e Intérpretes.
Compilador. Programa que traduce programas de un lenguaje de programación simbólico a código de la máquina.
La representación del programa en lenguaje simbólico se le llama programa fuente, y su representación en código 1
máquina se le llama programa objeto.
Intérprete . Programa que analiza directamente la descripción simbólica del programa fuente y realiza las
operaciones oportunas. Simula una máquina virtual. Es más sencillo, pero más lento.
Lenguaje de programación. Conjunto de símbolos reglas para crear programas
Programación. En general se encarga de desarrollar programas a pequeña escala.
Ingeniería del software . Conjunto de etapas necesarias para desarrollar programas a gran escala y de gran
calidad. Etapas:
- Análisis
- Diseño
- Codificación
- Pruebas y Mantenimiento
Modelos abstractos de cómputo . Conceptos comunes de un conjunto de lenguajes de programación basados
en elementos computacionales simbólicos. Existen diversos modelos abstractos de cómputo:
- Modelo funcional. Se basa casi exclusivamente en el empleo de funciones
- Modelo de flujo de datos . Un programa corresponde a una red de operadores interconectados entre sí.
Cada operador lo representaremos gráficamente mediante un cuadro con entradas y salidas, y dentro de él el
símbolo de la operación que realiza.
- Modelo imperativo. Responde a la estructura interna habitual de un computador, que se denomina
arquitectura Von Neumann. Deriva del hecho de que un programa aparece como una lista de órdenes a
cumplir.
Elementos de la programación imperativa. El más extendido, identifica el concepto de programa con el
VISTA PREVIA
de secuencia o lista de órdenes. Las órdenes o instrucciones del programa definen determinadas acciones que deben
ser realizadas por el procesador.
- Acciones primitivas: Mostrando 6 páginas
son las acciones de un total
que son directamente depor22el procesador
realizables
- Acciones compuestas . Abstracción equivalente a un fragmento del programa más o menos largo que
realiza una operación bien definida.

Tema 2. Elementos básicos


Notación BNF (backups-Naur Form)
Es el conjunto de reglas gramaticales en las que se basa un lenguaje de programación. Para describir estas reglas se
utilizan una serie de meta símbolos.
 ::== Metasímbolo de definición
 | Metasímbolo de alternativa
 {} Metasímbolo de repetición
 [] Metasímbolo de opción
 () Metasímbolo de agrupación
El modelo de flujo de datos es: un modelo abstracto de cómputo
Un intérprete: no produce programas objeto para una máquina virtual
Las redes de operadores, se utilizan en el modelo abstracto de cómputo imperativo
La ejecución de un programa mediante interpretación cumple que es más lenta que mediante compilación
y sólo necesita una etapa de procesado
Las reglas BNF tendrán dos tipos de elementos:
- Elemento terminal. Son elementos que forman parte del lenguaje C±
- Elemento no terminal. Están definidos a partir de los elementos terminales a partir de reglas de
producción.
Tipos predefinidos
- Tipo entero (int). Este tipo puede tomar valores positivos y negativos. El rango de valores que puede tomar
depende de la plataforma (combinación de procesador, sistema operativo y compilador) utilizada
- Tipo real (float). Este tipo puede tomar valores positivos y negativos, y puede tener una parte decimal. Es
una representación no exacta. El rango de valores depende de la plataforma
- Tipo carácter (char). Lo utilizaremos para manejar caracteres imprimibles: “A”, “b”,… y no imprimibles :
return, escape,… incluye la práctica totalidad de caracteres utilizados en el mundo.
Expresiones aritméticas
Representa un cálculo a realizar con valores numéricos (combinación de operandos y operadores). Si no se utilizan
paréntesis, el orden de prioridad de una expresión es: 2
1. Operadores multiplicativos . *%/
2. Operadores aditivos. +-
Operaciones de escritura simples Código Nemotécnico Tipo valor
El procedimiento printf está en la librería d decimal entero
<stdio.h>y sirve para mostrar o escribir por f float real
pantalla un valor. Ejemplo:
e exponential real con notación exponencial
printf(“Introduce nombre aquí: “);
g general real con/sin notación exponencial
c character carácter
s string cadena de caracteres

Tema 3. Constantes y variables


Identificadores
Nombres usados para identificar cada elemento del programa. Reglas:
- Palabra formada por caracteres alfabéticos o numéricos
- No valen los espacios en blanco ni signos de puntuación
- Es necesario que empiece por una letra
- Pueden utilizarse las 52 letras mayúsculas y minúsculas del alfabeto inglés, barra subrayada y dígitos del 0
al 9.
Constantes
VISTA PREVIA
Son datos que mantienen su valor fijo toda la ejecución del programa. La forma de declarar una constante es:
const tipo nombre = valor;
Variables Mostrando 6 páginas de un total de 22
Son datos que puede ir cambiando su valor durante la ejecución del programa. La forma de declarar una variable es:
int saldo; float gastos; saldo = int (gastos);
Lectura de variables
Para leer variables desde el teclado hacemos uso de la función scanf: scanf (“%d”, &a); lee un valor entero por
teclado, el valor se asigna a la variable int a.

Modelo de programación lógica: se basa en la declaración de hechos y reglas


Las cadenas (strings) no se implementan como registros de caracteres
& indica un argumento pasado por referencia
Para convertir el carácter 5 en número entero correspondiente: int (‘5’);
Tema 4. Metodología de Desarrollo de Programas (I)
Descomposición en subproblemas (refinamientos sucesivos)
A la hora de resolver problemas complejos lo mejor es intentar descomponer el problema en subproblemas más
pequeños y más fáciles de resolver. Esta metodología consiste en expresar inicialmente el programa a desarrollar
como una acción global, que si es necesario se irá descomponiendo en acciones más sencillas hasta llegar a acciones
simples que pueden ser expresadas directamente como sentencias del lenguaje de programación. Esta
descomposición exige:
- Identificar las acciones componentes
- Identificar la manera de combinar las acciones componentes para conseguir el efecto global

Tema 5. Estructuras Básicas de la Programación Imperativa 3


Programación estructurada
Es una metodología de programación que fundamentalmente trata de construir programas que sean fácilmente
comprensibles. Un programa no solo debe funcionar correctamente, sino que además debe estar escrito de manera
que se facilite su comprensión posterior.
Esta metodología está basada en la técnica de desarrollo de programas por refinamiento sucesivos.
Representación de la estructura de un programa. La estructura de los programas imperativos se representa
tradicionalmente mediante diagramas de flujo. Estos diagramas contienen dos elementos básicos, correspondientes
a acciones y condiciones. Las acciones son rectángulos y las condiciones son rombos. Las condiciones equivalente a
las que se puede responder SI o NO.

El flujo de control durante la ejecución del programa se refleja mediante líneas o vías que van de un elemento a otro.
Las acciones tienen una sola vía de entrada o comienzo y una de terminación o salida. Las condiciones tienen una
vía de entrada y dos vías de salida (SI o NO).
La programación estructurada recomienda descomponer las acciones usando las estructuras más sencillas posibles,
que son:
- SECUENCIA <-> Tupla o registro. Utilizar una secuencia de acciones o partes que se ejecutan de forma
sucesiva
- SELECCIÓN <-> Unión. Consiste en ejecutar una acción u otra, dependiendo de una determinada
condición
- ITERACIÓN <-> Formación (array). Repetición de una acción mientras se cumple una determinada
condición. VISTA PREVIA
Mostrando
Expresiones condicionales 6 páginas de un total de 22
Cada operador tiene una prioridad determinada. Si no se utiliza paréntesis, el orden de evaluación es el siguiente:
1 Operadores unarios !, -
2 Operadores multiplicativos *, /, %
3 Operadores aditivos +, -
4 Comparación matemática >, >=, <, <=
5 Comparación de igualdad ==, !=
6 Conjunción &&
7 Disyunción ||

El esquema básico de selección se corresponde con el esquema de datos Unión


Metodología de programación estructurada: utiliza la técnica de refinamientos sucesivos
Técnica de desarrollo mediante refinamientos sucesivos consiste en: descomponer acciones en otras más
simples en pasos sucesivos
El esquema básico de formación se corresponde con el esquema de datos Iteración
Estructuras básicas en C±
- Sentencia IF
- Sentencia WHILE
- Sentencia FOR

Tema 6. Metodología de Desarrollo de Programas (II)


Desarrollo con esquemas de selección e iteración
Se tiene tres posibilidades a la hora de refinar una acción compuesta:
- Organizarla como secuencia de acciones. Utilizar una secuencia de acciones o partes que se ejecutan
de forma sucesiva
- Organizarla como selección entre acciones alternativas. (IF, ELSE) Plantear una acción compuesta
como la realización de una acción entre varias posibles, dependiendo de ciertas condiciones. Para desarrollar 4
un esquema de selección debemos identificar sus elementos componentes. Por tanto habrá que:
o Identificar cada una de las alternativas del esquema y las acciones correspondientes
o Identificar las condiciones para seleccionar una alternativa u otra.
- Organizarla como iteración de acciones. (WHILE, FOR). Repetición de una acción o grupo de
acciones hasta conseguir el resultado deseado.
o Identificar las acciones útiles a repetir, y las variables necesarias. Precisar el significado de estas
variables al comienzo y al final de cada repetición.
o Identificar cómo actualizar la información al pasar de cada iteración a la siguiente
o Identificar la condición de terminación
o Identificar los valores iniciales de las variables, y si es necesaria, alguna acción para asignárselos
antes de entrar en el bucle.
Verificación de programas
Un programa es correcto si produce siempre los resultados esperados de acuerdo con la especificación del programa.
En la práctica, la verificación de un programa se hace muchas veces mediante ensayos. Un ensayo consiste en ejecutar
el programa con unos datos preparados de antemano y para los cuales se sabe cuál ha de ser el resultado a obtener.
Demostrar que el programa cumple con sus especificaciones. Estas se deben escribir con toda precisión en forma de
expresiones lógicas, y luego realizar una demostración lógico-matemática de que el programa las cumple.
Corrección parcial. Si el programa termina el resultado es correcto. ASERTO: if(a>b){ <<ASERTO : a>b>>…}
Corrección total. Lo anterior, y además para todo dato de entrada válido el programa termina.
Eficiencia de programas. Complejidad
El objetivo prioritario de la programación es la corrección, la eficiencia sólo debe tenerse en cuenta si es un factor
decisivo o importante en cada caso. VISTA PREVIA
Medidas de eficiencia. La eficiencia de un programa se define en función de la cantidad de recursos que consume
durante su ejecución. Las Mostrando 6 depáginas
principales medidas de un total de 22
recursos son:
- El tiempo que tarda en ejecutarse un programa
- La cantidad de memoria usada para almacenar datos.
Análisis de programas . La eficiencia de un programa se hace analizando los siguientes elementos:
- Cuánto tarda en ejecutarse cada instrucción básica del lenguaje utilizado
- Cuántas instrucciones de cada clase se realizan durante una ejecución del programa
El criterio del análisis de complejidad (número de instrucciones ejecutadas) de los esquemas básicos de los
programas se basa en las siguientes reglas:
1. La complejidad de un esquema de secuencia es la suma de las complejidades de sus acciones componentes
2. La complejidad de un esquema de selección equivale a la de la alternativa más complejo, es decir, más larga
3. La complejidad de un esquema de iteración se obtiene sumando la serie correspondiente al número de
instrucciones en las repeticiones sucesivas.

While (j>0) { u[j] = u[j-1]; j--; } búsqueda de un cierto elemento en el vector u


La complejidad es una medida: de la eficiencia de un programa
Crecimiento asintótico. La forma en que crece la función para tamaños grandes, y se representa mediante la
notación: 𝚶(𝒇(𝒏)). 𝒏 indica el tamaño del problema, 𝒇 la forma o función de crecimiento asintótico y 𝑶 orden de
crecimiento.

𝚶(𝟏) Complejidad constante. Ideal


𝚶(𝐥𝐨𝐠𝒏) Complejidad logarítmica. Muy eficiente
𝚶(n) Complejidad lineal. Muy eficiente
𝚶(𝐧 𝐥𝐨𝐠 𝒏) Complejidad lineal-logarítmica. Eficiente
𝚶(𝒏𝟐) Complejidad cuadrática. Menos eficiente
𝚶(𝐧𝐤) Complejidad polinómica. Poco eficiente
𝚶(𝟐𝒏 ) Complejidad exponencial. Muy poco eficiente

5
Tema 7. Funciones y Procedimientos
Concepto de subprograma
Es una parte de un programa. Como mecanismo de programación, un subprograma es una parte de un programa que
se desarrolla por separado y se utiliza invocándolo mediante un nombre simbólico. La técnica de refinamientos
sucesivos sugiere descomponer las operaciones complejas de un programa en otras más simples.
Funciones
Una función es un tipo de subprograma que calcula como resultado un valor único a partir de otros valores dados
como argumentos.
TipoResultado NomFuncion (Tipo1 arg1, Tipo2 arg2, …) float AreaTriangulo (float base, float altura).
Estas cabeceras representan la interfaz entre la definición de la función y su utilización posterior. Los argumentos
que aparecen en la cabecera son los argumentos formales. La definición completa de una función se compone de una
cabecera seguida de un cuerpo de función que tiene la misma estructura que un bloque de programa completo. En la
parte declarativa se pueden declarar constantes y variables locales que sólo son visibles en el cuerpo de la función.
float AreaTriangulo (float base, float altura) { return (base*altura)/2.0; }
return expresión; provoca la finalización inmediata de la ejecución de la función. Se puede insertar en cualquier
punto de la parte ejecutable de la función, además es posible utilizar más de una sentencia return en una misma
función.

Procedimientos
VISTA PREVIA
Es una forma de subprograma que agrupa una sentencia o grupo de sentencias que realizan una acción, y permite
darles un nombre por el que se las pueden identificar posteriormente. Se pueden parametrizar mediante una serie de
argumentos acciones parametrizadas.
Mostrando 6 páginas de un total de 22
void NombreProcedimiento (Tipo1 arg1, Tipo2 arg2,… )
La sentencia return se escribe ahora simplemente así, sin ninguna expresión que la acompañe. Sirve simplemente
para terminar la ejecución del procedimiento en ese momento y volver al punto a donde se invocó.

Paso de argumentos
Existen dos formas de realizar esta comunicación, que se denominan paso de argumentos por valor y paso de
argumentos por referencia
Paso de argumentos por valor. Se envía una copia del valor que tiene cada uno de los parámetros actuales en el
momento de realizar una llamada. En este caso el módulo invocado no puede modificar el valor original de las
variables actuales.
void Procedimiento (TipoAlgo MiArgumento) {…}: MiArgumento es un argumento por valor o referencia
según el tipo TipoAlgo
En el paso de argumentos por valor se pueden utilizar: variables, constantes o expresiones.
Un procedimiento es puro si: no usa variables externas ni llama a otros subprogramas que no sean puros.
Medida de complejidad O: evalúa de un programa el tiempo que tarda en ejecutarse
Dentro de un subprograma, un argumento: no puede cambiar de tipo
Paso de argumentos por referencia. El módulo invocado, en lugar de trabajar con los valores de las variables
actuales, trabaja sobre las direcciones de las variables locales. Por tanto, el módulo invocado puede modificar los
valores de las variables actuales del módulo que hace la llamada utilizando el símbolo &

Variables locales y globales


Variable local. Es aquella que su uso está restringido a la función que la ha declarado, se dice entonces que la variable
es local a esa función. Esto implica que esa variable sólo va a poder ser manipulada en esa sección, y no se podrá
hacer referencia fuera de ella. Cualquier variable que se define dentro de las claves del cuerpo de una función se
interpreta como variable local
Variable global. Aquella que se define fuera del cuerpo de cualquier función, normalmente al principio del programa,
tras la definición de los archivos de biblioteca, de la definición de constantes y antes de cualquier función. Cualquier
función puede acceder a esas variables para leer y escribir en ellas.
6
Recursividad de subprogramas
Cuando un subprograma hace una llamada a sí mismo se dice que es un subprograma recursivo.

Problemas al utilizar subprogramas


El uso inadecuado de las variables que pasamos como argumentos puede dar lugar a algunos problemas:
Efectos secundarios . Cuando un subprograma modifica alguna variable externa, se dice que está produciendo
efectos secundarios o laterales. El concepto al efecto lateral sería la transparencia referencial. Siempre que llamamos
a un subprograma con los mismos parámetros se debe obtener el mismo resultado
Redefinición de elementos . Cuando un subprograma se define una variable local da igual el nombre que elegimos,
ya que al ser local sólo afecta al propio subprograma
Doble referencia (aliasing). Se produce cuando una misma variable se referencia con dos nombres diferentes.

Tema 8. Metodología de Desarrollo de Programas (III)


Operaciones abstractas
Una abstracción es una visión simplificada de una cierta entidad, de la que sólo consideramos sus elementos
esenciales, prescindiendo en lo posible de los detalles. Las entidades que podemos abstraer para materializarlas como
subprogramas son, en general, operaciones. Con la palabra operación englobamos tanto la idea de acción como la de
función.
Especificación. Qué hace la operación (punto de vista de quien lo invoca). Indica cuál es el nombre de la operación
y cuáles son sus argumentos VISTA PREVIA
Realización. Cómo se hace la operación (punto de vista de quien la ejecuta). Suministra toda la información
Mostrando
necesaria para poder ejecutar 6 páginas de un total de 22
la operación (código).

Desarrollo usando abstracciones


Desarrollo descendente. Es el desarrollo por refinamientos sucesivos, teniendo en cuenta además la posibilidad
de definir operaciones abstractas. Habrá que optar por una de las alternativas siguientes:
- Considerar la operación como operación terminal, y codificarla mediante sentencias del lenguaje de
programación
- Considerar la operación como operación compleja, y descomponerla en otras más sencillas
- Considerar la operación como operación abstracta, y especificarla, escribiendo más adelante el subprograma
que la realiza.
Doble referencia: cuando un mismo elemento se utiliza con dos nombres distintos
Una constante puede pasarse como argumento a una función: solo por referencia
Extern: sólo se utiliza para las variables en el módulo de interfaz
El uso de variables globales: sólo puede evitarse mediante el paso de argumentos por valor

Das könnte Ihnen auch gefallen