0% encontró este documento útil (0 votos)
262 vistas50 páginas

PROG.01. Programación Estructurada

El documento presenta una introducción a la programación, incluyendo las características de un programa, representaciones gráficas como diagramas de flujo y pseudocódigo, y tipos de lenguajes de programación como lenguajes de alto y bajo nivel. También describe la comunicación entre usuario y máquina, necesitando un canal y lenguaje común, y cubre lenguajes compilados e interpretados.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
262 vistas50 páginas

PROG.01. Programación Estructurada

El documento presenta una introducción a la programación, incluyendo las características de un programa, representaciones gráficas como diagramas de flujo y pseudocódigo, y tipos de lenguajes de programación como lenguajes de alto y bajo nivel. También describe la comunicación entre usuario y máquina, necesitando un canal y lenguaje común, y cubre lenguajes compilados e interpretados.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 50

Módulo 3A: Programación

1. Introducción a la programación
Un programa es un conjunto de instrucciones dadas al ordenador en un
lenguaje que solo es entendible por él para comunicarle lo que queremos que
haga. Un algoritmo es una secuencia finita de operaciones que resuelven un
determinado problema.

Un algoritmo es más parecido a una idea, una forma de resolver un problema,


mientras que un programa está más relacionado con la realización de una o
más tareas por parte de un ordenador.

Un programa debe cumplir una serie de características:

• Deber ser finito: formado por un conjunto limitado de sentencias.

• Debe ser legible: es importante crear códigos limpios y fáciles de leer


con tabulaciones y espacios que diferencien las partes del programa.

• Debe ser modificable: debe ser sencillo el proceso de actualización o


modificación ante nuevas necesidades.

• Debe ser eficiente: debemos crear programas que ocupen poco


espacio en memoria y se ejecuten rápidamente.

• Debe ser modulable: debemos realizar algoritmos que se dividan a su


vez en sub-algoritmos de forma que se disponga de un grupo principal
desde el que llamaremos al resto. Así, incitamos a la reutilización de
código.

• Debe ser estructurado: engloba a las características anteriores, ya que


un programa estructurado será fácil de leer y modificar, y estará
compuesto de subprogramas que permitirán la reutilización de código.

Representaciones gráficas

Para representar un algoritmo, podemos utilizar dos herramientas gráficas: los


diagramas de flujo y el pseudocódigo.

Un diagrama de flujo es una representación gráfica de un proceso. Cada paso


del proceso se representa con un símbolo diferente que contiene una breve
descripción.

Debemos usar una serie de símbolos estándar:

Indican inicio o fin de programa.

3
Módulo 3A: Programación

Representan una instrucción, un


paso a dar o un proceso. Por
ejemplo: cont=cont+1.

Operaciones de entrada/salida de
datos. Por ejemplo: visualiza en
pantalla suma.

Usaremos este símbolo si nos


encontramos en un punto en el que
se realizará una u otra acción en
función de una decisión.

Por ejemplo, si miVariable = 0,


hacemos la instrucción 1. Si no,
hacemos la instrucción 2.

Conector. Permite unir diferentes


zonas del diagrama de forma que se
redefine el flujo de ejecución hacia
otra parte del diagrama.

Representa un método o
subprograma.

Flechas para indicar la dirección de


flujo.

Características de los diagramas de flujo:

• Deben escribirse de arriba abajo o de izquierda a derecha.

• Debemos evitar el cruce de líneas, para eso se define la forma de


conector. El uso de conectores debe producirse cuando no exista otra
opción.

• Todas las líneas de flujo deben estar conectadas a algún objeto.

• El texto que se escribe en las formas debe ser escueto y legible.

4
Módulo 3A: Programación

• Todos los símbolos de decisión deben tener más de una línea de salida,
es decir, deben indicar qué camino seguir en función de la decisión
tomada.

Ejemplo

Se representa el siguiente diagrama de flujo, que muestra todos los


números pares del 0 al 98:

5
Módulo 3A: Programación

La otra herramienta para representar los algoritmos es el pseudocódigo.

Es la manera de representar las distintas sentencias que va a realizar nuestro


algoritmo con un lenguaje cercano al natural. Por tanto, es un lenguaje que
no se puede ejecutar en una máquina.

Características del pseudocódigo


• Comienza con la palabra algoritmo seguido de su nombre.
• A continuación, tenemos la secuencia de instrucciones de este
algoritmo.
• Finaliza con la estructura FinAlgoritmo.
• No es necesaria la indentación (sangrado), aunque es recomendable.
• No se diferencia entre mayúsculas ni minúsculas.

Algoritmo triángulo
Definir área, altura, base de tipo números reales;
Escribir “Introduce la altura del triángulo:”;
Leer altura;
Escribir “Introduce la base del triángulo:”;
Leer base;
Área <- (a*b)/2;
Escribir “El área del triángulo es:”, área;
FinAlgoritmo

Comunicación de un sistema informático

En el proceso de programación se comunica a un usuario con una máquina.


Para que se pueda realizar dicha comunicación, debemos tener:

• Los dos agentes principales, usuario y máquina.

• El canal. Para continuar con el ejemplo con el que estamos explicando


el proceso de programación, podemos decir que el canal por el que se
comunica nuestro usuario será el teclado.

• El lenguaje. Tanto el receptor como el emisor hablan un lenguaje


completamente diferente. Para que la comunicación sea fluida,
debemos acercar los lenguajes, tanto de la máquina como del usuario,
y así lograr el entendimiento.

6
Módulo 3A: Programación

Ahora bien, para solventar el problema de la comunicación, tenemos


lenguajes de programación de tres tipos: alto nivel, nivel medio y bajo nivel.
Los lenguajes de alto nivel están más cerca del lenguaje que habla el usuario,
mientras que los lenguajes de bajo nivel se acercan más a las estructuras del
lenguaje de la máquina. Por su parte, los lenguajes de nivel medio toman
características de ambos, como por ejemplo el lenguaje C.

Para facilitar el trabajo, implementaremos nuestro código con lenguajes de


alto nivel, de modo que necesitaremos un proceso de traducción para
convertir el programa escrito en lenguaje máquina.

Características del lenguaje de alto nivel:

• Es totalmente independiente de la máquina y, por tanto, muy portable.

• Muy utilizado en el mercado laboral informático.

• Tanto las modificaciones como las actualizaciones son muy fáciles de


realizar.

• Para la tarea de traducción de código necesitamos un compilador y un


enlazador con librerías del propio lenguaje de programación elegido.

Algunos ejemplos de lenguajes de alto nivel son java, php, c#, VB.NET,
Python…

7
Módulo 3A: Programación

Características del lenguaje de bajo nivel:

• Está relacionado con las características del hardware.


• Es fácilmente traducible al lenguaje máquina.
• Es totalmente dependiente de la máquina.

Un ejemplo de lenguaje de bajo nivel es Ensamblador. Este lenguaje trabaja


con registros a más bajo nivel.

8
Módulo 3A: Programación

A lo largo de esta unidad formativa hablaremos de la estructura de un


programa informático y de sus elementos principales, como son las variables,
las constantes y los distintos operadores que podemos usar a la hora de
implementar un código fuente.

Lenguajes compilados e interpretados

Aquellos lenguajes de alto nivel que utilizan un compilador para poder


traducirlo al lenguaje máquina se denominan lenguajes compilados.

En nuestro caso, un programa escrito en C# necesita un compilador de C#. En


este supuesto, el lenguaje máquina no corresponde al del ordenador, sino al
de una máquina ficticia llamada máquina virtual. En C#, la máquina virtual se
denomina CLR (Common Language Runtime).

Esta máquina no existe físicamente, sino que es simulada por un ordenador.


Podemos instalarla en nuestro ordenador copiando ese programa en nuestro
disco duro.

Gracias a esa máquina, podemos ejecutar nuestro programa en cualquier


ordenador del mundo.

Un lenguaje interpretado no genera un programa escrito en una máquina


virtual. Efectúa directamente la traducción y ejecución simultáneamente para
cada una de las sentencias.

Un intérprete verifica cada línea del programa cuando se escribe. La ejecución


es más lenta debido a esta traducción simultánea.

En esta asignatura vamos a centrarnos en el lenguaje de programación C#.


Otro lenguaje muy utilizado actualmente es el lenguaje Java. En la siguiente
tabla mostramos las características de ambos:

C# Java

Es un lenguaje orientado a objetos. Es un lenguaje orientado a objetos.

Contiene dos categorías generales de Los argumentos son siempre pasados


tipos de datos integrados: tipos de valor por valor independientemente del tipo
y tipos de referencia. de variable.

La migración de C# a Java es sencilla La migración de Java a C# es sencilla


porque mantiene una sintaxis muy porque mantiene una sintaxis muy
similar. similar.

9
Módulo 3A: Programación

C# está incluido en la plataforma .NET Gracias al recolector de basura, se


que tiene a su disposición el recolector elimina la necesidad de la liberación
de basura del CLR (Common Language explícita de memoria.
Runtime o entorno en tiempo de
ejecución).

En C# todos los tipos derivan de una Java soporta sincronización de múltiples


superclase común llamada System. hilos de ejecución (multithreading) a
Object. A diferencia de Java, esta nivel de lenguaje.
característica también se aplica para los
tipos básicos.

C# es un lenguaje compilado. Java es compilado, en la medida en que


su código fuente se transforma en un
código máquina muy parecido al
lenguaje ensamblador.

Se genera un código intermedio llamado Java es interpretado, ya que ese código


MSIL (Microsoft Intermediate Language) máquina se puede ejecutar directamente
y luego ese código se vuelve a compilar sobre cualquier máquina la cual tenga el
para obtener el formato nativo en la intérprete y el sistema de ejecución en
máquina en la que se va a ejecutar. tiempo real.

2. Estructura de un programa informático


El lenguaje de programación C# es un lenguaje de alto nivel que pertenece al
conjunto de lenguajes de .NET. C# es una evolución de C++ y mucha de la
sintaxis está heredada de este lenguaje.

Con C#, podemos crear aplicaciones con una interfaz de texto, que
denominamos aplicaciones de consola.
Una de las ventajas de aprender este lenguaje es que es independiente de la
plataforma donde lo ejecutemos (sea Intel o AMD).

Para desarrollar nuestros programas ne C#, utilizaremos un IDE. Un entorno


de desarrollo integrado (IDE) es un software diseñado para el desarrollo de
aplicaciones con un conjunto de herramientas integradas en una interfaz
gráfica de usuario (GUI).

10
Módulo 3A: Programación

Sus características son:


• Editor de código fuente: ayuda al programador a escribir el código,
resaltando la sintaxis de forma visual y rellenando de forma automática
las distintas opciones que nos proporciona el lenguaje.
• Depurador: ayuda al programador a localizar sus errores de código.
• Compilación del código fuente: un código binario entendible por la
máquina.

Para plataformas Windows, podemos desarrollar con IDE Visual Studio. El


proyecto que implementa el desarrollo de .NET en GNU/Linux es el proyecto
Mono, concretamente el entorno de desarrollo MonoDevelop.
Con estos programas, vamos a ir generando los diferentes proyectos. Cada
vez que creemos un proyecto nuevo, el programa va a generar solo un fichero
de código fuente, que es el que va a dar lugar al ejecutable que necesita la
aplicación.

Este fichero que se genera debe tener la extensión cs, ya que es la extensión
utilizada por los ficheros en C#.

Instalación de Visual Studio

Para instalar nuestro Visual Studio, vamos a la página oficial de Microsoft,


donde, en la parte de downloads, tendremos varias opciones.
Así, descargamos Visual Studio Community, que es la versión gratuita:

https://visualstudio.microsoft.com/es/downloads/

Una vez descargado, procedemos a la instalación.

11
Módulo 3A: Programación

Durante la instalación, nos dará a elegir entre una serie de paquetes


instalables.
Nosotros, para realizar nuestras aplicaciones de consola, añadiremos el
siguiente paquete:

Instalación de MonoDevelop

Para la instalación de este IDE en plataformas como Ubuntu o Debian,


podemos seguir las indicaciones de la página oficial:

https://www.monodevelop.com/download/#fndtn-download-lin

2.1 Bloques de un programa informático


Podemos definir un programa como una secuencia de instrucciones
separadas por un punto y coma que se van a ir agrupando en diferentes
bloques mediante llaves.

Para crear un proyecto, abrimos nuestro Visual Studio y seleccionamos la


opción de Crear un proyecto.

12
Módulo 3A: Programación

Posteriormente, elegiremos la opción de Crear un aplicativo de consola.

Nombramos nuestra aplicación con el nombre que queramos y seleccionamos


la ruta donde lo guardaremos.

13
Módulo 3A: Programación

Cuando hayamos configurado estos parámetros, se nos abrirá la interfaz de


nuestro IDE, que estará formado por tres partes principales:

• La primera parte será nuestro editor de código. El desarrollador


implementará todas las instrucciones necesarias para completar su
programa.

14
Módulo 3A: Programación

• La segunda es el explorador de soluciones. En esta parte de nuestro


IDE, veremos los archivos generados de nuestro aplicativo.
• La tercera parte es la salida. Nos proporcionará el resultado de si la
compilación ha sido correcta o, por el contrario, si ha habido un error,
así como también el porqué de ese error.

Cuando creamos el proyecto, se crea la siguiente estructura:

CÓDIGO:

using System;

namespace MiAplicación
{
class Program
{
static void Main(string[] args)
{

}
}
}

La estructura que Visual Studio nos crea por defecto es la clase program. Una
clase es una estructura de datos que está compuesta por atributos o variables
(de las que hablaremos más adelante) y métodos o funciones. El método
principal se denomina Main.
De hecho, siempre que ejecutemos un programa, el primer método que se
ejecutará será el Main. Este método tiene una serie de argumentos. Estos
argumentos son cadenas de caracteres que podemos pasar línea de
comandos (CMD):

Nosotros trabajaremos con la Consola de nuestro entorno de desarrollo.

Entrada y salida por pantalla

Para establecer la comunicación entre el usuario y el programa, emplearemos


la clase Console.

• Para la salida por pantalla, podemos utilizar los métodos de esta clase,
Write y Writeline:

15
Módulo 3A: Programación

− El método Write() escribe un valor o valores especificado(s) en el


flujo de salida estándar, que generalmente será nuestra pantalla.
− El método WriteLine() escribe un valor o valores especificado(s)
en el flujo de salida estándar, que generalmente será nuestra
pantalla, y se realiza un salto de línea en nuestra consola.

CÓDIGO:

using System;

namespace MiAplicación
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Console.Write("Programming...");
}
}
}

La salida será:

Para la entrada de datos de usuario, utilizaremos el método ReadLine(). Este


método leerá el dato introducido por el usuario y devolverá un dato de tipo
cadena (string).

CÓDIGO:

using System;

namespace MiAplicación
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Introduce un dato”);
string dato = ReadLine();
}
}
}

16
Módulo 3A: Programación

Otra forma para recoger los datos de entrada de usuario es el método Read().
Este método leerá el dato introducido por el usuario y devolverá un dato de
tipo entero (int).

Asimismo, otro método utilizado por la clase Console es el método ReadKey().


En este caso, se obtiene el carácter presionado por el usuario y se muestra
esta tecla por la pantalla.

Se pueden consultar más métodos de esta clase en el siguiente enlace:

https://docs.microsoft.com/es-
es/dotnet/api/system.console?view=netframework-4.8

2.1. Variables. Usos y tipos


Una variable es una estructura de datos que ocupan un espacio en memoria
y pueden variar a lo largo de un programa.
Cuando declaramos una variable, establecemos el tipo de dato (entero,
cadena, carácter, etc.) y su identificador.

CÓDIGO:

class Program
{
static void Main(string[] args)
{
int numero;
numero = 10;
char letra = 'a';
string cadena = "Esta es una cadena";
}
}

17
Módulo 3A: Programación

Tipos de datos en C#:

Tipo simple Descripción


Sbyte, short, int, long Enteros con signo
Byte, unshort, unit, Enteros sin signo
ulong
Float, double Punto flotante
Char Uno o varios caracteres
Decimal Decimal de alta
precisión
Bool Booleano

• Tipo String: son cadenas de caracteres. Por ejemplo: string cadena =


“Hola mundo”;
• Tipo de dato enumerado: enum días_semana {lunes, martes,
miercoles};
• Tipos matriz:
o Unidimensionales:

int[] array = new int[5];


int[] array2 = new int[] { 1, 3, 5, 7, 9 };
int[] array3 = { 1, 2, 3, 4, 5, 6 };
o Multidimensionales:
int[,] multiDimensionalArray1 = new int[2, 3];
int[,] multiDimensionalArray2 = { { ‘a’, ‘b’, ‘c’ }, { ‘d’, ‘e’, ‘f’ } };

Para definir una variable, necesitamos conocer primero el tipo de datos que
va a almacenar y, a continuación, el nombre que le vamos a asignar. Es
recomendable que este nombre tenga relación con el ejercicio que estemos
desarrollando.

Para identificar a una variable, y que tenga un identificador válido por el


compilador, debemos seguir una serie de normas:

• Debe comenzar por un carácter (letra o “_”).

• Debe estar formada por caracteres del alfabeto (no podemos usar “ñ”)
o por dígitos (del 0 al 9). Se puede utilizar el subrayado ("_").

• No debe comenzar con un dígito.

• Distingue entre mayúsculas y minúsculas.

• No puede llevar espacios en blanco.

18
Módulo 3A: Programación

• No se pueden utilizar palabras reservadas. Por ejemplo, string es una


palabra reservada como tipo de dato cadena.

A continuación, encontraréis una lista de las palabras claves (o identificadores)


predefinidos por el compilador:

https://docs.microsoft.com/es-es/dotnet/csharp/language-
reference/keywords/

Para declarar una variable:

CÓDIGO:

<tipo> <nombre_variable>;

Y en C# lo pondríamos de la siguiente forma:

CÓDIGO:

int num;

En este caso, estamos definiendo una variable de tipo entero denominada


num.
A las variables también se les puede asignar un valor:

CÓDIGO:

int num=5;

Definimos una variable de tipo entero, denominada num y le asignamos el


valor de 5.

Debemos utilizar un tipo u otro de variable, dependiendo del tipo de dato


que queremos tratar.
A grandes rasgos, podemos dividir las variables en dos grandes bloques,
dependiendo del ámbito en el que se encuentren:

19
Módulo 3A: Programación

• Variables locales: aquellas declaradas dentro de un método o función.


• Variables globales: aquellas declaradas fuera de un método o función.
Podemos acceder a ellas desde cualquier punto del programa.

Más adelante definiremos el concepto de ámbito de variables, cuando


hablemos del concepto de programación modular.

No es buena práctica utilizar variables globales

El problema de las variables globales es que crean dependencias ocultas.


Cuando se trata de una aplicación grande, el programador no conoce los
objetos que tiene ni sus relaciones.

2.2. Constantes y literales. Tipos y utilidades


• Constantes

En el apartado anterior hemos hablado de las variables como espacio de


memoria donde se almacenan datos que pueden variar a lo largo del
programa. Ahora trabajaremos con los espacios de memoria cuyo contenido
no se puede alterar a lo largo del programa: las constantes.

El valor se establece en tiempo de compilación y no se puede cambiar su


contenido.

CÓDIGO:

const <tipo> <nombre_variable>;

Por ejemplo:

CÓDIGO:

const int num;

Después, declaramos una constante de tipo entero que denominamos num.

A continuación, exponemos una constante llamada días semana, con el valor


7, ya que todas las semanas tienen 7 días:

20
Módulo 3A: Programación

CÓDIGO:

class Calendar1
{
public const int dias_semanas = 7;
}

Las constantes se definen fuera del cuerpo de cualquier función, normalmente


al principio del programa.

• Literales

Mediante un literal podemos representar de forma explícita todos los valores


que pueden tomar los tipos básicos del lenguaje.

Seguidamente, vamos a explicar los diferentes tipos de literales que podemos


encontrarnos en C#.

• Literales enteros:
o Decimales: sin ningún prefijo. Por ejemplo: int dLiteral = 10;
o Hexadecimales: con el prefijo de 0x o 0X. Por ejemplo: int
hLiteral= 0x3F;

• Literales reales:
o El literal sin sufijo o con el sufijo d o D es del tipo double.
Por ejemplo: double num = 3.4d;
Double num2= 3.4;
o El literal con el sufijo f o F es del tipo float.
Por ejemplo: float variable = 4.5F;
o El literal con el sufijo m o M es del tipo decimal.
Por ejemplo: decimal numero = 3.2m;

• Literales de lógicos: representados por los valores lógicos true


(verdadero) y false (falso).

• Literales de carácter: cualquier carácter en C# podemos representarlo


con comillas simples. Por ejemplo, ‘a’ correspondería al carácter a.
Existen caracteres especiales que pueden representarse de la siguiente
forma:

21
Módulo 3A: Programación

Carácter Representación

Comilla simple \’

Comilla doble \”

Carácter nulo \0

Retroceso \b

Salto de página \f

Nueva línea \n

Retorno de carro \r

Tabulación horizontal \t

Tabulación vertical \v

2.3. Operadores del lenguaje de programación


• Operadores aritméticos

Operadores aritméticos

+ Suma aritmética de dos valores.

++ Incremento en 1 del operando.

- Resta aritmética de dos valores.

-- Decremento en 1 del operando.

* Multiplicación aritmética de dos valores.

/ División aritmética de dos valores.

% Obtiene el resto de la división entera.

El operador de incremento ++ puede ser aplicado como prefijo o sufijo de


una variable.
El resultado de num++ es el valor de num antes de la operación:

22
Módulo 3A: Programación

CÓDIGO:

int num = 100;


Console.WriteLine(num); // salida por pantalla: 100
Console.WriteLine(num++); // salida por pantalla: 100
Console.WriteLine(num); // salida por pantalla: 101

El resultado de ++num es el valor de num después de la operación:

CÓDIGO:

double num = 10.4;


Console.WriteLine(num); // salida por pantalla: 10.4
Console.WriteLine(++num); // salida por pantalla: 11.4
Console.WriteLine(num); // salida por pantalla: 11.4

Asimismo, sucede lo mismo con el operador decremento - -.

La prioridad de los operadores (de mayor a menor prioridad) es:

1. Operadores de incremento x++ y decremento x-- sufijos.


2. Operadores de incremento ++x y decremento --x prefijos.
3. Operadores de multiplicación, división y resta *, / y %.
4. Operadores de suma y resta + y -.

• Operadores booleanos

Operadores booleanos

& AND lógico. Evalúa ambos operandos.

&& AND lógico. Evalúa el operando derecho solo si es


necesario.

| OR lógico. Evalúa ambos operandos.

|| OR lógico. Evalúa el operando derecho solo si es necesario.

23
Módulo 3A: Programación

^ XOR lógico.

! Negación lógica.

El operador AND lógico & calcula el AND lógico de sus operandos. El


resultado de a & b es true si a y b se evalúan como true. Si no, el resultado es
false.

El operador AND lógico condicional && también evalúa el operador AND


lógico de sus operandos, pero no evalúa el operando derecho si el izquierdo
se evalúa como false.

El operador | calcula el operador OR lógico de sus operandos. El resultado


de a | b es true si a o b se evalúan como true. Si no, el resultado es false.

El operador OR lógico condicional || también evalúa el operador OR lógico


de sus operandos, pero no evalúa el operando derecho si el izquierdo se
evalúa como true.

El operador ^ es el operador OR exclusivo o XOR. La tabla de la verdad (tabla


que muestra el resultado de una combinación de valores) es la siguiente:

a b a^b
T T F
T F T
F T T
F F F

El operador ! calcula la negación lógica de su operando, es decir, si el


operando es true, devolverá el valor false. Si el operando es false, devolverá
el valor true.

24
Módulo 3A: Programación

• Operadores de comparación e igualdad

Operadores de comparación

> Mayor.

< Menor.

>= Mayor o igual.

<= Menor o igual.

== Igual.

!= desigualdad.

= Asignación.

El operador < devuelve true si el operando izquierdo es menor que el


derecho.

El operador > devuelve true si el operando izquierdo es mayor que el derecho.


El operador <= devuelve true si el operando izquierdo es menor o igual que
el derecho.
El operador >= devuelve true si el operando izquierdo es mayor o igual que
el derecho.
El operador de igualdad == devuelve true si sus operandos son iguales.
El operador de desigualdad != devuelve true si sus operandos son distintos.

2.4. Conversiones de tipos de clase


Como hemos visto anteriormente, en C#, cuando declaramos una variable, no
se puede volver a declarar, ni asignar un valor de otro tipo.
Por tanto, si tenemos una variable de tipo entero, no podemos asignar un
valor de tipo string.
Este fragmento de código daría un error:

CÓDIGO:

int numero=10;
numero = “a”; // No se puede convertir implícitamente el tipo
'string' en 'int'

25
Módulo 3A: Programación

Sin embargo, en ocasiones, podemos convertir el valor de una variable de un


tipo de dato a otro tipo. A estas conversiones se les denomina conversiones
de tipos.
Podemos tener diferentes clases de conversiones:

• Conversiones implícitas: son aquellas que se producen cuando el valor


que se va a almacenar se puede almacenar en la variable sin truncarse
ni redondearse.
Por ejemplo, una variable de tipo long puede almacenar datos de hasta
64 bits. Por tanto, puede almacenar cualquier dato de tipo int (32 bits).

CÓDIGO:

int a = 300;
long numero=a;

• Conversiones explícitas: cuando no hay posibilidad de realizar una


conversión implícita es cuando debemos indicar al compilador que se
pretende realizar una conversión que pueda producir una pérdida de
datos.

CÓDIGO:

double num = 100.85;


int b;
b = (int)num;
System.Console.WriteLine(b);

// La salida por pantalla será 100

Parse y TryParse

Con los métodos Parse y TryParse, podemos convertir una cadena en varios
tipos numéricos: int, decimal, double…
El método Parse devuelve el número convertido. El método TryParse devuelve
un valor booleano indicando si la conversión se realizó correctamente o no, y
devuelve el número convertido.

26
Módulo 3A: Programación

CÓDIGO:

int numValido = Int32.Parse("-100");


Console.WriteLine(numValido);

// La salida por pantalla será -100

While (Int32.TryParse("50", out int miNumero))


// El argumento miNumero, se pasa por referencia. Lo veremos
más adelante en la UF2, apartado 1.5

Console.WriteLine(miNumero);

// La salida por pantalla será 50

Convert
Es una clase que convierte un tipo de datos en otro. Algunos métodos son:
Método Descripción
ToBoolean Convierte un valor especificado en un valor
booleano
ToChar Convierte un valor especificado en un carácter
ToDecimal Convierte un valor especificado en un número
decimal
ToDouble Convierte un valor especificado en un número
de punto flotante
ToInt16 Convierte un valor especificado en un entero
de 16 bits
ToInt32 Convierte un valor especificado en un entero
de 32 bits
ToInt64 Convierte un valor especificado en un entero
de 64 bits
ToString Convierte un valor especificado en su
representación de cadena

