Dev - C++ - cuentas contables

 
Vista:

cuentas contables

Publicado por Ayuda a desarrollar este programa de cuentas contales (1 intervención) el 11/12/2021 03:52:49
Crear programa en C++ que permita registrar un catálogo de cuentas contables, dicho programa deberá
permitir:
1. Adicionar
2. Modificar
3. Listar
4. Consulta
Cuentas contables, las mismas se deberán registrar en un archivo binario, la estructura que representa
una cuenta contable es como sigue:
Estructura Cuenta
Cta_codigo char[20]
Cta_nombre cahr[80]
Cta_origen unsigned short int ( 1-Debito, 2-Credito)
Cta_es_control char (S-Si, N-No)
Cta_permite_saldo_negativo char (S-Si, N-No)
Cta_padre_codigo char[20]
Cta_saldo double
Requisitos que debe cumplir antes de registrar o modificar una cuenta.
1) El campo código solo puede estar compuesto de dígitos [0..9] y el carácter punto[.], el
carácter punto nunca debe estar al inicio ni al final, tampoco se permite más de un carácter
punto consecutivo.
Ejemplo
Cta_codigo correcta: 1.1.1.112 incorrecta: .1..1111
2) El dominio de valore del campo cta_origen es: [1, 2] donde 1->Debito, 2->crédito.
3) El campo cta_es_control solo admite un carácter S o N, donde S-Es cuenta Control, N-No es
cuenta control.
4) El campo Cta_permite_saldo_negativo solo admite un carácter S o N, donde S-Si, N-No
5) El campo Cta_padre_cogido puede admitir valores nulos, pero si coloca un valor diferente
de nulo entonces el programa debe verificar que exista una cuenta activa previamente
registrada y dicha cuenta debe ser tipo control.
6) El campo Cta_permite_saldo_negativo solo admite un carácter S o N, donde S-Si, N-No
7) El campo cta_saldo solo admite valores negativos si el valor del campo
Cta_permite_saldo_negativo es igual a S.


Formato Pantalla para la
Adicionar Cuenta
---------------------------------
Cuenta: 1.1.2.3
Nombre: Cuenta ahorro banco XXXX
Origen (1-Debito, 2-Credito) : 1
Es Cuenta Control: S
Permite Saldo negativo: N
Cuenta Padre: 1.1.2
Saldo: 0 ( Si esta adicionando una cuenta el valor del saldo es cero y no debe ser introducido )
Modificar
Cuenta: 1.1.2.3
Luego de pulsar enter debe verificar si la cuenta introducida esta registrada,
Si NO está registrada el programa mostrara el mensaje:
“Cuenta no registrada”, la operación de modificar filiara.
Si la cuenta se encuentra registrada el programa desplegara los datos de la cuenta y luego procede a
aceptar los nuevos valores
Datos Actuales:
----------------------
Nombre: Cuenta ahorro banco XXXX
Origen (1-Debito, 2-Credito) : 1
Es Cuenta Control: S
Permite Saldo negativo: N
Cuenta Padre: 1.1.2
Saldo: 0

Nuevos Datos
Nombre: Cuenta ahorro banco XXXX
Origen (1-Debito, 2-Credito) : 1
Es Cuenta Control: S
Permite Saldo negativo: N
Cuenta Padre: 1.1.2
Saldo: 0 ( Si esta adicionando una cuenta el valor del saldo es cero y no debe ser introducido )
Luego de introducir los datos el sistema debe actualizar el registro con los datos nuevos.
Listar
Relación de Cuetantas
Codigo nombre saldo
------------------------------------------------------
X XXXXXXXX 99999999999
X.X XXXXXXXX 99999999999
X.X.X XXXXXXXX 99999999999
X.X.X.XX XXXXXXXX 99999999999
---------------------------------------

Consulta por código
Cuenta: 1.1.2.3
Luego de pulsar enter debe verificar si la cuenta introducida está registrada,
Si NO está registrada el programa mostrara el mensaje:
“Cuenta no registrada”, la operación de modificar filiara.
Si la cuenta se encuentra registrada el programa desplegara los datos de la cuenta
Datos Actuales:
----------------------
Nombre: Cuenta ahorro banco XXXX
Origen (1-Debito, 2-Credito) : 1
Es Cuenta Control: S
Permite Saldo negativo: N
Cuenta Padre: 1.1.2
Saldo: 0
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

