|
Mostrar Mensajes
|
Páginas: [1] 2
|
1
|
Programación / Programación General / Como usar un panel en un form como contenedor para otros form en C#
|
en: 26 Mayo 2022, 12:21 pm
|
Hola! he conseguido encontrar la forma de como en un panel dentro del form principal, ir abriendo otros form, manteniendo la estructura de botones del form principal, y sobre todo que se abra de forma mas realista, que si se abriera por cada form una ventana y se cerrara la otra. El problema que me encuentro es que solo abre un nivel inferior de forms desde el form principal. Me explico, si desde el form princpila cargamos el form de Login, y una vez autenticado entra a otro form con diferentes opciones segun el perfil del usuario, a ese ultimo form del usuario, el metodo que tengo no funciona. Ya he probado desde el form de Login, llamar al panel del form principal, para modificarlo en el metodo que pasare a continuacion, pero me da error de acceso protegido, aunque haya puesto el panel del form principal la propiedad modifiers a public. Tambien he probado desde el form Login ha crear una instancia del form principal y asi llamar al metodo de abrir otro form en el panel, pero no entra bien en el metodo y no realiza nada. No se si os ocurrira alguna solucion?.Pego codigo del metodo: //Metodo para abrir formularios dentro del panelContenedor public void AbrirFormulario<MiForm>() where MiForm : Form, new() { Form formulario; formulario = panelFormularios.Controls.OfType<MiForm>().FirstOrDefault();//Busca en la colecion el formulario //si el formulario/instancia no existe if (formulario == null) { formulario = new MiForm(); formulario.TopLevel = false; formulario.FormBorderStyle = FormBorderStyle.None; formulario.Dock = DockStyle.Fill; panelFormularios.Controls.Add(formulario); panelFormularios.Tag = formulario; formulario.Show(); formulario.BringToFront(); } //si el formulario/instancia existe else { formulario.BringToFront(); } }
y una de las prueba que he realizado de las que he comentado antes, es definir ese metodo en el formulario de login y llamar al panel contenedor asi: formPrincipal.panelContenedor. Per da error de estar protegido. Ademas me parece que a nivel de seguridad, por encapsulación no seria lo correcto. La otra forma como explicaba es llamar a la funcion del form principal de form: formPrincipal.AbrirFormulario<formogin>() . Pero no entraba en el metodo al ejecturar la aplicacion. Bueno muchas gracias de antemano por la ayuda!, saludos
|
|
|
3
|
Programación / Programación C/C++ / Re: Ayuda con implementacion algoritmo warshall en C
|
en: 18 Mayo 2022, 01:50 am
|
Hola de nuevo,
porque en lo que me piden en este ejercicio es comprobar que no existen ciudades aisladas o ciudades inalcanzables partiendo desde otra ciudad, y viendo a simple vista el fichero de texto, todas las ciudades estan conectadas. Entonces entiendo que deberia dar todo 1 el resultado del algoritmo no?
Gracias de nuevo!
|
|
|
4
|
Programación / Programación C/C++ / Re: Ayuda con implementacion algoritmo warshall en C
|
en: 18 Mayo 2022, 01:02 am
|
Hola!, he sacado un hueco para implementarlo, que voy a tope. Y me sale este resultado: 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Yo entiendo que todas las ciudades al final están conectadas unas con otras, no?. Osea desde Coruña puedes ir a Cadiz a través de las otras ciudades. Entonces no entiendo como la ultima fila da todo 0,s. Entiendo que la ultima fila es la de Cadiz en relación con las otras ciudades?. En ese caso llegando por Sevilla, hay conexión previa con las otras ciudades. No se si estaré entendiendo bien la interpretación del resultado Ahora eso si, la funcion buscar indices no se si la tengo muy afinada, porque solo me ha corrido el programa, declarando punteros como paso de variables. Adjunto el codigo: #define MAX_NOMBRE_CIUDAD 40 #define NUM_CIUDADES 17 int buscarIndice(char *ciudad, char *ciudades[NUM_CIUDADES], int numCiudades) { for(int i=0; i<numCiudades; i++) { if(strcmp(ciudad ,ciudades [i ])==0)return i ; } } void warshall(int A[][NUM_CIUDADES], int nNodos) { int i,j,k; for (k = 0; k < nNodos; k++) for (i = 0; i < nNodos; i++) for (j=0; j< nNodos; j++) A[i][j] = A[i][j] || A[i][k] && A[k][j]; } int main() { char *ciudades[NUM_CIUDADES] = {"Corunya", "Vigo", "Valladolid", "Bilbao", "Madrid", "Oviedo", "Zaragoza", "Barcelona", "Gerona", "Valencia", "Badajoz", "Jaen", "Albacete", "Murcia", "Granada", "Sevilla", "Cadiz"}; int matriz_entrada[NUM_CIUDADES][NUM_CIUDADES] = {0}; char ciudad_origen[MAX_NOMBRE_CIUDAD]; char ciudad_destino[MAX_NOMBRE_CIUDAD]; int distancia; FILE *fichero = fopen("carreteras.txt", "r"); if(!fichero) // Lo mismo que decir: fichero == NULL { printf("El fichero no ha podido abrirse\n"); } while(fscanf(fichero , "%s %s %d", ciudad_origen , ciudad_destino , &distancia ) == 3) { printf("La distancia para ir de [%s] a [%s] es: %d\n", ciudad_origen , ciudad_destino , distancia ); int indice_origen = buscarIndice(ciudad_origen, ciudades, NUM_CIUDADES); int indice_destino = buscarIndice(ciudad_destino, ciudades, NUM_CIUDADES); if(indice_origen != -1 && indice_destino != -1) matriz_entrada[indice_origen][indice_destino] = 1; } warshall(matriz_entrada, NUM_CIUDADES); for(int i = 0; i < NUM_CIUDADES; ++i) { for(int j = 0; j < NUM_CIUDADES; ++j) printf("%d ", matriz_entrada [i ][j ]); } return 0; }
Muchas gracias de nuevo por la aclaración!
|
|
|
6
|
Programación / Programación C/C++ / Re: Ayuda con implementacion algoritmo warshall en C
|
en: 13 Mayo 2022, 00:04 am
|
Hola!, perdona no vi tu ultimo mensaje en el otro tema casualmente mientras me escribias este ultimo mensaje, estaba implementandolo con estructuras como sugerias en el otro tema. Y ya llama bien a al metodo warshall, pero creo devuelve mal los valores. Es que no me aclaro mucho con el metodo. Lo he tenido que modificar, porque si le implementaba tal como estaba, como le puedo asignar a una matriz de tipo bool, una matriz de tipo int que es donde van concatenadas las ciudades asignadas por una numeracion?. A mi me da como resultado la tabla con todos 1, supongo que no esta bien. En la tabla que compartes, el 0 es la ciudad actual, el -1 una ciudad inalcanzable, el 1 supongo que sera una ciudad alcanzable, pero los valores 4, 5 y 6 que aparecen en la tabla que significan. Pego el nuevo codigo por si esta muy mal lo repito, y si solo hay que retocarlo un poco lo del metodo warshall que la verdad es voy perdido como funciona, solo modifico ese metodo: En parte ya estaban las correciones que me has comentado, revisare las otras que no estan realizadas. Pego el codigo. Muchas gracias! struct ciudades { char ciudad1 [maxCiudad]; char ciudad2 [maxCiudad]; int distancia; }; /*void mas_corto(unsigned int c[][], unsigned int a[][], int P[][], unsigned int nNodos) { int i,j,k; for (i = 0; i < nNodos; i++) { for(j=0; j < nNodos; j++) { // Inicializamos con el coste de los caminos directos A[i][j] = C[i][j]; P[i][j] = -1; } } for (k = 0; k < nNodos; k++) for (i = 0; i < nNodos; i++) for (j=0; j< nNodos; j++) if (A[i][k]+A[k][j] < A[i][j]) { A[i][j] = A[i][k] + A[k][j]; P[i][j] = k; } } */ int contar_filas(int *filas) { FILE *fichero; char linea[maxLinea]; char * campo; fichero = fopen( "carreteras.txt", "r"); if(fichero==NULL) { printf("No se ha podido abrir el fichero.\n"); } else { while(fgets(linea ,maxLinea ,fichero )) { (*filas)++; } } return (*filas); } void warshall (int **A, unsigned int nNodos) { int i,j,k; for (k = 0; k < nNodos; k++) for (i = 0; i < nNodos; i++) for (j=0; j< nNodos; j++) A[i][j] = A[i][j] || A[i][k] && A[k][j]; //Si hay un camino de ‘i’ a ‘j’ o si hay //un camino de ‘i’ a ‘j’ pasando por ‘k’ for (int i=0; i<nNodos; i++) { for (int j=0; j<nNodos; j++) } } int main() { FILE *fichero; struct ciudades *city; int *filas=0, *columnas=0, clave=1; int cont=0, rows; char ciudad1[maxCiudad]; char ciudad2[maxCiudad]; char distancia[maxCiudad]; int **claves; fichero = fopen( "carreteras.txt", "r"); if(fichero==NULL) { printf("No se ha podido abrir el fichero.\n"); } else { filas=contar_filas(&filas); rows=filas; city =malloc(rows *sizeof(struct ciudades )); claves =malloc(rows *sizeof(int*)); for(int i=0; i<rows; i++) { claves [i ]=malloc(2*sizeof(int)); } // se lee cada fila de todo el fichero de elementos while(fscanf(fichero , "%s %s %s", ciudad1 , ciudad2 , distancia ) == 3) { strcpy(city [cont ]. ciudad1,ciudad1 ); strcpy(city [cont ]. ciudad2,ciudad2 ); city[cont].distancia=ciudad2; cont++; } } for(int i=0; i<rows; i++) { for(int j=0; j<2; j++) { if(strcmp(city [i ]. ciudad1,"Corunya")==0) claves[i][j]=1; if(strcmp(city [i ]. ciudad2,"Corunya")==0) claves[i][j]=1; if(strcmp(city [i ]. ciudad1,"Vigo")==0) claves[i][j]=2; if(strcmp(city [i ]. ciudad2,"Vigo")==0) claves[i][j]=2; if(strcmp(city [i ]. ciudad1,"Valladolid")==0) claves[i][j]=3; if(strcmp(city [i ]. ciudad2,"Valladolid")==0) claves[i][j]=3; if(strcmp(city [i ]. ciudad1,"Bilbao")==0) claves[i][j]=4; if(strcmp(city [i ]. ciudad2,"Bilbao")==0) claves[i][j]=4; if(strcmp(city [i ]. ciudad1,"Madrid")==0) claves[i][j]=5; if(strcmp(city [i ]. ciudad2,"Madrid")==0) claves[i][j]=5; if(strcmp(city [i ]. ciudad1,"Zaragoza")==0) claves[i][j]=7; if(strcmp(city [i ]. ciudad2,"Zaragoza")==0) claves[i][j]=7; if(strcmp(city [i ]. ciudad1,"Barcelona")==0) claves[i][j]=8; if(strcmp(city [i ]. ciudad2,"Barcelona")==0) claves[i][j]=8; if(strcmp(city [i ]. ciudad1,"Gerona")==0) claves[i][j]=9; if(strcmp(city [i ]. ciudad2,"Gerona")==0) claves[i][j]=9; if(strcmp(city [i ]. ciudad1,"Valencia")==0) claves[i][j]=10; if(strcmp(city [i ]. ciudad2,"Valencia")==0) claves[i][j]=10; if(strcmp(city [i ]. ciudad1,"Badajoz")==0) claves[i][j]=11; if(strcmp(city [i ]. ciudad2,"Badajoz")==0) claves[i][j]=11; if(strcmp(city [i ]. ciudad1,"Jaen")==0) claves[i][j]=12; if(strcmp(city [i ]. ciudad2,"Jaen")==0) claves[i][j]=12; if(strcmp(city [i ]. ciudad1,"Albacete")==0) claves[i][j]=13; if(strcmp(city [i ]. ciudad2,"Albacete")==0) claves[i][j]=13; if(strcmp(city [i ]. ciudad1,"Murcia")==0) claves[i][j]=14; if(strcmp(city [i ]. ciudad2,"Murcia")==0) claves[i][j]=14; if(strcmp(city [i ]. ciudad1,"Granada")==0) claves[i][j]=15; if(strcmp(city [i ]. ciudad2,"Granada")==0) claves[i][j]=15; if(strcmp(city [i ]. ciudad1,"Sevilla")==0) claves[i][j]=16; if(strcmp(city [i ]. ciudad2,"Sevilla")==0) claves[i][j]=16; if(strcmp(city [i ]. ciudad1,"Cadiz")==0) claves[i][j]=17; if(strcmp(city [i ]. ciudad2,"Cadiz")==0) claves[i][j]=17; } } warshall(claves,n_Nodos); return 0; }
Y el resultado que muestra por pantalla: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
|
|
7
|
Programación / Programación C/C++ / Re: Ayuda con implementacion algoritmo warshall en C
|
en: 12 Mayo 2022, 14:27 pm
|
Vale, gracias:
Corunya Vigo 171 Corunya Valladolid 455 Vigo Valladolid 356 Valladolid Bilbao 280 Valladolid Madrid 193 Oviedo Bilbao 304 Bilbao Madrid 395 Bilbao Zaragoza 324 Madrid Zaragoza 325 Zaragoza Barcelona 296 Barcelona Gerona 100 Valencia Barcelona 349 Madrid Badajoz 403 Madrid Jaen 335 Madrid Albacete 251 Albacete Valencia 191 Albacete Murcia 150 Murcia Granada 284 Murcia Valencia 241 Granada Jaen 99 Granada Sevilla 256 Jaen Sevilla 242 Sevilla Cadiz 125
|
|
|
8
|
Programación / Programación C/C++ / Ayuda con implementacion algoritmo warshall en C
|
en: 12 Mayo 2022, 11:56 am
|
Hola, necesito ayuda para implementar el algoritmo warshall, que ira recogiendo varias filas con dos ciudades, que se suponen que entre todas las ciudades hay conexion pasando a traves de otras. Entonces se busca con este algoritmo que vaya indicando si en cada fila devuelva true o false segun vaya recorriendo las filas. Yo al menos he entendido asi el problema. El primer problema que tengo es que, no consigo crear la matriz dinamica para guardar las ciudades en cada fila de la matriz, al leer de nuevo el fichero de texto se cuelga el programa, y no veo la razon. Vereis que he puesto varios printf(variable), para ver donde se quedaba colgado el programa, y muestra por pantalla el numero de filas. Y despues lo que no se es, en que tipo de variable debo recoger los resultados? en una matriz de tipo int?, y si es asi luego es ir recorriendo la matriz viendo cuantos 1, obtiene?y como discernir que por el numero de 1 que devuelve el algoritmo, no hay ninguna ciudad aislada?. Como imaginareis es un ejercicio que me han puesto, y estoy bloqueado desde hace dias haciendo pruebas. Pego el codigo: void warshall (bool *c, bool *a, unsigned int nNodos) { int i,j,k; for (i = 0; i < nNodos; i++) for (j=0; j< nNodos; j++) //A[i][j] = C[i][j]; a[(i*nNodos)+j] = c[(i*nNodos)+j]; for (k = 0; k < nNodos; k++) for (i = 0; i < nNodos; i++) for (j=0; j< nNodos; j++) //A[i][j] = A[i][j] || A[i][k] && A[k][j]; //Si hay un camino de ‘i’ a ‘j’ o si hay //un camino de ‘i’ a ‘j’ pasando por ‘k’ a[(i*nNodos)+j] = a[(i*nNodos)+j] || a[(i*nNodos)+k] && a[(k*nNodos)+j]; //Si hay un camino de ‘i’ a ‘j’ o si hay //un camino de ‘i’ a ‘j’ pasando por ‘k’ } int main() { FILE *fichero; bool *a; bool *test; int n_Nodos=19; char * campo; char ** datos; int filas=0; int MaxLinea=maxLinea; char lineaFinal[maxLinea]; char ciudad1[maxCiudad]; char ciudad2[maxCiudad]; char distancia[maxCiudad]; char linea[maxLinea]; fichero = fopen( "carreteras.txt", "r"); if(fichero==NULL) { printf("No se ha podido abrir el fichero.\n"); } else { while(fgets(linea ,MaxLinea ,fichero )) { filas++; } fichero = fopen( "carreteras.txt", "r"); datos =malloc(sizeof(char*)*filas ); // se lee cada fila de todo el fichero de elementos while(fscanf(fichero , "%s %s %s", ciudad1 , ciudad2 , distancia ) == 3) { datos[filas][0]=ciudad1; printf("El valor de la linea %s \n", ciudad1 ); datos[filas][1]=ciudad2; printf("El valor de la linea %s \n", ciudad2 ); datos[filas][2]=distancia; printf("El valor de la linea %s \n", distancia ); } } a = (bool *)malloc(sizeof(bool )*(n_Nodos * n_Nodos )); // aqui no tengo claro si se recoge asi los resultados del algoritmo int resul[filas][3]=warshall (a,datos,n_Nodos); return 0; }
Muchas gracias por la ayuda!
|
|
|
10
|
Programación / Programación C/C++ / Ayuda con fichero y cadenas en C
|
en: 4 Mayo 2022, 19:49 pm
|
Hola, agradeceria si me podeis ayudar, estoy con un programilla que lee desde un fichero varias lineas donde hay el nombre de una ciudad, un espacio, el nombre de otra ciudad, otro espacio y los kilometros entre ellas. El problema es que no consigo que tras leer una de las lineas en la variable linea, pasarsela a una array de cadenas para despues con un par de bucles for ir rellenando una matriz dinamica. No se si estoy planteando bien el copiar directamente la linea al array, o el problema esta en que debo poner \0 al final de la linea. Yo he impreso printf("%s\n", linea); dentro del bucle while e imprime bien cada linea, pero al compilar se abre el prompt y finaliza el programa sin mostrar nada por pantalla. Pego el codigo por si me podeis ayudar. Gracias: char * campo; char ** datos; int filas=0; int MaxLinea=maxLinea; char lineaFinal[maxLinea]; char linea[maxLinea]; datos =malloc(sizeof(char*)*1); // se lee cada fila de todo el fichero de elementos while(fgets(linea ,MaxLinea ,fichero ) >0 ) { strcpy(lineaFinal [filas ],linea ); filas++; datos =realloc(datos ,sizeof(char*)*filas ); } for(int i=0; i<filas; i++) { datos =realloc (datos ,sizeof(char)*3); } for(int i=0; i<filas; i++) { for(int j=0; j<3; j++) { campo = strtok(lineaFinal [filas ], " "); datos[i][j]=campo; datos[i][j]=campo; datos[i][j]=campo } }
MOD: El código debe ir entre etiquetas de Código GeSHi
|
|
|
|
|
|
|