Sesión 3.0
Todo lo visto en PSInt, ahora “bien escrito” en C#
Meta: traducir conceptos, no memorizar sintaxis
Herramienta: consola + pruebas por casos
Salida: 1 programa corto + 3 casos (incluye bordes)
Navegación: ← → · Pantalla completa: F
Objetivos (universitario)
- Escribir la estructura mínima de un programa de consola en C#.
- Declarar variables con tipos correctos (int, decimal, bool, string).
- Leer, convertir y validar entrada por consola (Parse/TryParse).
- Implementar reglas con if/else y switch sin ambigüedad.
C# es estricto con tipos: eso te obliga a pensar mejor el modelo.
Mapa mental: PSInt → C#
PSInt C#
---------------------------------------------------------
Proceso / FinProceso static void Main(...) { ... }
Escribir Console.WriteLine(...)
Leer x var s = Console.ReadLine()
x = int.Parse(s) / TryParse
Entero / Real / Cadena int / double|decimal / string
Si / Sino / FinSi if / else
Segun / FinSegun switch
Y / O / No && / || / !
La lógica es la misma; cambia el “cómo se escribe”.
Cómo inicia un programa (plantilla mínima)
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hola, mundo");
}
}
Tu programa vive dentro de Main. Primero lo hacemos simple, luego lo organizamos.
Tipos de datos (lo que debes dominar ya)
Numéricos
int edad = 20; // enteros
decimal precio = 12500m; // dinero (más seguro)
double x = 3.14; // cálculo científico
Tip: dinero → decimal (usa sufijo m).
Texto y lógico
string ciudad = "Cali";
bool esValido = true;
bool solo puede ser true/false.
Entrada por consola (sin fallar)
Versión directa (Parse)
Console.Write("Edad: ");
int edad = int.Parse(Console.ReadLine()!);
Si el usuario escribe texto, esto puede fallar.
Versión robusta (TryParse)
Console.Write("Edad: ");
string s = Console.ReadLine() ?? "";
bool ok = int.TryParse(s, out int edad);
if (!ok)
{
Console.WriteLine("Entrada inválida.");
return;
}
Universitario: valida entrada o define precondición explícita.
Operadores (repaso rápido)
Aritméticos
+ - * /
Comparación
== != > >= < <=
Lógicos
&& (AND)
|| (OR)
! (NOT)
Si mezclas AND/OR, usa paréntesis.
Condicionales (if / else)
if (edad >= 18)
{
Console.WriteLine("Mayor de edad");
}
else
{
Console.WriteLine("Menor de edad");
}
No hay “FinSi”: en C# mandan las llaves { }.
Selección por categorías (switch)
Console.Write("Tipo (1=Moto, 2=Carro, 3=Camión): ");
int tipo = int.Parse(Console.ReadLine()!);
decimal baseTarifa = tipo switch
{
1 => 6000m,
2 => 12000m,
3 => 20000m,
_ => throw new Exception("Tipo inválido")
};
switch ayuda cuando la regla es “según categoría”.
Ejemplo completo (IVA + descuento)
El mismo ejemplo de PSInt, ahora en C# con decimal.
Console.Write("Precio base: ");
decimal precioBase = decimal.Parse(Console.ReadLine()!);
Console.Write("IVA (%): ");
decimal ivaPct = decimal.Parse(Console.ReadLine()!);
Console.Write("Descuento (%): ");
decimal descPct = decimal.Parse(Console.ReadLine()!);
decimal ivaVal = precioBase * (ivaPct / 100m);
decimal subtotal = precioBase + ivaVal;
decimal descVal = subtotal * (descPct / 100m);
decimal total = subtotal - descVal;
Console.WriteLine($"Total: {total}");
Prueba mínima: descPct=0 debe dejar total=subtotal.
Prueba por casos (lo que exijo)
- 1 caso normal (valores típicos).
- 1 caso borde (0, umbral exacto, etc.).
- 1 caso “sanity” (¿el resultado tiene sentido?).
Sin pruebas por casos, no hay evidencia de corrección.
Actividad (obligatoria)
Taller en clase: reescribe tu solución de “compra con envío” en C#.
- Entradas: subtotal (decimal), ciudad (string), tieneCupon (S/N).
- Reglas: cupón y envío gratis por umbral (prioridad).
- Salida: total.
- Entrega: .cs o captura del código + 3 casos de prueba documentados.
- Enfócate en: tipos + if/else + claridad de reglas.
Reto (opcional, sin nota)
Modo robusto: reemplaza Parse por TryParse y maneja entrada inválida sin romper el programa.
Si lo haces, obtienes retroalimentación extra (no calificación).
Esto prepara tu proyecto: entrada real casi siempre trae errores.
Ticket de salida (5 min)
- ¿Qué tipo usaste para dinero y por qué?
- Escribe 1 borde que probaste (con valores).
- ¿Qué regla de prioridad implementaste en tu if/else?
Objetivo: pasar de pseudocódigo a C# sin perder el modelo.