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 - ciquee

#1
Nada, ya le puedo dar todas las vueltas que quiera que me da errores con la función AnalizarFichero y PedirNumeroPositivo. Yo no me limito a copiar y pegar, como bien dices para aprender hay que entender el código, pero no entiendo porque me da error, pongo en negrita los errores que me indica mi programa:


#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

void MostrarPresentacionPrograma (void);
ifstream AnalizarFichero(string);
int PedirNumeroPositivo (ifstream);
bool EsPrimo(int);


int main (void) {

int num;
MostrarPresentacionPrograma ();
ifstream fichero = AnalizarFichero(string);
[b]num = PedirNumeroPositivo (ifstream);[/b]

while (num != 0){
if (EsPrimo (num) == 1)
cout << "El numero " << num << "es primo.\n";
else
cout << "El numero " << num << " NO es primo.\n";
[b]num = PedirNumeroPositivo(fichero);[/b]
}

fichero.close();
cin.get();
return 0;
}


ifstream AnalizarFichero(string nombreFichero) {
ifstream fichero;

cout << "Introduzca el nombre del fichero: " << endl;
getline (cin,nombreFichero);

fichero.open (nombreFichero.c_str());

if(!fichero){
exit (1);
}

return fichero;
}


int PedirNumeroPositivo(ifstream fichero) {
int numero = 0;

if(!fichero.eof())
fichero >> numero;

return numero;
}

void MostrarPresentacionPrograma (){
cout << "Este programa determina si los numeros enteros positivos de un fichero son o no primos" << endl;
}


bool EsPrimo (int num) {
for (int i = 2; i <= num-1; i++){
if (num % i == 0){
return false;
}
}

return num >= 2;
}


No he cambiado la función EsPrimo porque he estado probando con la que me dices y no me da bien algunos resultados, pero no pasa nada, dejo esta que tengo quitando la variable que no usaba.

Y también he probado a hacer la función AnalizarFichero de esta otra forma y nada...

bool AnalizarFichero(ifstream &fichero) {
string nombreFichero;
bool fichero_ok = true;

cout << "Introduzca el nombre del fichero: " << endl;
getline (cin,nombreFichero);

fichero.open (nombreFichero.c_str());

if(!fichero){
fichero_ok = false;
}

return fichero_ok;
}


Y respecto a a la función MostrarPresentacionPrograma ¿esta bien ahora? porque no entiendo muy bien para que sirve, ya que no es reutilizaba para otros programas ni nada, y me cuesta menos poner un cout con lo que hace el programa que llamar a la función... no se...
#2
Muchas gracias a los dos! Manolo me apunto tus apuntes y libros! Y gracias por el consejo, se hace lo que se puede, estoy haciendo la carrera ya un poco mayor y además soy deficiente visual así que me entero más buscando por mi cuenta y preguntando por aquí después de clase, no lo puedo hacer de otra manera... pero muchas gracias!

A ver, pues yo sigo atascado, porque mi principal bloqueo es al dividir en dos funciones las tareas de abrir un fichero, y leer de este mismo. Y es que por más que lo miro y le doy vueltas no sé hacer lo que me dices YreX-DwX, no sé como es eso de devolver como parámetro. Si me lo pudierais explicar... además luego como cierro el fichero?

Y respecto al resto de funciones a ver como están ahora, he hecho algún cambio pero no se...


#include <iostream>
#include <fstream>

using namespace std;

bool AnalizarFichero(string);
int PedirNumeroPositivo (int);
bool EsPrimo(int);
void MostrarPresentacionPrograma (void);

int main (void) {

int num;
MostrarPresentacionPrograma ();
bool AnalizarFichero (string nombre);
num = PedirNumeroPositivo (num);
if (EsPrimo (num) == 1)
cout << "El numero " << num << "es primo.\n";
else
cout << "El numero " << num << " NO es primo.\n";

cin.get();
return 0;
}


