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 - K-YreX

#901
Claro porque lo que hace es guardar los elementos que están tanto en <valores> como en <numeros> y en <valores> tienes los múltiplos de 2 y en <numeros> los múltiplos de 3. Y los números que están en ambos son entonces múltiplos de 2 y de 3 y eso por definición son los múltiplos de 6.
#902
Citar
Creo que ahora ya vas viendo lo que va a hacer: ¿Cuándo va a entrar al <if> que hay dentro del <for>? Cuando un valor esté en <valores> y en <numeros>. Y como en <valores> tenemos los múltiplos de 2 y en <numeros> tenemos los múltiplos de 3... Que va a haber en <soluciones>? :silbar: Exacto, los múltiplos de 2 y 3 al mismo tiempo, es decir, los múltiplos de 6.

Aquí lo tienes, es decir, sí que va a entrar en el <if>. Simplemente que el proceso explicado brevemente sería:
<i = 1> <j = 1> No entra.
Se repite el <for> hasta el último valor de j (no va a entrar en ninguna repetición).
<i = 1> <j = 99> No entra.

Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 2>
<i = 2> <j = 1> No entra.
Se repite el <for> hasta el último valor de j (no va a entrar en ninguna repetición).
<i = 2> <j = 99> No entra.

Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 3>
<i = 3> <j = 1> No entra.
EXCEPCIÓN: <i = 3> <j = 2> ENTRA. Entonces <z = 1> solucion[1] = valores[3] = 6
Se repite el <for> hasta el último valor de j (ya no entra más veces).
<i = 3> <j = 99> No entra.

Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 4>. Entonces valores[4] = 8 (no va a entrar)
Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 5>. Entonces valores[5] = 10 (no va a entrar)

Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 6>. Entonces valores[6] = 12
Ahora si va a entrar cuando j sea 4 ya que numeros[4] = 12.

Es decir el programa coge la posición <i> de <valores> y la compara con todas las posiciones de <números>, si coincide alguno lo mete en <solucion> y cuando lleg al final de <numeros> incrementa <i>; entonces ahora compara la siguiente posición de <valores> con todas las posiciones de <numeros> y si coincide alguno lo mete en <solucion>.
Es decir, que el programa compara todos los elementos de <numeros> con cada elemento de <valores>. Al final lo que hace es comparar los dos vectores enteros.

PD: Cuando digo que vuelve a entrar en el <for>, por lo que he explicado antes, j vuelve a empezar desde 1.
#903
Cita de: Estudiante000000 en 22 Noviembre 2018, 00:01 AM
Continuando con el analisis  y la parte que no entiendo es la siguiente.
Código (cpp) [Seleccionar]

i = 1;
iterar:
for (j = 1; j <= 100; j = j + 1){
    if (valores[i] == numeros[j]){
        solucion[z] = valores[i];
        z = z + 1;
    }
}
if (i <= 100){
    i = i + 1;
    goto iterar;
}


En esta parte basicamente segun lo que veo es que voy a empezar con ciclo for desde que j=1, hasta que j<=100 , y cual con un if voy  a comparar los arreglos valores y numeros[j] , y si hacemos la primera comparacion tengo que  :

valores[i=1] = 2  y numeros[j=1] = 3 cual la condicion del if no deberia de cumplirse , asi que pasaria al siguiente if 


Código (cpp) [Seleccionar]

if (i <= 100){
    i = i + 1;
   goto iterar;
}


  En este if como i=1 es menor o igual que 100 , se cumple la condicion y voy a iterar i , y posterior redireccionarme con el goto iterar hasta este for.

Código (cpp) [Seleccionar]

iterar:
for (j = 1; j <= 100; j = j + 1){
    if (valores[i] == numeros[j]){
        solucion[z] = valores[i];
        z = z + 1;
    }
}


  Como itero j y i , quedarian i=2 y j=2 , y se haria de nuevo la comparacion  pero tendria lo siguiente

