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ú

Temas - SDCC

#1
Hola a todos, resulta que tenía la duda de si era necesario ajustar el socket para que fuera no bloqueante antes de suscribirlo a una llamada select. Buscandome me encontre con esto:
https://stackoverflow.com/questions/16628743/should-socket-be-set-non-blocking-before-it-is-polled-by-select

Me queda claro la razón por la cual debe ser no bloqueante pero realmente vale la pena seguir ese consejo, al menos en el caso de conexiones TCP. Es decir:

Yo tengo un select a la espera de que varias conexiones TCP esten listas para ser leidas, me surte el problema de que se me notifica de que el socket esta listo para lectura, entonces prosigo a intentar hacer la lectura con el respectivo método, sin tener conocimiento de que fue un fallo y el contenido fue descartado por algo como que fallo el checksum(situación que menciona la respuesta del link), esto me va ocasionar distintos comportamientos dependiendo si el socket es bloqueante...
1. Si es bloqueante, entonces mi hilo estara bloqueada esperando que realmente la conexión tenga información entrante, pero este tiempo bloqueado creo que es aceptable debido a que es TCP, entonces tengo la certeza de que habrá una retransmisión en un rango de tiempo relativamente corto. Sin embargo se podría presentar el mismo problema de que el siguiente envio tuviera el mismo problema, ¿acaso se tiene la seguridad de que el kernel va ser capaz de quitar la información entrante erronea(que no cumplio con el checksum) antes de que la función recv recolecte los datos?, agregando a esta solución si quisiera asegurar que el tiempo de bloquea no sea mayor a N porción de segundo, podria agregar:
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
Al final podría decidir que si pasa el timeout, entonces vuelva a bloquearme en el select.
Nota. Aquí surge una duda de como es que select se da cuenta que un socket esta listo. Puede ser que lo determine conforme solo a si tiene alguna actividad relacionada con el, sin que esto realmente tenga como consecuencia que algo se este poniendo en la cola de entrada, esto respondería la pregunta de por que se notifica como que el socket esta listo cuando realmente no se ha terminado de confirmar la información entrante.

2. Si no es bloqueantes, entonces es cierto que una llamada recv no me bloquearía pero ¿no tendría que hacer todo un mecanismo para asegurarme de recolectar todo el contendio de esa petición?  a través de algo como recibe hasta que no encuentres el final de la respuesta, mientras no encuentres el final de la respuesta repite:

recv(....);
sleep(algunos_milisegundos);

sin embargo me da la sensación de que se degradaría mas el desempeño de la aplicación por ese sleep, debido a que ese hilo no tendría ninguna otra tarea que hacer, seria algo parecido a una espera ocupada deficiente.

Vi una implementación en python que lo hace es suscribir los sockets como NO_BLOQEUANTES al select, posterior a eso cuando se le notifica que alguno esta listo, lo cambia para que sea BLOQUEANTE pero finalmente creo que se llega al mismo problema, realmente es una condición de carrera que en algunos casos puede resultar en lo mismo que si siempre fuera BLOQUEANTE. ¿Alguna alternativa u opinión de cual seria la solución ideal?
#2
Redes / Proxies
6 Febrero 2020, 04:30 AM
He estado siguiendo dos libros basicos de hacking (Black Hat Python y Attacking Networks Protocols) y en ambos llevo rato trabajando en todo lo relacionado principalmente con proxies. He practicado un poco con los ejercicios que contempla principalmente el libro de Python para poder construir mis limitados proxies que simplemente consisten principalmente en un socket que reenvía contenido a su destino únicamente por un puerto. Ademas he estado leyendo un poco sobre la variedad de proxies que existen, como son:

1. Proxies basados en Socks4, 4a y 5
2. Proxies HTTP
3. Forwarding Port( Es el primero que vi y con el que he podrido interactuar más con Python)

Me queda clara la idea de un proxy a grandes rasgos y entiendo un poco las diferencias entre cada uno de manera no muy detallada:

1. Sockes4, 4a, 5. El 5 es muy bueno en el sentido de que ofrece autenticacion por varios mecanismos, se puede adaptar a las aplicaciones sin tanto esfuerzo, etc.
2. Proxies HTTP. Especifico para transmision de datos mediante el protocolo HTTP
3. Forwarding Port. Una instancia de este programa se encarga simplemente de abrir un puerto y reenviar los datos entrantes hacia una dirección destino.

Mi principal problema es cuando intento verlo desde el punto de vista de programación. Es decir:

1. Forwarding Port. A nivel de programación lo puedo ver como un socket TCP o UDP que simplemente se encarga de atender a un único cliente y reenviar lo que le llega a la dirección que se le fue especificada como dirección final. Creo que la principal dificultad es que las aplicaciones que lo utilizan deben tener la opción para especificar la dirección y puerto de destino , ademas que se complica si las peticiones que lanza la aplicación aveces varian de objetivo., haciendo practicamente imposible hacer un proxie casero de esta manera que sea generico y que de paso a transmitir la información sin tener que modificar el programa cliente o el programa que esta utilizando el proxie.

2. Proxie HTTP. Entiendo que es una especie de proxie destinado para tráfico del protocolo HTTP pero no me termina de quedar claro como trabaja. Es decir, yo puedo configurar mi Navegador para que use un Proxie HTTP y el proxy se va encargar de retransmitir toda la comunicación existente pero ¿Como lo hace?. Acaso hay algunas estandar para la construcción de Proxie HTTP entre otros que me diga algo al estilo:
PASOS PARA SINCRONIZAR INICIO ENTRE UN NAVEGADOR Y UN PROXIE HTTP.
1. El navegador se va encargar de crear una conexión al proxie HTTP.
2. Hacen un procedimiento de Handhsake
3. El navegador envia mensajes con un formato HTTP , en donde exista una Cabecera DESTINO_FINAL que tendra la IP hacia donde debe ser enviado ese paquete

NOTA. He visto y como era de esperarse, que el navegador usa varios puertos para despachar las peticiones de paginas que hacen cada pestaña e intuyo que de alguna manera una vez sincronizado el navegador con el proxy deben crear un mecanismo para permitir tener varios SUB_CLIENTES (Pestañas virtuales) para cada navegador,  para que sea posible que si hay 3 pestañas haciendo peticiones desde una misma computadora, entonces el proxy puede generar 3 sockets o conexiones auxiliares para darle seguimiento a cada petición, esto debido a que incialmente el navegador esta enviando peticiones HTTP al servidor como si el fuera el servidor web pero como le dice cual es el verdadero destino para cada petición.

3. Finalmente tengo los proxies SOCK..., he visto que estos los que mas facilmente pueden adaptarse a las aplicaciones de manera génerica y he visto que tienen un estandar al estilo como el inventado de HTTP de unos parrafos arriba. Pero entonces esto me esta implicando que cada aplicación que quiera usar este tipo de proxie debe tener un mecanismo dentro de ella que permita la comunicación con un proxie de este estilo, o es posible que realmente la aplicación siga haciendo las mismas cosas que hace comunmente y jamas sepa que realmente primero se esta comunicando con un proxie SOCK.

