27 mayo, 2021

Sexta Evaluación Java Avanzado

¡Buen día, coders! El día de hoy vamos a resolver una examen que nos envió un seguidor de la página. Es un examen final que trata sobre Manejo de Archivos de textos, Clases y Arreglo de Objetos. Les dejaré la solución a este examen y cualquier duda que tengan en la sección de comentarios.


PROBLEMA

Cree un programa que permita registrar cuentas y realizar movimientos bancarios (consulta de movimientos, realizar depósito y retiro). Para la creación de la cuenta se deberá ingresar el código o número de DNI, el apellido y el nombre. El usuario debe poder realizar depósitos y retiros. Para ello, se le pedirá antes su número de cuenta y posteriormente el monto si fuese a depositar o retirar. El usuario también debe poder consultar todos sus movimientos. Guarde la información en dos archivos. cuentas.txt y movimientos.txt.

Se muestra un ejemplo de cómo podría ser el programa.

Cuentas.txt

Movimiento.txt






SOLUCIÓN

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;

import javax.swing.JOptionPane;

public class Practica {
	public static void main(String[] args) {
		ArregloMovimientos a = new ArregloMovimientos();
		ArregloCuentas ac = new ArregloCuentas();
		do {
			String principal = JOptionPane.showInputDialog(
								"BIENVENIDO AL SISTEMA " +
								"\nOperacion a realizar." +
								"\n(M) Movimientos" +
								"\n(C) Creacion de cuentas");
			// MENÚ MOVIMIENTOS
			if (principal.equalsIgnoreCase("M")) {
				int inicial = 0, saldo = inicial, monto = 0;
				// Leemos la cuenta
				String codigo = JOptionPane.showInputDialog("Ingresar cuenta"); 
				Cuenta cuenta = ac.buscar(codigo); // Obtenemos la cuenta
				if (cuenta != null) { // Si la cuenta existe
                                        // Obtenemos los movimientos de la cuenta
					List<Movimiento> lista = a.buscar(codigo); 
					StringBuilder sb = new StringBuilder();
					if (lista.size() > 0) { // Si la cuenta tiene movimientos
			            for (int i = 0; i < lista.size(); i++) { // Recorremos la lista
			                Movimiento e = a.obtener(i); // Obtenemos el movimiento
			                // Almacenamos los movimientos en un Builder
	                		sb.append(e.getCodigo() + " | " 
			                + new SimpleDateFormat("dd/MM/yyyy")
			                .format(e.getFecha())  + " | " + (e.getOperacion().equals("d") ? 
			                "Depósito" : "Retiro") + " | " +  e.getMonto() + "\n");
	                		// Sacamos el sado
	                		if(e.getOperacion().equals("d"))
	                			saldo += e.getMonto();
	                		else 
	                			saldo -= e.getMonto();
			            }
			        } else
			        	// Cuenta sin movimientos
			        	sb.append("Ud., aún no tiene movimientos");
				         String opcion = JOptionPane.showInputDialog("Bienvenido Sr.: " + 
                        cuenta.getApellidos() + "\nSu saldo es de: $ " + saldo +
                         "\nOperacion a realizar."  + "\n(I) Informacion" 
                         + "\n(D) Deposito" + "\n(R) Retiro");

					// SUBMENÚ INFORMACIÓN
			       if (opcion.equalsIgnoreCase("I")) {
		                   // Mostramos los movimientos de la cuenta en pantalla
		                   JOptionPane.showMessageDialog(null, 
		            		"MOVIMIENTOS  \n" +
		            		"Codigo \t Fecha \t Operación \t Monto \n" + sb +
		            		"Saldo actual: " + saldo);
			       } else if (opcion.equalsIgnoreCase("D") || 
			    		  opcion.equalsIgnoreCase("R")) {
			    	   
			    	   // SUBMENU DEPÓSITO
			    	   if (opcion.equalsIgnoreCase("D")) {
			    		   while (true) {
			    			   try {
			    				   monto = Integer.parseInt(JOptionPane
										.showInputDialog("Ingresar monto: "));
			    				   break; // Si todo es correcto, termino el bucle
			    			   } catch (NumberFormatException e) {
									JOptionPane.showMessageDialog(null, 
											"Debe ingresar un monto valido: " 
								    + e.getMessage());
								} catch (Exception e) {
									JOptionPane.showMessageDialog(null, 
											"Error: " + e.getMessage());
								}
			    		   }
		    		   }
			    	   
			    	   // SUBMENU RETIRO
			    	   if (opcion.equalsIgnoreCase("R")) {
							while (true) {
								try {
									monto = Integer.parseInt(JOptionPane
											.showInputDialog("Ingresar monto: "));
									if (monto <= saldo)
										break;
									else
										JOptionPane.showMessageDialog(null, 
												"Saldo insuficiente");
								} catch (NumberFormatException e) {
									JOptionPane.showMessageDialog(null,
											"---> Debe ingresar un monto valido: " 
													+ e.getMessage());
								} catch (Exception e) {
									JOptionPane.showMessageDialog(null, 
											"---> Error: " + e.getMessage());
								}
							}
			    	   }
			    	   Movimiento mov = new Movimiento(codigo, new Date(), 
                                 opcion, monto);
			    	   a.adicionar(mov); // Agregamaos el movimiento a la lista
			    	   a.grabar(); // Guardamos el movimiento en la bd 
			    	   JOptionPane.showMessageDialog(null, 
			    			   "Operación realizada con éxito"); // Mensaje de exito
				} else
				     JOptionPane.showConfirmDialog(null, "Error, "
				     		+ "seleccione entre I, D y R.");
				} else 
					JOptionPane.showMessageDialog(null, 
							"La cuenta no existe, ¡debe crearla!"); // La cuenta no existe
		    // MENÚ CREACIÓN DE CUENTAS
			} else if (principal.equalsIgnoreCase("C")) {
				String codigo   = JOptionPane.showInputDialog(
                          "Ingresar codigo o DNI"); // Leemos la cuenta
				Cuenta cuenta = ac.buscar(codigo); // Buscamos la cuenta
				if (cuenta == null) { // Si la cuenta no existe
					String apellido = JOptionPane.showInputDialog("Ingresar Apellido");
					String nombre   = JOptionPane.showInputDialog("Ingresar Nombre");
					Cuenta c = new Cuenta(codigo, apellido, nombre); // Creamos la cuenta
					ac.adicionar(c); // Agregamos la cuenta a la lista
					ac.grabar(); // Grabamos la cuenta en la bd
				} else {
					JOptionPane.showMessageDialog(null, "La cuenta '" +
                       codigo + "' ya existe, ingrese otra");
				}
			} else
				JOptionPane.showMessageDialog(null, 
						"Error, seleccione entre M, C.");
		} while (JOptionPane.showConfirmDialog(null, 
				"¿Desea realizar otra operación?") == 0);
	}
}


