• Miércoles 15 de Mayo de 2024, 00:02

Autor Tema:  simple burbuja, se me queda colgado  (Leído 2524 veces)

picyo

  • Visitante
simple burbuja, se me queda colgado
« en: Lunes 26 de Abril de 2010, 17:30 »
0
hola! vereis, estoy recordando un poco el C++ desde lo mas básico, como sería el método de ordenacion de la burbuja, pero tengo un problema: se me queda colgado... y no por que...alguien ve algo ?
Código: C++
  1.  
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main(void){
  6.     int array[10];
  7.     int valores[9];
  8.     int x,q,temporal,TAM,i,j,temp;
  9.  
  10.     //for(int x=0;x=9;x++) {
  11.     x=0;
  12.     while (x<10){
  13.     cout << "pon un numero"<<endl;
  14.     cout << "Numero("; cout <<x; cout <<"): ";
  15.     cin >> array[x];
  16.     cin.get();
  17.     x++;
  18.     }  
  19.     cout << "empieza la ordenacion" << endl;
  20.  
  21.     for (int i=0;i=10-1;i++){
  22.         for(int j=i+1;j=10;j++){
  23.  
  24.             if (array[i]>array[j]){
  25.                 temp=array[i];
  26.                 array[i]=array[j];
  27.                 array[j]=temp;         
  28.             }      
  29.         }      
  30.     }
  31.    
  32.     for (int i=0;i=10-1;i++){
  33.     cout<<array[i]; 
  34.     }    
  35.     cin.get();
  36.    
  37. return 0;
  38. }
  39.  
  40.  

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: simple burbuja, se me queda colgado
« Respuesta #1 en: Lunes 26 de Abril de 2010, 19:52 »
0
Código: C++
  1.  
  2.  for (int i=0;i=10-1;i++){
  3.         for(int j=i+1;j=10;j++){
  4.  
  5.  

las clausulas de terminación de estos for's estan mal!, no estas comprobando nada, estas asignando.
Creo que querias decir...

Código: C++
  1.  
  2.  for (int i=0;i<10-1;i++){
  3.         for(int j=i+1;j<10;j++){
  4.  
  5.  

Ah, y en el ultimo for, tambien.

picyo

  • Visitante
Re: simple burbuja, se me queda colgado
« Respuesta #2 en: Jueves 29 de Abril de 2010, 01:20 »
0
si, es cierto!
NO creía que tuviese que poner, el error de ejecución estaba ahí, en la asignación del for.Vaya fallo... de todos modos no me ordena en todos los casos, pero bueno, eso ya corre de mi cuenta. gracias!!

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: simple burbuja, se me queda colgado
« Respuesta #3 en: Jueves 29 de Abril de 2010, 14:16 »
0
te explico, por si acaso.

el for tiene 3 elementos

for ( inicialización ; clausula de continuación ; iteración )

El for comenzará haciendo lo que ponga en la Inicializacion nada mas arrancar. Despues si la clausula es TRUE (es cierta) entonces ejecuta el contenido de su bloque. Despues , ejecuta la iteración y vuelve a comprobar si la clausula de continuación es TRUE, y vuelve a ejecutar. Asi sucesivamente.

La clausula por lo tanto es una operación booleana, y por lo tanto se va a comparar si vale 0 o diferente de 0, dando igual que tipo de operación sea.

por ejemplo
for (int e=0; IsNotFinished() ; e++)
{
...
}

si IsNotFinished() devuelve false, entonces se romperia el for.

for (int e=0; array[e]!='';e++)

itera el array hasta encontrar el valor ''.

etc...

picyo

  • Visitante
Re: simple burbuja, se me queda colgado
« Respuesta #4 en: Jueves 29 de Abril de 2010, 16:58 »
0
Si, entiendo. creo que la mayoria de for's que he o hemos hecho han sido algo mecánicos. Creo que entiendo mucho más ahora.Tengo otra duda acerca de esta ordenacion de mi array. Ahora, quiero hacer el mismo programa ( que por cierto, si ordena bien, lo dije mal ) pero en Visual C++. Primero necesitaba hacerlo en plan DOS, para saber exactamente lo que hacia ( por eso este ejemplo cortito). Todo esto lo hago para aprender de una forma más o menos intuitiva, a programar en Visual X ( C++ ahora). Pongo mis pasos :

1. He creado un nuevo proyecto, con windows form.
2. Mi pretension es aplicar el anterior ejemplo hecho en C++ "estándar" pero con entorno gráfico de Windows.
3. Una ventana ( form1) que indique al usuario que ha de poner una serie de numeros, y un botón de "start", y luego otra ventana que sobresalga cuando el resultado de esa ordenacion  este implementada.

de momento solo he puesto una ventana con un boton, el cual quiero asociar a start la ordenacion, pero no se que tipo de orden arrastrar ( visual) desde la lista de comandos para que el usuario escriba distintos numeros, voy bastante perdido

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: simple burbuja, se me queda colgado
« Respuesta #5 en: Jueves 29 de Abril de 2010, 19:23 »
0
bueno, te paso un link a un tutorial que enseña a usar el win32.
http://www.winprog.org/tutorial/

Despues de que te lo mires...
lo que quieres hacer no necesita que arrastres nada. Realmente, create un form con 1 EDIT y un BUTTON y ya esta.
En el WM_COMMAND del BUTTON procedes a hacer la operación.

picyo

  • Visitante
Re: simple burbuja, se me queda colgado
« Respuesta #6 en: Jueves 29 de Abril de 2010, 20:18 »
0
ok, entiendo tu idea. De momento Visual C++ dejarlo aparcado ( al menos con el IDE Visual Studio) y hacerlo " a mano". también me servirá para comprara lo que si he visto ya de Visual. Me gusta ese tutorial, esta muy bien! Ya ire informando acerca de como me va ;)

picyo

  • Visitante
Re: simple burbuja, se me queda colgado
« Respuesta #7 en: Viernes 30 de Abril de 2010, 15:34 »
0
hola de nuevo. Estoy metido en ese curso, pero me da un problema. hago nada mas copiar y pegar, haciendo un proyecto de Win32 de tipo consola. Me da fallo, creo qu eno reconoce la libreria <windows.h>.
Voy al directorio de Visual Studio/VC y en la carpeta de includes no hay ningún windows.h PAra quien está dirijido pues este curso ? Deberia tener el Borland C, o que pasa?

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: simple burbuja, se me queda colgado
« Respuesta #8 en: Viernes 30 de Abril de 2010, 19:09 »
0
Deberia funcionar con Visual C++. Ese archivo si se encuentra en Visual C++.

Quizas no este bien instalado, deberias desisntalarlo y volverlo a instalar.

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

picyo

  • Visitante
Re: simple burbuja, se me queda colgado
« Respuesta #9 en: Domingo 2 de Mayo de 2010, 17:01 »
0
si, cierto. Lo que tratando de encontrarla manualmente no soy capaz :p
De todos en este curso, también te has de creer miles de cosas, por ejemplo, esta bien cuando explican casi cada cosa que es, pero creo que sigo necesitando un libro, ya que te dejan un poco abierto a expectativas ( relamente no se muy bien lo que hago, es como si usase Visual C++ y ya tuviera generadas las ventanas y eventos)

picyo

  • Visitante
Re: simple burbuja, se me queda colgado
« Respuesta #10 en: Martes 11 de Mayo de 2010, 16:12 »
0
estoy siguiendo un curso de un libro mas bien, begining Visual C++ 2008, y me parece perfecto, porque como dcis, no va directamente a los windows forms, primero te enseña desde "abajo" viendo la API. Ahora he hecho un parentesis del libreo, para hacer una modificacion de uno de los ejemplos, y hacer cosas por mi cuenta. Estoy mezclando ( quizas este mal eso) cosas del "antiguo" C o C++, pero bueno. Lo que quiero hacer es bastante simple:

* Cada vez preguntar si se quiere jugar.
* En caso de no, se aprieta 'N'.
* En caso de si, se aprieta 'S'. Al apretar S, pongo otro getchar. Si pulsamos la letra "q", la opcion sera correcta y ganamos un punto, de caso contrario volveria al principio.
* si cuano nos pregunta si queremos seguir jugando decimos que no ("N"), "quiero" es False, y se acaba este juego ( o cosa.:P).

Pues CASI me va bien, pero... no me entra nunca en el segundo switch, de hecho para ver si entra o no pongo una lectura de la tecla apretada y siempre es la misma ( el resultado de la tecla pulsada lo da en numero ascii). Por que puede ser qu eno me entre ahí?
Y hay otro caso... da "2" vueltas a todo... AHora pongo una serie de pantallazos y el codigo de programa:
codigo:
Código: C++
  1.  
  2. // verificarTecla.cpp : main project file.
  3.  
  4. #include "stdafx.h"
  5. #include <stdio.h>
  6. #include <conio.h>
  7. #include <string.h>
  8.  
  9.  
  10.  
  11. using namespace System;
  12. void mensaje (void);
  13.  
  14.  
  15. int main(array<System::String ^> ^args)
  16. {
  17.     char tecla,tecla1;
  18.     int nomasqueuna,puntos=0;
  19.     bool quiero=true;
  20.     char quiero1;
  21.     nomasqueuna=1;
  22.     while(quiero){
  23.         Console::WriteLine("Seguro que quieres jugar? 'S' para Si, 'N' para no");
  24.        
  25.         tecla=getchar();
  26.         //quiero=false;
  27.         switch (tecla)
  28.         {
  29.         case ('S'):
  30.                  mensaje();
  31.                  Console::WriteLine("Has pulsado{0}. Escribe la letra",tecla);
  32.                  tecla=getchar();   //  NO ME HACE CASO EN ESTE GETCHAR! SIEMPER TIENE EL MISMO VALOR            
  33.                  switch (tecla)
  34.                  {
  35.                      Console::WriteLine(" Pulsada tecla {0}.Si Entra en Sitch",tecla);
  36.                      tecla=getchar();
  37.                      case ('q'):
  38.                         puntos++;
  39.                         Console::WriteLine(" ****Has apretado la tecla {0}, con total de puntos {1}*****",tecla,puntos);
  40.                      case (!'q'):
  41.                          Console::WriteLine("MIERDA, sin puntos {0}",tecla);
  42.                          break;
  43.                          
  44.                     }
  45.                                    
  46.         break;
  47.         case ('N'):
  48.                 quiero=false;
  49.         break;
  50.         default:
  51.                 Console::WriteLine("Opción incorrecta");      
  52.         break;
  53.        
  54.         }   
  55.     }              
  56.     return 0;
  57. } // main
  58.  
  59. void mensaje (void){
  60.     Console::WriteLine("hola");
  61. }
  62.  
  63.  
Al ejecutar, se ve este resultado, al teclear la letra S (mayúscula):
[/url]

Uploaded with ImageShack.us

[/img]
Como veis, no me hace caso a este nuevo gecthar(). Bien, imaginemos que pongo cualquier letra ( una tecla solo) entonces veo :

[/url]</noscript>
[/img]

Si tecleo una letra distinta a S o N, pero solo una, se repite 2 veces, y si pongo 2 letras, lo hara 3:
[/url]

Uploaded with ImageShack.us
[/img]

bueno tengo asi pues localizados los problemas:
1) No me lee el segundo gecthar, por tanto , no me hace caso a la opcion "S". He probado hacerlo mediante "if" pero con mismo resultado.
2) repeticion según el número de teclas tecleadas del bucle.

NO hallo solucion a ello chicos... y la verdad es que he sido capaz de hacer programas mucho mas costosos que este.. y esta tonteria, me da problemas...increíble..que ocurre?

picyo

  • Visitante
Re: simple burbuja, se me queda colgado
« Respuesta #11 en: Martes 11 de Mayo de 2010, 16:58 »
0
Uhm, a modo de prueba error, he arreglado el problema, pero la verdad, no entiendo porque he de poner ese gechar en esa posicion. Ok, antes de salir, la variable tecla ya tiene un nuevo valor, `pero realmente el break no se a donde lo lleva ..¿?
Código: C++
  1.  
  2. // verificarTecla.cpp : main project file.
  3.  
  4. #include "stdafx.h"
  5. #include <stdio.h>
  6. #include <conio.h>
  7. #include <string.h>
  8.  
  9.  
  10.  
  11. using namespace System;
  12. void mensaje (void);
  13.  
  14.  
  15. int main(array<System::String ^> ^args)
  16. {
  17.     char tecla,tecla1;
  18.     int nomasqueuna,puntos=0;
  19.     bool quiero=true;
  20.     char quiero1;
  21.     nomasqueuna=1;
  22.     while(quiero){
  23.         Console::WriteLine("Seguro que quieres jugar? 'S' para Si, 'N' para no");
  24.        
  25.         tecla=getchar();
  26.         //quiero=false;
  27.         switch (tecla)
  28.         {
  29.        
  30.         case ('S'):
  31.                  mensaje();
  32.                  tecla=getchar();
  33.                  Console::WriteLine("Has pulsado{0}. Escribe la letra",tecla);
  34.                    
  35.                  tecla=getchar();
  36.                  
  37.                  Console::WriteLine("tecla={0}",tecla);
  38.                  switch (tecla)
  39.                  {
  40.                      Console::WriteLine(" Pulsada tecla {0}.Si Entra en Sitch",tecla);
  41.                      case ('q'):
  42.                         puntos++;
  43.                         Console::WriteLine(" ****Has apretado la tecla {0}, con total de puntos {1}*****",tecla,puntos);
  44.                         tecla=getchar(); // POR QUE NECESITO PONERLO AQUI, Y NO AL PRINCIPIO COMO LO PONIA?
  45.                         break;   // ME HABIA DEJADO ESTE BREAK, PERO, AL "ROMPER", NO LO SACA FUERA DEL 2o SWITCH?
  46.                      case (!'q'):
  47.                          Console::WriteLine("MIERDA, sin puntos {0}",tecla);
  48.                          break;
  49.                        
  50.                     }
  51.                                    
  52.         break;
  53.         case ('N'):
  54.                 quiero=false;
  55.         break;
  56.         default:
  57.                 Console::WriteLine("Opción incorrecta");      
  58.         break;
  59.        
  60.         }
  61.    
  62.     }
  63.    
  64.                
  65.     return 0;
  66. } // main
  67.  
  68. void mensaje (void){
  69.     Console::WriteLine("hola");
  70. }
  71.  
  72.  
  73.  

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: simple burbuja, se me queda colgado
« Respuesta #12 en: Martes 11 de Mayo de 2010, 20:21 »
0
Hola picyo, primero que nada, te aconsejaria lo siguiente, estas trabajando con Visual C++, pero estas utilizando las "Extensiones CLR para .NET", estas extenciones de C++ NO son portables, solo funcionan en entornos .NET Framework, asi que si tu intension es escribir codigo C++ portable a cualquier sistema operativo, evita utilizarlas. La principal funcion de estas extensiones CLR seria desde mi punto de vista escribir codigo C++ que sea compatible con lenguajes .NET, como Visual Basic o Visual C#, asi que si no es esa tu intension, desechalo.

Ahora respecto a tus dudas:

1. gertchar(), este seria tu primer problema, la manera como funciona el getchar() es que lee valores desde la entrada estandar (stdin), pero no limpia todo el buffer de entrada al leer, asi que si tu escribes por ejemplo S y luego das enter, en el buffer se queda el valor de S y tambien el valor de el enter, que en este caso es un avance de linea (caracter No 10), por eso al volver a usar getchar, seguira leyendo los valores que quedan en el buffer de entrada. La solucion a esto es utilizar la funcion fflush(stdin) para limpiar el buffer de entrada y asi el proximo getchar() leera los datos de manera correcta, o sea que debes hacer:

Código: C++
  1.  
  2.         tecla=getchar();
  3.         fflush(stdin);
  4.  
  5.  

Ahora, si insistes en utilizar las Extensiones CLR, la manera correcta de leer seria:

Código: C++
  1.  
  2.         tecla = Console::Read();
  3.  
  4.  

2. break, respecto al break, la sentencia break lo que hace es sacar la ejecucion del bloque actual, asi que en tu caso, el break mas interno NO te sacara de todos los switch, solo te saca del mas interno. Ademas, el break no solo se utiliza en switch, se puede utilizar en cualquier sentencia, y su funcion es la misma, te saca del bloque actual.

Un ejemplo para que notes como funcona el break:
Código: C++
  1.  
  2. if (condicion)
  3.  {
  4.   sentencia1;
  5.   sentencia2;
  6.   if (condicion)
  7.      {
  8.      sentencia3;
  9.      if (condicion)
  10.        {
  11.        sentencia4
  12.        // la ejecucion continuara en sentencia6, se salta sentencia5;
  13.        break;
  14.        sentencia5;
  15.        }
  16.      sentencia6;
  17.      }
  18.   sentencia7
  19. }
  20.  
  21. if (condicion)
  22.  {
  23.   sentencia1;
  24.   sentencia2;
  25.   if (condicion)
  26.      {
  27.      sentencia3;
  28.      // la ejecucion continuara en sentencia7, se salta el if, sentencia4
  29.      // sentencia5 y sentencia6;
  30.      break;
  31.      if (condicion)
  32.        {
  33.        sentencia4
  34.        sentencia5;
  35.        }
  36.      sentencia6;
  37.      }
  38.   sentencia7
  39. }
  40.  
  41.  

Espero que con esto te quede mas claro.

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

picyo

  • Visitante
Re: simple burbuja, se me queda colgado
« Respuesta #13 en: Martes 11 de Mayo de 2010, 20:57 »
0
uhm. Si si, muchisimo :)
Lo que dices acerca que no se borra el registro ( o donde sea que este :p) cuando haces getchar() si lo he visto, pero no tenia ni idea que hacer. En una de las lineas ( no se si al final la he quitado) ponia un Console::writeLine(" algo{0}",tecla) y en tecla me aparecia el numero 10 . De ahí he deducido que era del código ASCII, y lo he consultado. En efecto, es lo que tu dices, el codigo 10 es un salto de línea y la verdad... no sabía como solucionarlo  ( Ahora si ;) )

respecto .NET, lo que realmente quiero aprender ( al principio) es Visual C++ ( Y vIsual basic, Visual C#...) pero para empezar quiero ( y creo que ha de ser asi) empezar por la API de Windows, e incluso saber el C++ "estandar" o sea, sin basarse en librerias de Windows. Creo que los voy aprendiendo a la par, y saber como se hace lo mismo ( siempre que se pueda) de un modo u otro. Me gustaria acabar haciendo una aplicacion, un juego para crios, para apreender algo ( no se muy bien que ). por eso he empezado ya con eso de los puntos y tal :p

picyo

  • Visitante
Re: simple burbuja, se me queda colgado
« Respuesta #14 en: Sábado 15 de Mayo de 2010, 17:43 »
0
Hola! estoy haciendo el seguimiento del libreo, y salen dudas ( como no!) acerca del tipo de proyecto, o que es MFC o que es CLI o que es win32...o que es todo junto..vaya lio :)
ya lo voy comprendiendo, si alguien que lea por aqui tiene mi misma duda ( ya la tengo resarcida) os paso un link que em ha gustado :

http://geeks.ms/blogs/rfog/archive/2009 ... c-cli.aspx