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

#941
Claro, es cierto que si el vector es de tamaño 100 no puedes acceder a la posición 100 ya que la última es la 99 pero lo que se suele hacer es guardar el primer valor en la posición 0 (aunque sea un 1) y así en la 99 (entraría el último valor 100). Como es lógico, no coincide el índice con el número que vas a almacenar (por ejemplo el 1 en la posición 0 en vez de el 1 en la posición 1) pero eso se puede arreglar ajustando el código donde sea necesario usando algún <i+1> en vez de i para que todo cuadre.

De todos modos nunca he usado el Visual Basic C++ entonces igual es algo a tener en cuenta si se usa ese IDE (no voy a hablar de lo que no sé). Pero una cosa importante es que o no estoy teniendo en cuenta que sea posible ejecutar ese código o ese código desde mi punto de vista al menos tiene errores básicos como la falta de índices ya que si no usas índice diría desde mis conocimientos que accedes a la posición de memoria y creo que ese no es el objetivo. A mí al menos compilando desde una terminal de Ubuntu me salen errores de compilación con ese código.

Por lo tanto si el código no es tuyo no puedo adivinar que debería hacer ese cuarto bloque que no he descrito antes pero intento explicarte así en líneas generales: Si poner una etiqueta al código mediante:
Código (C++) [Seleccionar]

etiqueta:

puede hacer un salto incondicional a esa etiqueta con la orden <goto> y el nombre de la etiqueta, tal que:
Código (C++) [Seleccionar]

goto etiqueta;

por lo que cuando se ejecuta la línea del <goto> lo que se produce es un salto hacia atrás que es donde está la etiqueta.

Normalmente esto son prácticas no recomendadas en lenguajes de alto nivel al igual que evitar el uso de <break> (excepto en bloque switch) y otras más. Puedes buscar información adicional respecto a esto si te interesa saber cuales son esas instrucciones.

Y bueno para terminar lo otro que falta por analizar son simples operaciones aritmético-lógicas y de asignación que no tienen mayor misterio.
#942
Programación C/C++ / Re: Valor primo absoluto C++
16 Noviembre 2018, 04:54 AM
Ya tienes lo más complicado. Tienes una función que te dice si un número es primo y tienes otra función que te devuelve la suma de los dígitos de un número.

Cuidado con esto en <es_primo(unsigned n){}>; es primo, no primer:

primer=n%divisor!=0;


Solo te falta hacer un bucle como el del main, pero en vez de mostrar la suma de los dígitos, tienes que comprobar que el número siga siendo primo. Entonces en el bucle mientras el número sea >= 10 y el número sea primo aboluto: si el número no es primo, entonces no es primo absoluto, sino el número es igual a la suma de sus cifras. Un ejemplo de cómo quedaría es:

Código (C++) [Seleccionar]

bool isAbsolutePrime(unsigned num){
bool absPrime = isPrime(num);
while(num >= 10 && absPrime){
num = sumDigits(num);
if(!isPrime(num))
absPrime = false;
}
return absPrime;
}


Y en el <main> puedes ejecutarlo como (los nombres de las funciones son distintos pero su contenido no).
Tendrías que adaptarlo a tu código o simplemente ahorrarte la función <isAbsolutePrime(unsigned)> y hacerlo en el <main> directamente.

Código (C++) [Seleccionar]

int main(){

unsigned max;
cout << "Introduce el limite maximo: ";
cin >> max;

for(size_t i = 0; i < max; i++)
if(isAbsolutePrime(i))
cout << i << "  ";

cout << endl;
return 0;
}
 
#943
Podrías copiar el código del programa para echarle un vistazo?
Ya que yo probé a ejecutar el programa con las modificaciones que había hecho y si me funcionaba.
#944
En primer lugar preguntarte si estos programas los has implementado tú o son códigos que has obtenido de algún otro sitio. Ya que tanto este como el otro programa que has comentado hace un rato y que vengo de responder tienen errores básicos de indexación. Por lo tanto te recomendaría que le echarás un vistazo a ese punto ya que es fundamental para casi cualquier programa.

Lo segundo recalcar que los índices en C++ empiezan en 0, no en 1 como estás teniendo en cuenta; otro dato que debes tener en cuenta.

Y te recomiendo que empieces corrigiendo estos errores, y acostumbrarte a no usar "números mágicos" como te he explicado en el otro post ya que dificulta un poco el entendimiento del programa.

