| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 1344
| Publicado: 14/08/2012 1:34 am | | | Título: |
| | leosan escribió: | | Era sólo cuestión de fijarse en double y cambiar los formatos del printf: | Lo dices en broma, ¿no? ¿De verdad crees que por el simple hecho de cambiar el formato y el tipo funciona? Si te funciona es porque has vuelto a tu antiguo método de ordenamiento por burbuja.
El tipo y formato debería ser irrelevante para la resolución de este problema y si no lo es preocúpate pues quiere decir que el código que has hecho no es demasiado bueno.
Un saludo! |
| | Volver arriba | |  | leosan
Registrado: 19 Abr 2012 Mensajes: 730 Ubicación: GRAN CANARIA
| Publicado: 14/08/2012 4:12 am | | | Título: |
| | Pantalàimon_ escribió: | | leosan escribió: | | Era sólo cuestión de fijarse en double y cambiar los formatos del printf: | Lo dices en broma, ¿no? ¿De verdad crees que por el simple hecho de cambiar el formato y el tipo funciona? Si te funciona es porque has vuelto a tu antiguo método de ordenamiento por burbuja. |
Es que ya había intentado usar atof con array y no me había salido. Y era porque no había cambiado los printf. No obstante, aquí está sin usar burbuja, aunque tal como me sale - hay que tener muchas "cositas" en cuenta tal como lo he hecho - no sé qué decir de cual método es más eficiente .... haciéndolo yo, claro..... y seguiré depurándolo. Si lo haces tú me asombrarías seguro, pero bueno... lo he peleado:
| Código: | #include <stdio.h> #include <stdlib.h> #include <string.h> #include <float.h> #define NOM_ARCHIVO "C:\\ejercicio21.csv" int main() { int i,j,k=0; double max[10],min[10],minimo=DBL_MIN ,maximo=DBL_MAX,max_global=DBL_MIN,min_global=DBL_MAX; double a[10]={0}; int contador_1,contador_2; char linea[80]; char * pch; FILE* fichero; fichero = fopen(NOM_ARCHIVO, "wt"); fputs("\n2.3,0.1,6,5,8.65,6,4.65\n", fichero); fputs("4,2,3,2,4\n", fichero); fputs("2,1,1,3,7.15,1,0.5,7.15", fichero); fclose(fichero); fgets(linea, 80, fichero);/**/ fichero = fopen(NOM_ARCHIVO, "rt"); if (fichero == NULL) { printf("No existe el fichero!\n"); return 1; } while (! feof(fichero)) { fgets(linea, 80, fichero); puts(linea); i=j=0; pch = strtok (linea,",\n"); while (pch != NULL) { a[i]=atof (pch); pch = strtok (NULL, ","); i++; } for (j=0; j< i; j++) { if (a[j]> maximo ) { maximo = a[j]; contador_1 = 1; } else if (a[j] == maximo ) contador_1 = 0; } if (contador_1 == 1) { printf("\nMayor : %g\t",maximo); max[k]=maximo;k++; }
if (contador_1 == 0) { printf("\nNo existe mayor\t"); max_global=DBL_MIN;max[k]=DBL_MIN;k++; } maximo=DBL_MIN;
for (j=0; j< i; j++) { if (a[j]<minimo ) { minimo = a[j]; contador_2 = 1; } else if (a[j]==minimo ) contador_2 = 0; } if (contador_2==1) { printf("\tMinimo : %g\n\n",minimo);k--; min[k]=minimo;k++; } if (contador_2==0) { printf("\tNo existe menor\n\n");k--; min_global=DBL_MAX;min[k]=DBL_MAX;k++; } minimo=DBL_MAX; } for (k=0;k<3;k++) { if (max[k]>max_global) max_global=max[k]; if (min[k]<min_global) min_global=min[k]; } if (max_global==DBL_MIN) printf("\nNo existe mayor global\t"); else printf("\n\tMayor global: %g\t",max_global); if (min_global==DBL_MAX) printf("\tNo existe minimo global\n\n"); else printf("\tMinimo global: %g\n",min_global); fclose(fichero); return 0; }
|
Un saludo! |
| | Volver arriba | |  | leosan
Registrado: 19 Abr 2012 Mensajes: 730 Ubicación: GRAN CANARIA
| Publicado: 14/08/2012 4:31 am | | | Título: |
| | Pantalàimon_ escribió: | El tipo y formato debería ser irrelevante para la resolución de este problema y si no lo es preocúpate pues quiere decir que el código que has hecho no es demasiado bueno. |
Me parece un poco "duro". Te parecerá irrelevante desde tu "altura", pero para mí ha sido una alegría complicar el ejercicio con decimales y variando la cantidad de números por línea. He descubierto que hay librería <limits.h> que es sólo para los enteros y otra <float.h> para los decimales - y con un código he buscado en ellas todas las opciones aplicables a mí ordenador. Por no hablar de <string.h> con , además de las funciones usuales,otras como strtok strpbrk strchr etc, y retenerlas y más aún, aplicarlas no me es nada fácil. No olvides que soy un "pardillo" en esto del C.
Un saludo! Y gracias por la atención que me prestas siempre. |
| | Volver arriba | |  | | Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 1344
| Publicado: 14/08/2012 5:40 am | | | Título: |
| | leosan escribió: | | Pantalàimon_ escribió: | El tipo y formato debería ser irrelevante para la resolución de este problema y si no lo es preocúpate pues quiere decir que el código que has hecho no es demasiado bueno. |
Me parece un poco "duro". Te parecerá irrelevante desde tu "altura", pero para mí ha sido una alegría complicar el ejercicio con decimales y variando la cantidad de números por línea. |
No, irrelevante quiere decir que no tiene importancia, no que sea fácil. Con lo que has puesto he entendido que decías que cambiando atoi por atof, %lf por %g y long int por double el programa te ha funcionado correctamente por arte de magia. Y yo te he contestado que eso no es así, que esos cambios no son relevantes para el correcto funcionamiento del programa. Si el código te funcionaba era porque usabas el algoritmo que usaba ordenamiento por burbuja que ya funcionaba bien para el tipo int. Y en este nuevo código que pones te funciona porque has cambiado algunas cosas a parte del atoi, %ld y long int que hacen que también funcione correctamente. Y si lo cambiaras a %ld, long int, atoi y INT_MAX, INT_MIN también te funcionará porque estos cambios son irrelevantes. Es decir, por hacer esos cambios el programa no dejará de funcionarte correctamente.
Un saludo! |
| | Volver arriba | |  | Masakre
Registrado: 06 Jun 2012 Mensajes: 245
| Publicado: 28/08/2012 11:17 am | | | Título: |
| | Sorancio escribió: | GCC es más rápido y no necesita tanta chorrería. Usas Windows: codeblocks-10.05mingw-setup.exe |
Ya lo tengo. Por fin! Pero . . . He copiado tan ansioso un código para probarlo, y luego que presiono el F8 aparece y desaparece la consola al instante. Le he agregado el famoso system("pause"); y ni así. PD: Incluso una vez me pareció leer que este tipo de IDE genera la pausa por defecto. |
| | Volver arriba | |  | leosan
Registrado: 19 Abr 2012 Mensajes: 730 Ubicación: GRAN CANARIA
| Publicado: 28/08/2012 1:21 pm | | | Título: |
| | Masakre escribió: | Pero . . . He copiado tan ansioso un código para probarlo, y luego que presiono el F8 aparece y desaparece la consola al instante.
|
Curioso, en mi codeblocks la tecla es, por defecto, F9. Cuelga en un post el código para probarlo. Saludos ...... y bienvenido. |
| | Volver arriba | |  | | Masakre
Registrado: 06 Jun 2012 Mensajes: 245
| Publicado: 29/08/2012 8:43 pm | | | Título: |
| | leosan escribió: | Curioso, en mi codeblocks la tecla es, por defecto, F9. Cuelga en un post el código para probarlo. Saludos ...... y bienvenido. |
Probé con crear un proyecto y albergar en él programas distintos, para evitar crear tantas carpetas, y pues, me salía un error, ya que 'main' era duplicado. Recién allí entendí más o menos el funcionamiento (por algo esos nuevos archivos se creaban como .c a diferencia del main.cpp). Entonces creí correspondiente crear un nuevo proyecto para cada programa. Ahora el problema que me resulta es que no sé como depurar algún proyecto que no sea el último. Es decir, cuando presiono F9 se construye y depura el último proyecto creado. Gracias de antemano. |
| | Volver arriba | |  | leosan
Registrado: 19 Abr 2012 Mensajes: 730 Ubicación: GRAN CANARIA
| Publicado: 05/09/2012 3:29 am | | | Título: |
| | Masakre escribió: | Probé con crear un proyecto y albergar en él programas distintos, para evitar crear tantas carpetas |
Pues yo guardo cada programa en distintas carpetas: API, ANALISIS NUMERICO, ALLEGRO, ARRAY, COMANDOS Y LIBRERIAS, ESTRCUTURA, FUNCION, FICHEROS, LEON, LETRAS,NÚMEROS, OPENGL, ORDEN, BUSQUEDA, TEMP, WIN32, WINGGIM, algunas con subcarpetas y todo dentro de la carpeta C en Mis Documentos .... y analogamente para C++. Y va como la seda, todo ordenadito y al alcance en cualquier momento.
| Cita: | Entonces creí correspondiente crear un nuevo proyecto para cada programa. Ahora el problema que me resulta es que no sé como depurar algún proyecto que no sea el último. Es decir, cuando presiono F9 se construye y depura el último proyecto creado. |
No utilizo hasta ahora Proyecto en Code::Blocks, sólo en Pelles C para depurar. Con un proyecto abierto no puedo tan libremente manejar la cantidad de códigos que mantengo abiertos en las múltiples pestañas que uso con Code::Blocks. A ver si alquien que use o tenga Code::Blocks - por ejemplo -Sorancio- te puede ayudar con ese problema. Y ya que nombro al "diablo", lástima que Sorancio se halla olvidado de "nosotros" y nuestros "ejercicios". Saludos |
| | Volver arriba | |  | Sorancio

Registrado: 29 May 2009 Mensajes: 1157 Ubicación: España
| Publicado: 06/09/2012 1:16 pm | | | Título: |
| No os he olvidado xD pero estoy haciendo una recopilación de 3 ejercicios y los publicaré cuando los tenga. A ver si para el domingo o el lunes... _________________ Mi página web (en inglés): |
| | Volver arriba | |  | | Sorancio

Registrado: 29 May 2009 Mensajes: 1157 Ubicación: España
| Publicado: 11/09/2012 2:52 am | | | Título: |
| Ya he publicado el ejercicio C.2. Intentaré publicar la respuesta durante esta semana, aunque no es necesaria ya que es muy abierto :). El ejercicio requiere de uso de árboles, memoria dinámica y más de un fichero. Publicadlo con letra pequeña ^^.
¡Mucha suerte!
PD: A quien quiera ver mi entorno de desarrollo (dos fotos):
La primera foto tiene algo de código de la solución que estoy escribiendo :). _________________ Mi página web (en inglés): |
| | Volver arriba | |  | leosan
Registrado: 19 Abr 2012 Mensajes: 730 Ubicación: GRAN CANARIA
| Publicado: 11/09/2012 10:57 am | | | Título: |
| | Sorancio escribió: | | El ejercicio requiere de uso de árboles, memoria dinámica y más de un fichero. |
Lo primero, es lo primero. Crear los ficheros, pero .....ni p. idea. Creo que esperas demasiado de nosotros.Este ejercicio es como un salto cuántico respecto de los otros. Pero no por ello me voy a rendir sin "luchar". Mi duda "inicial"nace de la ignorancia de cómo se distribuyen las "tareas" internas en cuanto a la "administración" de una red. Sólo he trabajado con ordenadores "personales" ... y lo primero que he hecho siempre es crearme la cuenta de "Administrador", que sabes que por defecto no viene en los últimos Windodows, sino que hay que "crearla". Así que no sé hasta que punto los tres ficheros de que consta el ejercicio son o no correctos e/y/o/ incompletos. Por si acaso te dejo el código inicial con los tres ficheros y ya me dirás donde "patino" y/o que tareas faltan o están de más. Por cierto, además del enunciado he usado tus fotos para lo realizado (ya sé que es casi nada, pero lo primero ........
| Cita: | PD: A quien quiera ver mi entorno de desarrollo (dos fotos):
La primera foto tiene algo de código de la solución que estoy escribiendo . |
| Código: | #include<stdio.h>
int main() { char * pch,linea[80]; /*************************************************************/ FILE* fichero_menu; fichero_menu = fopen("menu.dat", "wt"); fputs("Administracion: ADMINISTRADOR\n", fichero_menu); fputs("Seguridad: GESTOR DE SEGURIDAD\n", fichero_menu); fputs("Contenidos: GESTOR DE CONTENIDOS\n", fichero_menu); fputs("USUARIO", fichero_menu); fclose(fichero_menu); fichero_menu = fopen("menu.dat", "rt"); if (fichero_menu == NULL) { printf("No existe el fichero!\n"); return 1; } while (! feof(fichero_menu)) { fgets(linea, 80, fichero_menu); puts(linea); } fclose(fichero_menu); /*************************************************************/ FILE* fichero_roles; fichero_roles = fopen("users.dat", "wt"); fputs("ADMINISTRADOR:GESTOR DE SEGURIDAD; GESTOR DE CONTENIDOS; MONITOR; USUARIO\n", fichero_roles); fputs("GESTOR DE SEGURIDAD: MONITOR;USUARIO\n", fichero_roles); fputs("GESTOR DE CONTENIDOS: MONITOR; USUARIO\n", fichero_roles); fputs("USUARIO", fichero_roles); fclose(fichero_roles); fichero_roles = fopen("users.dat", "rt"); if (fichero_roles == NULL) { printf("No existe el fichero!\n"); return 1; } while (! feof(fichero_roles)) { fgets(linea, 80, fichero_roles); puts(linea); } fclose(fichero_roles); /*************************************************************/ FILE* fichero_usuarios; fichero_usuarios = fopen("users.dat", "wt"); fputs("leosan/leo ADMINISTRADOR;GESTOR DE SEGURIDAD; GESTOR DE CONTENIDOS\n", fichero_usuarios); fputs("sorancio/sor GESTOR DE SEGURIDAD; MONITOR\n", fichero_usuarios); fputs("pantalaimon/pan GESTOR DE CONTENIDOS;MONITOR\n", fichero_usuarios); fputs("masakre/mas USUARIO", fichero_usuarios); fclose(fichero_usuarios); fichero_usuarios = fopen("users.dat", "rt"); if (fichero_usuarios == NULL) { printf("No existe el fichero!\n"); return 1; } while (! feof(fichero_usuarios)) { fgets(linea, 80, fichero_usuarios); puts(linea); } fclose(fichero_usuarios);
return 0;
}
|
Los ficheros los "escribo" y luego los "leo" para ver si han salido bien. "Inseguridad de un novatillo". Y los "nombres" los he tomado así para que me sea más "familiar". ......... .¡OJO!, que no he tomado el nombre de "Kevin". |
| | Volver arriba | |  | Sorancio

Registrado: 29 May 2009 Mensajes: 1157 Ubicación: España
| Publicado: 11/09/2012 12:06 pm | | | Título: |
| | leosan escribió: | Lo primero, es lo primero. Crear los ficheros, pero .....ni p. idea. Creo que esperas demasiado de nosotros.Este ejercicio es como un salto cuántico respecto de los otros. Pero no por ello me voy a rendir sin "luchar".
|
Realmente el ejercicio son tres. Pero debido a que por separado eran bastante simples, he decidido juntarlos. Por eso he tardado tanto, no sabía como meterlos juntos xD.
Los ficheros te recomiendo que los crees a mano y te dediques a resolver el problema, si no vas a añadir código que sobra al programa.
| leosan escribió: | | Mi duda "inicial"nace de la ignorancia de cómo se distribuyen las "tareas" internas en cuanto a la "administración" de una red. Sólo he trabajado con ordenadores "personales" ... y lo primero que he hecho siempre es crearme la cuenta de "Administrador", que sabes que por defecto no viene en los últimos Windodows, sino que hay que "crearla". |
De la red se ocupa un tío de redes, nosotros somos programadores :). Nah bueno, es relativamente fácil administrar una red simple, pero no es nuestro trabajo.
He utilizado este ejemplo sobre seguridad para tener una ayuda contextual y que veáis por donde van los tiros.
En este ejercicio váis a estar más pensando en qué teneis que hacer más que en cómo hacerlo. Os he dado una ayuda de como separar el código (3 ficheros, 3 módulos, ¿lógico?) para que sea fácil de sobrellevar.
Yo recomiendo crear tres módulos, uno para gestionar los usuarios (leerlos, hacer el login), este depende lógicamente de otro módulo: el de roles. El de roles se encargará de:
1) Leer el fichero y cargar los roles procesados en memoria. Es muy recomendable usar una estructura, la mía es:
| Código: | struct role { char *name; struct role **childs; unsigned int child_count; }; |
Aunque cualquiera puede crear la suya.
2) Verificar que dado un rol que exista, este tiene en herencia (es padre de) otro rol. Por ejemplo, el rol de ADMINISTRADOR tendrá los roles de USUARIO porque un ADMINISTRADOR hereda todo del USUARIO.
Luego tendremos el módulo de menú que depende tanto de usuarios como de roles (este último indirectamente).
Separa el código y luego crea el último módulo (el 4º) que mezclará los otros 3 y será realmente el programa, pero si lo piensas bien, con los otros tres problemas ya resueltos y sólo tendrás que mezclar lo necesario.
Entonces, habrás visto como se programa algo ya tirando para "real".
Como este programa es más complejo que los demás porque requiere más conocimientos, además del foro abro canal a que se me envien preguntas por correo o mensaje privado por el foro.
Mi correo es:
¡A pasárselo bien! _________________ Mi página web (en inglés): |
| | Volver arriba | |  | | leosan
Registrado: 19 Abr 2012 Mensajes: 730 Ubicación: GRAN CANARIA
| Publicado: 13/09/2012 6:37 am | | | Título: |
| [quote="Sorancio"]| leosan escribió: | Lo primero, es lo primero. Crear los ficheros, pero .....ni p. idea. Creo que esperas demasiado de nosotros.Este ejercicio es como un salto cuántico respecto de los otros. Pero no por ello me voy a rendir sin "luchar".
|
He creado "un" fichero", usuarios, donde he introducido con una estructura "todo": usuario, password y los distintos roles. Luego uso dicha estructura y fichero para : 1º preguntar por usuario. 2º si es correcto, preguntar password. 3º si es correcto imprimir roles correspondientes. Aún me queda implementar si no son correctos que hacer ( preguntar por otro usuario o salir), caso de que sea el administrdor si desea introducir algún usuario,etc. No he usado arboles porque aún tengo que verlos mejor, bastante he hecho con crear un fichero a partir de una estructura, y eso gracias a un post que ví, que si no ni de coña se me ocurre a mí sólo. Pero supongo que así se va aprendiendo. Pero para que vayas viendo algo, aquí está el código por ahora:
| Código: | #include <stdio.h> #include <stdlib.h> #include <string.h> struct users { char usuario[10]; char password [10]; char rol1 [40]; char rol2 [40]; char rol3 [40]; char rol4 [40]; }; int main() { char usuario_[10],password_[10]; /**/puts ("Ingrese su nombre de usuario (Enter para SALIR):"); gets (usuario_); struct users *usuarios;
usuarios = (struct users*)malloc (sizeof(struct users)); FILE *fil_users; fil_users = fopen("usuarios.dat", "r+b"); if(!fil_users) fil_users = fopen("usuarios.dat", "w+b"); rewind(fil_users); while (fread(usuarios, sizeof *usuarios, 1, fil_users)) if (strcmp( usuario_, usuarios->usuario)==0) /*printf("\t%s ",usuario_);*/ { puts ("Ingrese su password (Enter para SALIR):"); gets (password_); rewind(fil_users); while (fread(usuarios, sizeof *usuarios, 1, fil_users)) if (strcmp( password_, usuarios->password)==0) { /*printf("\t%s ",password_);*/ printf("%s %s %s %s %s\n", usuarios->rol1, usuarios->rol2, usuarios->rol3,usuarios->rol4); } } fclose(fil_users); return 0; } |
El código de creación del fichero está aparte. Igual si adelantas "algo" de tu código puedo encaminarme mejor. Chaito! |
| | Volver arriba | |  | Sorancio

Registrado: 29 May 2009 Mensajes: 1157 Ubicación: España
| Publicado: 15/09/2012 2:12 am | | | Título: |
| Hasta el lunes no voy a dar código porque realmente el programa es sencillo, no deberías tener problemas. Estoy seguro de que si te dejo usar fscanf irías mejor.
Tienes que pensar en diversas cosas:
1) ¿El usuario tiene una cantidad máxima de roles? p1.0) Sí, es igual a la cantidad de roles que existen. p.1.1) No, la cantidad es infinita.
Entonces sabiendo eso deberás elegir una estructura para guardar los datos u otra.
Sobre tu código:
| Código: | struct users { char usuario[10]; char password [10]; char rol1 [40]; char rol2 [40]; char rol3 [40]; char rol4 [40]; };
|
Por joder (no te lo tomes a mal, es broma) te pondré en el archivo 5 roles, ¿qué harás?. No está mal poner límites (Java para la herencia tiene sólo 1 clase, por poner un ejemplo) pero, ¿y si superan el límite?. ¿Lo controlas? :)
En C lo más complicado es la gestión de errores.
Piensa, además, que nosotros no estamos leyendo una estructura (C guardará esa estructura en binario tal como lo haces). Estamos leyendo un fichero en que tenemos datos y tenemos que deserializarlos a una estructura en C.
Como si fuese un archivo XML pero muchísimo más sencillo.
Como hoy me he levantado con buen pie, daré las estructuras con las que quiero que hagais el trabajo :). Podéis hacerlo de otra manera, pero es una ayudita.
| Código: | struct generic_list { void *value; struct generic_list *next; };
struct role { char *name; struct generic_list *child_roles; };
struct user { char *name; char *password; struct generic_list *roles; };
struct menu_item { char *description; struct generic_list *access_roles; }; |
Si te fijas, son 4 (eran 3 programas :), la generic_list la compartían todos). _________________ Mi página web (en inglés): |
| | Volver arriba | |  | leosan
Registrado: 19 Abr 2012 Mensajes: 730 Ubicación: GRAN CANARIA
| Publicado: 26/09/2012 5:38 am | | | Título: |
| SORANCIO, ¿DÓNDE ESTÁS?
| Sorancio escribió: | Como hoy me he levantado con buen pie, daré las estructuras con las que quiero que hagais el trabajo . Podéis hacerlo de otra manera, pero es una ayudita.
| Código: | struct generic_list { void *value; struct generic_list *next; };
struct role { char *name; struct generic_list *child_roles; };
struct user { char *name; char *password; struct generic_list *roles; };
struct menu_item { char *description; struct generic_list *access_roles; }; |
|
Estoy bloqueado, sé manejar punteros a estructuras pero no punteros dentro de estructuras. No sé como hacer referencias a ellos. ¿podrías adelantar una de ellas o indicarme cómo es su uso?. Y no creas que me he olvidado, he buscado en libros e Internet, pero nada. Saludos! |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |