Ejercicios de Programación

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
Masakre
Mensajes: 249
Registrado: 06/06/2012 10:52 am

#46 Mensaje por Masakre » 02/08/2012 7:47 pm

El compilador no me dice nada, es que en realidad sí compila (siento haber dicho lo contrario). El problema es semántico.
En uno de mis últimos mensajes decía que usé string, pero ni así conseguía mi propósito: que el usuario pueda establecer la ruta de acceso a su archivo.txt con la información.
Acá cito el código con el que he estado probando:

Código: Seleccionar todo

#include <iostream>
#include <fstream>
#include <string>
#define MAX 1000
using namespace std;
int main(void){
	int i=0, N; double lista[MAX]; char save; string filename;
	cout<<"\t\tCESTAS DE PERAS\n"
		<<"Especifique el nombre del fichero con la informacion de las peras por canasta.\n"
		<<"Nombre del archivo:\t"; cin>>filename; system("pause");
	ifstream datosE(filename); // Input File Stream (Entrada)
	if(datosE) {cout<<"\n\nDatos leidos correctamente . . .\n\t"; system("pause");}
	else {cout<<"\n\nLectura incorrecta. Cerrando programa . . .\n\t"; system("pause"); return 0;}
	datosE>>lista[i]; // Leemos la 1ra línea.
	while(!datosE.eof()){ // datosE.eof() es TRUE si intentamos sobrepasar el final.
		lista[i]*=(0.15); cout<<i+1<<") "<<lista[i]<<"Kg\n"; // Vamos mostrando y guardando.	
		i++; datosE>>lista[i]; 
	}datosE.close(); N=i;// Cerramos fichero.
	do{cout<<"\n\n\tDesea guardar estos datos?(S/N):\t"; cin>>save; save=toupper(save);}while(save!='S'&&save!='N');
	if(save=='S'){cout<<"\n\nLos pesos seran almacenados en pesos.txt . . .\n"; 
	ofstream datosS("pesos.txt"); system("pause");
	datosS<<"\tPESOS DE LAS "<<N<<" CANASTAS DE PERAS"<<endl; 
	for(i=0;i<N;i++){datosS<<i+1<<") "<<lista[i]<<"Kg.\n";}
	}return 0;
}
* Como ya había comentado con anterioridad, el programa me muestra "Lectura incorrecta" cuando yo ingreso canastas.txt por teclado. Y no es que me haya olvidado de crear dicho fichero (sí existe).

* Si en vez de pedir el nombre del fichero lo ingreso yo directamente en el código y advierto al usuario del nombre que debe tener (su fichero con los datos), funciona todo perfectamente (ya antes había dejado un código de esto jeje).

Avatar de Usuario
leosan
Mensajes: 730
Registrado: 19/04/2012 8:35 am
Ubicación: GRAN CANARIA

#47 Mensaje por leosan » 03/08/2012 5:00 am

A la espera de nuevos ejercicios y/o soluciones de Sorancio me he animado a empezar el estudio de C++, en paralelo con C. Igual es un disparate, pero salvo opiniones en contra .......
Y aquí está mi respuesta al primer ejercicio en C++:

Código: Seleccionar todo

#include <iostream>
using namespace std;

int main()
{
    long f0=0,f1=1;
    while (f1<=10000)
    {
        long f2 = f0 + f1;
        f0 = f1;
        f1 = f2;
    }
    cout << f1;
    return 0;
}

Avatar de Usuario
Sorancio
Mensajes: 1157
Registrado: 29/05/2009 12:42 pm
Ubicación: España
Contactar:

#48 Mensaje por Sorancio » 03/08/2012 6:18 am

Hola Masakre.

¡El programa a mi no me compila! ¿Pero qué basura de compilador estás usando? Yo con Code::Blocks usando GCC me lanza dos errores:

1) system no está definido.
2) No puedes llamar al constructor de ifstream con un string de parámetro.

El primero se arregla incluyendo la cabecera cstdlib. El segundo usando:

ifstream datosE(filename.c_str());

Durante este fin de semana publicaré un ejercicio más. Id mirando que es un archivo CSV :)
Mi página web (en inglés): http://kmr.conscell.net/

Masakre
Mensajes: 249
Registrado: 06/06/2012 10:52 am

#49 Mensaje por Masakre » 03/08/2012 9:27 am