// Clases Bases
class Cuenta {
	private String codigo;
	private String apellidos;
	private String nombres;
	
	public Cuenta(String codigo, String apellidos, 
			String nombres) {
		this.codigo = codigo;
		this.apellidos = apellidos;
		this.nombres = nombres;
	}

	public String getCodigo() {
		return codigo;
	}

	public String getApellidos() {
		return apellidos;
	}

	public String getNombres() {
		return nombres;
	}
}

class Movimiento {
	private String codigo;
	private Date fecha;
	private String operacion;
	private double monto;
	
	public Movimiento(String codigo, Date fecha, 
			String operacion, double monto) {
		this.codigo = codigo;
		this.fecha = fecha;
		this.operacion = operacion;
		this.monto = monto;
	}

	public String getCodigo() {
		return codigo;
	}

	public Date getFecha() {
		return fecha;
	}

	public String getOperacion() {
		return operacion;
	}

	public double getMonto() {
		return monto;
	}
}

// Clases Arreglos
class ArregloCuentas {
	private List<Cuenta> lista;
	
	public ArregloCuentas() {
		lista = new ArrayList<>();
		cargar();
	}
	
	public void adicionar(Cuenta x) {
		lista.add(x);
    }
	
	public Cuenta buscar(String codigo) {
        for (int i = 0; i < lista.size(); i++)
            if (codigo.equalsIgnoreCase(lista.get(i).getCodigo()))
                return lista.get(i);
        return null;
    }
	