CÓDIGO:

double numero = 30.5;


string cadena = Convert.ToString(numero);

// Mostraría por pantalla la cadena “30.5”

27
Módulo 3A: Programación

CÓDIGO:

Ejemplo

Según el siguiente código:

Int a=10, b=3, c=1, d, e;

Float x,y;

x=a/b;

c=a<b && c;

d= a + b++;

e= ++a - b;

y= (float)a / b;

// habría un error en la sentencia c=a<b && c, porque estamos evaluando


una condición booleana, mientras que la variable c es una variable de tipo
entero.

2.5 Comentarios al código


Hasta ahora nos hemos introducido en la creación por parte de un
programador de código fuente con una finalidad concreta. No debemos pasar
por alto que, además de realizar programas, lo debemos hacer de la forma
más optimizada y ordenada posible.

En el ámbito de la organización entra en escena el concepto de los


comentarios. Es una herramienta disponible en el compilador para que el
programador pueda hacer anotaciones en el código sin que sea procesado
por el compilador. Estas anotaciones deben de esclarecer el propio código y
ayudar a entender las sentencias del programa. Así, futuros programadores
podrán conocer su funcionamiento.
En el lenguaje de programación C# está permitido hacer dos tipos de
comentarios:

28
Módulo 3A: Programación

● Comentarios de una línea: son frases cortas y, por tanto, solo pueden
ocupar una línea del código. Debemos de escribir “//” antes de
comenzar con dichas anotaciones.

● Comentarios multiline o multilíneas: son comentarios de varias líneas,


que se utilizan para hacer una explicación mucho más detallada del
código en cuestión. También podemos hacer uso de este tipo de
comentarios cuando deseamos que una parte del código no sea
procesada por el compilador. En este caso, debemos de englobar el
texto entre los caracteres “/*” y “*/”.

El uso de los comentarios es muy útil y, por tanto, se aconseja a los


programadores que implementen programas con tantos comentarios como
sea posible para documentar el código.

CÓDIGO:

/*Programa que muestra por


pantalla la frase
Buenas tardes*/

// Está compuesto por la clase Hello1 y el método Main()

public class Hello1


{
public static void Main()
{
System.Console.WriteLine("Buenas Tardes");
}
}

29
Módulo 3A: Programación

3. Programación estructurada
La programación estructurada es un procedimiento que consiste en diseñar e
implementar programas de forma clara y sencilla para que puedan ser
mantenidos con facilidad.

La idea de la programación estructurada fue expuesta por E.W. Dijkstra 1 en


1965 y su base teórica se apoyó en los trabajos de Böhm y Jacopini 2.

El estudio concluyó que, con la combinación de tres tipos de instrucciones,


podemos crear un programa estructurado:
- Secuencia de instrucciones.

- Selección de instrucciones.

- Iteración o bucle de instrucciones.

1
Serna, M. E. (2009). Edsger Wybe Dijkstra. Revista Digital Lámpsakos, no. 2, pp. 107-11.

2
Corrado Böhm, Giuseppe Jacopini. (1966). Flow diagrams, turing machines and languages
with only two formation rules. 2020, de ACM Digital Library, Association for Computing
Machinery. Sitio web: https://dl.acm.org/doi/pdf/10.1145/355592.365646

30
Módulo 3A: Programación

3.1. Fundamentos de programación


Los fundamentos de la programación se basan en un conjunto de técnicas que
persiguen desarrollar algoritmos que sean sencillos de escribir, leer, modificar
y testear.

El orden en que se ejecutan las sentencias de un programa es secuencial. Este


flujo significa que las sentencias se ejecutan en secuencia, una después de
otra, y en el orden en que se encuentran dentro del programa.

Teorema de Böhm y Jacopini

Un programa debe de cumplir las siguientes características:

• Debe tener un único punto de entrada y uno de salida.


• Toda acción del algoritmo debe ser accesible. Tiene que haber al
menos un camino que va desde el inicio hasta el fin del algoritmo.
• No deben existir, por tanto, bucles infinitos.

El programa se encarga de transformar la entrada en salida:

Por lo tanto, la programación es un proceso de desarrollo que nos ayuda a


resolver un determinado problema.

31
Módulo 3A: Programación

3.2. Introducción a la algoritmia y herramientas de diseño


Un algoritmo es una secuencia de los pasos y las distintas operaciones que
debe realizar el programa para conseguir resolver un problema planteado.

En cambio, la algoritmia es un conjunto ordenado y finito de operaciones que


permite encontrar la solución a un problema cualquiera.

La algoritmia utiliza un conjunto de herramientas lógicas, matemáticas e


informáticas con el objetivo de diseñar y presentar un algoritmo.
Anteriormente, ya hemos hablado de dos herramientas para la construcción
de algoritmos: el pseudocódigo y los diagramas de flujo. Este conjunto de
herramientas es utilizado en las etapas de Ingeniería del Software que
veremos a continuación.

3.3. Ciclo de vida de un proyecto software


La imagen representa el ciclo de vida de un programa informático, de
manera que las flechas indican el orden de realización de cada etapa.

• Análisis de requisitos: a partir de las necesidades del usuario o del


programa planteado, se decide qué es lo que hay que hacer para llegar

32
Módulo 3A: Programación

a conseguir una solución óptima, y se genera un documento de


requisitos. Se trata de la etapa más importante del ciclo de vida.
Existen varias técnicas para obtener los requisitos del usuario:
o Entrevistas
o Brainstrorming
o Prototipos
o Casos de uso
o JAD (entrevistas en grupos o talleres)

• Diseño de la arquitectura: se hace un estudio para ver los distintos


componentes que van a formar parte de nuestro programa (módulos,
subsistemas, etc.) y se genera un documento de diseño. Esta fase se va
a revisar todas las veces que sea necesario hasta que estemos seguros
de cuál va a ser la mejor solución.
o Diseño estructurado: tenemos varias notaciones como los
diagramas de flujo o el pseudocódigo.
o Diseño orientado a objetos: trabajaremos con
representaciones en UML (diagramas de clases, diagramas de
secuencia, etc.).
• Etapa de implementación o codificación: en esta etapa vamos a pasar
a codificar las aplicaciones que hemos elegido en la etapa anterior,
empleando el lenguaje de programación con el que estemos
trabajando. El resultado que vamos a obtener va a ser el código fuente.

• Pruebas de integración: hay que realizar ensayos del funcionamiento,


combinando todos los módulos de la aplicación. Así, haciendo
funcionar la aplicación completa, comprobamos que cumple lo
establecido en el diseño.

• Pruebas de validación: el último paso de la integración se basa en


realizar nuevas pruebas de la aplicación en su conjunto. El objetivo es
cerciorarse de que se cumple lo establecido en el documento de
requisitos y que cubre las necesidades de los usuarios que ya habíamos
previsto.