cuentas contables

Publicado por NULL (1 intervención) el 31/07/2023 04:09:46
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>

using namespace std;

// Estructura para representar una cuenta contable
struct Cuenta {
char Cta_codigo[20];
char Cta_nombre[80];
unsigned short int Cta_origen; // 1-Debito, 2-Credito
char Cta_es_control; // S-Si, N-No
char Cta_permite_saldo_negativo; // S-Si, N-No
char Cta_padre_codigo[20];
double Cta_saldo;
};

// Función para validar el campo Cta_codigo según las reglas establecidas
bool validarCodigo(const char* codigo) {
int len = strlen(codigo);
if (len == 0 || codigo[0] == '.' || codigo[len - 1] == '.')
return false;

bool puntoAnterior = false;
for (int i = 0; i < len; i++) {
if (codigo[i] == '.') {
if (puntoAnterior)
return false;
puntoAnterior = true;
} else if (!isdigit(codigo[i])) {
return false;
} else {
puntoAnterior = false;
}
}
return true;
}

// Función para validar el campo Cta_es_control o Cta_permite_saldo_negativo
bool validarSN(char c) {
return c == 'S' || c == 'N';
}

// Función para buscar una cuenta por código en el archivo binario
bool buscarCuenta(const char* codigo, Cuenta& cuenta) {
ifstream archivo("cuentas.bin", ios::binary | ios::in);
if (!archivo) {
cerr << "Error al abrir el archivo." << endl;
return false;
}

while (archivo.read(reinterpret_cast<char*>(&cuenta), sizeof(Cuenta))) {
if (strcmp(cuenta.Cta_codigo, codigo) == 0) {
archivo.close();
return true;
}
}

archivo.close();
return false;
}

// Función para agregar una cuenta al archivo binario
bool agregarCuenta(const Cuenta& cuenta) {
ofstream archivo("cuentas.bin", ios::binary | ios::app);
if (!archivo) {
cerr << "Error al abrir el archivo." << endl;
return false;
}

archivo.write(reinterpret_cast<const char*>(&cuenta), sizeof(Cuenta));
archivo.close();
return true;
}

// Función para modificar una cuenta en el archivo binario
bool modificarCuenta(const Cuenta& cuenta) {
fstream archivo("cuentas.bin", ios::binary | ios::in | ios::out);
if (!archivo) {
cerr << "Error al abrir el archivo." << endl;
return false;
}

Cuenta cuentaActual;
while (archivo.read(reinterpret_cast<char*>(&cuentaActual), sizeof(Cuenta))) {
if (strcmp(cuentaActual.Cta_codigo, cuenta.Cta_codigo) == 0) {
archivo.seekp(-static_cast<int>(sizeof(Cuenta)), ios::cur);
archivo.write(reinterpret_cast<const char*>(&cuenta), sizeof(Cuenta));
archivo.close();
return true;
}
}

archivo.close();
return false;
}

// Función para listar todas las cuentas en el archivo binario
void listarCuentas() {
ifstream archivo("cuentas.bin", ios::binary | ios::in);
if (!archivo) {
cerr << "Error al abrir el archivo." << endl;
return;
}

Cuenta cuenta;
cout << "Codigo\tNombre\t\t\t\tSaldo" << endl;
cout << "-----------------------------------------------" << endl;
while (archivo.read(reinterpret_cast<char*>(&cuenta), sizeof(Cuenta))) {
cout << cuenta.Cta_codigo << "\t" << cuenta.Cta_nombre << "\t\t\t" << cuenta.Cta_saldo << endl;
}

archivo.close();
}

// Función para consultar una cuenta por código
void consultarCuenta(const char* codigo) {
Cuenta cuenta;
if (buscarCuenta(codigo, cuenta)) {
cout << "Datos Actuales:" << endl;
cout << "----------------------" << endl;
cout << "Nombre: " << cuenta.Cta_nombre << endl;
cout << "Origen (1-Debito, 2-Credito): " << cuenta.Cta_origen << endl;
cout << "Es Cuenta Control: " << cuenta.Cta_es_control << endl;
cout << "Permite Saldo negativo: " << cuenta.Cta_permite_saldo_negativo << endl;
cout << "Cuenta Padre: " << cuenta.Cta_padre_codigo << endl;
cout << "Saldo: " << cuenta.Cta_saldo << endl;
} else {
cout << "Cuenta no registrada." << endl;
}
}