Por último solo quiero recalcar que mi principal duda esta en que tan genericos se supone que deben ser los proxies en especifico el SOCK, es decir, en todos los casos la aplicación debe tener una opción para habilitar la comunicación con este tipo de proxies o como se logra que aplicaciones que no soportan estas opciones se puedan adaptar. ¿Se supone que puedo utilizar un proxie Socks para redirigir todo el tráfico que sale de mi interfaz de red, como si a gran nivel tuviera un cliente del proxie que prácticamente dijera SOY EL REPRESENTANTE LOCAL DEL PROXIE Y DE ALGUNA FORMA ESCUCHO TODO LO QUE SALE POR LA INTERFAZ DE RED Y ME ENCARGO DE PASARSELO AL PROXIE Y RETORNAR LAS RESPUESTAS? o ¿ debo ir aplicación por aplicación activando la configuración de proxie para que la aplicación se encargue de individualmente conectar su puerto de salida a la dirección del servido?
#3
Hacking Wireless / ARP Spoofing
4 Febrero 2020, 07:17 AM
Buenas, he estado el funcionamiento del protocolo ARP y me he encontrado con unas de sus vulnerabilidades que es el 'ARP Spoofing'. Mi duda parte de que he visto que la vulnerabilidad se presenta a partir de que el protocolo ARP acepta paquetes REPLY de una resolucion de una dirección aún cuando el no hizo la respectiva REQUEST. ¿ Por qué se da esto ?, ¿ Por que no es posible que solo se acepte resoluciones de direcciones a las cuales se hizo anteriormente un REQUEST?.

A demas he visto que este tipo de ataque se plantea en un entorno en el cual estas conectado a la misma red que el objetivo, intuyo que la primera razón para tener que cumplir con este requisito es que realmente no te puedes poner enmedio del ROUTER y del OBJETIVO por que simplemente no estas autenticado con el ROUTER pero que problemas hay con el OBJETIVO, es decir, yo estoy en un rango físico cercano al ROUTER y al objetivo, hago un ataque de 'ARP Spoofing' con el objetivo y el me reconoce como su router, entonces a partir de este momento el Router enviara correctamente los datos al OBJETIVO pero el objetivo me enviara los datos de su salida a mi y finalmente yo podría enviarlos al destino final por una red auxiliar. ¿Esto es posible o que incovenientes hay?. Finalmente estaria redirigiendo todo el trafico a la red auxiliar pero me gustaria saber en que punto llegaria a un conflicto
#4
GNU/Linux / Fallo en Manejo de Ventanas
27 Enero 2020, 03:26 AM
Hola a todos, resulta que tengo un buen rato intentando instalar Packet Tracer para Debian 10, con la novedad de que en todas las versiones encuentro fallos en dependencias obsoletas, en fin.. Finalmente he probado con la versión 7.2.2 , la cual he podido solucionar una dependencia y me he llevado la sorpresa que al iniciar el programa abre inicialmente dos ventanas:

1. Ventana de Login. Esta se sobrepone a la segunda
2. Ventana del entorno del trabajo.

Hasta aquí todo bien. El problema surge cuando doy el botón para iniciar sesión, dando como resultado una exepción de tipo Floating point exception y provocando el cierre de ambas ventanas. Actualmente no he dado solución con este problema en concreto pero ha manera de curiosidad he intentado matar la ventana de Login que se sobrepone a la ventana de entorno de trabajo sin conseguir ningun resultado al menos con los pocos conocimiento que tengo sobre el x-window-system y el manejo del comando wmctrl, debido a que al matar a la ventana de login, la ventana de trabajo tambien es cerrada.

Sin embargo, he ocasionado en dos situaciones muy aisladas lograr cerrar la ventana de login y permanacer con la ventana del entorno de trabajo abierta. Esto a sucedido cuando por repetidas ocasiones di clic sobre la ventana de trabajo lo que ocasiono que inesperadamente la ventana de login se cerrara y permitiera trabajar en la ventana de trabajo sin ningun problema(Incluso he guardado un archivo). ¿Qué pudo haber ocasionado esto?. No he conseguido determinar que secuencia de acciones me podrían dar como resultado esta reacción pero estoy seguro de que es posible debido a que ya ha sucedido 2 veces.
#5
Scripting / HTTP en Python
12 Noviembre 2019, 23:09 PM
Buenas a todos. Estoy haciendo una aplicación de comunicación remota con sockets y desearia usar el protocolo HTTP para el formato de mis mensajes, el problema es que me gustaria crear un objecto REQUEST y RESPONSE que me ayuden con el agrupamiento de los datos y finalmente que permitan convertir todos los atributos de dicho objeto en su representación cruda, es decir, en una representacion de texto plano.

He visto los objetos RESPONSE y REQUEST del modulo requests de python y al menos he observado que el objeto REQUEST lo podría utilizar para este proposito pero con la única desventaja de que no he encontrado un metodo que me haga la conversion del objeto a su representación de str con formato de petición HTTP.

¿ Alguien sabe donde se encuentra dicho método ? o conoce algun modulo que me presente una abstracción de dichos objetos con lo que requiero.

Divagando un poquito mas sobre el tema...  ¿ El modulo Request debe estar obligado a tener algun sinonimo de dicha función ?. Yo intuyo que dicha funcion debe estar en alguna parte del modulo requests debido a que no habria otra forma de comunicar un REQUEST o un RESPONSE debido a ese modulo no exige a que del otro lado de la comunicación exista un programa usando el mismo modulo en python(caso en el que se podria hacer una serializacion del objeto). ¿ Estoy equivocado o hay algo que estoy ignorado ?

Nota. En ultimo caso sé que podría crear una nueva clase que herede de REQUEST y agregar lo que requiero.
#6
Buenas a todos, estoy haciendo una práctica que simplemente es un servidor que despacha solicitudes de archivos , al estilo de un servidor Apache. Mi problema es que me gustaría que no fuera posible navegar fuera de esa carpeta al estilo de peticiones de archivos "../Otra_carpeta/Archivo_privado" .Si alguién sabe de manera mas detallada como soluciona dicho problema algunos servidores como Apache le agradecería que lo compartiera.

Algunas soluciones que se me ocurrieron fue:

  • 1. Posiblemente la mas sencilla. Crear un nuevo usuario con permisos de lectura solo dentro de la carpeta publica . Aunque en este punto estoy considerando que puedo crear un demonio y dicho demonio va tener los respectivos permisos que su usuario oriden (Corriganme si esto no es así)
  • 2. Usar Incron para generar eventos con referencia a la carpeta publica de manera que el servicio pueda ser notificado de cualquier eliminacion/agregación de un nuevo archivo en la carpeta  para que el servicio pueda tener un conjunto de los archivos disponibles, es decir, aquellos que se encuentran en la carpeta pública. Finalmente con cada petición de un archivo primeramente se verificaria si el recursos esta dentro de este conjunto de archivos disponibles(posiblemente con ayuda de su hash para una busqueda rapida)  
#7
Hardware / Fallo de teclas al encedido de laptop.
29 Octubre 2019, 21:26 PM
Buenas a todos, desde hace unos dias mi laptop ha presentado el problema de que al encender o volver de una suspension , algunas de las teclas no funcionan del todo bien. En la mayoría de los casos lo que ocurre es que algunas teclas aisladas como 'r' y 'i' funcionan bien solo que siempre se agrega un desplazamiento a la izquierda, es decir, como si se pulsara la tecla de '<-' y despues 'i' o 'r'. La laptop no ha tenido ningún accidente al estilo de que haya tenido contacto con el agua o algun otro liquido sin embargo el problema se empezo a presentar desde que empezo a bajar un poco la tempetura en mi ciudad, alrededor de los 12 grados Celsius.

