Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - ThunderCls

#71
Si lo que estas intentando hacer es una copia de la estructura t_persona a la variable aux, te recomendaria usar memcpy() en lugar de strcpy().

https://practice.geeksforgeeks.org/problems/difference-between-strcpy-and-memcpy
#72
Has intentado usar Transactions/Isolation Levels?, creo que con eso puedes hacer lo que quieres
#73
Tu declaracion de "pun" es la siguiente:

Código (cpp) [Seleccionar]
struct notas{
char nom[50];
char apel[50];
char cod[50];
float n1, n2;
float defi;
}alu, *pun=&alu;


Significa que "pun" es simplemente un puntero a una variable de tipo estructura "notas". Luego mas adelante haces algo como:

Código (cpp) [Seleccionar]
(pun+i)->cod

Significa que estas accediendo a una posicion en memoria de la que no tienes control (intentas acceder mas alla de los limites de tu variable con pun+i). Cuando accedes a una zona de memoria no reservada, el contenido es incierto ya que tu aplicacion o cualquier otra puede usarla. Una posible solucion es declarar "pun" como un array de estructuras, o mejor aun, como un contenedor dinamico (vector, list).

He modificado solamente la declaracion y uso de la variable "pun" para que tengas una idea:

Código (cpp) [Seleccionar]
#include <string.h>
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <vector>

using namespace std;

void gt(int x, int y) {             // -Posicion X y Y en el Programa
HANDLE Manipulador;  //Puntero
COORD Coordenadas; //Coordenadas
Manipulador = GetStdHandle(STD_OUTPUT_HANDLE); //Contenedor del Programa
Coordenadas.X = x; //Posicion en X
Coordenadas.Y = y; //Posicion en Y
SetConsoleCursorPosition(Manipulador, Coordenadas); //Envia el Contenedor y variable para la posicion
}

void formu() {
system("cls");
gt(15, 9); cout << "Codigo: ";
gt(15, 11); cout << "Nombres: ";
gt(15, 12); cout << "Apellidos: ";
gt(15, 14); cout << "Nota 1: ";
gt(15, 15); cout << "Nota 2: ";
gt(15, 17); cout << "Su Nota Definitiva es: ";
}

struct notas {
char nom[50];
char apel[50];
char cod[50];
float n1, n2;
float defi;
}alu;
vector<notas> pun;

void capt();
void list();
void consul();
int ne;

int main() {
char op;
do {
system("cls");
gt(20, 10); cout << "MENU REGISTROS";
gt(22, 12); cout << "1. Capturar.";
gt(22, 13); cout << "2. Consultar registros.";
gt(22, 14); cout << "3. Salir.";

gt(23, 16); cout << char(167) << "Digite un numero: "; op = _getch();

switch (op) {
case '1':
capt();
break;
case '2':
consul();
break;
case '3':
gt(6, 18); cout << "Saliendo...";
Sleep(200);
gt(5, 25); exit(1);
break;
default:
gt(6, 18); cout << "Debe digitar un numero del 1 al 3...";
system("pause");
break;
}
} while (op != '3');
}

void capt() {
system("cls");
gt(15, 10); cout << "Digite el Numero de Formularios a agregar: "; cin >> ne;
const int ju = ne;

for (int i = 0; i < ju; i++) {
struct notas nota;
formu();
fflush(stdin);
gt(23, 9); cin >> nota.cod;
gt(24, 11); cin >> nota.nom;
gt(26, 12); cin >> nota.apel;
gt(23, 14); cin >> nota.n1;
gt(23, 15); cin >> nota.n2;

nota.defi = (nota.n1 + nota.n2) / 2;
gt(38, 17); cout << nota.defi;
pun.push_back(nota);
system("pause");
}
ne = ju;
}

void consul() {
char op;
do {
system("cls");
gt(20, 10); cout << "MENU - Consultas";
gt(22, 12); cout << "1. Listar.";
gt(22, 13); cout << "2. Volver al menu anterior";
gt(22, 14); cout << "3. Salir";

gt(23, 16); cout << "Digite un numero: "; op = _getch();

switch (op) {
case '1':
list();
break;
case '2':
gt(6, 18); cout << "Volviendo...";
Sleep(200);
main();
break;
case '3':
gt(6, 18); cout << "Saliendo...";
Sleep(200);
gt(5, 25); exit(1);
break;
default:
gt(6, 18); cout << "Digite un numero del 1 al 3...";
system("pause");
break;
}
} while (op != '4' || op == '2');
system("pause");
}

void list() {
system("cls");
fflush(stdin);
if (pun.empty()) {
gt(15, 10); cout << "No se Encontraron Registros...";
}
else {
gt(16, 8); cout << "--- REGISTROS ---";

gt(3, 10); cout << "No.";
gt(7, 10); cout << "Codigo";
gt(17, 10); cout << "Nombre";
gt(33, 10); cout << "Apellido";
gt(47, 10); cout << "Nota 1";
gt(57, 10); cout << "Nota 2";
gt(67, 10); cout << "Definitiva";

for (int i = 0; i < ne; i++) {
auto nota = pun.at(i);
gt(3, i + 12); cout << i + 1;
gt(7, i + 12); cout << nota.cod;
gt(17, i + 12); cout << nota.nom;
gt(32, i + 12); cout << nota.apel;
gt(47, i + 12); cout << nota.n1;
gt(57, i + 12); cout << nota.n2;
gt(67, i + 12); cout << nota.defi;
}
system("pause");
}
}


Saludos
#74
Cita de: RM_85 en  9 Abril 2020, 21:21 PM
Hola ThunderCls te agradezco la ayuda pero necesitaba una forma mas simple de resolverlo. Saludos.

Mas simple?! Pero si solo le he añadido dos lineas a tu codigo  :xD
#75
Código (cpp) [Seleccionar]
#include <iostream>
#include <cstring>

using namespace std;

void pedirDatos();
void mostrarApellido();

struct Personas {
    char nombreApellido[30];
}
personas[10];

int main(int argc, char * argv[]) {
   
    memset(personas, 0, sizeof(personas) * 10); // usa memset para inicializar la estructura con ceros
    pedirDatos();
    mostrarApellido();

    return 0;
}

void pedirDatos() {
    for (int i = 0; i < 10; i++) {
        cout << " Ingrese apellido y nombre separado por un espacio: ";
        cin.getline(personas[i].nombreApellido, 30);
    }
}

void mostrarApellido() {

    int i = 0, k = 0, contador = 0;
    cout << "\n\n Apellidos introducidos: \n\n ";

    for (; i < 10; i++)
    {
        char *token = strtok(personas[i].nombreApellido, " "); // usa strtok para dividir la cadena por el espacio y obtener los tokens
        if(token && (token = strtok(nullptr, " ")) != nullptr)
        {
            cout << i + 1 << " - " << token << "\n";
        }
    }
}


Solo he añadido las dos lineas que necesitas basicamente, por otra parte, tu codigo no es el mejor  :-\
Saludos
#76
Cita de: Loretz en  9 Abril 2020, 05:11 AM
Puedes hacer algo como esto, pero ten en cuenta que en C++ no debes usar punteros, no debes usar new (ni delete).

En C++ no se deben usar punteros?, ni new ni delete? Podrias dar algunos de tus motivos para este razonamiento?

Cita de: Juan Sanchez en  9 Abril 2020, 03:37 AM
Saludos, Soy casi nuevo en este lenguaje y tengo ganas de profundizar el lenguaje.

Mi consejos si lo que te interesa es aprender C++:
- Separa conceptos de C y C++
- Aprende el lenguaje puro, de ser posible versiones modernas (17+)
- Usa la libreria estandar de C++
- Evita siempre que puedas el manejo de arreglos de chars para las cadenas, en C++ tienes std::string la cual es mucho mas segura y facil de usar

Código (cpp) [Seleccionar]
#include <iostream>

void NombreFuncion(string &str);

int main()
{
    std::string dato;
    NombreFuncion(dato);
    cout << dato << endl;
}

void NombreFuncion(std::string &dato)
{
    const std::string texto = "resultado";
    dato.assign(texto);
}


Suerte
#77
Aclaro un poco lo que dije antes.

Siempre que los indexes de las tablas puedan estar en memoria (contando con un buen diseño), el rendimiento no se veria afectado de acuerdo al tamaño o a la cantidad de records en la base de datos, evidentemente considerando el diseño de la bd, configuraciones y recursos de hardware, esto para operaciones basicas (insert/update/delete) que no modifican demasiadas filas.
Por otra parte cuando se trabaja con un alto numero de consultas mas complejas que usen o escaneen todos los registros de las tablas, el tiempo de respuesta va a incrementar linealmente de acuerdo al tamaño de la bd.

https://en.wikipedia.org/wiki/Very_large_database#Performance

Esto no quiere decir que no existan tecnicas para mejorar el rendimiento en estos casos, desde mejorar hardware (ram, ssd) hasta opciones de software como configuraciones master/slave, modificar y mejorar los indexes para dichas consultas, partitioning, clustering, etc, pero el punto que hice anteriormente es que si puede haber afectaciones de rendimiento segun el tamaño de una bd en algun determinado momento.

Cita de: NEBIRE en  8 Abril 2020, 15:35 PM
Ningún sistem es tan complejo que reqiera usar 1.000 tablas.
Otra cosa es que el sistema tenga varias bases de datos (de diferentes procesos) y que todas ellas formen parte de la misma aplicación y sumadas alcancen o superen dicha cantidad.

Acaso importa si el sistema usa las 1000 tablas en la misma bd o en bd repartidas? De cualquier manera las estaria usando y todas serian parte de su funcionamiento. El caso creo yo es que teoricamente un software pudiera usar dichas cantidades de tablas sin problemas si lo necesitara, el hecho que sea un evento "raro" o que se vea poco en el mundo profesional "comun" no le quita validez a la posibilidad, al menos eso creo yo.
#78
Cita de: Filantropo en  8 Abril 2020, 06:53 AM
No me refiero al numero maximo de tablas que el motor impone.
De todas las bases de datos que hayas hecho o visto cual era la que tenia mas tablas y cuantas eran?

El hecho de que el motor de la posibilidad de tener tantas tablas indica que se pueden tener diseños con cantidades astronomicas de tablas que quizas ya existen en la actualidad o en algun futuro podrian existir. Creo recordar algun e-commerce con el que trabaje que tenia cerca de las 50 y tantas tablas.

Cita de: Filantropo en  8 Abril 2020, 06:53 AM
La bd northwind de microsoft la componen 13 tablas se me hace algo dificil de entenderlo, lograr entender una bd que pueda llegar a las 1000 o mas tablas seria imposible.

No existe un patron en ingenieria de software que dicte cuantas tablas debe tener un sistema, todo es subjetivo y depende de la arquitectura, los requisitos funcionales y el diseño del sistema en general. Cada software es diferente y por ende tendra diferentes requisitos, diferente arquitectura de clases y diseños de bases de datos, asi que no seria tan raro ver un gran software con el orden de los cientos de tablas en una bd o quizas los miles. Cuantas tablas crees que pueda manejar Facebook en su bd por poner un ejemplo? Luego esta el tema de los Data Wharehouse/Data Mining donde se manejan cantidades astronomicas de datos, en fin, que de poder se puede, quizas proyectos pequeños no sobrepasen nunca las 40-50 tablas a lo mucho, pero libertad tienen para hacerlo si lo necesitaran

Saludos 
#79
Cita de: rigorvzla en  7 Abril 2020, 01:04 AM
observe los datos del responseString, lo abri o visualice como HTML y WALLA!!! ahi estaba en la pagina logeada mas no se ahora como hacerlo en un explorador web ,externo.

Lo que obtienes en el responseString es simplemente el HTML que te ha retornado el servidor, no se que pretendes que suceda al hacer un Proces.Start("HTML"), pero estoy seguro que no es lo que piensas, que imagino sea ejecutar un navegador web con el HTML renderizado. A ver, lo que te explico Eleкtro en su ultimo post es lo que debes hacer si quieres "abrir" dicho html con la sesion iniciada en un navegador dentro de tu aplicacion. Una vez has hecho las peticiones de inicio de sesion y estas dentro necesitas insertar las cookies obtenidas dentro del componente y lanzar la URL, es todo.
Por otra parte si lo que buscas es lanzar una instancia de un navegador externo como firefox o chrome entonces vas a necesitar hacer el mismo procedimiento lo que en este caso no se me ocurre otra opcion para inyectar las cookies que no sea a traves de un WebDriver/Selenium

Saludos
#80
"MySQL no tiene límite en la cantidad de bases de datos. El sistema de archivos subyacente puede tener un límite en el número de directorios. MySQL no tiene límite en el número de tablas. El sistema de archivos subyacente puede tener un límite en la cantidad de archivos que representan tablas. Los motores de almacenamiento individuales pueden imponer restricciones específicas del motor. InnoDB permite hasta 4 mil millones de tablas."
https://dev.mysql.com/doc/refman/8.0/en/database-count-limit.html

"En SQL Server todos los objetos que incluyen tablas, vistas, procedimientos almacenados, funciones definidas por el usuario, disparadores, reglas, valores predeterminados y restricciones. La suma del número de todos los objetos en una base de datos no puede exceder 2,147,483,647."
https://docs.microsoft.com/en-us/sql/sql-server/maximum-capacity-specifications-for-sql-server?redirectedfrom=MSDN&view=sql-server-ver15

"PostgreSQL normalmente almacena los datos de su tabla en fragmentos de 8 KB. El número de estos bloques es limitado a un entero con signo de 32 bits (poco más de dos mil millones), lo que da un tamaño máximo de tabla de 16 TB. El tamaño de bloque básico se puede aumentar cuando se construye PostgreSQL, hasta un máximo de 32 KB, dando así un límite teórico de tamaño de tabla de 64 TB."
https://link.springer.com/content/pdf/bbm%3A978-1-4302-0018-5%2F1.pdf

Los problemas o diferencias de rendimiento en una BD no vienen dados por la cantidad de tablas que se tengan pero por la cantidad de informacion que ellas manejan. A mayor volumen de datos menor rendimiento. Una BD de 1.000.000 de tablas con apenas 100 entradas almacenadas entre todas tendra mejor rendimiento que una BD con 100 tablas y 1.000.000 de entradas.
Saludos