using System;
using System.IO;
using System.Text;
namespace ConsoleApplication1
{
//Curso
class Curso
{
string sigla, descripcion;
int creditos;
public Curso(string s, string d, int c)
{
sigla = s.ToUpper(); descripcion = d.ToUpper(); creditos = c;
}
public string Sigla
{
get
{
return (sigla);
}
}
public string Descropcion
{
get
{
return (descripcion);
}
}
public int Creditos
{
get
{
return (creditos);
}
}
}
}
class ListaCursos
{
Curso[] cursos; //Almacena la lista de cursos
int cantidad = 0;
const int MAX = 20; //Limitacion: 20 cursos maximo
string archivo = "C:\\Archivos\\cursos.dat";
//Constructor: dimensiona la lista de alumnos en MAX
public ListaCursos()
{
cursos = new Curso[MAX]; //Limitacion: 20 cursos maximo
}
//Constructor: dimensiona la lista de cursos en MAX y carga
//los datos de archivo identificado por su nombre
public ListaCursos(string Filename)
{
StreamReader fr;
cursos = new Curso[MAX];
archivo = Filename;
try
{
fr = new StreamReader(archivo);
}
catch (Exception e)
{
//No se pudo abrir: se crea
StreamWriter sw = new StreamWriter(archivo);
sw.Close();
return;
}
string linea;
linea = fr.ReadLine();
while (linea != null)
{
string[] datos = linea.Split();
//Formato del archivo tiene: creditos sigla descripcion
Agregar(datos[1].ToUpper(), datos[2].ToUpper(), int.Parse(datos[0]));
linea = fr.ReadLine();
}
fr.Close();
}
//Guardar(): guarda datos en estructura al archivo identificado por su nombre
public bool Guardar()
{
StreamWriter fw;
try
{
fw = new StreamWriter(archivo);
}
catch (Exception e)
{
Console.WriteLine("Error en la apertura de \"{0}\": {1}", archivo, e.ToString());
return (false);
}
for (int i = 0; i < cantidad; i++)
fw.WriteLine("{0} {1} {2}", cursos[i].Creditos, cursos[i].Sigla, cursos[i].Descropcion);
fw.Close();
return (true);
}
//Agregar(): agrega un curso dado a la lista
//Prametros: Curso, c, el curso a agregar
public void Agregar(Curso c)
{
if (cantidad < MAX) cursos[cantidad++] = c;
}
//Agregar(): agrega un curso dados sus datos, a ña ñista
//Parametros: la sigla, la descripcion y los creditos
public void Agregar(string s, string d, int c)
{
if (cantidad < MAX)
{
cursos[cantidad++] = new Curso(s, d, c);
}
}
//Atributo Cantidad, solo lectura, no se puede modificar por fuera
public int Cantidad
{
get
{
return (cantidad);
}
}
//Mostrar(): muestra los datos registrados al momento
public void Mostrar()
{
Console.WriteLine("\nCURSOS:");
for (int i = 0; i < cantidad; i++)
Console.WriteLine("{0} {1} {2}", cursos[i].Creditos, cursos[i].Sigla, cursos[i].Descropcion);
Console.WriteLine("------------------------------------------------------------------------\n");
}
//Buscar(): Busca curso definido por sigla. Retorna la posicion, -1 si no esta.
public int Buscar(string sigla)
{
for (int i = 0; i < cantidad; i++)
if (cursos[i].Sigla == sigla.ToUpper())
return (i);
return (-1); //Si llego aqui, no lo encontro
}
//GetCurso(): Entrega curso ubicado en la posicion n del arreglo, con n de 0.. N-1
public Curso GetCursos(int n)
{
return (cursos[n]);
}
}
}
//Clase Alumno: representa un alumno con sus atributos basicos
class Alumno
{
string nombre, apellido;
string fechanac;
int numero;
public Alumno(int num, string n, string a, string f)
{
numero = num; nombre = n.ToUpper(); apellido = a.ToUpper(); fechanac = f;
}
public string Nombre
{
get
{
return (nombre);
}
}
public string Apellido
{
get
{
return (apellido);
}
}
public string FechaNac
{
get
{
return (fechanac);
}
}
public int Numero
{
get
{
return (numero);
}
}
}
}
//Clase ListaAlumnos: representa un conjunto de alumnos
class ListaAlumnos
{
Alumno[] alumnos; //Almacena la lista de alumnos
int cantidad = 0;
const int MAX = 20; //Limitacion: 20 alumnos maximo
string archivo = "C:\\Archivos\\alumnos.dat";
//Constructor: dimensiona la lista de alumnos en MAX
public ListaAlumnos()
{
alumnos = new Alumno[MAX];
}//Limitacion: 20 alumnos maximo
//Constructor: dimensiona la lista de alumnos en MAX
public ListaAlumnos(string Filename)
{
StreamReader fr;
alumnos = new Alumno[MAX];
archivo = Filename;
try
{
fr = new StreamReader(archivo);
}
catch (Exception e)
{
//No se pudo abrir, se crea
StreamWriter sw = new StreamWriter(archivo);
sw.Close();
return;
}
string linea;
linea = fr.ReadLine();
while (linea != null)
{
string[] datos = linea.Split();
//Formato del archivo tiene: num fecha nombre apellido
Agregar(int.Parse(datos[10]), datos[2], datos[3], datos[1]);
linea = fr.ReadLine();
}
fr.Close();
}
//Guardar():Guarda datos en la estructura al archivo identificado por su nombre
public bool Guardar()
{
StreamWriter fw;
try
{
fw = new StreamWriter(archivo);
}
catch (Exception e)
{
Console.WriteLine("Error en la apertura de \"{0}\": {1}", archivo, e.ToString());
return(false);
}
for(int i = 0; i < cantidad; i++)
fw.WriteLine("{0} {1} {2} {3}",alumnos[i].Numero, alumnos[i].FechaNac, alumnos[i].Nombre, alumnos[i].Apellido);
fw.Close();
return(true);
}
//Agregar(): agrega un alumno dado a la lista
//Parametros: Alumno a, el alumno a agregar
public void Agregar(Alumno a)
{
if(cantidad < MAX) alumnos[cantidad++] = a;
}
//Agregar(): agrega un alumno dados sus datos, a la lista
//Parametros: el numero, nombre, apellido, y fecha nacimiento
public void Agregar(int num, string n, string a, string f)
{
if(cantidad < MAX)
{
alumnos[cantidad++] = new Alumno(num, n, a, f);
}
}
//Atributo Cantidad, solo lectura, no se puede modificar por fuera
public int Cantidad
{
get
{
return(cantidad);
}
}
//Mostrar(): muestra los datos registrados al momento
public void Mostrar()
{
Console.WriteLine("\nALUMNOS:");
for(int i = 0; i < cantidad; i++)
Console.WriteLine("{0} {1} {2} {3}", alumnos[i].Numero, alumnos[i].FechaNac, alumnos[i].Nombre, alumnos[i].Apellido);
Console.WriteLine("--------------------------------------------------------------------------------------------------------");
}
//Buscar(): Busca alumnos definido por numero, retorna posicion -1 si no esta
public int Buscar(int numero)
{
for(int i = 0; i < cantidad; i++)
if(alumnos[i].Numero == numero)
return(i);
return(-1); //Si llego aqui no lo encontro
}
//GetAlumno(): Entrega alumno ubicado en posicion n del arreglo, con n de 0.. N-1
public Alumno GetAlumno(int n)
{
return(alumnos[n]);
}
}
}
//Clase ListaInscripciones: representa un conjunto de inscripciones
class ListaInscripciones
{
Inscripcion[] inscripciones; //Almacena la lista de inscripciones
int cantidad = 0;
const int MAX = 60; //Limitacion: 60 inscripciones maximo
string archivo = "C:\\Archivos\\inscripciones.dat";
//Constructor: dimensiona la lista de inscripciones en MAX
public ListaInscripciones()
{
inscripciones = new Inscripcion[MAX];
}
//Constructor: dimensiona la lista de inscripciones en MAX
//y carga los datos de archivo identificado por su nombre
public ListaInscripciones(string Filename)
{
StreamReader fr;
inscripciones = new Inscripcion[MAX];
archivo = Filename;
try
{
fr = new StreamReader(archivo);
}
catch (Exception e)
{
//No se pudo abrir, se crea
StreamWriter sw = new StreamWriter(archivo);
sw.Close();
return;
}
string linea;
linea = fr.ReadLine();
while (linea != null)
{
string[] datos = linea.Split();
//Formato del archivo tiene: sigla numero semestre
Agregar(datos[0].ToUpper(), int.Parse(datos[1]), int.Parse(datos[2]));
linea = fr.ReadLine();
}
fr.Close();
}
//Guardar(): guarda datos en la estructura al archivo identificado por su nombre
public bool Guardar()
{
StreamWriter fw;
try
{
fw = new StreamWriter(archivo);
}
catch (Exception e)
{
Console.WriteLine("Error en la apertura de \"{0}\": {1}", archivo, e.ToString());
return (false);
}
for (int i = 0; i < cantidad; i++)
fw.WriteLine("{0} {1} {2}", inscripciones[i].Sigla, inscripciones[i].Numero, inscripciones[i].Semestre);
fw.Close();
return (true);
}
//Agregar(): agregar una inscripcion dada a la lista
//Parametros: Inscripcion i, el curso a agregar
public void Agregar(Inscripcion i)
{
if (cantidad < MAX) inscripciones[cantidad++] = i;
}
//Agregar(): agrega un curso dados sus dtos, a la lista
//Parametros: la sigla, la descripcion, y los creditos
public void Agregar(string s, int n, int m)
{
if (cantidad < MAX)
{
inscripciones[cantidad++] = new Inscripcion(s, n, m);
}
}
//Atributo Cantidad, solo lectura, no se puede modificar por fuera
public int Cantidad
{
get
{
return (cantidad);
}
}
//Mostrar(): muestra los datos registrados al momento
public void Mostrar(ListaAlumnos la, ListaCursos lc)
{
Console.WriteLine("\nINSCRIPCIONES:");
for (int i = 0; i < MAX; i++)
{
Alumno a; Curso c;
a = la.GetAlumno(la.Buscar(inscripciones[i].Numero));
c = lc.GetCursos(lc.Buscar(inscripciones[i].Sigla));
Console.WriteLine("{0} ({1}) - {2} ({3} {4}) en {5}", c.Sigla, c.Descropcion, a.Numero, a.Nombre, a.Apellido, inscripciones[i].Semestre);
}
Console.WriteLine("-----------------------------------------------------------------------------------------------------------------------------");
}
}
}
//Clase MainApp: bloqu del algoritmo principal y metodos auxiliares
class MainApp
{
//ValidarFecha(): valida una fecha en formato ddmmaaaa
static bool ValidarFecha(string fecha)
{
string digitos = "0123456789";
if (fecha.Length != 8) return (false);
for (int i = 0; i < fecha.Length; i++)
if (digitos.IndexOf(fecha[i]) < 0) return (false);
if (int.Parse(fecha.Substring(0, 2)) > 31) return (false);
if (int.Parse(fecha.Substring(0, 2)) == 0) return (false);
if (int.Parse(fecha.Substring(2, 2)) > 12) return (false);
if (int.Parse(fecha.Substring(2, 2)) == 0) return (false);
return (true);
}
static Alumno NuevoAlumno()
{
string nombre, apellido, fechanac;
int numero;
Console.WriteLine("Datos del nuevo alumno");
Console.Write("Nombre:"); nombre = Console.ReadLine();
Console.Write("Apellido:"); apellido = Console.ReadLine();
do
{
Console.Write("Fecha Nac (ddmmaaaa): ");
fechanac = Console.ReadLine();
}
while (!ValidarFecha(fechanac));
Console.Write("Numero: "); numero = int.Parse(Console.ReadLine());
return (new Alumno(numero, nombre, apellido, fechanac));
}
static Curso NuevoCurso()
{
string sigla, descripcion;
int creditos;
Console.WriteLine("Datos del nuevo curso");
Console.Write("Sigla: "); sigla = Console.ReadLine();
Console.Write("Descripcion: "); descripcion = Console.ReadLine();
Console.Write("Creditos: "); creditos = int.Parse(Console.ReadLine());
return (new Curso(sigla, descripcion, creditos));
}
//NuevaInscripcion(): crea una nueva inscripcion relacionando un alumno existente
//con un curso que tambien debe ser existente
//Observaciones: se le pide al usuario solo el numero del alumno y la sigla del curso
//validando que ambis existan
static Inscripcion NuevaInscripcion(ListaAlumnos la, ListaCursos lc)
{
string sigla;
int numero, semestre;
Alumno a; Curso c;
//Muestra la lista en pantalla para ayudar al usuario a indicar datos
la.Mostrar(); lc.Mostrar();
Console.WriteLine("Inscripcion de Curso:");
do
{
Console.Write("Numero del Alumno: ");
numero = int.Parse(Console.ReadLine());
}
while (la.Buscar(numero) < 0);
do
{
Console.Write("Sigla Curso: ");
sigla = Console.ReadLine();
}
while (lc.Buscar(sigla) < 0);
Console.Write("Semestre: "); semestre = int.Parse(Console.ReadLine());
a = la.GetAlumno(la.Buscar(numero)); c = lc.GetCursos(lc.Buscar(sigla));
Console.WriteLine("El alumno {0} {1} se inscribio en el curso {2} ({3})", a.Nombre, a.Apellido, c.Sigla, c.Descropcion);
return (new Inscripcion(sigla, numero, semestre));
}
static int Menu(string[] opciones)
{
int contador = 1, op = 0;
foreach (string opcion in opciones)
Console.WriteLine("{0}) {1}", contador++, opcion);
Console.Write("Ingrese su opcion: ");
do
op = int.Parse(Console.ReadLine());
while (op <= 0 && op >= contador);
return (op);
}
static void Main ()
{
string[] opciones = { "Agregar Alumno", "Agregar Curso", "Inscribir en Curso", "Mostrar Alumnos", "Mostrar Cursos", "Mostrar Inscripciones", "Salir" };
int opcion = 0;
const string archivocursos = "C:\\Archivos\\cursos.dat";
const string archivoalumnos = "C:\\Archivos\\alumnos.dat";
const string archivoinscripciones = "C:\\Archivos\\inscripciones.dat";
ListaCursos lc = new ListaCursos(archivocursos);
ListaAlumnos la = new ListaAlumnos(archivoalumnos);
ListaInscripciones li = new ListaInscripciones(archivoinscripciones);
do
{
opcion = Menu(opciones);
switch (opcion)
{
case 1: la.Agregar(NuevoAlumno()); break;
case 2: lc.Agregar(NuevoCurso()); break;
case 3: li.Agregar(NuevaInscripcion(la,lc)); break;
case 4: la.Mostrar(); break;
case 5: lc.Mostrar(); break;
case 6: li.Mostrar(la, lc); break;
}
}
while (opcion != 7);
lc.Guardar();
la.Guardar();
li.Guardar();
}
}
}