int main() {
int opcion;
Cuenta cuenta;

do {
cout << "Menu:" << endl;
cout << "1. Adicionar Cuenta" << endl;
cout << "2. Modificar Cuenta" << endl;
cout << "3. Listar Cuentas" << endl;
cout << "4. Consulta por código" << endl;
cout << "5. Salir" << endl;
cout << "Seleccione una opción: ";
cin >> opcion;

switch (opcion) {
case 1:
cout << "Cuenta: ";
cin >> cuenta.Cta_codigo;
cout << "Nombre: ";
cin.ignore();
cin.getline(cuenta.Cta_nombre, 80);
cout << "Origen (1-Debito, 2-Credito): ";
cin >> cuenta.Cta_origen;
cout << "Es Cuenta Control (S/N): ";
cin >> cuenta.Cta_es_control;
cout << "Permite Saldo negativo (S/N): ";
cin >> cuenta.Cta_permite_saldo_negativo;
cout << "Cuenta Padre (o deje en blanco si no tiene): ";
cin >> cuenta.Cta_padre_codigo;
cuenta.Cta_saldo = 0;
if (validarCodigo(cuenta.Cta_codigo) &&
(cuenta.Cta_origen == 1 || cuenta.Cta_origen == 2) &&
validarSN(cuenta.Cta_es_control) &&
validarSN(cuenta.Cta_permite_saldo_negativo)) {
if (!cuenta.Cta_padre_codigo[0] || buscarCuenta(cuenta.Cta_padre_codigo, cuenta)) {
agregarCuenta(cuenta);
cout << "Cuenta agregada exitosamente." << endl;
} else {
cout << "La cuenta padre no es válida." << endl;
}
} else {
cout << "Datos inválidos, verifique las reglas para cada campo." << endl;
}
break;
case 2:
cout << "Cuenta: ";
cin >> cuenta.Cta_codigo;
if (buscarCuenta(cuenta.Cta_codigo, cuenta)) {
cout << "Datos Actuales:" << endl;
cout << "----------------------" << endl;
cout << "Nombre: " << cuenta.Cta_nombre << endl;
cout << "Origen (1-Debito, 2-Credito): " << cuenta.Cta_origen << endl;
cout << "Es Cuenta Control: " << cuenta.Cta_es_control << endl;
cout << "Permite Saldo negativo: " << cuenta.Cta_permite_saldo_negativo << endl;
cout << "Cuenta Padre: " << cuenta.Cta_padre_codigo << endl;
cout << "Saldo: " << cuenta.Cta_saldo << endl;

cout << "Nuevos Datos" << endl;
cout << "Nombre: ";
cin.ignore();
cin.getline(cuenta.Cta_nombre, 80);
cout << "Origen (1-Debito, 2-Credito): ";
cin >> cuenta.Cta_origen;
cout << "Es Cuenta Control (S/N): ";
cin >> cuenta.Cta_es_control;
cout << "Permite Saldo negativo (S/N): ";
cin >> cuenta.Cta_permite_saldo_negativo;
cout << "Cuenta Padre (o deje en blanco si no tiene): ";
cin >> cuenta.Cta_padre_codigo;
if (validarSN(cuenta.Cta_es_control) &&
validarSN(cuenta.Cta_permite_saldo_negativo)) {
if (!cuenta.Cta_padre_codigo[0] || buscarCuenta(cuenta.Cta_padre_codigo, cuenta)) {
modificarCuenta(cuenta);
cout << "Cuenta modificada exitosamente." << endl;
} else {
cout << "La cuenta padre no es válida." << endl;
}
} else {
cout << "Datos inválidos, verifique las reglas para cada campo." << endl;
}
} else {
cout << "Cuenta no registrada." << endl;
}
break;
case 3:
listarCuentas();
break;
case 4:
cout << "Cuenta: ";
cin >> cuenta.Cta_codigo;
consultarCuenta(cuenta.Cta_codigo);
break;
case 5:
cout << "Saliendo..." << endl;
break;
default:
cout << "Opción inválida. Intente nuevamente." << endl;
}
} while (opcion != 5);

return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar