elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  Mostrar Mensajes
Páginas: [1] 2
1  Programación / Programación C/C++ / Re: Manejo de Señales en Linux en: 17 Agosto 2010, 12:58 pm
Me estoy haciendo un lio de cojones. A ver:

Código:
    //Declaración de señales
        //Declaramos una estructua action y un handler info
        struct sigaction action;
        void info();
        //Inicializamos la nueva estructura a cero
        sigemptyset(&newmask);
        //Asignamos el bit correspondiente a KILL_CHILD
        sigaadset(&newmask,KILL_CHILD);
        //Asignamos SIG_KILL y la bloqueamos
        sigpromask(SIG_BLOCK,&newmask,&oldmask);
       
        action.sa_flags=0;
        action.sa_handler=info;
        //
            if (sigaction(KILL_CHILD, &action, NULL) == -1)
            {
                printf("Sistema operativo cerrando");
                exit(0);
            }
       

Todo esto es para que cuando llegue la señal KILL_CHILD el proceso muera no??
 
2  Programación / Programación C/C++ / Re: Manejo de Señales en Linux en: 17 Agosto 2010, 01:07 am
Tiene buena pinta y contiene todas las funciones. Mañana le echo un vistazo que me voy a sobar ahora. Lo único malo esque es otra vez un montón de tecnicismos, a ver si alguien me lo puede explicar en pocas palabras.
 Mil gracias Grok
3  Programación / Programación C/C++ / Re: eliminar ancestros de hojas arbol binario c++ en: 17 Agosto 2010, 00:35 am
Por si te interesa esto es un programita de manejo básico de arboles binarios. Es una chorrada pero esta bien para entender el manejo y la estructura.

En mi humilde opinión, me parece que eso de poner 8 return es un desfase. Mucho más facil es usar un doble puntero, porque esa función es pequeña pero me pones una fucnión de 300 lineas con 20 return y ni me leo el código. Algnos diran que soy un purista pesado, pero digo yo que si se creo la programación estructurada no sería para decorar o por aburrimiento.
Otra cosa es que los // o /* */ sirve para poner comentarios, una cosa que la gente agradece cuando el programa no es suyo.

Un saludo