Sorancio escribió:Hola Masakre.

¡El programa a mi no me compila! ¿Pero qué basura de compilador estás usando? Yo con Code::Blocks usando GCC me lanza dos errores:

1) system no está definido.
2) No puedes llamar al constructor de ifstream con un string de parámetro.

El primero se arregla incluyendo la cabecera cstdlib. El segundo usando:

ifstream datosE(filename.c_str());

Durante este fin de semana publicaré un ejercicio más. Id mirando que es un archivo CSV :)
Como ya le había comentado antes, he estado usando Visual Studio para guardar "uniformidad" con mis clases (aunque ya no las estoy recibiendo; quizás sea hora de cambiar).
Nunca he usado la librería cstdlib, aunque he visto que suelen hacerlo cuando se usa Dev-C++. En VS incluyo "stdafx.h", quizás sea su equivalente, por lo que no me da error (1).

En cuanto a lo otro (2), había hecho el cambio y no me funcionaba. Eso estaba muy extraño, considerando que usted lo había probado.
Entonces me acordé (muy tarde ya) que yo había creado otro proyecto con el nombre "SorancioClass - A3var" (var de variación), donde no existía canastas.txt y que por eso estaba andando mal :roll:

Entonces dije, quizás me funcione tal y como estaba.
Y pues sí. No fue necesario hacer el cambio que usted propone.
¿Es por alguna extraña coincidencia? ¿o también puede expresarse de esa forma (equivalente)?
(Si usted me dice que es necesario cambiarlo, lo haré . . . ya que, si entendí bien, a usted sí le muestra error al usarlo como string directamente, ¿verdad?)

Masakre
Mensajes: 249
Registrado: 06/06/2012 10:52 am

#50 Mensaje por Masakre » 03/08/2012 9:37 am

Sobre el ejercicio de las ecuaciones (me parece que es la C), he visto que leosan fácilmente lee los coeficientes de este modo:
fscanf (fp, "%gx+%gy=%g\n", &a, &b, &c);
Es decir, escribe algo como plantilla y especifica en ella indirectamente la posición de los caracteres que desea almacenar como dato.

Sin embargo, no se me ocurre cómo podría hacerlo en C++.
¿Alguna pista? :wink:

Gracias por todo.

Avatar de Usuario
Sorancio
Mensajes: 1157
Registrado: 29/05/2009 12:42 pm
Ubicación: España
Contactar:

#51 Mensaje por Sorancio » 03/08/2012 9:54 am

1.

stdfuck.h es una cabecera de Visual Studio y si la abres verás que está vacía. cstdlib es un port de la librería stdlib.h de C para C++ (es básicamente lo mismo).

Ahí está definida la función system (bueno la declaración).

2. Quizá la implementación de la librería estándar de Visual Studio tiene también esa definición de la función. De forma estándar no la tiene así que hazlo con string.c_str();

Siempre que programes Masakre tienes que poner el compilador en modo pedántico y sanguinario. Debe quejarse por todo. Un buen método para desarrollar es ponerlo en modo pedántico (-Wall en GCC) e ir arreglando warnings (posibles futuros errores).

Te recomiendo que descargues Code::Blocks con MinGW que es el port de GCC a Windows.

Sobre lo de fscanf: puedes usarlo igualmente. Las funciones de C están en C++ :). El problema es que eso no sirve para todas las opciones posibles. Si en vez de 4x + 2y = 5 pongo 4y = 2?. 2x = 4? 5x + 2 = 5?

:)
Mi página web (en inglés): http://kmr.conscell.net/

Avatar de Usuario
leosan
Mensajes: 730
Registrado: 19/04/2012 8:35 am
Ubicación: GRAN CANARIA

#52 Mensaje por leosan » 03/08/2012 2:42 pm

Sorancio escribió: Siempre que programes tienes que poner el compilador en modo pedántico y sanguinario. Debe quejarse por todo. Un buen método para desarrollar es ponerlo en modo pedántico (-Wall en GCC) e ir arreglando warnings (posibles futuros errores).
Gracias por la información, había oído campanas, pero no sabía a que se referían.Ahora ya lo sé y lo he activado
Y para que vean que me he metido con el C++, ahí va el segundo ejercicio:

Código: Seleccionar todo

/*Escribir un programa que determine si un año  es bisiesto. Un año es bisiesto si es múltiplo de
4 (por ejemplo, 1984). Sin embargo, los años múltiplos de 100 sólo son bisiestos cuando a la
vez son múltiples de 400 (por ejemplo, 1800 no es bisiesto, mientras que 2000 sí lo será).*/
#include <iostream>
using namespace std;
#define START   (1492)
#define END     (2012)
 int main()
{
int i,bisiestos=0;
for ( i=START;i<=END ;i+=4 )
if  ((i%4 ==0 && i%100!=0) ||  (i%400==0))
    bisiestos++;
cout<<"Hay  " << bisiestos << "  a\xA4os"  << "  entre  " <<   START << "  y  " <<  END;
}
Sobre lo de fscanf: puedes usarlo igualmente. Las funciones de C están en C++ :). El problema es que eso no sirve para todas las opciones posibles. Si en vez de 4x + 2y = 5 pongo 4y = 2?. 2x = 4? 5x + 2 = 5?
¿Podrías poner las respuestas éste y a los otros ejercicios y comparar con los nuestros?.Seguro que aprendemos mucho

Avatar de Usuario
Sorancio
Mensajes: 1157
Registrado: 29/05/2009 12:42 pm
Ubicación: España
Contactar:

#53 Mensaje por Sorancio » 03/08/2012 3:16 pm

No daré las respuestas por dos razones:

1) No aprenderíais leyéndola: un programador tiene que aprender a aprender :). Buscar información, pensar en el algoritmo, diseñarlo, programarlo, probarlo.

2) Tiempo. No tengo tiempo para ponerme a hacer programas :(

Pensemos en el problema de las ecuaciones:

Sabemos que, en principio, para un sistema de N ecuaciones habrán máximo N incógnitas.

Eso significa que cada ecuación tendrá N+1 coeficientes: uno autónomo y los demás con incógnita.

Podremos definir una ecuación como una lista anidada de coeficientes, ¿o no?

Sea coeficiente:

Código: Seleccionar todo

struct coeficiente {
   double multiplier;
   char value;
};
Coges una línea, la procesas, y cada coeficiente lo procesas en una lista.
Última edición por Sorancio el 03/08/2012 5:43 pm, editado 1 vez en total.
Mi página web (en inglés): http://kmr.conscell.net/

Masakre
Mensajes: 249
Registrado: 06/06/2012 10:52 am

#54 Mensaje por Masakre » 03/08/2012 5:04 pm

Sorancio escribió:stdfuck.h es una cabecera de Visual Studio y si la abres verás que está vacía. cstdlib es un port de la librería stdlib.h de C para C++ (es básicamente lo mismo).

Ahí está definida la función system (bueno la declaración).
¿Está vacía? ¿Entonces por qué es que se agrega automáticamente al crear un nuevo proyecto? (Si lo borro, simplemente no compila) . . .
¿cstdlib es un port de stdlib.h? Me parece haber visto que alguien afirmaba (quizás fue usted) que cstdlib era en realidad una nueva notación, pero que era lo mismo que stdlib.h
Es decir, entendí que esas eran dos formas distintas a usar con #include, pero que en realidad llamaban a un mismo encabezado (¿o debería decir librería?).
Sorancio escribió:Quizá la implementación de la librería estándar de Visual Studio tiene también esa definición de la función. De forma estándar no la tiene así que hazlo con string.c_str();
¿Se refiere a una implementación oculta que permita usar un string como parámetro al generar el flujo de entrada?
Sorancio escribió:Siempre que programes Masakre tienes que poner el compilador en modo pedántico y sanguinario. Debe quejarse por todo. Un buen método para desarrollar es ponerlo en modo pedántico (-Wall en GCC) e ir arreglando warnings (posibles futuros errores).
He estado buscando en Google acerca de ese "modo pedántico" para Visual Studio y no he encontrado nada interesante (en realidad, no hay resultados al respecto).
Aunque recuerdo que en algunas ocasiones pasadas sí me mostró Warnings.
Sorancio escribió:Te recomiendo que descargues Code::Blocks con MinGW que es el port de GCC a Windows.
¿Alguna versión en específico? ¿Debería traer un plugin o algo? (Digo esto porque hay veces en que termino descargando cosas que no son . . .)
Sorancio escribió:Sobre lo de fscanf: puedes usarlo igualmente. Las funciones de C están en C++ :). El problema es que eso no sirve para todas las opciones posibles. Si en vez de 4x + 2y = 5 pongo 4y = 2?. 2x = 4? 5x + 2 = 5?
De hecho que están. Pero me parece haber leído que no es recomendable mezclar C con C++, y que es preferible usar las funciones nuevas (por así decirlo) que trae C++ consigo.

Gracias por las respuestas.

Avatar de Usuario
Sorancio
Mensajes: 1157
Registrado: 29/05/2009 12:42 pm
Ubicación: España
Contactar:

#55 Mensaje por Sorancio » 03/08/2012 5:58 pm

Masakre escribió: ¿Está vacía? ¿Entonces por qué es que se agrega automáticamente al crear un nuevo proyecto? (Si lo borro, simplemente no compila) . . .
stdafx.h es un archivo para cabeceras precompiladas. Si tienes muchos archivos .h que se incluyen en muchos sitios lo mejor es poner el #include en stdafx e incluir stdafx ya que Visual Studio tiene una lógica interna para optimizar el tiempo de compilación del proyecto.

Vamos, es tontería. GCC es más rápido y no necesita tanta chorrería.
Masakre escribió: ¿cstdlib es un port de stdlib.h? Me parece haber visto que alguien afirmaba (quizás fue usted) que cstdlib era en realidad una nueva notación, pero que era lo mismo que stdlib.h
Es decir, entendí que esas eran dos formas distintas a usar con #include, pero que en realidad llamaban a un mismo encabezado (¿o debería decir librería?).
cstdlib es la librería stdlib.h de C preparada para C++. Las dos son válidas pero la correcta es cstdlib.
Masakre escribió: ¿Se refiere a una implementación oculta que permita usar un string como parámetro al generar el flujo de entrada?
Aquí el ocultismo no sirve. C++ tiene algo llamado sobrecarga. Puedes crear muchas funciones con el mismo nombre siempre que tengan diferentes firmas. Es posible que el constructor de ifstream esté en Visual Studio sobrecargado también para recibir un std::string (cosa que hará lo mismo que haces tú cuando llamas al de const char * usando c_str())
Masakre escribió: He estado buscando en Google acerca de ese "modo pedántico" para Visual Studio y no he encontrado nada interesante (en realidad, no hay resultados al respecto).
Aunque recuerdo que en algunas ocasiones pasadas sí me mostró Warnings.
Pues tienes que hacerle caso a los warnings :).
Masakre escribió: ¿Alguna versión en específico? ¿Debería traer un plugin o algo? (Digo esto porque hay veces en que termino descargando cosas que no son . . .)
Usas Windows: codeblocks-10.05mingw-setup.exe


Masakre escribió: De hecho que están. Pero me parece haber leído que no es recomendable mezclar C con C++, y que es preferible usar las funciones nuevas (por así decirlo) que trae C++ consigo.

Gracias por las respuestas.
Eso es falso. Quieran los fanboys de C++, depéndeis de los programadores de C. Muchas librerías de C++ son simples ports de librerías en C o abstracciones. Para el sistema de archivos tendréis que llamar a open en UNIX y a comosellame en Windows y las API están en C.

Hoy en día incluso mi lenguaje favorito (Common Lisp) depende de C. Para librerías complejas usamos bindings de C: cogemos la librería, la conectamos a funciones de Common Lisp y las abstraemos. Las interfaces gráficas las hacemos asi usando la librería cl-gtk2 y es una maravilla usarla.
Mi página web (en inglés): http://kmr.conscell.net/

Avatar de Usuario
leosan
Mensajes: 730
Registrado: 19/04/2012 8:35 am
Ubicación: GRAN CANARIA

#56 Mensaje por leosan » 07/08/2012 5:44 am

Usa Windows: codeblocks-10.05mingw-
Te aconsejo que uses el codeblocks, es un gustazo trabajar con nueves ventanas a la vez y en cada una varios codigos.
Para ponerlo en modo "pedantico" o -wall vas a "settings" ,"compiler and debugger" y en la cuarta opcion te encuentras el -wall.
También uso en ocasiones Dev-C++ , pero ni punto de comparación.Y el Pelles C que es como más estricto....pero no tiene ventanitas.
De hecho que están. Pero me parece haber leído que no es recomendable mezclar C con C++, y que es preferible usar las funciones nuevas (por así decirlo) que trae C++ consigo.
Es tanto C un subconjunto de C++, que mis programas de ficheros en C, guardados como cpp, corren perfectamente.
Y puestos a ir mejorando los codigos, dejo el de fibonacci "más interactivo" y con la función cuenta digitos....obsevar lo rápido que es para 5 o 6 cifras y lo que cuesta para 10 cifras (ten paciencia):

Código: Seleccionar todo

#include <stdio.h>
int cuenta_digito(long int number);
long int fibonacci(long int  k);
int main(void)
{
    register int i;
    long int fibo,n=0;
    while (n>=0){
        printf ("\nEl primer fibonacci de \"n\" digitos (negativo para salir). n= ");
        scanf ("%ld*c",&n);
        for ( i=0; ;i++ ){
            fibo=fibonacci(i);
            if (cuenta_digito (fibonacci(i))== n ) break;
        }
        printf ("%ld",fibonacci(i));
    }
    return 0;
}
/******************************************************/
 long int fibonacci(long int  k)
{
    if (k < 2) {  return 1;
    }
    else {return fibonacci(k - 1) + fibonacci(k - 2);
    }
}
 /******************************************************/
 int cuenta_digito(long int numero) {
    if (numero > 9) {
        return cuenta_digito(numero / 10) + 1;
    } else {
        return 1;
            }
}

Avatar de Usuario
Sorancio
Mensajes: 1157
Registrado: 29/05/2009 12:42 pm
Ubicación: España
Contactar:

#57 Mensaje por Sorancio » 07/08/2012 6:43 am

He dejado un ejercicio nuevo, a ver quien es el primero en hacerlo :).
Mi página web (en inglés): http://kmr.conscell.net/

Avatar de Usuario
leosan
Mensajes: 730
Registrado: 19/04/2012 8:35 am
Ubicación: GRAN CANARIA

#58 Mensaje por leosan » 07/08/2012 8:10 am

Sorancio escribió:He dejado un ejercicio nuevo, a ver quien es el primero en hacerlo :).
¿DÓNDE ESTÁ?....YA LO VÍ '¡ ¡ ¡

Avatar de Usuario
leosan
Mensajes: 730
Registrado: 19/04/2012 8:35 am
Ubicación: GRAN CANARIA

#59 Mensaje por leosan » 07/08/2012 9:22 am

Logro crear el fichero csv, lo leo y me da los valores a , b , c de cada línea y justo se cuelga, sin error ni warnings en modo wall ¿¿¿???

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#define NOM_ARCHIVO  "C:\\ejercicio2.csv"
#define NUM_ELEM  3

int main(void)
{
    FILE *entrada;
    int a[NUM_ELEM];
    int b[NUM_ELEM];
    int c[NUM_ELEM];
    int i;

    if ((entrada = fopen(NOM_ARCHIVO, "w")) == NULL){
      perror(NOM_ARCHIVO);
      return EXIT_FAILURE;
   }
   fprintf(entrada, "1,2,3\n");
   fprintf(entrada, "4,2,3\n");
   fprintf(entrada, "1,1,1\n");
   fprintf(entrada, "2,1,1\n");
   fclose(entrada);

   if ((entrada = fopen(NOM_ARCHIVO, "r")) == NULL){
      perror(NOM_ARCHIVO);
      return EXIT_FAILURE;
   }
   i = 0;
   while (fscanf(entrada, "%d,%d,%d", a + i, b + i, c + i) == NUM_ELEM){
      printf("a[%d]= %d, b[%d]=%d, c[%d]=%d\n", i, a[i], i, b[i], i, c[i]);
      i++;
    }

   fclose(entrada);
   return EXIT_SUCCESS;
}


Avatar de Usuario
Sorancio
Mensajes: 1157
Registrado: 29/05/2009 12:42 pm
Ubicación: España
Contactar:

#60 Mensaje por Sorancio » 07/08/2012 10:46 am

Hazlo sin usar fscanf, porque si lo haces así esta entrada:

Código: Seleccionar todo

5, 2, 1
7, 2, 2, 1
6, 2, 1
....
6, 
2, 1, 5, 7
ya no te sirve. Y el ejercicio bien dice que las columnas son variables, por lo que no resolverías el problema.
Mi página web (en inglés): http://kmr.conscell.net/

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 6 invitados