Finalmente el problema se resuelve despues de unos minutos de uso pero el fallo siempre se repite con las mismas teclas 'i'-'r', ademas de que siempre produce el mismo error. ¿ Alguien conoce alguna solución o que lo puede estar causando ?
#8
Redes / Campo Protocolo de cabecera IP.
26 Octubre 2019, 23:34 PM
Buenas a todos, estaba checando las diferencias entre TCP y UDP en la capa de transporte y vi que dichos protocolos estan vinculados a un entero que es colocado en la cabecera del paquete formado en la capa de RED(IP). Observe que existe unos valores destinados para el protocolo IP y IPv6 pero ¿ Cómo esta eso?.

Creo entender que todos los paquetes indepedientemente si son UDP,TCP,etc... Van a caer al protocolo IP en la capa de red y cada uno va asignar un valor entero en el campo de PROTOCOLO en dicha cabecera pero que sentido tiene que dentro de la cabecera IP se de la posibilidad de poner como protocolo IP o IPv6 (El mismo).  ¿ Cuáles son los casos en donde  este campo es asginado como IP O IPv6?
#9
Redes / RPC's y Sockets
22 Octubre 2019, 23:03 PM
Buenas a todos, llevo un lapso de tiempo viendo aplicaciones que hacen uso de sockets y tengo una noción relativamente superficial de los sockets y como es su manejo a nivel de programacion. Mi pregunta va en cuestión de las diferencias con RPC.

He visto y manejado un poco sobre el ONC RPC y su funcionamiento. Vi como principal diferencia la abstracción del llamar una función remota (como su mismo nombre dice) a diferencia de los sockets en donde no se presenta ese tipo de facilidades y todo se hace en un nivel aparentemente mas 'primitivo' .

Mis principales preguntas es...

  • 1. He visto muy poca información de los RPC a comparación de la de los sockets. ¿Los Sockets predominan en uso para comunicación entre procesos remotos?
  • 2. A lo que he visto la abstracción de los RPC permite realizar aplicaciones tal vez mas complejas con un menor esfuerzo a comparacion de los sockets. ¿Esta es su mayor ventaja frente a los sockets?
  • 3 Finalmente en que tipo de aplicaciones se prefiere los RPC frente a los sockets y viceversa
#10
Buenas a todos, encontre un ejemplo del problema de comunicacion en el libro de Tanenbaum que es el siguiente:


#include <stdio.h>
#include <pthread.h>
#define MAX 100
pthread_mutex_t el_mutex;
pthread_cond_t condc,condp;
int buffer = 0;

void *productor(void *ptr){
    int i;
    for(i = 1; i <= MAX;i++){
        pthread_mutex_lock(&el_mutex);
        while(buffer != 0 ) pthread_cond_wait(&condp,&el_mutex);
        printf("Productor....\n");
        buffer = i;
        pthread_cond_signal(&condc);
        pthread_mutex_unlock(&el_mutex);
    }
    pthread_exit(0);
}


void *consumidor(void *ptr){
    int i;
    for(i = 1; i <= MAX;i++){
        pthread_mutex_lock(&el_mutex);
        while(buffer == 0 ) pthread_cond_wait(&condc,&el_mutex);
        printf("Consumidor....\n");
        buffer = 0;
        pthread_cond_signal(&condp);
        pthread_mutex_unlock(&el_mutex);
    }
    pthread_exit(0);

}


int main(){
    pthread_t pro,con;
    pthread_mutex_init(&el_mutex,0);
    pthread_cond_init(&condc,0);
    pthread_cond_init(&condp,0);
    pthread_create(&con,0,consumidor,0);
    pthread_create(&pro,0,productor,0);
    pthread_join(pro,0);
    pthread_join(con,0);
    pthread_cond_destroy(&condc);
    pthread_cond_destroy(&condp);
    pthread_mutex_destroy(&el_mutex);
    return 0;

}


Todo va bien hasta aqui.Mi pregunta es si tiene sentido esta dos lineas:

        while(buffer != 0 ) pthread_cond_wait(&condp,&el_mutex);



        while(buffer == 0 ) pthread_cond_wait(&condc,&el_mutex);


¿Es necesario poner la condicion en un while ?. Hasta donde yo entiendo el problema podria ser resuelto sustituyendo el while por un if y lo he verificado en algunas pruebas pero no se si algun detalle se me esta escapando. Creo que el while seria util cuando se tuviera mas de un consumidor o productor pero en este caso en concreto en el cual solo es 1-1 , ¿Tiene sentido?
#11
Buenas a todos, estoy profundizando en la practica de los temas de comunicación entre procesos e hilos y me tope con 2 necesidades:

  • Hacer uso de memoria compartida
  • Hacer uso de semaforos

Encontre que ambas necesidades pueden ser proporcionadas por una familia de funciones de tanto el estandar POSIX como de aquellas heredadas de SYSTEM V,por lo tanto me genera la duda  ¿  es necesario aprender las viejas funciones del SYSTEM V?, o es mas que necesario con las del estandar de POSIX.

He visto que algunas diferencias tales como que en los semaforos de SYSTEM V se tiene mas control del incremento/decremento del semaforo,etc...  ¿Pero algunas de estas cualidades de las funciones de SYSTEM V pueden ser obligatorias para un cierto problema? o puede ser completamente sustituidas con las del estandar POSIX.
#12
Buenas a todos, tengo que dar solucion a un problema de un chat grupal con el modelo cliente/servidor dentro del lenguaje TCL y he creado de manera general una estructura en donde existe un servidor central al cual se conectan todos los clientes y los va agrupando en grupos de manera que cada usuario elige:

1. A que grupo pertenecer( En caso de no existir se crea)

2. Cual va ser su identificador dentro del grupo.
Mi modelo plantea que el servidor reciba estos datos al principio de la comunicacion y despues el haga la gestion de ellos de manera que pueda existir comunicacion entre usuarios de distintos grupos con ayuda del ID del grupo y el ID del usuario al que quiere comunicarse. Mis problemas comienzan con los siguientes puntos:

1. Como hago que el cliente este a la espera de recibir un mensaje del servidor y a la vez este a la espera de que no se llame la funcion que es generada al dar click en en un boton de "Enviar" para enviar un nuevo mensaje por parte del mismo cliente.

He visto el metodo SELECT de PYTHON que me permite estar a la espera de dos flujos de datos como STDIN y el socket pero en este caso concreto seria el SOCKET y una funcion que se llama cuando se da click en un boton para enviar el mensaje.He estado viendo si hay algo relacionado eso en TCL/TK pero no he encontrado demasiado al respecto.

2. En caso de que se envie un mensaje a un grupo o cliente no existente , que tipo de caracter podria enviar al cliente que origino el mensaje para darle a entender que el usuario o grupo al cual mando el mensaje no existe. Tal vez podria enviar una combinacion de caracteres pero de que manera me aseguro que esos caracteres no pueden ser parte de un mensaje que se esten pasando entre los usuarios.

Agradeceria si me ayudaran a dar solucion a estos dos problemas, o si me podrian presentar una alternativa que se suela usar para estos casos.
#13
Buenas a todos, resulta que viendo un poco sobre la API de UNIX y la API de WINDOWS observe que la creación de UNIX de proceso se hacia en dos pasos:
1. Llamada del sistema fork. Creación de un clon del proceso padre.
2. Llamada del sistema exec. Cambiar la imagen del proceso por un nuevo programa.

Mientras que este mismo proceso WINDOWS lo hacia en unicamente una llamada al sistema. En unos de los textos se mencionaba que el hecho de que se hiciera en dos pasos daba la posibilidad de tener un punto intermedio que permitia el compartir datos entre padre-hijo pero no termino de comprender que tanto impacto puede tener esto.

¿ Hay alguna cosa que no sea posible hacer en Windows debido a que esta situacion ?
¿ Qué ejemplo practico o real podria hacer uso de esta ventaja o se podria considerar más como una desventaja por parte de UNIX ?
#14
GNU/Linux / STATUS de los procesos
7 Septiembre 2019, 19:00 PM
Durante la observacion de los resultados originados por el comando 'ps', observe que habia dos casos particulares que generan incognitas en cuanto a lo que implicaban:

1. Procesos que que tenian el STAT S. S Interruptible sleep (waiting for an event to complete)
Era generado cuando dentro de un proceso utilizaba el metodo SLEEP correspondiente a la SIGALRM.Sin embargo me surge la duda de que es lo que ocurre, el proceso es retirado de la cola de procesos listos para finalmente ser activado por el SO mediante una senal cuando su tiempo de 'dormir' ha sido completado? o permanece en la cola de procesos listos y cada vez que le toca una RAFAGA DE CPU verifica si su tiempo de 'dormir' ha terminado?

2. T Procesos que que tenian el STAT T . T Stopped, either by a job control signal or because it is being traced.
Generado mientras terminaba un proceso con CTRL + Z. correspondiente a la senal SIGTSTP que al buscar sobre ella me di cuenta que podia ser ignorada por el proceso y que simplemente lo manda a este estado sin matarlo. Esto que consecuencias puede tener? he visto que mediante el comando 'top' el proceso no aparece pero entonces me hace creer que minimamente es retirado de la cola de proceso listos pero sin embargo que incoveniente puede tener el tenerlo en este estado? Simplemente mayor consumo de memoria para guardar el registro de dicho proceso? o  acaso tampoco se liberan los recursos ocupados por dicho proceso


NOTA. Una disculpa por subir la entrada incompleta, se me cerro accidentalmente el navegador y se subio el tema incompleto al principio
#15
GNU/Linux / Procesos vs Hilos
3 Septiembre 2019, 06:20 AM
Buenas a todos, actualmente estoy revisando el libro de Sistemas Operativos , Silberschatz Galvin Gagne y me ha surgido una duda con referencia al uso que se le pueden dar tanto a los procesos como a los hilos. Entiendo el concepto tanto de hilos y procesos sin embargo no llego a entender la finalidad de poder crear varios procesos. Tal vez suene un poco tonto pero no he encontrado un ejemplo claro en donde vea una ventaja o necesidad de crear varios procesos dentro de una misma computadora y crear una linea de comunicacion entre ellos a la contraparte de generar hilos.

En el libro se enfoca mucho en el hecho de que los hilos son mas rapidos de construir en el sentido de que se encuentran dentro de un mismo proceso y pueden compartir facilmente informacion. Ademas se explica un poco como es posible sacarle provecho para que cada hilo pueda ser ejecutado por un nucleo distinto y que cada uno tenga una actividad especifica dentro del programa. Este concepto de poder utilizar varios nucleos y ejecutar varios hilos en paralelo con ayuda de varios nucleos es posible tambien con los procesos?, he leido que en linux todo (hilo,procesos) es tomado como proceso pero el mismo concepto se ve reflejado en sistemas de windows?.

Finalmente me gustaria saber  si alguien me podria proporcionar un ejemplo claro en el que es util tener varios procesos en paralelo en contraparte de por que no se podria hacer con hilos?. Me gustaria tener alguna referencia o guia que trate estos temas de una manera mas practica a traves del lenguaje C/C++ para reforzar la teoria, si alguien conoce alguna se lo agradeceria de antemano.

#16
Buenas a todos. He estado viendo los diversos algoritmos de planificacion de procesos y he visto que algunos como el 'shortest job first' hacen uso del tiempo de rafa de CPU requerido por cada procesos para ordenarlos en una cola sin embargo mi pregunta es sobre ¿ como y en que momento se determina el tiempo de rafaga de CPU?. En simuladores entiendo que el tiempo es inventado y se simula la construccion de PCB's pero como determina el algoritmo real ¿ cual es el tiempo de rafaga de CPU necesario para cada proceso?. ¿ Acaso tiene una tabla de equivalencia para cada instruccion posible y hace el calculo conforme al codigo por ejecutar de dicho proceso?
#17
Hola a todos tengo un problema un tanto sencillo pero que no sè cual de mis ideas sea las mas adecuada.

El problema se reduce a una parte en donde debo tener 2 tipos de directorios.

  • Directorio Empresarial.Almacenada contactos empresariales
  • Directorio Personal.Almacena contactos personales

Practicamente ambos directorios deben realizar los mismos mètodos solo con la diferencia de el tipo de contacto que almacena y algunas consultas que se realizan dentro de los métodos..
Nota.Existe una superclase que es padrede "Contacto Empresarial" y "Contacto Personal" que lleva como nombre "Contacto"

Mi primera solución planteaba crear una interfaz "Directorio" como la siguiente(hacen falta definir un par de metodos).

Pero no sé si esta esta es la manera más correcta de hacerlo, es decir, los argumentos y retornos de los métodos ya estan definidos en la la interfaz lo cual en cierta manera me hace pensar en como tratar los casos especiales de cada clase que lo implemente, es decir, en mi clase "Directorio Empresarial" yo quiero que sus metodos solo acepten como argumentos y constructor datos de tipo "Contacto Empresarial" pero al yo implementar una interfaz esta me esta definiendo argumentos como de tipo "Contacto" que podria provocar errores en algunos metodos por lo cual entonces seria necesario lanzar una exepcion si me envian como argumento un objeto de tipo "Contacto"en vez de uno de tipo "Contacto Empresarial" .... y en ese caso me hace pensar que tal vez mi diseño es erroneo o que no sè como diseñar este tipo de problemas.

Yo necesito definir estos dos tipos de directorios por que aunque realmente tiene los mismos mètodos yo requiero que algunos mètodos hagan la misma tarea pero ademas hagan una consulta especifica a una base de datos en el caso de que sea un directorio empresarial/personal va ser distinta la consulta.

Tengo idea de un segundo planteamiento donde defino una clase abstracta "Directorio " que tiene como atributo un objeto de tipo "Contacto" y los respectivos metodos y que las clases derivadas ("Directorio Empresarial" y "Directorio Personal") solo implementa esos metodos pero caigo en la misma duda. Un Directorio Empresarial al heredar de Directorio va tener como atributo un objeto Contacto que puede almacenar por herencia un Contacto Empresarial pero ¿ Yo debo exigir que a esta clase Directorio Personal solo se le pueda pasar objetos Contacto Empresarial aún cuando los métodos que hereda y sobrescribe de la clase Directorio permiten que se la pase un objeto de Contacto?. Yo podría pasar por alto esto debido a que estoy haciendo el programa y sé como puedo controlar que esta clase de error no suceda pero me da la sensación de que como buena practica las clases no se deben prestar para dejar huecos que puedan causar errores al ser reutilizadas.
#18
Buenas a todos resulta que tengo una computadora con Windows 10 en la cual hasta hace un par de días funcionaba bien hasta que por descuido un día mi unidad de memoria donde tengo almacenado el sistema operativo se lleno... No le tome mucho caso y lo único que hice fue eliminar un par de archivos  que estoy seguro que no eran nada del sistema operativo si no que eran basura que yo tenía por ahí. Posterior a esto yo continue con la descarga de vmware y de una iso de kali hasta que llego el paso en el que quise descomprimir un archivo y al yo intentar abrir el programa que lo descomprimía windows dejo de responder.. Al cabo de unos minutos empece a reiniciar la pc y me tope con una hermosa pantalla Azul que mostraba como mensaje de error "Bad Config Info", he buscado posibles soluciones como restaurar los datos de la carpeta config y seguir algunos pasos que aconsejan los foros para dar solución a este tipo de problema sin llegar a ningun resultado.

Hasta el momento he intentado apoyar la solución desde una ISO en una memoria sin siquiera lograr que se arranque el sistema desde ahí( Ojo. Estoy seguro que la memoria tiene la ISO de manera correcta y ademas puse como prioridad la USB a la hora del arranque del sistema), ademas he intentado entrar en modo seguro consiguiendo el mismo error que siempre me ha marcado. ¿ De casualidad alguien tiene algun indicio de que podria ser?, no sé si el hecho de que estuviera instalando vmware y la iso de kali influyera en el error o que solo fuera simplemente el hecho de que se lleno la unidad de memoria donde estaba el sistema operativo. Quiero recalcar que el sistema operativo mostro fallas unos 15 minutos despues de que yo libere un espacio de la unidad de memoria.

Quiero agregar que dentro de las opciones que me aparece dentro de la pantalla azul tengo acceso a la CMD y he podido comprobar que me deje navegar por mis archivos y los del sistema operativo, en caso de que sea un error dado por un daño en la unidad de memoria del sistema ¿ Como podria darme cuenta que eso ?
#19
Buenas tardes,dias o noches,estoy haciendo un programita en el cual me he topado con un detalle a la hora de intentar dibujar un polygon en una JPanel en el cual quiero que el color de sus aristas sea totalmente configurable al igual que su fondo.He realizado un intento con el siguiente segmento de codigo:

Código (java) [Seleccionar]

//Coloca color de arista y dibuja figura
               g.setColor(Color.BLACK);
               g.drawPolygon(figura);
//Coloca color de fondo y rellena la figura
               g.setColor(Color.WHITE);
               g.fillPolygon(figura);


Nota.Para no extender mas el codigo la variable figura es de tipo Polygon.

El anterior codigo tambien lo he adaptado de manera muy similar para figuras sin vertices como un circulo.

Código (java) [Seleccionar]


g.setColor(figu.getColorArista());
               g.drawOval(figu.getCentro().x-radio,figu.getCentro().y-radio,radio*2,radio*2);
               g.setColor(figu.getColorFondo());
               g.fillOval(figu.getCentro().x-radio,figu.getCentro().y-radio,radio*2,radio*2);




Sin extender aún mas el programa....Mis resultados no han sido del todo buenos consiguiendo como resultado algo como lo siguiente:



Como se puede observar realmente se ve el cambio de color solo en ciertas orillas de la figura, esto depende de la forma de la figura.He pensado en hacer toda la figura del mismo color y despues simplemente trazar unas lineas que unieran todos los vertices con el color de las aristas de manera que se sobrepongan a la orilla de la figura.Les agradeceria si me compartieran una forma mas formal u otra forma distinta a la planteada que me pudiera dar solucion a este problema,gracias.
#20
Java / Alinear un JLabel en un Panel
14 Noviembre 2018, 05:22 AM
Buenos dias,estoy realizando la parte grafica de un programa y llevo rato atorado por querer acomodar varios JLabel mediante el metodo setAlignmentX.
En sintesis mi programa cuenta con varios paneles que para ser mas precisos son ordenados mediante un esquema BorderLayout, el panel en el que tengo problemas es en el panel del borde derecho.

El panel del borde derecho esta compuesto por principalmente dos paneles(Adjunto imagenes al final), este panel ordena a sus dos paneles hijos mediante un esquema BoxLayout en el eje Y ,mi problema se encuentra en estos dos paneles hijos.Ambos paneles hijos estan construidos de la misma manera mediante un esquema BoxLayout en el eje X, en ambos paneles tengo un JLabel llamado titulo que me representa el titulo del menu respectivamente , en ambos casos los paneles contienen otros paneles hijos que por el momento no he terminado sin embargo mi problema se encuentra en estos JLabel que representan los titulos de los menus los cuales quiero que esten alineados o pegados al borde izquiero de su respectivo Panel sin embargo no lo he conseguido con el metodo setAlignmentX.Tengo mis dudas si es por la manera en que estoy creando las ventanas o que simplemente el BoxLayout no me lo permite.De antemano agradezco sus aportes y adjunto el codigo e imagen de la interfaz grafica.

Clase de Contenedor Padre(Se encuentra en un BorderLayout en el borde derecho).

Código (java) [Seleccionar]

import java.awt.*;
import javax.swing.*;

public class MenuOpcionesFiguras extends JPanel{
   JPanel menuCrearFiguras;
   JPanel menuBorrarFiguras;
   JLabel titulo;
   
   public MenuOpcionesFiguras(){

       setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
       
       //Creacion de Paneles para menu de creacion de figuras, eliminacion de figuras,etc..
       menuCrearFiguras = new MenuCrearFiguras();
       menuCrearFiguras.setBorder(BorderFactory.createLineBorder(Color.black));
       menuCrearFiguras.setBackground(new Color(255, 153, 51));
 

       menuBorrarFiguras = new MenuBorrarFiguras();
       menuBorrarFiguras.setBorder(BorderFactory.createLineBorder(Color.black));
       menuBorrarFiguras.setBackground(new Color(102, 153, 255));

       titulo = new JLabel("Herramientas");
       titulo.setFont(new Font("Arial",Font.BOLD+Font.ITALIC,14));
       titulo.setAlignmentX(SwingConstants.CENTER);


       //Agregado de componentes al Panel
       add(titulo);
      add(menuCrearFiguras);
      add(menuBorrarFiguras);

     



   }

   @Override
   public Dimension getPreferredSize(){
       Dimension dimensionPadre = getParent().getSize();
       return new Dimension((int)(dimensionPadre.getWidth()/5),(int)(dimensionPadre.getHeight()));
       
   }

}




Clase un panel hijo (Se encuentra contenido en el JPanel de arriba)

Código (java) [Seleccionar]

import javax.swing.*;
import javax.swing.SwingConstants;



import java.awt.event.*;
import java.awt.*;

public class MenuCrearFiguras extends JPanel{
   
   
   JPanel subMenuCrearFigura;
   JLabel titulo;
   JPanel botones;
 
 

   public MenuCrearFiguras(){

       setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
       
       //Declaracion de componentes
       titulo =new JLabel("Crear Figuras");
       titulo.setFont(new Font("Agency FB", Font.BOLD, 14));
       titulo.setAlignmentX(LEFT_ALIGNMENT);
       


       botones = new BotonesCrearFiguras();
      // botones.setAlignmentX(JPanel.LEFT_ALIGNMENT);
     
       add(titulo);
       add(botones);
       
       //Agregar eventos a los componentes

       
       

   }
   @Override
   public Dimension getPreferredSize(){
       Dimension dimensionPadre = getParent().getSize();
       return new Dimension((int)(dimensionPadre.getWidth()),(int)(dimensionPadre.getHeight()/2));
   }
   
   

}




Clase contenida en el JPanel de la primera clase.En esta clase tambien se encuentra el problema con el posicionamiento del JLabel.

Código (java) [Seleccionar]



import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class MenuBorrarFiguras extends JPanel{
   JPanel menuBorrarID;
   JButton borrarPuntero;
   JLabel titulo;
   
   public MenuBorrarFiguras(){
       setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));

       //Creacion de componentes
       menuBorrarID = new MenuBorrarID();
       //borrarPuntero = new JButton("Borrar con puntero");

       titulo =new JLabel("Borrar Figuras");
       titulo.setFont(new Font("Agency FB", Font.BOLD, 14));
       titulo.setAlignmentX(LEFT_ALIGNMENT);

       

   

       //Agregado de elementos al panel
       add(titulo);
       add(menuBorrarID);
       //add(borrarPuntero);
       

       //Agregado de eventos a los componentes

   }

 
   public Dimension getPreferredSize(){
       Container padre =  getParent();
       Dimension dimensionPadre = padre.getSize();
       return new Dimension((int)dimensionPadre.getWidth(),(int)(dimensionPadre.getHeight()/2));
   }

}



Finalmente una foto de la parte de la Interfaz Grafica donde tengo problemas con los titulos


#21
Buenos dias,estoy realizando la parte grafica de un programa y llevo rato atorado por querer acomodar varios JLabel mediante el metodo setAlignmentX.
En sintesis mi programa cuenta con varios paneles que para ser mas precisos son ordenados mediante un esquema BorderLayout, el panel en el que tengo problemas es en el panel del borde derecho.

El panel del borde derecho esta compuesto por principalmente dos paneles(Adjunto imagenes al final), este panel ordena a sus dos paneles hijos mediante un esquema BoxLayout en el eje Y ,mi problema se encuentra en estos dos paneles hijos.Ambos paneles hijos estan construidos de la misma manera mediante un esquema BoxLayout en el eje X, en ambos paneles tengo un JLabel llamado titulo que me representa el titulo del menu respectivamente , en ambos casos los paneles contienen otros paneles hijos que por el momento no he terminado sin embargo mi problema se encuentra en estos JLabel que representan los titulos de los menus los cuales quiero que esten alineados o pegados al borde izquiero de su respectivo Panel sin embargo no lo he conseguido con el metodo setAlignmentX.Tengo mis dudas si es por la manera en que estoy creando las ventanas o que simplemente el BoxLayout no me lo permite.De antemano agradezco sus aportes y adjunto el codigo e imagen de la interfaz grafica.

Clase de Contenedor Padre(Se encuentra en un BorderLayout en el borde derecho).

Código (java) [Seleccionar]

import java.awt.*;
import javax.swing.*;

public class MenuOpcionesFiguras extends JPanel{
   JPanel menuCrearFiguras;
   JPanel menuBorrarFiguras;
   JLabel titulo;
   
   public MenuOpcionesFiguras(){

       setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
       
       //Creacion de Paneles para menu de creacion de figuras, eliminacion de figuras,etc..
       menuCrearFiguras = new MenuCrearFiguras();
       menuCrearFiguras.setBorder(BorderFactory.createLineBorder(Color.black));
       menuCrearFiguras.setBackground(new Color(255, 153, 51));
 

       menuBorrarFiguras = new MenuBorrarFiguras();
       menuBorrarFiguras.setBorder(BorderFactory.createLineBorder(Color.black));
       menuBorrarFiguras.setBackground(new Color(102, 153, 255));

       titulo = new JLabel("Herramientas");
       titulo.setFont(new Font("Arial",Font.BOLD+Font.ITALIC,14));
       titulo.setAlignmentX(SwingConstants.CENTER);


       //Agregado de componentes al Panel
       add(titulo);
      add(menuCrearFiguras);
      add(menuBorrarFiguras);

     



   }

   @Override
   public Dimension getPreferredSize(){
       Dimension dimensionPadre = getParent().getSize();
       return new Dimension((int)(dimensionPadre.getWidth()/5),(int)(dimensionPadre.getHeight()));
       
   }

}




Clase un panel hijo (Se encuentra contenido en el JPanel de arriba)

Código (java) [Seleccionar]

import javax.swing.*;
import javax.swing.SwingConstants;



import java.awt.event.*;
import java.awt.*;

public class MenuCrearFiguras extends JPanel{
   
   
   JPanel subMenuCrearFigura;
   JLabel titulo;
   JPanel botones;
 
 

   public MenuCrearFiguras(){

       setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
       
       //Declaracion de componentes
       titulo =new JLabel("Crear Figuras");
       titulo.setFont(new Font("Agency FB", Font.BOLD, 14));
       titulo.setAlignmentX(LEFT_ALIGNMENT);
       


       botones = new BotonesCrearFiguras();
      // botones.setAlignmentX(JPanel.LEFT_ALIGNMENT);
     
       add(titulo);
       add(botones);
       
       //Agregar eventos a los componentes

       
       

   }
   @Override
   public Dimension getPreferredSize(){
       Dimension dimensionPadre = getParent().getSize();
       return new Dimension((int)(dimensionPadre.getWidth()),(int)(dimensionPadre.getHeight()/2));
   }
   
   

}




Clase contenida en el JPanel de la primera clase.En esta clase tambien se encuentra el problema con el posicionamiento del JLabel.

Código (java) [Seleccionar]



import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class MenuBorrarFiguras extends JPanel{
   JPanel menuBorrarID;
   JButton borrarPuntero;
   JLabel titulo;
   
   public MenuBorrarFiguras(){
       setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));

       //Creacion de componentes
       menuBorrarID = new MenuBorrarID();
       //borrarPuntero = new JButton("Borrar con puntero");

       titulo =new JLabel("Borrar Figuras");
       titulo.setFont(new Font("Agency FB", Font.BOLD, 14));
       titulo.setAlignmentX(LEFT_ALIGNMENT);

       

   

       //Agregado de elementos al panel
       add(titulo);
       add(menuBorrarID);
       //add(borrarPuntero);
       

       //Agregado de eventos a los componentes

   }

 
   public Dimension getPreferredSize(){
       Container padre =  getParent();
       Dimension dimensionPadre = padre.getSize();
       return new Dimension((int)dimensionPadre.getWidth(),(int)(dimensionPadre.getHeight()/2));
   }

}



Finalmente una foto de la parte de la Interfaz Grafica donde tengo problemas con los titulos


#22
Buenas a todos.Tengo contemplado leer algun libro y profundizar un poco en el tema de estructuras de datos, actualmente conozco un poco el lenguaje C y ya he realizado algunas estructuras de datos basicas en el ,sin embargo ahora que quiero profundizar en el tema me ha surgido la duda de si deberia profundizar el tema en el lenguaje c/c++ o en algun otro lenguaje como java.

Durante mi búsqueda he visto que existe una gran de contenido sobre este tema enfocado en el lenguaje java pero no me termino de decidir si realmente lo quiero enfocar en ese lenguaje o prefiero explotar aun mas las capacidades que me ofrece c/++ con sus punteros.

Para finalizar me gustaria si me podrian ayudar a confirmar si realmente me seria mas util profundizar el tema en c/c++ o si seria mejor hacerlo en java.Ademas de eso si alguien conoce un buen libro sobre este tema le agradeceria que me pasara el nombre.
#23
Muy buenas tardes, dias o noches.He estado investigando sobre la gran variedad de clases que existen en java para el manejo de flujos, se me presento el problema de leer carácter ingresados desde la consola y lo realice con el siguiente código:

Código (java) [Seleccionar]

import java.io.*;
class prueba{

    public static void main(String args[]){

        try{
           
           char c;
           InputStreamReader leer = new InputStreamReader(System.in);
           
            System.out.println("Ingresa Caracter 1: ");
           
            c= (char)leer.read();
            leer.read();
            leer.read();

            System.out.println("Caracter Ingresado: " +c);
            System.out.println("Ingresa Caracter 2: ");
            c= (char)leer.read();
            System.out.println(leer.read());    //Nueva Linea
            System.out.println(leer.read());    //Retorno de carro
           
           

            System.out.println("Caracter Ingresado: " +c);

            System.out.println("Ingresa Caracter 3: ");
            c= (char)leer.read();
            leer.read();
            leer.read();
            System.out.println("Caracter Ingresado " +c);
        */   
           
        }catch(Exception e){
            System.out.println("Error"+e);
        }
       
    }
}


Al finalizar el programa logre capturar caracteres ingresados por consola pero me creo desconfianza el hecho de que necesitara 3 métodos read() para recolectar un carácter.Entiendo que el primer read es para obtener el carácter que deseamos, el segundo seria para recoger el "Enter" o carácter de nueva linea , pero cuando llegamos al 3er read realmente ya no sé por que es necesario.Investigando un poco mas he decidido agregar en el código 2 System.out.println(leer.read()) justo después de que leo el segundo carácter para intentar descifrar que es lo que realmente esta capturando.Efectivamente el programa me regreso dos valores numéricos que al yo relacionarlos con un valor de unicode di a la conclusión de que era el valor tanto del carácter de nueva linea , asi como el de retorno de esta manera tendría que para leer un carácter se necesita en realidad leer 3 caracteres para no dejar valores basura.El primero seria para el carácter que deseamos, el segundo para el carácter de nueva linea y el tercero para el carácter de retorno.

A partir de lo anterior no he comprendido por que en java al momento de escribir en consola realmente me esta colocando el carácter que  escribo, el carácter de nueva linea y el carácter de retorno de carro , cuando en otros lenguajes como en C  , recuerdo que simplemente bastaba con poner un getchar(); para recolectar el carácter de nueva linea y no tenia que preocuparme por un carácter de retorno debido a que el carácter de nueva linea ya era prácticamente una nueva linea con retorno de carro.De antemano les agradezco por el tiempo que les ha tomado leer esto y les agradecería si me podrian resolver esta duda
#24
Buenos dias,tardes o noches, pasaba por el foro para preguntar sobre algo que aparamente suele verse muy sencillo pero que aveces me genera incertidumbre sobre si estoy haciendo las cosas de la mejor manera posible.Durante un ejercicio de programacion me he afrontado con un problema de reservaciones dentro de un restaurante...Para no hacer mas extensa la descripcion , les presento aquellas clases que he creado para intentar dar solucion a la modelacion del problema desde el punto de vista orientado a objetos.

Clases:
-Mes
-Dia
-Horas
-Reservacion
-Datos de cliente
-Mesa

A partir de las anteriores clases he empezado a comprender el problema de la siguiente manera:
-Partiendo de la idea de que me debe ubicar en algo similar a un calendario, empiezo mis clases por la clase mes, esta clase mes a su vez debe estar compuesta por varios dias, y cada dia por varias horas , a su vez las horas deben tener reservaciones , estas reservaciones estan compuestas por una mesa en especifico y los datos del cliente.

Planteado el problema de esta forma , me parece que se puede seguir una logica entre la relacion de las clases sin embargo me surge una pregunta...¿Deberia agregar una clase o interfaz  "Mostrador" o "recepcionista" ?, a caso esta clase deberia manejar metodos tales como buscar Reservacion,Eliminar reservacion,Ver reservacion,etc... O todas estas acciones se las deberia dejar al metodo main.

Cabe recalcar que por el momento no me interesa  entrar en detalles sobre algun lenguaje, si no empezar a comprender los problemas desde un punto de vista modelado a objetos.De antemano les agradeceria si alguien me pudiera ayudar a resolver esta duda o corrigiendome sobre la forma en que plantie el problema, o simplemente aportandome alguna fuente donde pudiera consultar una manera correcta de hacerlo.
#25
Muy buenos dias,tardes o noches,durante un problema que realizaba sobre archivos me tope con un error un tanto extraño y que me hizo retomar este tema basico sobre el incremento en postfijo y prefijo.Tengo muy presentes las dos diferencias entre escribir el incremento en postfijo y prefijo pero a la hora de yo realizar varios postfijos o prefijos en una sentencia como la funcion printf() me topo con que los datos que arroja son algo raros y no termino de realizar una conexion entre los incrementos de la variable y los valores arrojados.

#include <stdio.h>
#include <stdlib.h>

int main()
{
   
int i=0;

printf("%d %d %d %d %d %d", ++i, i++, ++i, i++, ++i, i++);

}



El problema anterior no es el problema original, sin embargo es un pedazo de codigo que en esencia es el mismo problema que tengo en archivos y que ya pude solucionar de otra forma pero que sin embargo sigo sin entender la razon del resultado.
#26
Muy buenos dias, el proposito de este tema es sobre un duda que me surge al ver un fragmento de un programa que se encarga de imprimir caracter por caracter hasta que se llegue al final de un archivo.Este fragmento de programa lo he sacado del libro "El lenguaje de programación C".Libro de Brian Kernighan y Dennis Ritchie.


#include <stdio.h>

int main(){
int c;

while((c=getchar()!=EOF)
putchar(c);

}


En este programa entiendo cuales son las razones de que el caracter tenga que guardarse en una variable de tipo enteros por razones de que el valor EOF determina que el archivo ha terminado y tiene un valor que no puede ser almacenado por una variable de tipo char, mi duda surge a la hora de entender que es lo que realmente esta guardando la variable c, es decir , tengo un programa como el siguiente:


#include <stdio.h>

int main(){
int c;

printf("Ingresa un caracter\n");
c=getchar();
printf("%d\n",&c);
putchar(c);
}


En este programa realmente me reafirma que la variable de tipo entero esta almacenando un valor unico para cada caracter , es decir , para el caracter 'a' me arroja que la variable de tipo entero tiene el numero "6487628" y que a la hora de imprimirla como caracter me devuelve el caracter 'a' ,sin embargo no logro entender que relacion tiene esta cifra o este numero con el caracter 'a' , he visto que no se trata del codigo ASCII del caracter . De antemano , gracias.

#27
Buenos dias a todos , hoy mientras probaba la funcion toupper encontrada en la libreria ctype.h me surgio la necesidad de convertir una cadena en mayusculas para poderla comparar con una frase ya predeterminada , he visto que la funcion toupper solo me funciona a la hora de convertir un solo caracter , pero a la hora de querer convertir toda una cadena en mayusculas con esta funcion no me deja , alguien sabe si la unica opcion para convertir toda la cadena en mayusculas es ir convirtiendo caracter por caracter en mayusculas?, es decir:


char c1[4];
printf("Ingresa una frase "); \*Ingresa "hola" en minusculas *\
\*Converti en Mayusculas*\
for (int j=0;j<4;j++){
c1[j]=toupper(c1[j]);
                              }


O se podria realizar con ayuda de alguna funcion de manera que se transformara toda la cadena en mayuscula en un solo paso.

NOTA: ESTE ES EL PROGRAMA QUE INTENTO REALIZAR , LO UNICO QUE QUISIERA MODIFICAR ES QUE SI LA FRASE SE ESCRIBE EN MINUSCULAS SE CONVIERTA A MAYUSCULAS PARA QUE SE PUEDA VERIFICAR CON LA FRASE.


#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(){
char c1[]="TIENES", c2[]="QUE SER", c3[]="INVITADO", c4[]="PARA", c5[]="INGRESAR", cE[20],band=0;


printf("Este es un programa que se encarga de verificar 5 claves para poder entrar a una fiesta\nIngresa la primera clave\n");
scanf("%s",cE);
getchar();

if (strcmp(c1,cE)==0){
printf("Ingresa la segunda clave\n");
gets(cE);


if(strcmp(c2,cE)==0){
printf("Ingresa la tercera clave\n");
scanf("%s",(cE));


if(strcmp(c3,cE)==0){
printf("Ingresa la cuarta clave\n");\
scanf("%s",cE);


if(strcmp(c4,cE)==0){
printf("Ingresa la quinta clave\n");
scanf("%s",cE);


if(strcmp(c5,cE)==0){
printf("BIENVENIDO A LA FIESTA\n");
band=1;
}
}
}
}
}
if(band==0)
printf("TE EQUIVOCASTE DE FIESTA\n");

}
#28
Código (cpp) [Seleccionar]
#include <stdio.h>