valores[i=2] = 4 y en numeros[j=2] = 6 , lo cual de nuevo no se cumpliria la condicion del if y asi sucesivamente  y siempre se harian las comparaciones hasta que i=99 lo cual que esa condicion  nunca se cumpliria , no se me equivoco en algo dime porfavor.

Todo el análisis que no aparece en la cita es correcto, está bastante bien. Pero a partir de aquí es donde tienes un error así que vamos a ello.
Voy a ponerte un ejemplo para que veas a donde quiero llegar:
Código (cpp) [Seleccionar]

iterar:
cout << "Se repite la iteracion" << endl;
for (j = 1; j <= 100; j = j + 1){
    if (valores[i] == numeros[j]){
        solucion[z] = valores[i];
        z = z + 1;
    }
}
if (i <= 100){
    i = i + 1;
    goto iterar;
}


Si pruebas a ejecutar esto en lugar del código original (solo he añadido una línea después de la etiqueta iterar) verás el porqué del error y el porqué de que no se recomiende usar etiquetas y <goto> para los saltos. El sentido de añadir esa frase antes del <for> es que cada vez que se ejecute <goto etiqueta> se va a repetir esa frase en pantalla... Por qué? :huh: Vamos a analizarlo de nuevo sin la instrucción que he añadido que es meramente demostrativa:
El comienzo que has hecho es correcto, antes de llegar al <for> tienes <i = 1>, entonces (importante) ENTRAS en el <for> por lo tanto <j = 1>. Comparamos:
valores[i = 1] = 2
numeros[j = 1] = 3
Son distintos, entonces otra iteración del <for> ahora con <j = 2>. Entonces vamos a comparar cada posición de <numeros> con <valores[1]>. Nunca va a ser cierto ya que <numeros> sigue creciendo y <valores[1]> es menor que todos. Llegamos al final del <for> con <j = 100> ahora ya no se va a repetir, entonces salimos del <for> y miramos el <if> de fuera: ¿i <= 100? Sí, entonces <i = 2> y <goto iterar>. Volvemos ANTES del <for> entonces se ejecuta la inicialización otra vez, <i = 1> y se repite el proceso comparamos cada valor de <numeros> con <valores[2]> lo que nunca va a ser cierto.

Creo que ahora ya vas viendo lo que va a hacer: ¿Cuándo va a entrar al <if> que hay dentro del <for>? Cuando un valor esté en <valores> y en <numeros>. Y como en <valores> tenemos los múltiplos de 2 y en <numeros> tenemos los múltiplos de 3... Que va a haber en <soluciones>? :silbar: Exacto, los múltiplos de 2 y 3 al mismo tiempo, es decir, los múltiplos de 6.

Ahora ya podemos responder a la pregunta, te la dejo a ti que seguro que te hace más ilusión dar con la respuesta correcta en vez de decírtelo yo. ;-) ;-)
#904
Programación C/C++ / Re: Ayuda!!
21 Noviembre 2018, 12:00 PM
Está muy bien que te importe aprobar la asignatura de programación y está mejor todavía aprobar una asignatura sólo con hacer esos 4 programas  :xD :xD
Pero nosotros no estamos aquí para hacerte la tarea, que el que necesita aprobar eres tú, no los demás. Esto es un foro y ni a mí ni a ningún otro usuario de este foro creo que nos importe ayudarte a resolverte una duda.
Así que si tan importante es para ti aprobar ponte a hacer los programas y cuando te surja una duda puntual, te metes en el foro y te ayudamos a resolver esa duda. Si no te convence tanto esta idea es que no es tan importante para ti aprobar esta asignatura. :silbar:

PD: Si sigues queriendo ayuda (pero ayuda de verdad) te recomiendo que adjuntes el código que estés haciendo (entre etiquetas GeSHi) para que podamos ver cómo lo llevas.
#905
Primero decir que C no es mi fuerte, ya que programo más en C++ pero te comento:
- Por lo que he leído ahora mismo por ahí, las funciones de entrada de datos que usas son para especificar el tamaño máximo de la entrada, cosa que no haces. Por ejemplo <gets_s> debería recibir la variable donde quieres guardas el dato y el tamaño máximo. En ese caso te recomiendo usar <fgets> y sería tan simple como <fgets(cadena1, 10, stdin);> es decir guardar en cadena1 los 10 primeros caracteres cogidos de la entrada estándar.

- Segundo... Pero este trozo de código que sentido tiene?? :huh:

if(cadena1[11]>10){
printf("no puede exceder 10 cartacteres, de nuevamente el nombre");
}
else{
while(cadena1[11]>10);
{
// mas codigo
}

Traduzco por si las moscas: si el caracter guardado en cadena1[11] es mayor que 10 (supongo que comparará en Ascii lo que tampoco tiene mucho sentido creo yo), mostramos por pantalla que no se puede exceder de 10 caracteres; sino (osea si cadena1[11] no es mayor que 10) mientras cadena1[11] sea mayor que 10 que haga el resto del código... Te das cuenta que es un sin sentido? :-\
PD: El while va sin ";". El do while sí va con ";". Aunque siga estando mal para futuros programas.

- Tercero: no repitas código (lo que se conoce como principio de una única vez). Si en ambos casos del switch acabas haciendo lo mismo, hazlo una vez hayas salido del switch y así sólo lo pones una vez.

- Cuarto: quieres repetir el programa? Aquí tienes un ejemplo para que lo adaptes.

char respuesta;
do{
   // codigo, mucho codigo
   printf("Desea repetir el programa (s/n): ";
   scanf("%c" &respuesta);
} while(respuesta == 's' || respuesta == 'S');

PD: Los caracteres entre comillas simples, las cadenas de caracteres entre comillas dobles.

Edit: He estado probando a ver cómo podría hacer el programa y aunque he conseguido avanzar algo, no consigo que quede del todo correcto. El código que he implementado es el siguiente:

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

const int SIZE_NAME = 10;
const int SIZE_EMAIL = 30;

typedef enum{true = 1, false = 0} bool;

int main(){
char name[SIZE_NAME+1];
char hotmail[] = "@hotmail.com";
char gmail[] = "@gmail.com";
char finalEmail[SIZE_EMAIL];
int option;
char repeat;
bool validEmail;

do{
validEmail = true;
//do{ // bucle para quitar los saltos de linea del buffer || getchar() del ultimo while
strcpy(name, "");
strcpy(finalEmail, "");
system("clear");
printf("Enter your name for the email: ");
fgets(name, SIZE_NAME, stdin);
printf("\n%lu\n", strlen(name));
//} while(name[0] == '\n');

printf("Select an option:");
printf("\n\t1. Hotmail");
printf("\n\t2. Gmail");
printf("\nOption: ");
fscanf(stdin, "%d", &option); // opcion 1 para guardar opcion
//scanf("%d", &option); // opcion 2 para guardar opcion

//printf("%s", finalEmail); // prueba
//printf("%s", name); // prueba
// esta funcion inserta la respuesta anterior antes de la nueva. Descomentar pruebas para verlo
strncpy(finalEmail, name, strlen(name)-1);
//printf("%s", finalEmail); // prueba
switch(option){
case 1:
strncat(finalEmail, hotmail, strlen(hotmail));
break;
case 2:
strncat(finalEmail, gmail, strlen(gmail));
break;
default:
printf("\nThis option is invalid\n");
validEmail = false;
break;
}
if(validEmail){ // no se puede repetir programa si validEmail == false por errores en el buffer
printf("\nYour email is: %s\n", finalEmail);
printf("\nDo you want to repeat the program (y/n): ");
do{ // bucle para evitar que el salto de linea del buffer nos impida elegir si repetir programa
repeat = getchar();
} while(repeat == '\n');
}
} while(validEmail && (repeat == 'y' || repeat == 'Y') && getchar()); // getchar() para eliminar un '\n' del buffer || do while inicial
}


Lo que no consigo arreglar es que si introduces un correo y deseas escribir otro, si el segundo nombre es más corto que el primero se repite el primer nombre. Además si el segundo nombre no es más corto se añade el correo anterior y se concatena la nueva opción. Os pongo un ejemplo para que veáis a lo que me refiero:
nombre1: aaaaaa
opcion1: 1
email1: "aaaaaa@hotmail.com"

Hasta aquí todo bien pero ahora introducimos "y" para crear otro correo:
nombre2: bb
opcion2: 2
email2: "bbaaaa@hotmail.com@gmail.com"

No sé muy bien como solucionar esto. Si alguien puede echar un vistazo al código anterior y corregirme si me he equivocado en algo...
Dentro del propio código hay algunos comentarios sobre el porqué de algunas partes del código (he averiguado la línea en la que sucede ese error que he explicado antes y está señalado en el código).
Y por último me gustaría que el código quedase bien, es decir, si se pudiese arreglar el código sin añadir un montón de cálculos incomprensibles (no sé si me explico).

PD: Por este tipo de cosas me quedo con C++. Pero me gustaría conseguir resolver este programa :rolleyes:
#906
.NET (C#, VB.NET, ASP) / Re: Matriz aleatoria
21 Noviembre 2018, 02:04 AM
Cita de: NEBIRE en 21 Noviembre 2018, 02:00 AM
Resumiendo tu código sería:
1º Generar array de primos
2º Barajar los primos.
3º Asignarlos valores primos barajados al array bidimensional (si bastara un array unidimensional, el array primos una vez barajado se podría devolver, haciendo innecesario el punto 3º.
Yo había pensado generar el array de primos y en lugar de barajar el array y después asignarlo a cada posición de la matriz, asignar a cada posición de la matriz una posición aleatoria del array de primos (entre 0 y 23) y así no desordenas el array de primos.
#907
.NET (C#, VB.NET, ASP) / Re: Matriz aleatoria
21 Noviembre 2018, 01:44 AM
Cita de: sleepy.lito en 21 Noviembre 2018, 01:38 AM
El objetivo del programa es generar una matriz de 6x4 con los primeros 24 numeros primos y que estos sean aleatorios.
Los 24 primeros números primos son estos: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89. Es decir, que no entiendo lo de "que estos sean aleatorios". Te refieres a tener esos 24 números y meterlos en la matriz desordenados?   
#908
Entonces tienes que hacer lo que te he comentado antes pero sin usar arrays, osea directamente suma cada dígito a un acumulador si la posición es par y a otro acumulador si es impar. Como pista tienes que usar los operadores </> (calcula el cociente de una división) y <%> (calcula el resto de una división entera) y usar algunas potencias de 10 para ir separando dígitos.
Ahora el programa te toca hacerlo a ti.
#909
Para ello tienes que descomponer el número. Puedes hacerlo con un algoritmo que va cogiendo cada cifra y metiéndola en un array o bien transformándolo en un string o cadena C para poder acceder a cada posición independientemente.
Si tienes alguna duda más pon tu código para ver lo que pretendes hacer exactamente.
#910
.NET (C#, VB.NET, ASP) / Re: Matriz aleatoria
20 Noviembre 2018, 23:14 PM
No entiendo muy bien tu pregunta, si pudieras ser más claro con el objetivo del programa (con un ejemplo).
De todos modos si no puedes usar un <for> pero sí puedes usar un <while>... Aquí tienes como se transforma un <for> en un <while>:silbar::
Código (csharp) [Seleccionar]

// BUCLE FOR
for(int i = 0; i < n; i++){
// cuerpo del for
}

// BUCLE WHILE
int i = 0;
while (i < n){
// cuerpo del while
i++;
}