	public void cargar() {
		try {
			File file = new File("cuentas.txt");
			if (file.exists()) {
				BufferedReader br = new BufferedReader(new FileReader(file));
				String linea;
				while ((linea = br.readLine()) != null) {
					StringTokenizer st = new StringTokenizer(linea, ",");
					String cod = st.nextToken();
					String ape = st.nextToken();
					String nom = st.nextToken();
					Cuenta c = new Cuenta(cod, ape, nom);
					lista.add(c);
				}
				br.close();
	   } else {
	        	JOptionPane.showMessageDialog(null,
                        "El archivo '" + file.getName() + "' no existe");
	   }
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void grabar() {
		try {
			File file = new File("cuentas.txt");
			PrintWriter pw = new PrintWriter(new FileWriter(file));
			for (int i = 0; i < lista.size(); i++) {
				pw.println(lista.get(i).getCodigo()    + "," + 
						   lista.get(i).getApellidos() + "," + 
						   lista.get(i).getNombres());
			}	
			pw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}	
}

class ArregloMovimientos {
	private List<Movimiento> lista;
	private List<Movimiento> lista2;
	
	public ArregloMovimientos() {
		lista = new ArrayList<>();
		cargar();
	}
	
	public List<Movimiento> buscar(String codigo) {
		lista2 = new ArrayList<>();
		for (int i = 0; i < lista.size(); i++)
			if (codigo.equalsIgnoreCase(lista.get(i).getCodigo()))
				lista2.add(lista.get(i));
		return lista2;
	}
	
	public Movimiento obtener(int pos) {
		return lista2.get(pos);
	}
	
	public int tamaño() {
		return lista.size();
	}
	
	public void adicionar(Movimiento x) {
		lista.add(x);
    }
	
	public void cargar() {
		try {
			File file = new File("movimientos.txt");
			if (file.exists()) {
				BufferedReader br = new BufferedReader(new FileReader(file));
				String linea;
				while ((linea = br.readLine()) != null) {
					StringTokenizer st = new StringTokenizer(linea, ",");
					String cod = st.nextToken();
					Date fecha = new SimpleDateFormat("dd/MM/yyyy")
							.parse(st.nextToken());
					Date   fec = fecha;
					String ope = st.nextToken();
					double mon = Double.parseDouble(st.nextToken());
					Movimiento m = new Movimiento(cod, fec, ope, mon);
					lista.add(m);
				}
				br.close();
	        } else {
	        	JOptionPane.showMessageDialog(null,
                        "El archivo '" + file.getName() + "' no existe");
	        }
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

	public void grabar() {
		try {
			File file = new File("movimientos.txt");
			PrintWriter pw = new PrintWriter(new FileWriter(file));
			for (int i = 0; i < lista.size(); i++) {
				pw.println(lista.get(i).getCodigo()    + "," +
						   new SimpleDateFormat("dd/MM/yyyy")
						   .format(lista.get(i).getFecha()) + "," +
						   lista.get(i).getOperacion() + "," +
						   lista.get(i).getMonto());
			}
			pw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

DESARROLLO TUS ALGORITMOS 🔥🔥


✅ 1. Envía tu algoritmo.
✅ 2. Indica en qué lenguaje de Programación lo deseas.
✅ 3. Para qué fecha lo quieres.
✅ 4. De que país eres (para tu forma de pago)
✅ 5. También se desarrollan al momento.
✅ 6. Los 3 primeros ejercicios son gratis.
🔸 Explico cada ejercicio que desarrollo en el código.

No hay comentarios, ¡cuéntame algo!

Me gustaría saber tu opinión. ¡Saludos!