• Fase de mantenimiento: revisar todo el proceso anterior e ir


actualizando o modificando los cambios oportunos en las etapas
anteriores.

33
Módulo 3A: Programación

3.4. Prueba de programas


Una vez implementado y compilado el código de nuestro algoritmo, debemos
ponerlo en marcha y comenzar la etapa de testing, plan de prueba o prueba
de programa.

En ella, se prueba un programa para demostrar la existencia de defectos:


algorítmicos, de sintaxis, de documentación, de sobrecarga, de capacidad, de
rendimiento, de sincronización, de recuperación, de hardware y software y de
estándares.

Este proceso de prueba del programa se lleva a cabo de manera automática


o manual y persigue los siguientes objetivos:

• Comprobar los requisitos funcionales y no funcionales del programa.

• Probar todo tipo de casos para detectar alguna anomalía en su


ejecución.

Tenemos dos tipos de técnicas de pruebas:


• Pruebas de caja blanca: donde se valida la estructura del sistema.
• Pruebas de caja negra: donde se analizan las entradas y salidas del
sistema sin tener en cuenta el funcionamiento interno.

34
Módulo 3A: Programación

El plan de prueba consta de varias etapas, ya que, después de implementar


el código, si existiera algún tipo de fallo en el programa, tendríamos que
volver a empezar con el nuevo código modificado.

3.5. Tipos de datos: simples y compuestos


C# es un lenguaje de programación en el que cada variable, constante,
atributo o valor que devuelve una función se encuentra establecido en un
rango de elementos ya definidos.

Podemos diferenciar entre:

• Tipos simples

A la hora de seleccionar un determinado tipo, debemos considerar el rango


de valores que puede tomar, las operaciones a realizar y el espacio necesario
para almacenar datos.

Debemos tener en cuenta que el tipo de datos simple no está compuesto por
otros tipos, y que contiene un valor único.

o Tipos simples predefinidos: entre sus propiedades más importantes


podemos destacar que son indivisibles, tienen existencia propia y
permiten operadores relacionales.

Se utilizan sin necesidad de ser definidos previamente:

• Natural: números naturales (N): byte, uint, ushort, ulong.


• Entero: números enteros (Z): sbyte, int, long, short.
• Real: números reales (R): decimal, float, double.
• Carácter: caracteres (C): char.
• Lógico: booleanos (B): bool.

o Tipos simples definidos por el usuario

o Tipos enumerados: es un tipo de valor definido por el usuario,


así como un conjunto de constantes. Para definir un tipo de
enumeración, utilizamos la palabra clave enum y especificamos
los nombres de componentes de la enumeración:

35
Módulo 3A: Programación

CÓDIGO:

public class EnumTest

enum dias {Domingo,Lunes,Martes,Miercoles,Jueves,Viernes,Sabado};

static void Main()

int x = (int)dias.Domingo;

int y = (int)dias.Viernes;

Console.WriteLine("Domingo = {0}", x);

Console.WriteLine("viernes = {0}", y);

/* Salida:

Domingo = 0

Viernes = 5

*/

• Tipos compuestos o estructurados

Se crean mediante la unión de varios tipos (simples o compuestos).

o Vectores: estructura donde almacenamos varias variables del


mismo tipo. Se puede declarar una matriz si se especifica el tipo de
sus elementos. También son llamados array unidimensional, es
decir, de una dimensión. Con esto, nos damos cuenta de la cantidad
de indicadores de posición que necesitamos para acceder a un
elemento de la tabla.

Sintaxis:

CÓDIGO:

<tipo> [] <nombre> = new <tipo> [<tamaño>];

36
Módulo 3A: Programación

Por ejemplo:

CÓDIGO:

int [] v = new int [10];

int[] array1 = new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };

int[] array2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

Con el anterior código, estamos declarando 10 números enteros en un vector


al que hemos llamado v.

A continuación, veremos la manera de acceder a cada uno de ellos. Cabe


recordar que la primera posición de todo array es el 0:

v[0] Primer número entero del vector.

v[1] Segundo número entero del vector.

v[2] Tercer número entero del vector.

v[3] Cuarto número entero del vector.

v[9] Último número entero del vector

Veamos el siguiente ejemplo:

CÓDIGO:

char[] miArray = { ‘a’, ‘b’, ‘c’, ‘d’, ‘e’};

for (int x=0; x<5; x++) {

miArray [1]=’z’;

Console.WriteLine(miArray[1]);

// Guardamos en la posición 1, el carácter z. Por lo que, por pantalla, mostrará ese carácter
en esa posición. Ahora el vector estaría formado por {‘a’, ‘z’, ‘c’, ‘d’, ‘e’}

o Matrices: unión de varios vectores de cualquier tipo simple


(enteros, reales, etcétera). También la podemos ver como un array
bidimensional, por tanto, esos datos nos indican que necesitamos

37
Módulo 3A: Programación

dos indicadores de posición para acceder al elemento. La primera


posición de una matriz es (0,0).

Sintaxis:

CÓDIGO:

Tipo [,] Nombre= new Tipo [filas, columnas];

Por ejemplo:

CÓDIGO:

int [,] matriz = new bool[2,3];

int[,] array2D = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

int[,] miMatriz = new int[4, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

En este caso:

int [,] matriz = new bool[2,3];

estamos declarando una matriz denominada matriz, de tipo entero, que


consta de 2 filas y 3 columnas.

Accedemos a cada uno de sus elementos de la forma que se indica a


continuación:

matriz[0,0] Elemento correspondiente a la primera fila, primera columna.

matriz[0,1] Elemento correspondiente a la primera fila, segunda columna.

matriz[0,2] Elemento correspondiente a la primera fila, tercera columna.

matriz[1,0] Elemento correspondiente a la segunda fila, primera columna.

matriz[1,1] Elemento correspondiente a la segunda fila, segunda columna.

matriz[1,2] Elemento correspondiente a la segunda fila, tercera columna.

Matriz de 6 elementos (2 filas por 3 columnas):

38
Módulo 3A: Programación

3.6. Estructuras de selección (instrucciones condicionales)


Las estructuras de selección son aquellas que permiten ejecutar una parte del
código dependiendo de si cumple o no una determinada condición.

Instrucción simple (IF): su estructura sería de la siguiente forma:

• Instrucción simple (IF)

SI CONDICIÓN ENTONCES:

INSTRUCCIONES_1

FIN SI;

• Instrucción doble (IF-ELSE)

SI CONDICIÓN ENTONCES:

INSTRUCCIONES_1;

SI NO:

INSTRUCCIONES_2;

FIN SI;

39
Módulo 3A: Programación

En este caso, si CONDICIÓN ES CIERTA, ejecutaremos lo que hay en


INSTRUCCIONES_1 y saltaremos hasta el FIN SI.

Sin embargo, si CONDICIÓN ES FALSA, ejecutaremos lo que hay en


INSTRUCCIONES_2.

En las estructuras dobles, por cada IF, debe haber un ELSE.

• Operadores lógicos

&& AND: ambas condiciones deben cumplirse para entrar en el bloque IF.

No evalúa el operando derecho si el izquierdo es false.

|| OR: es suficiente con que una de las condiciones se cumpla para entrar en el bloque
IF.

El resultado de x || y es true si x o y es true.

^ XOR: El resultado se evalúa como true si una condición se evalúa como false y otra
como true.

Si ambas condiciones se evalúan como false o como true, el resultado será false.

Ejemplo AND lógico condicional &&:

SI CONDICIÓN_1 && CONDICIÓN_2 ENTONCES:

FIN SI;

Si condición_1 y condición_2 son true, el resultado se evalúa como true. Si


alguna condición es false, el resultado se evalúa como false.

Ejemplo OR lógico condicional ||:

SI CONDICIÓN_1 || CONDICIÓN_2 ENTONCES:

FIN SI;

Si condición_1 es true o condición_2 es true, el resultado se evalúa como true.

40
Módulo 3A: Programación

Ejemplo XOR exclusivo:

SI CONDICIÓN_1 ^ CONDICIÓN_2 ENTONCES:

FIN SI:

CONDICIÓN_1 CONDICIÓN_2 RESULTADO


false false False
false true True
True false true
true true false

• Sentencia Switch (o de selección múltiple)

Es una instrucción de selección que elige una sola acción de una lista de
opciones en función de una coincidencia de distintos patrones con la
expresión.

CÓDIGO:

using System;

public class Example

public static void Main()

int var = 1;

switch (var)

case 1:

Console.WriteLine("Caso 1");

break;

case 2:

41
Módulo 3A: Programación

Console.WriteLine("Caso 2");

break;

default:

Console.WriteLine("Otro caso");

break;

// La salida mostrada será Caso 1 porque nuestra variable ‘var’ contiene el valor 1.

La cláusula default es optativa en esta estructura.

3.7. Estructuras de repetición


Las estructuras de repetición siempre se ejecutan mediante el uso de bucles.
Estos son los que permiten que una o varias líneas de código se ejecuten de
forma repetida. Se van a ir repitiendo mientras que se cumpla una
determinada condición de salida.

Existen diferentes estructuras de repetición:

• Mientras (While)

Mientras que se cumpla una condición, el código incluido dentro del bucle se
repite. La condición se evalúa al principio, por lo que puede que no llegue a
ejecutarse nunca.

Mientras CONDICIÓN Hacer

Instrucción_1;

Instrucción_2;

…;

Instrucción_N;

ModificarCondición;

FinMientras;

42
Módulo 3A: Programación

• Hacer… mientras (Do… while)

Mientras que se cumpla una condición, el


código incluido dentro del bucle se repite. La
condición se evalúa al final, por lo que, como
mínimo, se va a ejecutar una vez.

Hacer

Instrucción_1;

Instrucción_2;

Instrucción_N;

ModificarCondición;

Mientras CONDICIÓN;

• Para

Mientras que se cumpla una condición, el


código incluido dentro del bucle se repite
tantas veces como indique el contador, que se
irá modificando en cada sentencia. La
condición se evalúa al principio, por lo que
puede que no llegue a ejecutarse nunca.

Para CONDICIÓN

Instrucción1;

Instrucción2;

InstrucciónN;

ModificarCondición;

43
Módulo 3A: Programación

• Foreach

Ejecuta una instrucción o bloque de instrucciones para cada elemento


de ciertas estructuras de datos como arrays o listas

CÓDIGO:

Ejemplo 1

int [] diasMes = {1, 21, 30};

foreach (int dias in diasMes) {

Console.WriteLine("Dias del mes: {0}", dias);

// creamos una variable días de tipo entero que nos servirá para recorrer
cada elemento del array diasMes

Ejemplo2
List‹string› ListaColores = new List‹string›(); //creamos una lista de tipo string

//añadimos un color a la lista

ListaColores.Add ("Azul");

ListaColores.Add ("Rojo");

ListaColores.Add ("Verde");

ListaColores.Add ("Amarillo");

ListaColores.Add ("Morado");

foreach (string color in ListaColores)

// recorremos la lista mediante la variable string color

Console.WriteLine ( color );

44
Módulo 3A: Programación

3.8. Estructuras de salto


Las estructuras de salto son todas aquellas que detienen (de diferentes
formas) la ejecución de alguna de las sentencias de control de nuestro
programa.

break Se encuentra al final de la sentencia switch. Interrumpe el bucle indicando


que debe continuar a partir de la siguiente sentencia después del bloque del
ciclo.

El control se devuelve a la instrucción que haya a continuación de la


instrucción finalizada.

continue Se utiliza en sentencias repetitivas con bucles for, foreach, while y do… while.
Transfiere el control a la siguiente iteración.

for (int i = 1; i <= 10; i++)


{
if (i < 9)
{
continue;
}
Console.WriteLine(i);
}

Console.ReadKey();

// Mostraría por pantalla 9 y 10

return Esta estructura de salto obliga a que finalice la ejecución de una determinada
función. Normalmente se utiliza para devolver el control a la función de
llamada.

static double CalculaArea(int radio)


{
double area = radio * radio * Math.PI;
return area;
}

//Devuelve la variable local área como un valor de tipo entero

45
Módulo 3A: Programación

3.9. Tratamiento de cadenas


Una cadena es un objeto de tipo string. Para la representación de cadenas de
caracteres se utiliza la palabra reservada string.

En C#, la representación del tipo de datos sería de la siguiente forma:

CÓDIGO:

string frase = "buenos días";

Console.WriteLine("El caracter de la posición 5, es {0}", frase [5]);

// La salida por pantalla sería el carácter ‘s’ que está en la posición 5

Siempre que queramos escribir combinaciones alfanuméricas, en nuestro


código, irán entre comillas dobles (“”), ya que el compilador las va a tomar
como un tipo string. Estas variables string se pueden inicializar a partir de una
tabla de caracteres creada previamente.

CÓDIGO:

char []letras = {'h', 'o', 'l', 'a'};

string frase = new string(letras);

char caracter = frase [0];

/* Creamos un array de caracteres llamado letras.

A continuación, vamos a crear un objeto de tipo string con la palabra reservada


new.
Con esta palabra reservada, creamos una nueva instancia de tipo string (frase).

Por último, asignamos el primer valor de nuestro string a la variable carácter.

En este caso, el valor será ‘h’ */

new
El operador new crea una nueva instancia de un tipo.

La palabra new crea un objeto tipo string al que pasamos el parámetro letras
como una tabla de caracteres.

A continuación, vamos a ver los principales métodos de los que dispone


string:

46
Módulo 3A: Programación

Length Devuelve el número de caracteres.

ToCharArray() Convierte un string en array de caracteres.

SubString() Extrae parte de una cadena. Método que puede ser sobrecargado
indicando su inicio y su fin: SubString (int inicio) o SubString (int inicio, int
tamaño).

CopyTo() Copia un número de caracteres especificados a una determinada posición


del string.

CompareTo() Compara la cadena que contiene el string con otra pasada por parámetro.

Devuelve un entero que indica si la posición de esta instancia es anterior,


posterior o igual que la posición del string.

Contains() Si la cadena que se le pasa por parámetro forma parte del string, devuelve
un booleano.

IndexOf() Si aparece un carácter especificado en el string, devuelve el índice de la


posición de la primera vez que aparece. Devuelve -1 si el carácter no se
encuentra en la cadena.

Insert() Inserta una cadena de caracteres en una posición concreta del string.

Trim() Quita todos los espacios en blanco del principio y el final de la cadena de
caracteres.

Replace() Devuelve una cadena, donde se ha sustituido un carácter por otro.

Remove() Devuelve una cadena donde se ha eliminado un número de caracteres


especificado.

Split() Ofrece la posibilidad de separar en varias partes una cadena de caracteres.

47
Módulo 3A: Programación

ToLower() Devuelve una cadena convertida en mayúsculas.

ToUpper() Devuelve una cadena convertida en mayúsculas.

En el siguiente link, se puede consultar la información de los métodos string:

https://docs.microsoft.com/es-es/dotnet/api/system.string?view=netcore-
3.1#methods

3.10. Depuración de errores


Una vez que llegamos a la etapa de depuración de nuestro programa, nuestro
objetivo será descubrir todos los errores que existan e intentar
solucionarlos de la mejor forma posible.

Podemos encontrar tres tipos de errores diferentes:

• De compilación o sintaxis: errores en el código.

• De tiempo de ejecución: los que producen un fallo a la hora de


ejecutar el programa. Se trata de fragmentos de código que parecen
estar correctos y que no tienen ningún error de sintaxis, pero que no se
ejecutarán. Por ejemplo, se podría escribir correctamente una línea de
código para abrir un archivo, pero si el archivo no existe, la aplicación
no puede llevar a cabo la apertura de ese archivo, por lo que se
detendrá la ejecución.

• Lógicos: son aquellos errores que dan resultados erróneos, diferentes


a los esperados o no deseados, en respuesta a las acciones del usuario.
Son los más difíciles de corregir, ya que no siempre está claro dónde
se originan.

Cuando queramos depurar errores, tenemos la opción, en cualquier


momento de nuestro programa, de poner un punto de interrupción en una
determinada línea de código. Para ello, presionamos F9.

Si queremos ejecutar la aplicación en el depurador de Visual Studio, podemos


hacerlo presionando F5. La aplicación se detiene en la línea y podremos
examinar cuánto valen las variables para ir realizando su seguimiento, o

48
Módulo 3A: Programación

podemos comprobar cuándo finalizan los bucles, entre otras cosas. Para
depurar el código, teclearemos F10 (paso a paso).

• Errores de compilación: estos errores impiden la ejecución de un


programa. Inicialmente se compila el programa, y, si el compilador
encuentra cualquier cosa que no entiende, lanza un error de
compilación. Casi todos los errores que ocasiona el compilador se
producen mientras escribimos el código.

• Errores en tiempo de ejecución: aparecen mientras se ejecuta el


programa, normalmente cuando se pretende realizar una operación
que no lleva a ninguna solución, como, por ejemplo, cuando se
pretende dividir por cero.

• Errores lógicos: impiden que se lleve a cabo lo que se había previsto.


El código se puede compilar y ejecutar sin problema, pero, en el caso
de que se compile, devuelve algo que no era la solución que se
esperaba. El programa no da error cuando se ejecuta en el inicio, por
lo que su corrección es más difícil. Tenemos que encontrar el error en
un programa que sí funciona, pero que funciona de forma diferente a
la que debería.

3.11. Documentación de programas


Una vez que finaliza nuestro proceso de compilación y ejecución, debemos
elaborar una memoria para que quede registrado todo el desarrollo que
hemos llevado a cabo, los fallos que ha presentado y cómo hemos conseguido
solventarlos.

49
Módulo 3A: Programación

Los ficheros que entreguemos que formen parte del proyecto deben estar
testeados y tener un correcto funcionamiento. Habrá que solventar los errores
descritos anteriormente.

summary
La etiqueta <summary> debe usarse para describir un tipo y para agregar
información adicional dentro de nuestro código. Gracias a herramientas de
documentación como GhostDoc y Sandcastle, creamos hipervínculos internos
a las páginas de documentación de los elementos de código:

https://docs.microsoft.com/es-es/dotnet/csharp/programming-
guide/xmldoc/cref-attribute

CÓDIGO: XML

<summary>description</summary>

CÓDIGO: XML

namespace ConsoleApp33

// Implementamos los métodos a utilizar

class Program

/// <summary>

///

/// Main es el método principal de nuestra clase

///

/// </summary>

static void Main(string [] args)

// Voy a realizar un programa y a documentarlo

char []letras = { 'h', 'o', 'l', 'a'};

50
Módulo 3A: Programación

string frase = new string(letras);

char caracter = frase [0];

//salida por pantalla

Console.WriteLine(caracter);

Console.ReadLine();

CÓDIGO: XML

<?xml version="1.0"?>

<doc>

<assembly>

<name>ConsoleApp33</name>

</assembly>

<members>

<member name="M:ConsoleApp33.Program.Main(System.String[])">

<summary>

Main es el método principal de nuestra clase.

</summary>

</member>

</members>

</doc>

51
Módulo 3A: Programación

3.12. Entornos de desarrollo de programas


Una vez que diseñamos un programa, podemos denominar entorno de
desarrollo integrado (IDE o integrated development environment) al entorno
de programación que hemos utilizado para su realización: editor de código,
compilador, depurador e interfaz gráfica (GUI o graphical user interface).

Los IDE son utilizados por distintos lenguajes de programación como C++,
PHP, Python, Java, C#, Visual Basic, etcétera.

A modo de ejemplo, podemos señalar algunos entornos integrados de


desarrollo como Eclipse, Netbeans, Visual Code o Visual Studio, entre otros.

Los IDE deben cumplir con una serie de características para su correcto
funcionamiento, como, por ejemplo:

• Son multiplataforma.

• Actúan como soporte para diferentes lenguajes de programación.

• Reconocen sintaxis.

• Están integrados con sistemas de control de diferentes versiones.

• Tienen un depurador.

• Permiten importar y exportar proyectos.

• Manejan diferentes idiomas.

• Facilitan un manual de ayuda para el usuario.

Las diferentes ventajas que ofrecen los IDE son:

• Presentan una baja curva de aprendizaje.

• Son de uso óptimo para usuarios que no son expertos.

• Formatean el código.

• Usan funciones para renombrar funciones y variables.

• Permiten crear proyectos.

• Muestran en pantalla errores y warnings.

52

También podría gustarte