Código
  1. //Cabeceres de precompilación o librerias
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. //Estructuras globales
  7. typedef struct arbol{
  8. char DNI[10];
  9. char Nombre[20];
  10. float nota;
  11. struct arbol *izq;
  12. struct arbol *der;
  13. }T_ARBOL;
  14.  
  15.  
  16.  
  17.  
  18. //Funciones
  19. void Menu (int *op);
  20. void Crear_nodo (T_ARBOL **nodo,T_ARBOL Dato);
  21. void Insertar_nodo (T_ARBOL **nodo,T_ARBOL Dato);
  22. void Limpiar_cadena (char *cadena, int n);
  23. void visualizar (T_ARBOL *nodo);
  24. void preorden (T_ARBOL *nodo);
  25. void inorden (T_ARBOL *nodo);
  26. void postorden (T_ARBOL *nodo);
  27. T_ARBOL *Buscar(T_ARBOL *nodo,char *clave,T_ARBOL **POS);
  28. void Eliminar_nodo (T_ARBOL **nodo,char *clave);
  29. void Desconectar12 (T_ARBOL **nodo,T_ARBOL *POS,T_ARBOL **PAD);
  30. void Desconectar3 (T_ARBOL **nodo,T_ARBOL *POS,T_ARBOL **PAD);
  31.  
  32. /*************************************************
  33. ********************PRINCIPAL*********************
  34. *************************************************/
  35. int main(void)
  36. {
  37. //ENTORNO
  38. int op;
  39. T_ARBOL *raiz;
  40. T_ARBOL Info;
  41. char clave[20];
  42.  
  43. //INICIALIZACIONES
  44. raiz=NULL;
  45. op=0;
  46.  
  47. //ALGORITMO
  48.  
  49. system("title Practica 8: Arboles");
  50.  
  51.  
  52. do{
  53. printf("\n ");
  54. system("pause");
  55. system("cls");
  56. Menu(&op);
  57.  
  58. system("cls");
  59.  
  60. switch(op)
  61. {
  62. case 1://Introducir alumno
  63. printf("\t\n Nombre: ");
  64. fflush(stdin);    
  65. fgets(Info.Nombre,20,stdin);
  66. Limpiar_cadena(Info.Nombre,20);
  67. printf("\t\n DNI: ");
  68. fflush(stdin);    
  69. fgets(Info.DNI,10,stdin);
  70. Limpiar_cadena(Info.DNI,10);
  71. printf("\t\n Nota: ");
  72. scanf("%f",&Info.nota);
  73.  
  74.  
  75. Insertar_nodo(&raiz,Info);
  76.  
  77.  
  78. break;
  79. case 2://Eliminar alumno
  80.  
  81. if(raiz!=NULL)
  82. {
  83. printf("\t\n Introduzca el nombre del alumno a borrar: ");
  84. fflush(stdin);    
  85. fgets(clave,20,stdin);
  86. Limpiar_cadena(clave,20);
  87.  
  88. Eliminar_nodo(&raiz,clave);
  89. }
  90. else
  91. {
  92. printf("\t\n El arbol est%c vac%co",160,161);
  93. }
  94.  
  95.  
  96. break;
  97. case 3://Preorden
  98. if(raiz!=NULL)
  99. {
  100. preorden(raiz);
  101. }
  102. else
  103. {
  104. printf("\t\n El arbol est%c vac%co",160,161);
  105. }
  106. break;
  107. case 4://Inorden
  108. if(raiz!=NULL)
  109. {
  110. inorden(raiz);
  111. }
  112. else
  113. {
  114. printf("\t\n El arbol est%c vac%co",160,161);
  115. }
  116. break;
  117. case 5://Postorden
  118. if(raiz!=NULL)
  119. {
  120. postorden(raiz);
  121. }
  122. else
  123. {
  124. printf("\t\n El arbol est%c vac%co",160,161);
  125. }
  126. break;
  127. case 6://Salir
  128. printf("\t\n Gracias por usar este programa ");
  129.  
  130. break;
  131.  
  132. }//Fin Switch
  133. }while(op!=6);
  134.  
  135. // Valor devuelto por el programa en caso de funcionamiento correcto.
  136. return(0);
  137. }
  138. /*************************************************
  139. ********************FUNCIONES ********************
  140. *************************************************/
  141. void Menu(int *op)
  142. {
  143. do{
  144. printf("\t\n  *** GESTI%cN DE NOTAS DE ALUMNOS ",162);
  145. printf("\t\n1.A%cadir alumno(nodo) ",164);
  146. printf("\t\n2.Eliminar alumno(nodo) ");
  147. printf("\t\n3.Mostrar datos de alumnos en preorden ");
  148. printf("\t\n4.Mostrar datos de alumnos en inorden ");
  149. printf("\t\n5.Mostrar datos de alumnos en posorden ");
  150. printf("\t\n6.Salir ");
  151. printf("\t\n     Opci%cn: ",162);
  152. scanf("%d",&*op);
  153. }while(*op>6);
  154.  
  155. return;
  156. }
  157.  
  158.  
  159.  
  160. //CREACIÓN DE UN NODO
  161.  
  162. void Crear_nodo(T_ARBOL **nodo,T_ARBOL Dato)
  163. {
  164. //ENTORNO
  165.  
  166. //ALGORITMO
  167.  
  168. //Pedir memoria
  169. (*nodo)=(T_ARBOL*)calloc(1,sizeof(T_ARBOL));
  170. if((*nodo)==NULL)//Control de errores
  171. {
  172. printf("\n\t Error al pedir memoria ");
  173. }
  174. else
  175. {
  176.  
  177. //Copiar datos al elemento
  178. strcpy((*nodo)->Nombre,Dato.Nombre);
  179. strcpy((*nodo)->DNI,Dato.DNI);
  180. (*nodo)->nota=Dato.nota;
  181.  
  182. //Crearmos los punteros a futuros hijos
  183. (*nodo)->izq=NULL;
  184. (*nodo)->der=NULL;
  185.  
  186.  
  187. }
  188. return;
  189. }
  190.  
  191. //INSERTAR RECURSIVA
  192.  
  193. void Insertar_nodo(T_ARBOL **nodo,T_ARBOL Dato)
  194. {
  195.  
  196. if(*nodo==NULL)
  197. {
  198. Crear_nodo(&(*nodo),Dato);
  199.  
  200. }
  201. else
  202. {
  203. if(strcmp((*nodo)->Nombre,Dato.Nombre)==0)
  204. {
  205. printf("\t\n El elemento ya existe ");
  206. }
  207. else
  208. {
  209. if(strcmp((*nodo)->Nombre,Dato.Nombre)>0)//Izquierda
  210. {
  211. Insertar_nodo(&(*nodo)->izq,Dato);
  212. }
  213. else//Derecha
  214. {
  215. Insertar_nodo(&(*nodo)->der,Dato);
  216. }
  217. }
  218. }
  219. return;
  220. }
  221.  
  222. void visualizar(T_ARBOL *nodo)
  223. {
  224. printf("\t\n ");
  225. printf(" Nombre: ");
  226. puts(nodo->Nombre);
  227. printf(" DNI: ");
  228. puts(nodo->DNI);
  229. printf(" Nota: %f ",nodo->nota);
  230. printf("\t\n ");
  231. return;
  232. }
  233.  
  234. void preorden(T_ARBOL *nodo)
  235. {
  236.  if (nodo != NULL) {
  237.    visualizar(nodo);
  238.    preorden(nodo->izq);
  239.    preorden(nodo->der);
  240.  }
  241. }
  242.  
  243. void inorden(T_ARBOL *nodo)
  244. {
  245.  if (nodo != NULL) {
  246.    inorden(nodo->izq);
  247.    visualizar(nodo);
  248.    inorden(nodo->der);
  249.  }
  250. }
  251.  
  252. void postorden(T_ARBOL *nodo)
  253. {
  254.  if (nodo != NULL) {
  255.    postorden(nodo->izq);
  256.    postorden(nodo->der);
  257.    visualizar(nodo);
  258.  }
  259. }
  260.  
  261.  
  262.  
  263. T_ARBOL *Buscar(T_ARBOL *nodo,char *clave,T_ARBOL **PAD)
  264. {
  265. //ENTORNO
  266. T_ARBOL *POS;
  267. int sw;
  268.  
  269.  
  270. //INICIALIZACIONES
  271. POS=nodo;
  272. PAD=NULL;
  273. sw=0;
  274. //ALGORITMO
  275. while(sw!=1 && POS!=NULL)
  276. {
  277. //Encontrado
  278. if(strcmp(POS->Nombre,clave)==0)
  279. {
  280. sw=1;
  281. }
  282. //Seguimos buscando
  283. else
  284. {
  285. (*PAD)=POS;
  286. if(strcmp(POS->Nombre,clave)<0)
  287. POS=POS->der;
  288. else
  289. POS=POS->izq;
  290. }
  291. }
  292.  
  293. return(POS);
  294. }
  295.  
  296.  
  297. void Eliminar_nodo(T_ARBOL **nodo,char *clave)
  298. {
  299. T_ARBOL *PAD;
  300. T_ARBOL *POS;
  301.  
  302. //Buscar el elemento a borrar
  303. POS=Buscar((*nodo),clave,&PAD);
  304. if(POS==NULL)
  305. printf("\n No encontrado");
  306. else
  307. {
  308. //En caso de que tenga 2 hijos
  309. if(POS->izq!=NULL && POS->der!=NULL)
  310. {
  311. Desconectar3(&(*nodo),POS,&PAD);
  312. }
  313. //Si no tiene o solo tiene 1 hijo.
  314. else
  315. {
  316. Desconectar12(&(*nodo),POS,&PAD);
  317. }
  318. //Liberamos la memoria
  319. free(POS);
  320. }
  321. return;
  322. }
  323.  
  324. void Desconectar12(T_ARBOL **nodo,T_ARBOL *POS,T_ARBOL **PAD)
  325. {
  326.  
  327. T_ARBOL *HIJO;
  328.  
  329. //No tiene hijos
  330. if(POS->izq==NULL && POS->der==NULL)
  331. {
  332. HIJO=NULL;
  333. }
  334. //Tiene 1 hijo
  335. else
  336. {
  337. if(POS->izq==NULL)
  338. HIJO=POS->der;
  339. else
  340. HIJO=POS->izq;
  341. }
  342. //El nodo a eliminar es la raiz
  343. if((*PAD)==NULL)
  344. {
  345. *nodo=HIJO;
  346. }
  347. else
  348. {
  349. if(POS==(*PAD)->izq)//ERROR
  350. (*PAD)->izq=HIJO;
  351. else
  352. (*PAD)->der=HIJO;
  353.  
  354. }
  355.  
  356.  
  357.  
  358. return;
  359. }
  360.  
  361. void Desconectar3(T_ARBOL **nodo,T_ARBOL *POS,T_ARBOL **PAD)
  362. {
  363. //ENTORNO
  364. T_ARBOL *SIG;
  365. T_ARBOL *PADSIG;
  366.  
  367. //INICIALIZACIONES
  368. PADSIG=POS;
  369. SIG=POS->der;
  370. //ALGORITMO
  371. //Buscar el siguiente en INORDEN
  372. while(SIG->izq !=NULL)
  373. {
  374. PADSIG=SIG;
  375. SIG=SIG->izq;
  376. }
  377. //Desconectarlo
  378. Desconectar12(&(*nodo),SIG,&PADSIG);
  379. //Borrarlo
  380. if(PAD==NULL)
  381. (*nodo)=SIG;
  382. else
  383. {
  384. if(POS==(*PAD)->izq)
  385. (*PAD)->izq=SIG;
  386. else
  387. (*PAD)->der=SIG;
  388. }
  389. SIG->izq=POS->izq;
  390. SIG->der=POS->der;
  391.  
  392. return;
  393. }
  394.  
  395.  
  396. void Limpiar_cadena(char *cadena, int n)
  397. {
  398.    // Variable local.
  399.    int i;
  400.  
  401.    // Sustituimos el \n por un \0.
  402.    i=0;
  403.    while(cadena[i]!='\n' && i<n-1)
  404.    {
  405.        i++;
  406.    }
  407.    cadena[i]='\0';
  408.  
  409.  
  410.    return;
  411. }
  412.  
  413.  
  414.  
4  Programación / Programación C/C++ / Manejo de Señales en Linux(resuelto) en: 17 Agosto 2010, 00:15 am
Hola todo el mundo,
me he estado machacando buscando información sobre señales por google, pero lo que encuentro esta siempre a medias y no me explica como usar las señales y sus funcione.

Basicamente lo que me gustaria saber es que hacen y como se usan ciertas señales en c.
La funciones que tengo que usar son:
1-sigqueue (no me queda claro para que sirve la variable sig).
2-sigaction ( he leido que se pueden enviar datos con esta, aunque tampoco entiendo como)
3-sigwaitinfo(entiendo que es para esperar la señal pero la variables nose como se usan).
4-sigemptyset ( Para que sirven los sets?)
5-sigaddset
6-sigprocmask (Para que sirven la mascaras?)

También he visto que para usar ciertas variables de las funciones se han de declarar estructuras he inicializar no se que cosas.
Llevo toda la tarde leyendo paginas con ejemplos raros que no hacen nada y no encuentro nada que tenga una función util o que explique como se usa de verdad cada función. Espero que alguien tenga un momento para explicarme como funcionan, aunque sean algunas, o por lo menos recomendarme alguna página donde tengan información sobre como se usan.

Para lo que necesito estas funciones es para comunicar dos procesos, el main con un hijo creado con fork y ejecutando execlp para ejecutar al hijo. Solo necesito enviar una variable al otro proceso y matarlo cuando transcurra un tiempo.

