Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Mensajes - do-while

#821
Programación C/C++ / Re: ayuda. matriz binaria
14 Noviembre 2011, 09:37 AM
¡Buenas!

Siempre podras transformar la matriz en un vector:

Matriz m x n ->vector[m x n]
Matriz(i,j) ->vector[i * n + j] (0<= i < m, 0 <= j < n)

Ahora dada una matriz m x n, te hara falta almacenar m x n bits. Tomaremos como unidad del vector el byte (char). Asi, tendras que crear un vector de (m x n) / 8 + ((m x n) % 8 ? 1 : 0) bytes para poder almacenar todos los bits que te hagan falta.

Para acceder al elemento i , j:

- Tendras que saber el byte en el que se encuentra = numero de bits / 8 = (i * n + j) / 8
- Tendras que desplazarte dentro de ese byte (i * n + j) - ((i * n + j) / 8) * 8 bits a la izquierda (los bits totales de la posicion que buscas menos los la cantidad de bits de los bytes anteriores).

Por lo tanto el elemento i , j sera: vector[(i * n + j) / 8] >> (i * n + j) - ((i * n + j) / 8) * 8

¡Saludos!

PD: Si me he confundido con los calculos avisad, que lo he hecho un poco al vuelo.

¡Saludos de nuevo!

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.


PD2: No me he dado cuenta de que lo he puesto mal.

Para saber el valor del bit tendras que hacer un and:
vector[(i * n + j) / 8] & (1 << 7 - ((i * n + j) - ((i * n + j) / 8) * 8))

para ponerlo a uno lo haces con un or:
vector[(i * n + j) / 8] | (1 << 7 - ((i * n + j) - ((i * n + j) / 8) * 8))

y para ponerlo a cero con xor (si no era cero, evidentemente, sino lo estarias poniendo a uno):
vector[(i * n + j) / 8] ^ (1 << 7 - ((i * n + j) - ((i * n + j) / 8) * 8))

Siempre podras ponerlo a cero de forma directa con la formula:
vector[(i * n + j) / 8] ^ (vector[(i * n + j) / 8] & (1 << 7 - ((i * n + j) - ((i * n + j) / 8) * 8)))

Ahora creo que esta bien.

La primera parte sirve solo para pensar un poco como hacerlo, pero esta mal. Lo dejo porque de los errores se aprende.

¡Saludos!
#822
¡Buenas!

Puestos a liarla:

#include <stdio.h>

int main(void)
{
    int numero;
    int i;
    int es_primo;

    printf("Introduce el numero: ");
    fflush(stdout);

    while(!scanf("%d", &numero))
        while(getchar() != '\n');

    for (es_primo = (numero > 1 && (numero == 2 || numero % 2 == 1)) , i = 2 ; i * i <= numero && (es_primo = (numero % i != 0)); i++);

    printf("%d %s primo\n", numero, es_primo ? "es" : "no es");

    return 0;
}


XD

¡Saludos!
#823
Programación C/C++ / Re: Generador de contraseñas
13 Noviembre 2011, 16:42 PM
¡Buenas!

No es que tu codigo este mal, pero hay una forma de generar un solo caracter por iteracion para el segundo y tercer caso:

Mayusculas y minusculas
Código (cpp) [Seleccionar]

char mi_letra = (char)((rand() % 26 + 'a') + (rand() % 2) * ('A' - 'a'));

Asi si rand() % 2 == 1, generara una mayuscula y si rand() % 2 == 0 sera una letra minuscula.

Minusculas y numeros:
Código (cpp) [Seleccionar]

int numero = rand() % 2;
char mi_letra = (char)(rand() % (26 - 16 * numero) + 'a' + numero * ('0' - 'a'));

Si numero == 1, generaras primero un numero aleatorio ente 0 y 9, al que le sumaras 'a' y '0' - 'a', por lo que te generara un digito entre 0 y 9.

Si numero == 0, generaras un numero entre 0 y 25 al que le sumaras 'a' y 0 * ('0' - 'a'), es decir, tendras un caracter entre 'a' y  'a' + 25.

¡Saludos!
#824
Programación C/C++ / Re: Teorema del seno
10 Noviembre 2011, 09:48 AM
¡Buenas!

Enhorabuena por el codigo. Sigue asi. Solo te comentare algun detalle.

En C, las variables se declaran antes de cualquier otra sentencia del programa, por lo tanto, tendras que declararlas justo despues de la cabecera de las fuciones (en este caso al principio de main).

Y otro detalle, que funciona pero creo que tu intencion era otra, en las condiciones. Has puesto:if (aa && bb != 0 && cc==0)y expresiones similares.

Igual lo estoy interpretando mal y realmente querias poner esto, pero creo que tu intencion era decir que si aa y bb son distintos de cero y cc es igual a cero... En C y C++ tienes que poner cada condicion de forma explicita y utilizar parentesis para agruparlas. En este caso los parentesis dan igual, pero cuando utilices expresiones mas complejas que impliquen y y o logicos, tendras que tener en cuenta que el y tiene mayor precedencia que el o. Por lo tanto vete acostumbrandote, aunque te parezca que no es necesario, a utilizar parentesis, asi cuando empieces a manejar expresiones mas complicadas te ahorraras problemas. Bueno, la expresion quedaria asi:if ((aa!=0 && bb != 0) && cc==0).

¿Poque funciona el codigo que has puesto? En C las expresiones logicas son valores enteros, cero es falso y no cero eas verdadero, por lo tanto, las expresiones siguientes son equivalentes:

if (aa != 0 && bb != 0 && cc==0)
if (aa && bb && !cc)

Ya que si aa != 0, tanto la expresion aa != 0 como solamente aa son verdad, la primera de dara 1, y la segunda sera un valor distinto de cero, por lo que ambas seran verdad. Si cc == 0, significa que cc a secas es falso (ya que cc es cero) por lo tanto ! transformara el cero en uno, por lo que !cc y c == 0, produciran como resultado verdadero.

Recuerda esto:
cero es falso.
no cero es verdadero.
! transforma cero en uno.
! transforma no cero en cero.
&& tiene mayor precedencia que ||
utiliza parentesis para agrupar las expresiones logicas, aunque te parezca que no hace falta, para obligar a que se evaluen en el orden correcto.

Un ejemplo de esto ultimo seria por ejemplo, decidir el color y la forma de un objeto. Imagina que tiene una propiedad color, y otra forma y quieres saber si el objeto es por ejemplo un cubo de color rojo o azul. Lo harias asi:

if((color == ROJO || color == AZUL) && forma == CUBO)
    //...

Ya que si lo pones asi:

if(color == ROJO || color == AZUL && forma == CUBO)
    //...

&& se evaluara antes que || por lo que realmente estarias evaluando:


if(color == ROJO || (color == AZUL && forma == CUBO))
    //...


Ya ves que son detalles, el codigo en general esta bien, sigue trabajando que vas bien.

¡Saludos!
#825
¡Buenas!

Tu problema es que no quieres pensar. Casi lo tienes hecho. Ahi va una ayuda:

Si tienes cinco manzanas y te quitan tres, ¿Cuantas manzanas te quedan?

Respuesta: 5 - 3 = 2.

Si tengo una fecha y le quito otra, ¿Cuantos dias me quedan?

Respuesta: ...

¡Saludos!
#826
¡Buenas!

Alguna vez he hecho algun juego en consola utilizando conio.h de borland para hacer los dibujos utilizando el codigo ASCII (era para windows, no para linux). Esta libreria no te servira pero el principio que utilizaba si. Se trata poder situarte en la posicion que quieras de la pantalla, eliminar el objeto que se mueva, ir a la nueva posicion y redibujarlo alli. Para hacer esto en linux creo que se utiliza ncurses (si me equivoco corregidme). No conozco ncurses, pero seguro que en internet encontraras las funciones que te ofrece con ejemplos para poder utilizarlas.

Si en lugar de utilizar el ASCII para crear los objetos estas utilizando graficos, no se que libreria tienes que usar, pero el principio de posicionarte, eliminar, posicionarte y redibujar lo tendras que aplicar igualmente.

¡Saludos!
#827
¡Buenas!

Que los catolicos hagan lo que quieran. Sobre ellos que mande lo que dios quiera (jeje, buen juego de palabras... XD), pero que no me quiten el porno por su culpa.

A ver catolicos, a cerrar los ojicos cuando os metais en internet, que sino el tio Ratz nos querra joder a todos (y no solo a los niños).

¡Saludos!
#828
¡Buenas!

Aqui encontraras mucha informacion y ejemplos sobre las funciones de la libreria estandar. Entre ellas las de ctype.h, o ccype como se llama a su adaptacion a C++.

¡Saludos!
#829
¡Buenas!

Tan facil como escribir en una linea Menu:y el la siguiente:
- Guiones
- Guiones bajos
- El signo de igualdad
- Imprimirte el codigo ASCII por pantalla y escoger el caracter que mas te guste.

Con esta ultima opcion podras crear tambien recuadros para tablas con distintos bordes y lineas de separacion.

¡Saludos!
#830
Foro Libre / Re: Duda con ecuaciones
4 Noviembre 2011, 06:40 AM
Cita de: Kasswed en  3 Noviembre 2011, 23:12 PM
O eso o tiras de ecuaciones diofánticas, pero veo que tienes un número real así que no se podría

Tan facil como plantearlo asi:

2y = 4x + 25


¿No?

¡Saludos!