bool AnalizarFichero(string) {
ifstream archivo;
string nombreArchivo;

cout << "Introduzca el nombre del archivo: " << endl;
getline (cin,nombreArchivo);

archivo.open (nombreArchivo.c_str());

if(!archivo){
return 0;
}

else {
PedirNumeroPositivo(int num);
}

archivo.close ();
}


int PedirNumeroPositivo(int num) {
string archivo;

while (!archivo.eof())
{
archivo >> num;
}
}


void MostrarPresentacionPrograma (){
cout << "Este programa determina si los numeros enteros positivos de un fichero son o no primos" << endl;
}


bool EsPrimo (int num) {
bool es_primo = false;
for (int i = 2; i <= num-1; i++){
if (num % i == 0){
return false;
}
}

return num >= 2;
}


A ver qué me decís!!
#3
Buenas! Gracias YreX-DwX! y perdón por no abrir un nuevo tema, pero como es un ejercicio que trata de lo mismo que el anterior... no lo volveré a hacer!

Con tu explicación he entendido más o menos lo de los retornos y las funciones que quiero que haga cada función, aunque en este ejercicio está claro las funciones a utilizar porque me lo piden en el enunciado.
- La función MostrarPresentacionPrograma creo que esta claro que debe ser void ya que no nos devuelve nada, solo nos tiene que mostrar los "cout".
- La función AnalizarFichero qué creo que también puede ser void ya que necesitamos que nos abra el fichero solamente.
- La función PedirNumeroPositivo (que más bien se debería llamar CogerNumeroPositivo) ya que los va a extraer del fichero, la cual debe retornar un int.
- Y la función EsPrimo, la cual ya tenemos, y será bool.

Vale, la función EsPrimo ya la tengo, y las demás por más vueltas que le dé no consigo hacerlas. Además, la función AnalizarFichero me abre el fichero pero también me lo cierra, no sé cómo hacer para que lo deje abierto (porque podría obviar la linea de archivo.close() pero luego de pasarle la siguiente función PedirNumeroPositivo ¿cómo la cierro?).

Con la función PedirNumeroPositivo tampoco sé cómo proceder, ya que como tiene que ser independiente de las demás debería abrir el archivo dentro de esta para poder coger los números positivos. Y esto que yo he hecho como que no lo veo...


int PedirNumeroPositivo(int num) {
string archivo;

archivo >> num; // Guardamos en num un numero entero del fichero
}

return 0;
}


En cuanto a la función "MostrarPresentacionPrograma" bastaría con un cout que diga lo que va a hacer el programa ¿no? algo así...:


void MostrarPresentacionPrograma (){

cout << "Este programa determina si los numeros enteros positivos de un fichero son o no primos" << endl;

return 0;
}


Y luego una duda que me surge a la hora de hacer las funciones, mi profesor califica de "Mala práctica" el utilizar más de un Return en cada función, y en por ejemplo en la función EsPrimo (utilizada ya en el ejercicio anterior) he usado 2, pero no sabría como hacerla sin ambos ¿sabes porque es una mala práctica?
#4
Por fin lo conseguí!!í Muchas gracias!! Aunque solo me saca 8 números perfectos, pero a todos los compañeros les pasa igual, del 7º al 8º tarda bastante, igual si lo dejo mucho tiempo mas saca el 9º y el 10º o igual mi ordenador no es potente ni para eso! jajja.

Bueno, ahora estoy con otro ejercicio que lo tengo casi casi, o eso creo, del mismo estilo, aunque sin formulas ni nada, solo que se han de usar mas funciones para estructurarlo. El enunciado me pide esto:

Realiza un programa en C++ que lea números enteros de un fichero y nos diga de cada uno de ellos si es primo o no lo es, utilizando en este la función EsPrimo que hiciste para un ejercicio anterior. El programa principal debe seguir
el siguiente esquema:


void AnalizarFichero(string nombre);
int main (void)
{
int num;
MostrarPresentacionPrograma ();
num = PedirNumeroPositivo ();
if (EsPrimo (num) )
cout << "El numero es primo.\n";
else
cout << "El numero NO es primo.\n";
return 0;
}
void AnalizarFichero(string nombre)
{
// Abrir Fichero
...
// Comprobar la correcta apertura del
// fichero
...
// Mientras sea posible leer
// un entero num del fichero
...
if (EsPrimo (num) )
{
cout << "El numero " << num;
cout << " es primo.\n";
}
else
{
cout << "El numero " << num;
cout << " NO es primo.\n";
}
// Cerrar Fichero
return;
}


Y la salida debería ser algo así:
Este programa determina si los numeros enteros positivos de un fichero son o no primos
- Dame nombre del fichero: enteros.dat
- El numero 23 es primo
- El numero 6 NO es primo
- El numero 3 es primo
- El numero 27 NO es primo
- El numero 20 NO es primo

Vale, y ahora va lo que yo tengo hecho:


#include <iostream>
#include <fstream>

using namespace std;

void AnalizarFichero(string);
int PedirNumeroPositivo (int);
bool EsPrimo(int);
void MostrarPresentacionPrograma (void);

int main (void) {

int num;
MostrarPresentacionPrograma ();
void AnalizarFichero (string nombre);
num = PedirNumeroPositivo (num);
if (EsPrimo (num) == 1)
cout << "El numero es primo.\n";
else
cout << "El numero NO es primo.\n";

cin.get();
return 0;
}


void AnalizarFichero(string nombre) {
ifstream archivo;
string nombreArchivo;

cout << "Introduzca el nombre del archivo: " << endl;
getline (cin,nombreArchivo);

archivo.open (nombreArchivo.c_str());

if(!archivo){
cout << "No se pudo abrir el archivo" << endl;
}

while (!archivo.eof())
{

archivo.close ();
return;
}


int PedirNumeroPositivo(int num) {
string archivo;

archivo >> num;
}

return 0;
}


int MostrarPresentacionPrograma (int){

cout << "Este programa determina si los numeros enteros positivos de un fichero son o no primos" << endl;

return num;
}


bool EsPrimo (int num) {
bool es_primo = false;

for (int i = 2; i <= num-1; i++){
if (num % i == 0){
return false;
}
}

return num >= 2;
}


Creía que le había pillado ya el truquillo a trabajar con varias funciones, pero cuando entran en juego más de 2 me pierdo. Además de que me lio a la hora de declararlas, y no sé como hacerlo bien, por ejemplo aquí seguro que tengo mal alguna (espero que no todas!). En la función PedirNumeroPositivo no tengo ni idea de como hacerlo, teniendo en cuenta que se lo pedimos a un archivo, y como lo he hecho no puede ser porque la función no conoce a "archivo".

Espero que me podáis orientar un poco por favor!!
Gracias!!
#5
Buenas!
YreX-DwX no entiendo muy bien el pseudocódigo que me pones para EsPrimo:

para i := 2 hasta numero-1
    si numero % i == 0
        return true
    fin si
fin para
return numero == 2


Acabando con return == 2 no devolverá siempre "2"?
¿Me la podrías explicar un poco más porfa?

Bueno, de momento he puesto la que decía string Manolo, que yo también sabía (aunque es contando los múltiplos y la tengo que cambiar) para probar el funcionamiento o no funcionamiento del programa. Y no sé que es lo que está mal pero este es mí código

#include <iostream>
#include <math.h>

using namespace std;

bool EsPrimo(unsigned long long);
unsigned long long Potencia (int);

int main(void) {
unsigned long long primo = 2, mersenne = 0, perf = 0;

while (perf < 10){

if (EsPrimo(primo)){
mersenne = Potencia(primo)-1;

if (EsPrimo(mersenne)){
perf = mersenne * Potencia(primo-1);
cout << perf << endl;
perf = perf + 1;
}
}
primo = primo + 1;
}

cin.get();
return 0;
}

// Esta funcion nos dice si un numero es primo o no
bool EsPrimo (unsigned long long num) {

int contador = 0;
bool es_primo = false;

for (int i=1; i < (num + 1); ++i)
{
if (num % i == 0)
{
contador++;
}
}

if (contador != 2)
{
return es_primo;
}

else
{
es_primo = true;
return es_primo;
}
}


// Esta función "Potencia" eleva una base entera (2) a una potencia entera y devuelva un 'unsigned long long
unsigned long long Potencia (int exponente){
unsigned long long res = 2;

for (int i = 1; i < exponente; i++){
res = res * 2;
}

return res;
}



Y no me saca nada más que los dos primeros números perfectos usando los primos de Mersenne, o sea el 6 y el 28 nada mas ¿que es lo que tengo mal?
#6
Hola!! Buenas tardes y muchas gracias a los dos!!

string Manolo muchas gracias por tus recomendaciones de libros, los tendré en cuenta. Decirte que yo también pensaba como tu, cuando empecé a resolver problemas en los que tenía que averiguar fórmulas y demás, pero que con el paso del tiempo he aprendido a valorar, ya que indagando sobre esas cosas a priori "externas" a la programación, se aprende bastante, y se aprecia lo grande que es este mundo de la programación en el que se puede hacer prácticamente de todo. Además como me gusta ponerme a prueba e indagar me gusta hacer estos ejercicios, aunque si que es cierto que a veces me veo en un lio del que no se como salir, como era este caso jajaja.

YreX-DwX, eres un maquina tío, siempre estas ahí! gracias de nuevo. Aunque aún no me he puesto a resolver el ejercicio en sí, estoy asimilando la información que me habéis dado ambos. Pero ya he hecho algunos cambios siguiendo el primero de tus comentarios.

Con esta suposición:
Citar
una potencia de 2 elevada a un número primo, menos uno, da como resultado otro número primo
me equivoqué al expresarla, no quería decir una potencia de dos, sino una potencia de base 2.

Luego en la función EsPrimo, he quitado los else como me dijiste, ya que es cierto lo que dices, no había caído. Y he aunque he añadido otro if con el 7 sigue sin ser correcta porque siempre me dará error al escribir múltiplos de los números primos, como es el caso del 11, 13... así que no tengo ni idea de como hacerlo, ya que de la forma que dice storing Manolo si que sé, pero en el ejercicio me piden que lo averigüe sin contar los divisores... ayuda!!

Respecto a la función "Potencia":
Citar
Cómo vamos a utilizar potencias enteras de 2 con resultados elevados, diseña, para ayudarte, una función 'Potencia' que eleve una base entera a una potencia entera y devuelva un 'unsigned long long' (¡no utilices la función 'pow'!).
Al decirme que vamos a usar potencias enteras de base 2, yo he hecho la función ya dando por hecho esa valor en la base, lo cual no esta mal ¿no?, lo que si que voy a hacer es aclarar en un comentario lo que me dices, que es una función que eleva, únicamente el 2, a una potencia. y en cuanto a esto:
Citar
No has creado una función que eleve una base entera a una potencia entera. Has creado una función que eleva el 2 a una potencia NATURAL/entera positiva (0 incluido) (unsigned). Solo te lo comento para que veas la diferencia entre lo que te piden y lo que implementas.
Ok, ya he entendido en que me equivocaba!

Y ahora me voy a poner con el problema en si, y los números primos de Mersenne y los perfectos! Si no me aclaro vuelvo a escribir por aquí!!

Saludos!!
#7
Buenas a todos!

Que lio tengo con un ejercicio, y es que ya llevo dos días bloqueado y nada, a ver si me podéis guiar hacia La Luz... jajaja

Necesito hacer un programa que muestre los 10 primeros números perfectos tomando como referencia los números de Mersenne.

Yo no soy muy bueno en mates y he tenido que buscar a Mersenne y he averiguado que "una potencia de 2 elevada a un número primo, menos uno, da como resultado otro número primo".

Este es el enunciado de mi problema:
Realiza un programa que nos diga los 10 primeros números perfectos utilizando para ello los números primos de Mersenne.
- Utiliza una función 'EsPrimo' que determine si un número es o no primo (NO debe contar los divisores, sino determinar si el número es o no primo)
- Cómo vamos a utilizar potencias enteras de 2 con resultados elevados, diseña, para ayudarte, una función 'Potencia' que eleve una base entera a una potencia entera y devuelva un 'unsigned long long' (¡no utilices la función 'pow'!).

Ya he hecho la función "EsPrimo" y la función "Potencia" y debería hacer una también para determinar cuando el numero es perfecto, pero investigando he descubierto que según Euclides: "Siempre que (2^n)-1 sea primo, la fórmula (2^n)–1 * (2^(n – 1)) genera un nº perfecto. Con lo cual bastará con multiplicar los 10 primeros números de Mersenne por 2^(n-1). Vale, pero ahora no tengo ni idea de como sacar los números de Mersenne para pasarlos por un bucle y hacerlos perfectos y después pasarlos por la función "Potencia"... y es que nunca he hecho un problema sin que el usuario tenga que introducir algún dato.

Os pongo mí código, pero como no tengo nada claro, solo ideas sueltas, la función main no hay por donde cogerla:


#include <iostream>
#include <math.h>

using namespace std;

bool EsPrimo(unsigned long long);
unsigned long long Potencia (unsigned long long);

int main(void) {
unsigned long long primo = 0, mersenne = 0, mersenne_perf = 0;

for (int i = 1; i >= 2210; i++)
if (EsPrimo(i) == 0)

Mersenne = (pow (2,n)-1);

/*for (int i = 1; i < pot; i++){
res = res * 2;
cout<<
}
*/

// Para hacerlos perfectos supongo que es así: pow (2, n-1) * Mersenne;


cout << "Estos son los 10 primeros números perfectos de los números primos de Mersenne" << m_perf << endl;


return 0;
}


bool EsPrimo (unsigned long long num) {

if (num != 2 && num % 2 == 0){
return 0;
}

else if (num != 3 && num % 3 == 0) {
return 0;
}

else if (num != 5 && num % 5 == 0) {
return 0;
}

else {
return 1;
}
}


unsigned long long Potencia (unsigned int pot){
unsigned long long res = 2;

for (int i = 1; i < pot; i++){
res = res * 2;
}

return res;
}


Por favor, que alguien me ayude!! O me diga si tengo que dejarme esto de la programación, porque menudo follón tengo en la cabeza con este ejercicio.

Siento que me haya quedado tan larga la entrada!!
Gracias de antemano!!
#8
Si, si, en cuanto me has dicho lo de iniciar abund he caído en eso y he cambiado <abund++> por <abund +=x>. Y ya lo he probado con varios valores y ¡funciona!
Gracia de nuevo amigo!
#9
Ostras!! vaya tontería!!
Ya lo tengo!!!
Muchas gracias de nuevo!
#10
Excelente explicación, como todas las que me das!

He seguido tus indicaciones y he vuelto a cambiar mi código, pero el resultado da mal, creo que no hace lo que debe, ya que me da un numero demasiado elevado, y encima negativo :-(.


#include <iostream>
using namespace std;

int Perfecto (int);

int main (void) {

int valor1, valor2, abund;

cout << "Este programa determina la suma de los numeros abundantes comprendidos entre dos enteros determinados" << endl;

cout << "Escribe un numero: ";
cin >> valor1;

cout << "Escribe otro numero: ";
cin >> valor2;

for (int x = valor1 +1; x < valor2; x++) {
if (Perfecto(x) == 1)
abund++;
}

cout << "La suma de los numeros abundantes entre " << valor1 << " y " << valor2 << " es " << abund;

return 0;
}


int Perfecto(int num) {

int sum_div = 0;

for (int i = 1; i < num; i++) {
if (num%i == 0) {
sum_div += i;
}
}

if (sum_div > num)
return 1;

if (sum_div == num)
return 0;

return -1;
}


He probado a cambiar en el bucle, la linea <if (Perfecto(x) == 1)> por <cout<<x<<endl;> y evidentemente me salen todos los números que hay entre los dos valores tecleados, con lo cual, lo que tengo mal es la función, pero no sé que puede haber mal, a ver si tu si...

Saludos!