Espero que alguién me pueda echar un cable, si hace falta mas información estare pendiente del post así que diganme y lo cuelgo cuanto antes.

Un saludo
5  Programación / Programación C/C++ / Re: Entrada de datos desde consola y validación.[Segmentation fault] en: 12 Mayo 2010, 18:23 pm
Ya, si me he fijado que estan pinchados, no se en que estaría pensando al ponerlos. Encima llevo algo de tiempo haciendo la practica y como la dejo todo el rato. Nunca me acuerdo de lo que he hecho, encima tenía 3 copias y ya ni se cual es cual XD.

Gracias a tu tiempo ya lo veo más claro, menos mal que te has dado cuenta tú porque yo me hubiese tirado 3 días frustado.

Luego le dedico algo de tiempo que ahorame estoy peleando con una de arboles que es para mañana y las funciones me las da predefinidas.


 Muchas gracias otra vez :)
6  Programación / Programación C/C++ / Re: Entrada de datos desde consola y validación.[Segmentation fault] en: 12 Mayo 2010, 18:04 pm
Vale eres el puto amo!
Me acabo de bajar dos IDE el KDevelop 4 y Anjuta IDE, los voy a probar ahora a ver que tal me va.
Mucha gracias tio, me has alegrado el día :D

Edito:

Me da que le queda un buen trabajo, porque lo que es funcionar no funciona del todo bien XD. En todo caso visto que estoy cogiendo los valores de sitios erroneos pues tendre más cuidado.

Por cierto si alguien, sabe manejar el asunto del fork() no vendría nada mal un par de consejos :)
7  Programación / Programación C/C++ / Entrada de datos desde consola y validación.[Segmentation fault](Resuelto) en: 12 Mayo 2010, 17:36 pm
Hola todo el mundo, llevo rato intentado hacer una practica estupida pero soy incapaza de realizarla de forma que funcione correctamente.
Mi principal problema es que tengo que implementarlo para linux y la entrada de datos es por main, o sea usando ./sim.exe "datos".
Se me compila perfectamente, pero al quere ejecutarlo me tira de error de segmentación.

Sospecho que el problema es la validación de la variable tiempo, o su extracción de la cadena, pero ya no se como modificar el código para que corra correctamente.

Se que pido mucho ya que es un coñazo mirar el código de otra persona e intentar entenderlo, pero lo he blindado con comentarios espero que eso ayuda.

Si se os ocurre cualquier cosa, os lo agradecería mil veces.

Código
  1. /***********************************************
  2. Nombre: Simulador
  3. Descripción: Primera parte de la creación de un simulador
  4. de sistema operativo RR.
  5. Fecha:13-01-09
  6. Autor:Bruno Kröller da Silva
  7. ************************************************/
  8.  
  9. // Cabecera de librerías
  10. #include <stdio.h> // Uso de printf,...
  11. #include <stdlib.h> //Uso de atoi,...
  12. #include <unistd.h> //Uso de waitpid,...
  13. #include <sys/types.h> // Uso de rand,...
  14. #include <string.h> // Uso de
  15.  
  16. //VARIABLES GLOBALES
  17. #define N_MAX 15
  18. #define T_MAX 30
  19. #define T_MIN 5
  20. //FUNCIONES
  21. int hijos(int n_maximo,int quantum,int tiempo);
  22.  
  23.  
  24.  
  25. // Función main que recive parametros de entrada
  26. int main (int argc, char *argv[])
  27. {
  28.  
  29. // Variables de entorno.
  30. int resultado; // 0 error 1 correcto
  31. int tiempo;
  32. int n_maximo;
  33. int quantum;
  34.  
  35. //Valores predefinidos de las variables.
  36. n_maximo=5;
  37. quantum=80;
  38. resultado=0;
  39. /*
  40. Controlamos que el número de argumentos sea correcto, en caso contrario
  41. no empezamos a ejecutar las funciones principales.
  42. */
  43. if(argc==1 || argc==3 || argc==5 || argc>6)
  44. {
  45.  
  46. printf("\t\n Error, el formato es n p m q t");
  47.  
  48.  
  49. }
  50. else
  51. {
  52. /*
  53. Si entran dos argumentos, nombre + tiempo
  54. */
  55.  
  56.  
  57. if(argc==2)
  58. {
  59. tiempo=atoi(argv[2]);
  60.  
  61. if(1<=tiempo<=120)
  62. {
  63. resultado=1;
  64. }
  65.  
  66.  
  67. }
  68. /*
  69. Si entran 4 argumentos, nombre+ numero+ p + tiempo o nombre+ quantum+ q + tiempo
  70. */
  71. else if(argc==4)
  72. {
  73. tiempo=atoi(argv[4]);
  74. if(*argv[2]=='p' && 1<=tiempo<=120)
  75. {
  76. n_maximo=atoi(argv[1]);
  77. resultado=1;
  78. }
  79. if(*argv[2]=='q' && 1<=tiempo<=120)
  80. {
  81. quantum=atoi(argv[1]);
  82. resultado=1;
  83. }
  84.  
  85.  
  86. }
  87. /*
  88. Si entran6argumentos, nombre+ numero+ p+ quantum+ q + tiempo
  89. */
  90. else if(argc==6)
  91. {
  92. tiempo=atoi(argv[6]);
  93.  
  94. if(*argv[2]=='p' && *argv[4]=='q' && 1<=tiempo<=120)
  95. {
  96.  
  97. n_maximo=atoi(argv[1]);
  98. quantum=atoi(argv[3]);
  99. resultado=1;
  100.  
  101. }
  102.  
  103. }
  104. // SAlIDA DEl PROGRAMA
  105. if(resultado==1)
  106. {
  107. printf("\t\n Simulador: ");
  108. printf("\t\n       Numero maximo de programas: %d ",n_maximo);
  109. printf("\t\n       Quantum : %d",quantum);
  110. printf("\t\n       Tiempo de ejecución: %d ",tiempo);
  111. }
  112. else
  113. {
  114. printf("\t\n Error al introducir los parametros:");
  115. printf("\t\n [numero_prog] [p] [quantum] [q] [tiempo] ");
  116. }
  117.  
  118. }
  119.  
  120. return 0;
  121. }
  122. int hijos(int n_maximo,int quantum,int tiempo)
  123. {
  124. int error; // 1 correcto, 0 error.
  125. pid_t pid_h; // Variable donde almacenaremos el pid del hijo
  126. int numero;
  127. int i;
  128. int tiempo_max;
  129. //INICIALIZACIÓN DE VALORES
  130. i=0;
  131. error=1;
  132.  
  133. /*
  134. LANZAMIENTO DEL SISTEMA OPERATIVO
  135. */
  136. //Creamos un hijo
  137. pid_t fork();
  138. //Pedimos que nos diga su pid
  139. pid_h=getpid();
  140. //Comprobamos que el hijo se ha creado
  141. if(pid_h==-1)
  142. {
  143. error=0;
  144. }
  145. else
  146. {
  147. //Ejecutado por el padre
  148. if(pid_h!=0)
  149. {
  150. waitpid(pid_h,NULL,0);
  151. }
  152. //Ejecutado por el hijo
  153. else
  154. {
  155. //Ejecutar el S.O.
  156.  
  157. //Aquí termina el hijo
  158. exit(0);
  159. }
  160. }
  161. /*
  162. LANZAMIENTO DE LA TEMPORIZACIÓN.
  163. */
  164. //Creamos un hijo
  165. pid_t fork();
  166. //Pedimos que nos diga su pid
  167. pid_h=getpid();
  168. //Comprobamos que el hijo se ha creado
  169. if(pid_h==-1)
  170. {
  171. error=0;
  172. }
  173. else
  174. {
  175. //Ejecutado por el padre
  176. if(pid_h!=0)
  177. {
  178. waitpid(pid_h,NULL,0);
  179. }
  180. //Ejecutado por el hijo
  181. else
  182. {
  183. sleep(tiempo);
  184. printf("\t\n Temporizador: Finalizado el tiempo de simulación ");
  185. //Aquí termina el hijo
  186. exit(0);
  187. }
  188. }
  189. /*
  190. LANZAMIENTO DE LA TEMPORIZACIÓN.
  191. */
  192. //CREARCIÓN DE LOS 10 HIJOS
  193.  
  194. while(i<10)
  195. {
  196.  
  197. srand(time(0));
  198. //Generamos un numero no mayor que N_MAX
  199. //Le sumamos 1 para que empiece en 1.
  200. numero=1+rand()%(N_MAX);
  201. //Generamos el tiempo de espera de cada hijo.
  202. //Crea números en un intervalo de 5 a 30.
  203. tiempo_max=5+rand()%21;
  204. //Tiempo de espera para crear el siguiente hijo.
  205. sleep(numero);
  206. //CREAR HIJO
  207. pid_t fork();
  208.  
  209. }
  210. pid_h=getpid();
  211. if(pid_h==0)
  212. {
  213. sleep(tiempo_max);
  214. printf("\n\t Simulador: Lanzando programa- Tiempo ejecución %d ",tiempo_max);
  215. exit(0);
  216. }
  217. //El padre espera a que todos los hijos mueran.
  218. wait();
  219.  
  220. return(error);
  221. }
  222.  
  223.  
  224.  
  225. /*
  226. CHULETA DE VARIABLES
  227.  
  228. Valores mínimos y máximos de:
  229.  mínimo  máximo
  230. Tiempo : 1 120
  231. Quantum : 20 200
  232. Programas : 1 5
  233.  
  234. numero esta entre [1,30]
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241. */
  242.  
  243.  
  244.  
8  Programación / Programación C/C++ / Re: Pregunta sobre pid_t fork(); y el hijo creado. en: 29 Abril 2010, 17:46 pm
Mil gracias darkraider, entonces tendre que hacer un par de cambios.

Un saludo
9  Programación / Programación C/C++ / Re: Sacar decimales al Número PI en: 29 Abril 2010, 17:32 pm
Fuente: http://stackoverflow.com/questions/19/fastest-way-to-get-value-of-pi (La página está en ingles.

El código fuente esta colgado en la página esa.

Este es otro método que converge rápidamente (~ 14digits por iteración), la aplicación actual es más rápido PiFast utiliza esta fórmula con la FFT. Voy a escribir la fórmula, ya que el código es muy sencillo. Esta fórmula la encontró  Ramanujan y fue descubierto por Chudnovsky. Es como logro calcular varios miles de millones dígitos del número de - por lo que  es un método a tener en cuenta. La fórmula se desbordará rápidamente, ya que estamos dividiendo factoriales, sería ventajoso para el cálculo de dicha demora para eliminar términos.



k1 = 545140134; k2 = 13591409; k3 = 640320; k4 = 100100025; k5 = 327843840; k6 = 53360;

A continuación se muestra el algoritmo de Brent-Salamín. Wikipedia dice que cuando a y b son "lo suficientemente cerca" entonces (a + b) ^ 2/4t será una aproximación de pi. No estoy seguro de lo que significa "lo suficientemente cerca", sino de mis pruebas, una iteración tiene 2 dígitos, dos tienen 7, y tres tenían 15, por supuesto, esto es con habitaciones dobles, por lo que podría error han basado en su representación y el ' verdadero 'cálculo podría ser
más exactos.

Es solo una alternativa a lo que han dicho.

Un saludo
10  Programación / Programación C/C++ / Re: Ordenamiento burbuja en: 29 Abril 2010, 17:13 pm
Yo te recomendarías dos cosas para empezar: tabula y pon comentarios. Porque el código tal cual esta es incomprensible.
Antes de preguntas, por qué no usas el debuger, aprenderas más que si te resuelven otros las dudas simples.
En todo caso como dice biribau no te hace falta ordenar y en este caso no deberías ordenador es totalmente ilógico y sobrecargas el programa para nada.

Lo que tienes que hacer es coger un papel y plantearte el problema. Necesitas saber cual es la nota maxima. Pues como te ha dicho biribau :
Citar
cada vez que te entreguen un numero mayor actualizas el máximo, ya está, porque si algo es mayor que el máximo es que es el máximo. Problema: necesitas un numero mínimo(para inicializar máximo), esto a veces puede suponer un problema, a veces se coge -infinito o MIN_INT, en tu caso ya sabes cual es el mínimo posible, 0.


Después de insertar los datos en el vector con el primer for. Haz otro for igual y dentro pregunta si el dato que esta en MAX es mejor que el del vector, si es el caso cambia, sino pues que siga.
NOTA:No hace falta un mínimo para eso, tan solo inicialo con el primer valor del vector.



Una burbuja en speudocódigo

Citar
COMIENZO Burbuja

Entorno:

 p,n,i son enteros
 vector[n] es alfanumerico{vector}
Algoritmo:
 
 para
p<-1 a n-1 hacer {en c seria i<-0}
   para i<-1 a n-1 hacer
     si vector>vector[i+1]
        entonces
        aux<-v
        vector<-vector[i+1]
        vector[i+1]<-aux
    fin_si
   fin_para
 fin_para

FIN_BURBUJA

Esto es la estructura de una burbuja.


Un saludo
Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines