Repasando Programacion
Repasando Programacion
INTRODUCCION A LA PROGRAMACION
Es bueno tenerse paciencia cuando los problemas no se resuelven por completo, pero es de
fundamental importancia dedicar tiempo al análisis individual de los problemas.
¿Qué es un programa?
Programa: Conjunto de instrucciones que entiende un ordenador para realizar una actividad.
Todo programa tiene un objetivo bien definido: un procesador de texto es un programa que permite
cargar, modificar e imprimir textos, un programa de ajedrez permite jugar al ajedrez contra el
ordenador u otro contrincante humano.
La actividad fundamental del programador es resolver problemas empleando el ordenador como
herramienta fundamental.
Para la resolución de un problema hay que plantear un algoritmo.
Algoritmo: Son los pasos a seguir para resolver un problema.
Diagrama de flujo
Un diagrama de flujo es la representación gráfica de un ALGORITMO.
Los símbolos gráficos a utilizar para el planteo de diagramas de flujo son:
Estos son los elementos esenciales que intervienen en el desarrollo de un diagrama de flujo.
Para el ejemplo planteado la variable HorasTrabajadas almacena la cantidad de horas trabajadas por
el operario. La variable ValorHora almacena el precio de una hora de trabajo. La variable Sueldo
almacena el sueldo a abonar al operario.
En el ejemplo tenemos tres variables.
Tipos de variable:
Una variable puede almacenar:
- Valores Enteros (100, 260, etc.)
- Valores Reales (1.24, 2.90, 5.00, etc.)
- Cadenas de caracteres ("Juan", "Compras", "Listado", etc.)
Elección del nombre de una variable:
Debemos elegir nombres de variables representativas. En el ejemplo el nombre HorasTrabajadas es
lo suficientemente claro para darnos una idea acabada sobre su contenido. Podemos darle otros
buenos nombres. Otros no son tan representativos, por ejemplo HTr. Posiblemente cuando estemos
resolviendo un problema dicho nombre nos recuerde que almacenamos las horas trabajadas por el
operario pero cuando pase el tiempo y leamos el diagrama probablemente no recordemos ni
entendamos qué significa HTr.
Ahora debemos codificar el diagrama de flujo utilizando las instrucciones del lenguaje C#. Como
hemos visto el entorno de programación del Visual C# nos creó un esqueleto básico sobre el cual
continuaremos el programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CalculoSueldo
{
class Program
{
static void Main(string[] args)
{
}
}
}
Tenemos dos entradas num1 y num2, dos operaciones: realización de la suma y del producto de los
valores ingresados y dos salidas, que son los resultados de la suma y el producto de los valores
ingresados. En el símbolo de impresión podemos indicar una o más salidas, eso queda a criterio del
programador, lo mismo para indicar las entradas por teclado.
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SumaProductoNumeros
{
class Program
{
static void Main(string[] args)
{
int num1, num2, suma, producto;
string linea;
Console.Write("Ingrese primer valor:");
linea = Console.ReadLine();
num1 = int.Parse(linea);
Console.Write("Ingrese segundo valor:");
linea = Console.ReadLine();
num2 = int.Parse(linea);
suma = num1 + num2;
producto = num1 * num2;
Console.Write("La suma de los dos valores es:");
Console.WriteLine(suma);
Console.Write("El producto de los dos valores es:");
Console.WriteLine(producto);
Console.ReadKey();
}
}
}
Recordemos que tenemos que seguir todos los pasos vistos para la creación de un proyecto.
Algunas cosas nuevas que podemos notar:
• Podemos definir varias variables en la misma línea:
Podemos observar: El rombo representa la condición. Hay dos opciones que se pueden tomar. Si la
condición da verdadera se sigue el camino del verdadero, o sea el de la derecha, si la condición da
falsa se sigue el camino de la izquierda.
Se trata de una estructura CONDICIONAL SIMPLE porque por el camino del verdadero hay
actividades y por el camino del falso no hay actividades.
Por el camino del verdadero pueden existir varias operaciones, entradas y salidas, inclusive ya
veremos que puede haber otras estructuras condicionales.
Problema:
Ingresar el sueldo de una persona, si supera los 3000 pesos mostrar un mensaje en pantalla
indicando que debe abonar impuestos.
Diagrama de flujo:
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EstructuraCondicionalSimple1
{
class Program
{
static void Main(string[] args)
{
float sueldo;
string linea;
Console.Write("Ingrese el sueldo:");
linea=Console.ReadLine();
sueldo=float.Parse(linea);
if (sueldo>3000)
{
Console.Write("Esta persona debe abonar impuestos");
}
Console.ReadKey();
}
}
}
La palabra clave "if" indica que estamos en presencia de una estructura condicional; seguidamente
disponemos la condición entre paréntesis. Por último encerrada entre llaves las instrucciones de la
rama del verdadero.
Es necesario que las instrucciones a ejecutar en caso que la condición sea verdadera estén
encerradas entre llaves { }, con ellas marcamos el comienzo y el fin del bloque del verdadero.
Ejecutando el programa e ingresamos un sueldo superior a 3000 pesos. Podemos observar como
aparece en pantalla el mensaje "Esta persona debe abonar impuestos", ya que la condición del if es
verdadera.
Volvamos a ejecutar el programa y carguemos un sueldo menor o igual a 3000 pesos. No debe
aparecer mensaje en pantalla.
Estructura condicional compuesta.
Cuando se presenta la elección tenemos la opción de realizar una actividad u otra. Es decir tenemos
actividades por el verdadero y por el falso de la condición. Lo más importante que hay que tener en
cuenta que se realizan las actividades de la rama del verdadero o las del falso, NUNCA se realizan las
actividades de las dos ramas.
Representación gráfica:
namespace EstructuraCondicionalCompuesta1
{
class Program
{
static void Main(string[] args)
{
int num1, num2;
string linea;
Console.Write("Ingrese primer valor:");
linea = Console.ReadLine();
num1 = int.Parse(linea);
Console.Write("Ingrese segundo valor:");
linea = Console.ReadLine();
num2 = int.Parse(linea);
if (num1 > num2)
{
Console.Write(num1);
}
else
{
Console.Write(num2);
}
Console.ReadKey();
}
}
}
Cotejemos el diagrama de flujo y la codificación y observemos que el primer bloque de llaves después
del if representa la rama del verdadero y el segundo bloque de llaves representa la rama del falso.
Compilemos el programa, si hubo errores sintácticos corrijamos y carguemos dos valores, como, por
ejemplo:
Ingrese el primer valor: 10
Ingrese el segundo valor: 4
10
Si ingresamos los valores 10 y 4 la condición del if retorna verdadero y ejecuta el primer bloque.
Un programa se controla y corrige probando todos sus posibles resultados.
Ejecutemos nuevamente el programa e ingresemos:
Ingrese el primer valor: 10
Ingrese el segundo valor: 54
54
Cuando a un programa le corregimos todos los errores sintácticos y lógicos ha terminado nuestra
tarea y podemos entregar el mismo al USUARIO que nos lo solicitó.
Operadores
En una condición deben disponerse únicamente variables, valores constantes y operadores
relacionales.
Operadores Relacionales:
> (mayor)
< (menor)
>= (mayor o igual)
<= (menor o igual)
== (igual)
!= (distinto)
Operadores Matemáticos
+ (más)
- (menos)
* (producto)
/ (división)
% (resto de una división) Ej.: x=13%5; {se guarda 3}
Hay que tener en cuenta que al disponer una condición debemos seleccionar que operador
relacional se adapta a la pregunta.
Ejemplos:
1. Realizar un programa que lea por teclado dos números, si el primero es mayor al
segundo informar su suma y diferencia, en caso contrario informar el producto y la
división del primero respecto al segundo.
2. Se ingresan tres notas de un alumno, si el promedio es mayor o igual a siete mostrar
un mensaje "Promocionado".
3. Se ingresa por teclado un número positivo de uno o dos dígitos (1..99) mostrar un
mensaje indicando si el número tiene uno o dos dígitos.
(Tener en cuenta que condición debe cumplirse para tener dos dígitos, un número
entero)
El diagrama de flujo que se presenta contiene dos estructuras condicionales. La principal se trata de
una estructura condicional compuesta y la segunda es una estructura condicional simple y está
contenida por la rama del falso de la primera estructura.
Es común que se presenten estructuras condicionales anidadas aún más complejas.
Problema:
Confeccionar un programa que pida por teclado tres notas de un alumno, calcule el promedio e
imprima alguno de estos mensajes:
Si el promedio es >=7 mostrar "Promocionado".
Analicemos el siguiente diagrama. Se ingresan tres valores por teclado que representan las notas de
un alumno, se obtiene el promedio sumando los tres valores y dividiendo por 3 dicho resultado
(Tener en cuenta que si el resultado es un valor real solo se almacena la parte entera).
Primeramente preguntamos si el promedio es superior o igual a 7, en caso afirmativo va por la rama
del verdadero de la estructura condicional mostramos un mensaje que indica "Promocionado" (con
comillas indicamos un texto que debe imprimirse en pantalla).
En caso que la condición nos dé falso, por la rama del falso aparece otra estructura condicional,
porque todavía debemos averiguar si el promedio del alumno es superior o igual a cuatro o inferior
a cuatro.
namespace EstructuraCondicionalAnidada1
{
class Program
{
static void Main(string[] args)
{
int nota1,nota2,nota3;
string linea;
Console.Write("Ingrese primer nota:");
linea = Console.ReadLine();
nota1=int.Parse(linea);
Console.Write("Ingrese segunda nota:");
linea = Console.ReadLine();
nota2 = int.Parse(linea);
Console.Write("Ingrese tercer nota:");
linea = Console.ReadLine();
nota3 = int.Parse(linea);
int promedio=(nota1 + nota2 + nota3) / 3;
if (promedio>=7)
{
Console.Write("Promocionado");
}
else
{
if (promedio>=4)
{
Console.Write("Regular");
}
else
{
Console.Write("Reprobado");
}
}
Console.ReadKey();
}
}
}
Codifiquemos y ejecutemos este programa. Al correr el programa deberá solicitar por teclado la
carga de tres notas y mostrarnos un mensaje según el promedio de las mismas.
Podemos definir un conjunto de variables del mismo tipo en una misma línea:
int nota1,nota2,nota3;
Esto no es obligatorio, pero a veces, por estar relacionadas, conviene.
A la codificación del if anidado podemos observarla por el else del primer if.
Para no tener problemas (olvidarnos) con las llaves de apertura y cerrado podemos ver la siguiente
regla:
Cada vértice representa una llave de apertura y una de cierre:
Problemas propuestos
1. Se cargan por teclado tres números distintos. Mostrar por pantalla el mayor de ellos.
2. Se ingresa por teclado un valor entero, mostrar una leyenda que indique si el número es
positivo, nulo o negativo.
3. Confeccionar un programa que permita cargar un número entero positivo de hasta tres cifras
y muestre un mensaje indicando si tiene 1, 2, o 3 cifras. Mostrar un mensaje de error si el
número de cifras es mayor.
4. Un postulante a un empleo, realiza un test de capacitación, se obtuvo la siguiente
información: cantidad total de preguntas que se le realizaron y la cantidad de preguntas que
contestó correctamente. Se pide confeccionar un programa que ingrese los dos datos por
teclado e informe el nivel del mismo según el porcentaje de respuestas correctas que ha
obtenido, y sabiendo que:
Nivel máximo:Porcentaje>=90%.
Nivel medio: Porcentaje>=75% y <90%.
Nivel regular: Porcentaje>=50% y <75%.
Fuera de nivel: Porcentaje<50%.
Confeccionar un programa que lea por teclado tres números distintos y nos muestre el mayor.
Diagrama de flujo:
Este ejercicio está resuelto sin emplear operadores lógicos en un concepto anterior del tutorial. La
primera estructura condicional es una ESTRUCTURA CONDICIONAL COMPUESTA con una
CONDICION COMPUESTA.
Podemos leerla de la siguiente forma:
Si el contenido de la variable num1 es mayor al contenido de la variable num2 Y si el contenido de
la variable num1 es mayor al contenido de la variable num3 entonces la CONDICION COMPUESTA
resulta Verdadera.
Si una de las condiciones simples da falso la CONDICION COMPUESTA da Falso y continua por la rama
del falso.
Es decir que se mostrará el contenido de num1 si y sólo si num1>num2 y num1>num3.
En caso de ser Falsa la condición, analizamos el contenido de num2 y num3 para ver cual tiene un
valor mayor.
En esta segunda estructura condicional no se requieren operadores lógicos al haber una condición
simple.
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CondicionCompuesta1
{
class Program
{
static void Main(string[] args)
{
int num1,num2,num3;
string linea;
Console.Write("Ingrese primer valor:");
linea = Console.ReadLine();
num1=int.Parse(linea);
Console.Write("Ingrese segundo valor:");
linea = Console.ReadLine();
num2 = int.Parse(linea);
Console.Write("Ingrese tercer valor:");
linea = Console.ReadLine();
num3 = int.Parse(linea);
if (num1>num2 && num1>num3)
{
Console.Write(num1);
}
else
{
if (num2>num3)
{
Console.Write(num2);
}
else
{
Console.Write(num3);
}
}
Console.ReadKey();
}
}
}
Operador ||
La carga de una fecha se hace por partes, ingresamos las variables dia, mes y año.
Mostramos el mensaje "Corresponde al primer trimestre" en caso que el mes ingresado por teclado
sea igual a 1, 2 ó 3.
En la condición no participan las variables dia y año.
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CondicionCompuesta2
{
class Program
{
static void Main(string[] args)
{
int dia,mes,año;
string linea;
Console.Write("Ingrese nro de día:");
linea = Console.ReadLine();
dia = int.Parse(linea); ;
Console.Write("Ingrese nro de mes:");
linea = Console.ReadLine();
mes=int.Parse(linea);
Console.Write("Ingrese nro de año:");
linea = Console.ReadLine();
año=int.Parse(linea);
if (mes==1 || mes==2 || mes==3)
{
Console.Write("Corresponde al primer trimestre");
}
Console.ReadLine();
}
}
}
Problemas propuestos
1. Realizar un programa que pida cargar una fecha cualquiera, luego verificar si dicha fecha
corresponde a Navidad.
2. Se ingresan tres valores por teclado, si todos son iguales se imprime la suma del primero con
el segundo y a este resultado se lo multiplica por el tercero.
3. Se ingresan por teclado tres números, si todos los valores ingresados son menores a 10,
imprimir en pantalla la leyenda "Todos los números son menores a diez".
4. Se ingresan por teclado tres números, si al menos uno de los valores ingresados es menor a
10, imprimir en pantalla la leyenda "Alguno de los números es menor a diez".
5. Escribir un programa que pida ingresar la coordenada de un punto en el plano, es decir dos
valores enteros x e y (distintos a cero).
6. Posteriormente imprimir en pantalla en que cuadrante se ubica dicho punto. (1º Cuadrante
si x > 0 Y y > 0 , 2º Cuadrante: x < 0 Y y > 0, etc.)
7. De un operario se conoce su sueldo y los años de antigüedad. Se pide confeccionar un
programa que lea los datos de entrada e informe:
a) Si el sueldo es inferior a 500 y su antigüedad es igual o superior a 10 años, otorgarle un
aumento del 20 %, mostrar el sueldo a pagar.
b) Si el sueldo es inferior a 500 pero su antigüedad es menor a 10 años, otorgarle un aumento
de 5 %.
c) Si el sueldo es mayor o igual a 500 mostrar el sueldo en pantalla sin cambios.
8. Escribir un programa en el cual: dada una lista de tres valores numéricos distintos se calcule
e informe su rango de variación (debe mostrar el mayor y el menor de ellos)
Si continuamos con el diagrama no nos alcanzarían las próximas 5 páginas para finalizarlo. Emplear
una estructura secuencial para resolver este problema produce un diagrama de flujo y un programa
en C# muy largo.
Ahora veamos la solución empleando una estructura repetitiva while:
evaluarse por primera vez la condición retorna falso y no se ejecuta el bloque de instrucciones que
queríamos repetir 100 veces.
No existe una RECETA para definir una condición de una estructura repetitiva, sino que se logra con
una práctica continua solucionando problemas.
Una vez planteado el diagrama debemos verificar si el mismo es una solución válida al problema (en
este caso se debe imprimir los números del 1 al 100 en pantalla), para ello podemos hacer un
seguimiento del flujo del diagrama y los valores que toman las variables a lo largo de la ejecución:
x
1
2
3
4
.
.
100
101 Cuando x vale 101 la condición de la estructura repetitiva retorna falso,
en este caso finaliza el diagrama.
Importante: Podemos observar que el bloque repetitivo puede no ejecutarse ninguna vez si la
condición retorna falso la primera vez.
La variable x debe estar inicializada con algún valor antes que se ejecute la operación x=x + 1 en caso
de no estar inicializada aparece un error de compilación.
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EstructuraRepetitivaWhile1
{
class Program
{
static void Main(string[] args)
{
int x;
x = 1;
while (x <= 100)
{
Console.Write(x);
Console.Write(" - ");
x = x + 1;
}
Console.ReadKey();
}
}
}
(x=x+2)
Problema 2:
Escribir un programa que solicite la carga de un valor positivo y nos muestre desde 1 hasta el valor
ingresado de uno en uno.
Ejemplo: Si ingresamos 30 se debe mostrar en pantalla los números del 1 al 30.
Es de FUNDAMENTAL importancia analizar los diagramas de flujo y la posterior codificación en C# de
los siguientes problemas, en varios problemas se presentan otras situaciones no vistas en el ejercicio
anterior.
Diagrama de flujo:
Podemos observar que se ingresa por teclado la variable n. El operador puede cargar cualquier valor.
Si el operador carga 10 el bloque repetitivo se ejecutará 10 veces, ya que la condición es “Mientras
x<=n ”, es decir “mientras x sea menor o igual a 10”; pues x comienza en uno y se incrementa en uno
cada vez que se ejecuta el bloque repetitivo.
A la prueba del diagrama la podemos realizar dándole valores a las variables; por ejemplo, si
ingresamos 5 el seguimiento es el siguiente:
n x
5 1 (Se imprime el contenido de x)
2 " "
3 " "
4 " "
5 " "
6 (Sale del while porque 6 no es menor o igual a 5)
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EstructuraRepetitivaWhile2
{
class Program
{
static void Main(string[] args)
{
int n,x;
string linea;
Console.Write("Ingrese el valor final:");
linea=Console.ReadLine();
n=int.Parse(linea);
x=1;
while (x<=n)
{
Console.Write(x);
Console.Write(" - ");
x = x + 1;
}
Console.ReadKey();
}
}
}
Los nombres de las variables n y x pueden ser palabras o letras (como en este caso)
La variable x recibe el nombre de CONTADOR. Un contador es un tipo especial de variable que se
incrementa o decrementa con valores constantes durante la ejecución del programa.
El contador x nos indica en cada momento la cantidad de valores impresos en pantalla.
Problema 3:
Desarrollar un programa que permita la carga de 10 valores por teclado y nos muestre
posteriormente la suma de los valores ingresados y su promedio.
Diagrama de flujo:
En este problema, a semejanza de los anteriores, llevamos un CONTADOR llamado x que nos sirve
para contar las vueltas que debe repetir el while.
También aparece el concepto de ACUMULADOR (un acumulador es un tipo especial de variable que
se incrementa o decrementa con valores variables durante la ejecución del programa)
Hemos dado el nombre de suma a nuestro acumulador. Cada ciclo que se repita la estructura
repetitiva, la variable suma se incrementa con el contenido ingresado en la variable valor.
La prueba del diagrama se realiza dándole valores a las variables:
valor suma x promedio
0 0
(Antes de entrar a la estructura repetitiva estos son los valores).
5 5 1
16 21 2
7 28 3
10 38 4
2 40 5
20 60 6
5 65 7
5 70 8
10 80 9
2 82 10
8 90 11
9
Este es un seguimiento del diagrama planteado. Los números que toma la variable valor dependerá
de qué cifras cargue el operador durante la ejecución del programa.
El promedio se calcula al salir de la estructura repetitiva (es decir primero sumamos los 10 valores
ingresados y luego los dividimos por 10)
Hay que tener en cuenta que cuando en la variable valor se carga el primer valor (en este ejemplo
5) al cargarse el segundo valor (16) el valor anterior 5 se pierde, por ello la necesidad de ir
almacenando en la variable suma los valores ingresados.
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EstructuraRepetitivaWhile3
{
class Program
{
static void Main(string[] args)
{
int x,suma,valor,promedio;
string linea;
x=1;
suma=0;
while (x<=10)
{
Console.Write("Ingrese un valor:");
linea = Console.ReadLine();
valor=int.Parse(linea);
suma=suma+valor;
x=x+1;
}
promedio=suma/10;
Console.Write("La suma de los 10 valores es:");
Console.WriteLine(suma);
Console.Write("El promedio es:");
Console.Write(promedio);
Console.ReadKey();
}
}
}
Problema 4:
Una planta que fabrica perfiles de hierro posee un lote de n piezas.
Confeccionar un programa que pida ingresar por teclado la cantidad de piezas a procesar y luego
ingrese la longitud de cada perfil; sabiendo que la pieza cuya longitud esté comprendida en el rango
de 1,20 y 1,30 son aptas. Imprimir por pantalla la cantidad de piezas aptas que hay en el lote.
Diagrama de flujo:
Podemos observar que dentro de una estructura repetitiva puede haber estructuras condicionales
(inclusive puede haber otras estructuras repetitivas que veremos más adelante)
En este problema hay que cargar inicialmente la cantidad de piezas a ingresar ( n ), seguidamente se
cargan n valores de largos de piezas.
Cada vez que ingresamos un largo de pieza (largo) verificamos si es una medida correcta (debe estar
entre 1.20 y 1.30 el largo para que sea correcta), en caso de ser correcta la CONTAMOS
(incrementamos la variable cantidad en 1)
Al contador cantidad lo inicializamos en cero porque inicialmente no se ha cargado ningún largo de
medida.
Cuando salimos de la estructura repetitiva porque se han cargado n largos de piezas mostramos por
pantalla el contador cantidad (que representa la cantidad de piezas aptas)
En este problema tenemos dos CONTADORES:
x (Cuenta la cantidad de piezas cargadas hasta el momento)
cantidad (Cuenta los perfiles de hierro aptos)
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EstructuraRepetitivaWhile4
{
class Program
{
static void Main(string[] args)
{
int x,cantidad,n;
float largo;
string linea;
x=1;
cantidad=0;
Console.Write("Cuantas piezar procesará:");
linea = Console.ReadLine();
n=int.Parse(linea);
while (x<=n)
{
Console.Write("Ingrese la medida de la pieza:");
linea = Console.ReadLine();
largo=float.Parse(linea);
if (largo>=1.20 && largo<=1.30)
{
cantidad = cantidad +1;
}
x=x + 1;
}
Console.Write("La cantidad de piezas aptas son:");
Console.Write(cantidad);
Console.ReadKey();
}
}
}
Problemas propuestos
Ha llegado la parte fundamental, que es el momento donde uno desarrolla individualmente un
algoritmo para la resolución de problemas.
El tiempo a dedicar a esta sección EJERCICIOS PROPUESTOS debe ser mucho mayor que el empleado
a la sección de EJERCICIOS RESUELTOS.
La experiencia dice que debemos dedicar el 80% del tiempo a la resolución individual de problemas
y el otro 20% al análisis y codificación de problemas ya resueltos por otras personas.
Es de vital importancia para llegar a ser un buen PROGRAMADOR poder resolver problemas en forma
individual.
1. Escribir un programa que solicite ingresar 10 notas de alumnos y nos informe cuántos tienen
notas mayores o iguales a 7 y cuántos menores.
2. Se ingresan un conjunto de n alturas de personas por teclado. Mostrar la altura promedio de
las personas.
3. En una empresa trabajan n empleados cuyos sueldos oscilan entre $100 y $500, realizar un
programa que lea los sueldos que cobra cada empleado e informe cuántos empleados cobran
entre $100 y $300 y cuántos cobran más de $300. Además el programa deberá informar el
importe que gasta la empresa en sueldos al personal.
4. Realizar un programa que imprima 25 términos de la serie 11 - 22 - 33 - 44, etc. (No se
ingresan valores por teclado)
5. Mostrar los múltiplos de 8 hasta el valor 500. Debe aparecer en pantalla 8 - 16 - 24, etc.
6. Realizar un programa que permita cargar dos listas de 15 valores cada una. Informar con un
mensaje cual de las dos listas tiene un valor acumulado mayor (mensajes "Lista 1 mayor",
"Lista 2 mayor", "Listas iguales")
Tener en cuenta que puede haber dos o más estructuras repetitivas en un algoritmo.
7. Desarrollar un programa que permita cargar n números enteros y luego nos informe cuántos
valores fueron pares y cuántos impares.
En su forma más típica y básica, esta estructura requiere una variable entera que cumple la función
de un CONTADOR de vueltas. En la sección indicada como "inicialización contador", se suele colocar
el nombre de la variable que hará de contador, asignándole a dicha variable un valor inicial. En la
sección de "condición" se coloca la condición que deberá ser verdadera para que el ciclo continúe
(en caso de un falso, el ciclo se detendrá). Y finalmente, en la sección de "incremento contador" se
coloca una instrucción que permite modificar el valor de la variable que hace de contador (para
permitir que alguna vez la condición sea falsa)
Cuando el ciclo comienza, antes de dar la primera vuelta, la variable del for toma el valor indicado
en la sección de "inicialización contador". Inmediatamente se verifica, en forma automática, si la
condición es verdadera. En caso de serlo se ejecuta el bloque de operaciones del ciclo, y al finalizar
el mismo se ejecuta la instrucción que se haya colocado en la tercer sección.
Seguidamente, se vuelve a controlar el valor de la condición, y así prosigue hasta que dicha condición
entregue un falso.
Si conocemos la cantidad de veces que se repite el bloque es muy sencillo emplear un for, por
ejemplo si queremo que se repita 50 veces el bloque de instrucciones puede hacerse así:
La variable del for puede tener cualquier nombre. En este ejemplo se la ha definido con el nombre
f.
Analicemos el ejemplo:
- La variable f toma inicialmente el valor 1.
- Se controla automáticamente el valor de la condición: como f vale 1 y esto es menor que
50, la condición da verdadero.
- Como la condición fue verdadera, se ejecutan la/s operación/es.
- Al finalizar de ejecutarlas, se retorna a la instrucción f++, por lo que la variable f se
incrementa en uno.
- Se vuelve a controlar (automáticamente) si f es menor o igual a 50.
Como ahora su valor es 2, se ejecuta nuevamente el bloque de instrucciones e
incrementa nuevamente la variable del for al terminar el mismo.
- El proceso se repetirá hasta que la variable f sea incrementada al valor 51.
En este momento la condición será falsa, y el ciclo se detendrá.
La variable f PUEDE ser modificada dentro del bloque de operaciones del for, aunque esto podría
causar problemas de lógica si el programador es inexperto.
La variable f puede ser inicializada en cualquier valor y finalizar en cualquier valor. Además, no es
obligatorio que la instrucción de modificación sea un incremento del tipo contador (f++).
Cualquier instrucción que modifique el valor de la variable es válida. Si por ejemplo se escribe f=f+2
en lugar de f++, el valor de f será incrementado de a 2 en cada vuelta, y no de a 1. En este caso, esto
significará que el ciclo no efectuará las 50 vueltas sino sólo 25.
Problema 1:
Podemos observar y comparar con el problema realizado con el while. Con la estructura while el
CONTADOR x sirve para contar las vueltas. Con el for el CONTADOR f cumple dicha función.
Inicialmente f vale 1 y como no es superior a 100 se ejecuta el bloque, imprimimos el contenido de
f, al finalizar el bloque repetitivo se incrementa la variable f en 1, como 2 no es superior a 100 se
repite el bloque de instrucciones.
Cuando la variable del for llega a 101 sale de la estructura repetitiva y continúa la ejecución del
algoritmo que se indica después del círculo.
La variable f (o como sea que se decida llamarla) debe estar definida como una variable más.
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EstructuraRepetitivaFor1
{
class Program
{
static void Main(string[] args)
{
int f;
for(f=1;f<=100;f++)
{
Console.Write(f);
Console.Write("-");
}
Console.ReadKey();
}
}
}
Problema 2:
: Desarrollar un programa que permita la carga de 10 valores por teclado y nos muestre
posteriormente la suma de los valores ingresados y su promedio. Este problema ya lo desarrollamos,
lo resolveremos empleando la estructura for.
Diagrama de flujo:
En este caso, a la variable del for (f) sólo se la requiere para que se repita el bloque de instrucciones
10 veces.
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EstructuraRepetitivaFor2
{
class Program
{
static void Main(string[] args)
{
int suma,f,valor,promedio;
string linea;
suma=0;
for(f=1;f<=10;f++)
{
Console.Write("Ingrese valor:");
linea=Console.ReadLine();
valor=int.Parse(linea);
suma=suma+valor;
}
Console.Write("La suma es:");
Console.WriteLine(suma);
promedio=suma/10;
Console.Write("El promedio es:");
Console.Write(promedio);
Console.ReadKey();
}
}
}
El problema requiere que se carguen 10 valores y se sumen los mismos.
Tener en cuenta encerrar entre llaves bloque de instrucciones a repetir dentro del for.
El promedio se calcula fuera del for luego de haber cargado los 10 valores.
Problema 3:
Escribir un programa que lea 10 notas de alumnos y nos informe cuántos tienen notas mayores o
iguales a 7 y cuántos menores.
Para resolver este problema se requieren tres contadores:
aprobados (Cuenta la cantidad de alumnos aprobados)
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EstructuraRepetitivaFor3
{
class Program
{
static void Main(string[] args)
{
int aprobados,reprobados,f,nota;
string linea;
aprobados=0;
reprobados=0;
for(f=1;f<=10;f++)
{
Console.Write("Ingrese la nota:");
linea = Console.ReadLine();
nota=int.Parse(linea);
if (nota>=7)
{
aprobados=aprobados+1;
}
else
{
reprobados=reprobados+1;
}
}
Console.Write("Cantidad de aprobados:");
Console.WriteLine(aprobados);
Console.Write("Cantidad de reprobados:");
Console.Write(reprobados);
Console.ReadKey();
}
}
}
Problema 4:
Escribir un programa que lea 10 números enteros y luego muestre cuántos valores ingresados fueron
múltiplos de 3 y cuántos de 5. Debemos tener en cuenta que hay números que son múltiplos de 3 y
de 5 a la vez.
Diagrama de flujo:
Tengamos en cuenta que el operador matemático % retorna el resto de dividir un valor por otro, en
este caso: valor%3 retorna el resto de dividir el valor que ingresamos por teclado, por tres.
Veamos: si ingresamos 6 el resto de dividirlo por 3 es 0, si ingresamos 12 el resto de dividirlo por 3
es 0. Generalizando: cuando el resto de dividir por 3 al valor que ingresamos por teclado es cero, se
trata de un múltiplo de dicho valor.
Ahora bien ¿por qué no hemos dispuesto una estructura if anidada? Porque hay valores que son
múltiplos de 3 y de 5 a la vez. Por lo tanto con if anidados no podríamos analizar los dos casos.
Es importante darse cuenta cuando conviene emplear if anidados y cuando no debe emplearse.
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EstructuraRepetitivaFor4
{
class Program
{
static void Main(string[] args)
{
int mul3,mul5,valor,f;
string linea;
mul3=0;
mul5=0;
for(f=1;f<=10;f++)
{
Console.Write("Ingrese un valor:");
linea = Console.ReadLine();
valor=int.Parse(linea);
if (valor%3==0)
{
mul3=mul3+1;
}
if (valor%5==0)
{
mul5=mul5+1;
}
}
Console.Write("Cantidad de valores ingresados múltiplos de 3:");
Console.WriteLine(mul3);
Fuera de la estructura repetitiva imprimimos el contador cantidad que tiene almacenado la cantidad
de valores ingresados mayores o iguales a 1000.
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EstructuraRepetitivaFor5
{
class Program
{
static void Main(string[] args)
{
int cantidad,n,f,valor;
string linea;
cantidad=0;
Console.Write("Cuantos valores ingresará:");
linea = Console.ReadLine();
n=int.Parse(linea);
for(f=1;f<=n;f++)
{
Console.Write("Ingrese el valor:");
linea = Console.ReadLine();
valor = int.Parse(linea);
if (valor>=1000)
{
cantidad=cantidad+1;
}
}
Console.Write("La cantidad de valores ingresados mayores o iguales a 1000
son:");
Console.Write(cantidad);
Console.ReadKey();
}
}
}
Problemas propuestos
1. Confeccionar un programa que lea n pares de datos, cada par de datos corresponde a la
medida de la base y la altura de un triángulo. El programa deberá informar:
a) De cada triángulo la medida de su base, su altura y su superficie.
b) La cantidad de triángulos cuya superficie es mayor a 12.
2. Desarrollar un programa que solicite la carga de 10 números e imprima la suma de los últimos
5 valores ingresados.
3. Desarrollar un programa que muestre la tabla de multiplicar del 5 (del 5 al 50)
4. Confeccionar un programa que permita ingresar un valor del 1 al 10 y nos muestre la tabla
de multiplicar del mismo (los primeros 12 términos)
Ejemplo: Si ingreso 3 deberá aparecer en pantalla los valores 3, 6, 9, hasta el 36.
5. Realizar un programa que lea los lados de n triángulos, e informar:
a) De cada uno de ellos, qué tipo de triángulo es: equilátero (tres lados iguales), isósceles
(dos lados iguales), o escaleno (ningún lado igual)
b) Cantidad de triángulos de cada tipo.
c) Tipo de triángulo que posee menor cantidad.
6. Escribir un programa que pida ingresar coordenadas (x,y) que representan puntos en el
plano.
Informar cuántos puntos se han ingresado en el primer, segundo, tercer y cuarto cuadrante.
Al comenzar el programa se pide que se ingrese la cantidad de puntos a procesar.
7. Se realiza la carga de 10 valores enteros por teclado. Se desea conocer:
a) La cantidad de valores ingresados negativos.
b) La cantidad de valores ingresados positivos.
c) La cantidad de múltiplos de 15.
d) El valor acumulado de los números ingresados que son pares.
8. Se cuenta con la siguiente información:
Las edades de 50 estudiantes del turno mañana.
Las edades de 60 estudiantes del turno tarde.
Las edades de 110 estudiantes del turno noche.
Las edades de cada estudiante deben ingresarse por teclado.
a) Obtener el promedio de las edades de cada turno (tres promedios)
b) Imprimir dichos promedios (promedio de cada turno)
c) Mostrar por pantalla un mensaje que indique cual de los tres turnos tiene un promedio de
edades mayor.
No hay que confundir los rombos de las estructuras condicionales con los de las estructuras
repetitivas do while.
En este problema por lo menos se carga un valor. Si se carga un valor mayor o igual a 100 se trata de
un número de tres cifras, si es mayor o igual a 10 se trata de un valor de dos dígitos, en caso contrario
se trata de un valor de un dígito. Este bloque se repite hasta que se ingresa en la variable valor el
número 0 con lo que la condición de la estructura do while retorna falso y sale del bloque repetitivo
finalizando el programa.
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EstructuraRepetitivaDoWhile1
{
class Program
{
static void Main(string[] args)
{
int valor;
string linea;
do {
Console.Write("Ingrese un valor entre 0 y 999 (0 finaliza):");
linea = Console.ReadLine();
valor=int.Parse(linea);
if (valor>=100)
{
Console.WriteLine("Tiene 3 dígitos.");
}
else
{
if (valor>=10)
{
Console.WriteLine("Tiene 2 dígitos.");
}
else
{
Console.WriteLine("Tiene 1 dígito.");
}
}
} while (valor!=0);
}
}
}
Problema 2:
Escribir un programa que solicite la carga de números por teclado, obtener su promedio. Finalizar la
carga de valores cuando se cargue el valor 0.
Cuando la finalización depende de algún valor ingresado por el operador conviene el empleo de la
estructura do while, por lo menos se cargará un valor (en el caso más extremo se carga 0, que indica
la finalización de la carga de valores)
Diagrama de flujo:
namespace EstructuraRepetitivaDoWhile2
{
class Program
{
static void Main(string[] args)
{
int suma,cant,valor,promedio;
string linea;
suma=0;
cant=0;
do {
Console.Write("Ingrese un valor (0 para finalizar):");
linea = Console.ReadLine();
valor=int.Parse(linea);
if (valor!=0) {
suma=suma+valor;
cant++;
}
} while (valor!=0);
if (cant!=0) {
promedio=suma/cant;
Console.Write("El promedio de los valores ingresados es:");
Console.Write(promedio);
} else {
Console.Write("No se ingresaron valores.");
}
Console.ReadLine();
}
}
}
El contador cant DEBE inicializarse antes del ciclo, lo mismo que el acumulador suma. El promedio
se calcula siempre y cuando el contador cant sea distinto a 0.
Problema 3:
Realizar un programa que permita ingresar el peso (en kilogramos) de piezas. El proceso termina
cuando ingresamos el valor 0. Se debe informar:
a) Cuántas piezas tienen un peso entre 9.8 Kg. y 10.2 Kg.?, cuántas con más de 10.2 Kg.? y
cuántas con menos de 9.8 Kg.?
b) La cantidad total de piezas procesadas.
Diagrama de flujo:
Los tres contadores cont1, cont2, y cont3 se inicializan en 0 antes de entrar a la estructura repetitiva.
A la variable suma no se la inicializa en 0 porque no es un acumulador, sino que guarda la suma del
contenido de las variables cont1, cont2 y cont3.
La estructura se repite hasta que se ingresa el valor 0 en la variable peso. Este valor no se lo considera
un peso menor a 9.8 Kg., sino que indica que ha finalizado la carga de valores por teclado.
Programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EstructuraRepetitivaDoWhile3
{
class Program
{
static void Main(string[] args)
{
int cant1,cant2,cant3,suma;
float peso;
string linea;
cant1=0;
cant2=0;
cant3=0;
do {
Console.Write("Ingrese el peso de la pieza (0 pera finalizar):");
linea = Console.ReadLine();
peso=float.Parse(linea);
if (peso>10.2)
{
cant1++;
}
else
{
if (peso>=9.8)
{
cant2++;
}
else
{
if (peso>0)
{
cant3++;
}
}
}
} while(peso!=0);
suma=cant1+cant2+cant3;
Console.Write("Piezas aptas:");
Console.WriteLine(cant2);
Console.Write("Piezas con un peso superior a 10.2:");
Console.WriteLine(cant1);
Console.Write("Piezas con un peso inferior a 9.8:");
Console.WriteLine(cant3);
Console.ReadLine();
}
}
}
Problemas propuestos
1. Realizar un programa que acumule (sume) valores ingresados por teclado hasta ingresar el
9999 (no sumar dicho valor, indica que ha finalizado la carga). Imprimir el valor acumulado e
informar si dicho valor es cero, mayor a cero o menor a cero.
2. En un banco se procesan datos de las cuentas corrientes de sus clientes. De cada cuenta
corriente se conoce: número de cuenta y saldo actual. El ingreso de datos debe finalizar al
ingresar un valor negativo en el número de cuenta.
3. Se pide confeccionar un programa que lea los datos de las cuentas corrientes e informe:
a) De cada cuenta: número de cuenta y estado de la cuenta según su saldo, sabiendo que:
Estado de la cuenta 'Acreedor' si el saldo es >0.
'Deudor' si el saldo es <0.
'Nulo' si el saldo es =0.
b) La suma total de los saldos acreedores.