[C con Clase] problemas

Alejandro alepelexo en yahoo.es
Mar Mayo 27 16:57:05 CEST 2008


¡Hola! Vamos a ver tu código:

>> #include<iostream>
>> using namespace std;
>> #include<conio.h>

No entiendo mucho de la librería "conio", pero sí te puedo decir que no es estándar (aunque mucha gente la use) y en este programa no es imprescindible, por lo que creo que sería mejor que no la usaras. De hecho, creo que sólo utilizas una función de esa librería. Personalmente, no la tengo instalada, así que no podré probar los programas que hagas con ella, y como supongo que habrá más gente como yo, te recomiendo que trates de evitarla (a no ser que te facilite mucho las cosas o sea imprescindible).

>> main()
>> { 
>>       int a, b, c;

Para empezar, yo diría que le deberías dar un tipo a "main". No sé si se puede hacer como lo has hecho tú, pero hasta ahora no lo he visto, por lo que creo que deberías usar el típico "int main()", en lugar de tan sólo "main()". Te aconsejaría también que le dieras nombres claros a las variables, ya que lo que tú has hecho es un programa simple, pero cuando se comience a complicar el tema acabarás por tener un código incompresinble. Podrías hacer "int num1, num2, num3;", o algo así. Ahora bien, para reducir líneas podrías guardar los números en un array y así, además de reducir código, conseguirías hacer tu programa más manejable, ya que podrías cambiar el nº de elemntos de manera muy simple. Para esto te aconsejo declarar una constante (global o no) para indicar el número de elemntos del array. Algo así: "const int TAM_ARRAY = 3;". Y luego declaras dentro de "main()" el array: "int numeros[TAM_ARRAY];". Simplemente con cambiar la constante que dije antes cambiarás el nº de elementos del array.

>>       cout<<"1er # :"; 
>>       cin>>a; 
>>       cout<<"2do # :"; 
>>       cin>>b; 
>>       cout<<"3er # :"; 
>>       cin>>c;

Esta manera de leer la entrada de teclado para los números es correcta, pero, ¿no crees que sería un poco difícil hacer lo mismo para, en vez de 3 números, por ejemplo, 99 números? ¿Escribirías 99 líneas a mano para conseguirlo? Yo, al menos, no. Por lo tanto ya tenemos otra ventaja aquí de almacenar los números en un array, la manera de leerlos es más simple. Lo podemos hacer con un simple bucle de la siguiente manera:

for(int n = 0; n < TAM_ARRAY; n++)//Aquí recorremos, uno a uno, todos los elementos del array
{
    cout << "Introduce el numero: ";
    cin >> numeros[n];
}

De esa forma leerías todos los números del array (la cantidad de números a leer es el tamaño del array, declarado en la constante que te dije antes). Con lo cual ya tenemos leídos los números de manera más simple. Sólo nos queda comprobar cual es el número intermedio.

>>       if(b||c<a && a<c||b)
>>           cout<<"nª intermdio: "<<a<<endl;    
>>           
>>       else
>>       {
>>           if((a<c && c<b)|| (b<c && c<a))
>>               cout<<"nª intermedio: "<<c<<endl;    
>>           else
>>               cout<<"nª intermedio : "<<b;
>>       }

De nuevo, has desarrollado un método pensando en que sólo sn tres números, por lo que habría que cambiarlo para usarlo con el array. Además, yo diría que no es correcto lo que has hecho. Al menos el primer "if": "if(b||c<a && a<c||b)". Si no me equivoco, esa instrucción comprueba que el segundo número (b) sea distinto de 0, o que el tercer número (c) sea menor de "a", además debe cumplirse también que "a" sea menor de "c" o que "b" sea distinto de 0. Escribir "b||c<a" no es los mismo que escribir "b<a || c<a". Tenlo presente. Dicho esto, la instrucción correcta sería "if((b<a && a<c)||(c<a && a<b))"  o, en su defecto, "if((b<a || c<a)&&(a<c || a<b))". De todas formas, como ya he dicho, no es un método correcto si trabajamos con el array y un número variable de elementos.Yo creo que lo primero sería definir que es el número intermedio:

 - En una serie de números de cantidad par, no hay un número intermedio. Por ejemplo, si tenemos los números "2, 5, 1, 9", los números intermedios serían dos: el 2 y el 5. Por lo tanto, en caso de que el nº de elementos fuera par, habría 2 números intermedios.
 - En una serie de números de cantidad impar si hay un número intermedio. Por ejemplo, si tenemos los números "2, 5, 1, 9, 7" el número intermedio es el 5.

Una vez dicho eso, yo creo que la mejor manera de calcular cual es el número intermedio en una serie es, primero, ordenar esa serie de menor a mayor (o a la inversa) y coger el número intermedio. No sé si hay otra forma de hacerlo, pero yo diría que no. Si hay un algoritmo más eficaz, que lo plantee alguien e implementa el que más te convenga. Dicho esto, creo que lo mejor será no darte el código de cómo implementar un algoritmo que ordene de mayor a menor, ya que deberías tratar de desarrollarlo tú mismo. Si no eres capaz, dílo y trataré de ayudarte más.

Una vez tengas ordenados los números, implementa, basándote en las dos afirmaciones que puse antes, un algoritmo que obtenga el número intermedio.

>>    getch();
>>}

Ahí está la función "getch()", que es la única que usas de "conio.h". Se puede sustituír por otra que hace la misma función y que pertenece a "iostream": "cin.get();". Si no llega con poner uno, pon dos o más. No voy a hablar del por qué porque hace recientemente poco que Steven aclaró esto de poner varios "cin.get()" y de posibles soluciones, si mal no recuerdo, y lo hizo mil veces mejor de lo que yo lo haría, además de que dio otras posibles soluciones que yo no conocía.

Espero haberte ayudado. Si tienes algún problema, dímelo y trataré de ayudarte, pero intenta siempre desarrollar todo lo que puedas con la menor ayuda posible, ya que es así como en realidad se aprende.

Un saludo.


El pasado 2008-05-26 22:20:43, luis carlos escribió:
 
lc> Un afectivo saludo 
lc>  
lc> Quisiera saber si se puede reducir las lineas de este codigo . EL programa consiste en hallar el numero intermedio entre un mayor y un menor.
lc>  
lc> De antemano gracias por la ayuda
lc>  
lc> #include<iostream>using namespace std;#include<conio.h>main(){ int a, b, c; cout<<"1er # :"; cin>>a; cout<<"2do # :"; cin>>b; cout<<"3er # :"; cin>>c; if(b||c<a && a<c||b)   cout<<"nª intermdio: "<<a<<endl;    else{  if((a<c && c<b)|| (b<c && c<a))  cout<<"nª intermedio: "<<c<<endl;    else    cout<<"nª intermedio : "<<b;} getch();}
lc> _________________________________________________________________
lc> Discover the new Windows Vista
lc> http://search.msn.com/results.aspx?q=windows+vista&mkt=en-US&form=QBRE
lc> _______________________________________________
lc> Lista de correo Cconclase Cconclase en listas.conclase.net
lc> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
lc> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ


Más información sobre la lista de distribución Cconclase