Por ejemplo si sabes que la matriz es 3x3 no crees de manera aleatoria una matriz de 6x4. En todo caso podrías crear una matriz más grande si no sabes cuantas filas o columnas vas a utilizar (y usar dos variables para recorrer solo las posiciones útiles de la matriz, esto es habitual cuando trabajas con matrices estáticas de las que desconoces su tamaño) para ello:

Código (C++) [Seleccionar]

const int TAM = 10;
int matriz[TAM][TAM];
int fila_util = 3;
int col_util = 3;


Te comento que a cada posición de una matriz se accede como matriz[fila][columna] tanto para leer su contenido como para escribir en ella. Dicho esto empieza haciendo programas más pequeños y sencillos para familiarizarte con ello y te será más sencillo que querer abarcar programas con más código como estos.
#945
Muy bien, empecemos por partes.

Código (C++) [Seleccionar]

#include <iostream>
#include <stdlib.h>


Lo primero de todo parece que estás programando en C++. Por lo tanto sería recomendable usar el formato de las librerías de C++: una libreria C  se declararía como <libreria.h> como has hecho en <stdlib.h>. Su variante en C++ sería <clibreria>, es decir, que la misma librería quedaría <cstdlib>. El funcionamiento va a ser correcto de todos modos pero es simplemente por aclarar esto desde los comienzos de la programación. Por tanto sería conveniente modificarlo por:

Código (C++) [Seleccionar]

#include <iostream>
#include <cstdlib>


Dicho esto empecemos con el programa ya que veo algunos errores básicos. Creo que no es necesario analizar exhaustivamente las primeras líneas; en ellas declaramos 3 arrays (vectores) de tamaño 101, 3 variables i, j, z inicializadas a 1 y una variable valor. Es conveniente también no usar "números mágicos", estos son números que aparecen literales como el 101, por lo tanto el tamaño de los arrays es conveniente hacerlo con constantes, así si queremos cambiar el tamaño solo tenemos que cambiarlo en un sitio y el programa funcionaría correctamente:

Código (C++) [Seleccionar]

const int TAM = 101;
int valores[TAM], numeros[TAM], solucion[TAM];


Vamos a revisar el acceso a los arrays. Un array v[3] tiene tamaño = 3, va de 0 a 2, por lo tanto sus posiciones son v[0], v[1], v[2]. Visto esto el bucle quedaría así para poner todas las posiciones a 0:

Código (C++) [Seleccionar]

for (i = 0; i < TAM; i++) // CICLO FOR PARA RELLENAR LOS 3 VECTORES CON CEROS EN TODAS SUS POSICIONES.
{
  valores[i] = 0;
  numeros[i] = 0;
  solucion[i] = 0;
}


Pero esto no es necesario ya que si en la declaración hacemos:

Código (C++) [Seleccionar]

const int TAM = 101;
int valores[TAM] = {0}, numeros[TAM] = {0}, solucion[TAM] = {0};


Excepcionalmente si inicializamos los arrays así, se inicializarían todas las posiciones del array a 0.

El segundo bloque empezando en i = 1, guarda el doble de i (imagino que en la posición i del vector) e incrementa i en 1. Primero vemos que falta el índice del array como en el bucle anterior y en segundo lugar vemos que si i empieza en 1 la posición 0 no se modifica por lo que valores[0] = 0. Una alternativa es usar un bucle for y evitar el uso del 101 usando la variable TAM, también se puede evitar el uso de la variable valor (opcional). Esto quedaría:

Código (C++) [Seleccionar]

for (i = 1; i < TAM; i++) // ESTE CONDICIONAL ME VA GUARDAR LOS NUMEROS DE 2 EN 2 HASTA EL 200 EN LA VARIABLE VALORES .
{
  valor = i * 2;
  valores[i] = valor;
}


Excepcionalmente date cuenta que si la primera operación que hacemos sobre el array valores es de escritura no es necesario inicializarlo a 0 y simplemente empezando este segundo for en i = 0 el resultado obtenido sería el mismo, pero no es mala idea inicializar las variables en la declaración.

El tercer bloque es estructuralmente idéntico al segundo ya explicado por lo que puedes aplicar las mismas modificaciones. Recuerda siempre poner el índice al array, es fundamental.

El cuarto bloque... Vamos a corregirlo de raíz porque tiene graves problemas. Pero para ello necesito que me expliques cual es el funcionamiento deseado ya que tiene muchas interpretaciones posibles o si simplemente te han dado este código para que lo analices (de ser así un código un poco...). Bueno espero tu respuesta.

Ahora analizamos el bloque final. Me he dado cuenta ahora de que igual no sabías que la primera posición del array es la 0, no la 1.
El trozo de "Solucion = " hay que ponerlo antes del if ya que si la posición 1 es 0 pero las otras no, se escribirían las otras posiciones pero no aparecería "Solucion = " por pantalla. Además faltaba el índice dentro del for de <solucion>. El código quedaría algo así:

Código (C++) [Seleccionar]

cout << "Solucion = ";
if (solucion[0] != 0)
{
  cout << solucion[1];
}

for (i = 1; i < TAM; i++)
{
  if (solucion[i] != 0)
  {
   cout << " - " << solucion[i];
  }
}


Y para finalizar, comentarte que hay muchas referencias a evitar la llamada system("pause"). Como alternativa te recomiendo cin.get();
Puedes buscar información adicional sobre esto si te interesa.

PD: Viendo el funcionamiento del programa igual lo correcto era crear arrays de tamaño 100 y empezar metiendo el 1 en posición 0. Ya que es un valor que he visto que no se ha utilizado en toda la ejecución del programa. Te lo dejo a ti por si quieres intentarlo y me cuentas.
En cuanto a tu segunda pregunta no puedo darte una respuesta sin saber cual es el funcionamiento buscado en el bloque que he dejado sin explicar.
#946
Varias cosas a tener en cuenta. Aunque en este programa al ser sencillo no afectan al funcionamiento:

Hay que limitar el uso de variables globales, ya que estas se pueden alterar desde cualquier parte del programa. Por eso es mejor declarar como global y constante el tamaño del vector pero el vector es mejor declararlo dentro del main (date cuenta de que si el vector es global no es necesario pasarlo como parámetro de la función ya que se puede usar directamente).

Si declaramos una constante <TAM> para el tamaño del vector, usar esa constante en la declaración del vector. Así si queremos cambiar el tamaño del vector sólo tendríamos que cambiarlo en el valor de <TAM> y el programa ya estaría modificado.

En el prototipo de la función es cierto que no hace falta indicar el nombre de las variables, solo su tipo. Pero ya que está el nombre del vector, quedaría mejor poner el nombre del segundo parámetro (el tamaño en este caso). Recalcar que al ser variables globales no sería necesario pasarlas como parámetros ya que ya existen en todo el programa. Nótese también que en el main se utiliza la variable <TAM> que es global mientras que en el cuerpo de la función se utiliza <tam> ya que es el nombre con el que nos referimos al segundo parámetro. Podría eliminarse ese segundo parámetro y usar <TAM> dentro de la función también.

En el main hay dos bucles: uno para rellenar el vector y otro para mostrar cada elemento. Esto se puede hacer en un solo bucle para ahorrar tiempo y no tener que recorrer el bucle completo dos veces.
Además de eso se especifica que el resultado es real, por lo que la función debe devolver un float o un double, no un int.

Puedes probar a cambiar algunas de las cosas que he comentado arriba para entender su funcionamiento y si tienes alguna duda no dudes en preguntar.
El código final quedaría algo por el estilo:


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

const int TAM = 5400;

float promedio_V(int vector[], int tam);

int main(){
int vector[TAM];

srand(time(0));

for(int i = 0; i < TAM; i++){
vector[i] = 1 + rand() % 100;
printf("%d\n", vector[i]);
}

printf("El promedio del vector es %.2f\n", promedio_V(vector, TAM));

return 0;
}

float promedio_V(int vector[], int tam){
float suma = 0;

for(int i = 0; i < tam; i++)
suma += vector[i];

return suma/tam;
}
#947
Ya que no puedes usar un array para resolver este problema, una posible solución es crear una función auxiliar con dos parámetros y usarla en tu función.
Quedaría algo de este estilo:

Código (c++) [Seleccionar]

int Mayor (int a, int b){
    int mayor = a;
    if (b > mayor)
        mayor = b;
    return mayor;
}

int Mayor (int n1, int n2, int n3, int n4, int n5){
    int mayor = Mayor (Mayor (n1, n2), Mayor (n3, n4));
    mayor = Mayor (mayor, n5);
    return mayor;
}


Ambas funciones pueden tener el mismo nombre porque el número de parámetros es distinto.
Si tienes alguna duda al respecto puedes buscar información sobre la sobrecarga de funciones.

Al llamar a la función Mayor desde la propia función se resuelven primero las funciones interiores y finalmente la exterior.
Como faltaría por comprobar un número lo he comprobado en otra línea aunque se podría hacer todo a la vez.
Queda un poco ilegible el código pero puedes probar a hacerlo.