int main(){
int m,x,j,m2[m],m3[x];

for (m=1;m<=10;m++){
m2[m]=m*3;
}
for (x=1;x<=10;x++){
m3[x]=x*2;
}
for(x=1;x<=10;x++){
for(j=1;j<=10;j++){
if(m2[x] == m3[j]){
printf("%i \n",m2[j]);
}
}
}
}



Buenos dias compañeros disculpen estoy comenzando en esto y me tope con este error a la hora de asignar una valor dentro una matriz , tengo la percepción de que el error puede estar en ell como declare alguna variable pero realmente aun no logro entender de manera lógica en que es lo que estoy mal , principalmente el programa es sencillo y lo único que intento hacer es que se imprima los valores que se repiten en la tabla de 2 y 3
#29
Java / Suma de 3 arreglos
9 Junio 2017, 05:39 AM
Disculpen , soy nuevo, y estoy empezando  a trabajar con los arreglos en java , sin embargo he tenido un problema , se supone que dentro del siguiente texto , intento hacer un menu en el cual la primera opcion sea ordenar , esa ya quedo lista , sin embargo en la segunda opcion conlleva a dar 10 nombres , que como continuacion se puede introducir 10 calificaciones de 3 materias distintas , sin embargo al final debo hacer que la el valor que esta en el arreglo  
  • , se sume con la del arreglo 2[0] y se sume con la del arreglo3
  • para finalmente sacar un promedio de las 3 , sin embargo a la hora de ejecutarlo se repiten los valores de los arreglos de manera infinita , he intentado checar los corchetes pero no encuentro el error, de antemanos gracias  :huh:
    Código (java) [Seleccionar]
    package examen.semestral.ultimo;
    import java.util.*;
    import javax.swing.JOptionPane;
    public class ExamenSemestralUltimo {

       /**
        * @param args the command line arguments
        */
       public static void main(String[] args) {
      Scanner sc= new Scanner (System.in);
    int opcion;
         
               opcion = Integer.parseInt(JOptionPane.showInputDialog(null,
                       "Opciones:\n\n"
                       + "1. Captura de 10 elementos y su posterior ordenamiento \n"
                       + "2. Ingreso de nombre del alumnos \n"
                               + "3. Salir del programa"));
         
       
       
               switch(opcion){
                   case 1:
      int Ta;
    Ta= 10;
    int aux = 0;
       int i;
       int j;
        int[] numeros = new int[Ta];
      for (i=0; i < numeros.length ; i ++){
              numeros[i]=Integer.parseInt(JOptionPane.showInputDialog ( "Ingresa los numeros "));
     System.out.print( "Estos son los numeros desordenados:      "+ numeros [i]+ "  \n"  );
      }
     for (i=0; i < numeros.length ; i ++){
         

             
                    for (i=0; i < numeros.length ; i ++){
                     for (j=0; j < numeros.length ; j ++){
                         if (numeros[i] < numeros [j]){
                             aux = numeros [i];
                             numeros [i] = numeros [j];
                             numeros [j] = aux ;
                           
                         
       
       
                         }}}
          for (i=0; i < numeros.length ; i ++){
                            System.out.print("Estos son los numeros acomodados  "+ numeros[i]+"\n");}
           }
                   break;
                   case 2:
                       int z;
      String[ ] nombre = new String[10];
      for (z=0; z <nombre.length ; z ++){
              nombre[z]=JOptionPane.showInputDialog("Ingresa los nombres del alumno "+ (z+1)+"");
               System.out.print( "Alumno no. "+(z+1)+") "+(nombre[z])+" \n");
      }int opcion2;
                opcion2 = Integer.parseInt(JOptionPane.showInputDialog(null,
                       "Opciones:\n\n"
                       + "1. Capturar calificaciones de las materias de Contabilidad , Electronica y Calculo \n"
             
                               + "2. Salir del programa"));
                switch(opcion2){
                    case 1:
                     
                        int Ta3;
                        Ta3= 10;
                        int e;
                       
                       
                         int[] cal1 = new int[Ta3];
      for (e=0; e < cal1.length ; e ++){
          cal1 [e]= Integer.parseInt(JOptionPane.showInputDialog ( "Ingresa la calificacion de Contabilidad del Alumno  "+ (e+1)+ "  "));
           System.out.print( "Calificacion de Contabilidad de Alumno "+(e+1)+"    "+ cal1 [e]+ "  \n"  );
      }
       
                        int Ta4= 10;
                        int x;
                       
                       
                         int[] cal2 = new int[Ta4];
                    for (x=0; x < cal2.length ; x ++){
          cal2 [x]= Integer.parseInt(JOptionPane.showInputDialog ( "Ingresa la calificacion de Electronica del Alumno  "+ (x+1)+ "  "));
                     System.out.print( "Calificacion de Electronica de Alumno "+(x+1)+"    "+ cal2 [x]+ "  \n"  );
                    }
                    int Ta5= 10;
                        int v;
                       
                       
                         int[] cal3 = new int[Ta5];
                    for (v=0; v < cal3.length ; v ++){
          cal3 [v]= Integer.parseInt(JOptionPane.showInputDialog ( "Ingresa la calificacion de Calculo del Alumno  "+ (v+1)+ "  "));
             
          System.out.print( "Calificacion de Calculo de Alumno "+(v+1)+"    "+ cal3 [v]+ "  \n"  );
                    }
                   
               
               
                    int opcion3;
                     opcion3 = Integer.parseInt(JOptionPane.showInputDialog(null,
                       "Opciones:\n\n"
                       + "1. Sacar Promedios \n"
             
                       + "2. Salir del programa"));
                        switch(opcion3){
                            case 1:
     int y;
                                 for (y=0; y < 10 ; y ++){
                                       int suma[]=new int[10];
                                       int d;
                                       
                                  for (d=0; d < 10 ; d ++){
                                 
                                 double promedio;
                             
                                    for (e=0; e < 10 ; e ++){
                                        for (x=0; x < 10 ; x ++){
                                       
                                            for (v=0; v < 10 ; v ++){
                             
                                       
                                     
                                   suma[d]= cal3[v]+cal2[x]+cal3[e];
                               
                                 
                               
                                 int r;
                               for (r=0; r < 10 ; r ++){
                                 System.out.print("La suma de las calificaciones del alumno  "+(r+1)+" son"+ suma[d]+" \n ");}
                                  }}}
                                           }
                                    }
                                 break;
                                 case 2:
                                 break;
                               }
                    case 2:
                break;
                }
                }
               }
                         
                                       
                                  }    
                                                 



    · Los códigos deben ir en etiquetas GeSHi
    · Los temas de Java van en el subforo de Java, no C++
    >aquí las reglas del foro
    -Engel Lex