Duda con ejercicio de programacion (c++) (ACTUALIZADO CON NUEVA DUDA)

codigo

El enunciado dice lo siguiente:

(3.5 ptos) 3.- Diseña un algoritmo que lea de teclado una cadena de caracteres (patrón) y un
texto, y muestre por pantalla un listado de todas las palabras del texto que contengan
la cadena patrón de “forma relativa”. Esto significa que la palabra contendrá todas
las letras de la cadena patrón en el mismo orden, pero no tienen que estar dispuestas
juntas. En la salida no habrá palabras repetidas.
Ejemplo:
Entrada:
Introduzca el patrón: EN
Introduzca el texto (FIN para terminar):
CREO QUE IREMOS A LA DIRECCION QUE NOS DIERON Y
TAMBIEN IREMOS A LA DIRECCION NUEVA QUE YO CONOCIA
FIN
Salida:
DIRECCION DIERON TAMBIEN
NOTAS:
 El texto contiene un número indefinido de palabras.
 El texto termina con la palabra FIN.
 Cada palabra tiene un número indefinido pero limitado de caracteres (todos
alfabéticos mayúsculas).
 En el texto aparecerán un número máximo MAX_PAL_DIST (una
constante) de palabras distintas.
 El carácter separador de palabras es el espacio en blanco.

Es probable que caiga algo parecido. Por favor si alguien ve algun fallo que me lo diga

codigo
anonimo115 escribió:https://hastebin.com/ukasugakep.cpp

En este codigo el array ordenado deberia salirme 2 2 5 7 9 10 12 89 me sale 2 2 5 7 9 10 12 12. ¿Alguien sabe por que?


Así de primeras lo que veo un poco raro es que calcular mínimo esté dentro del for. ¿No se supone que eso solo se debería hacer una vez?

Edito: yo haría algo así:

for(i=0;i<=10;i++)
{
     for(j=0;j<=10-i;j++)
     {
         if(a[j]>a[j+1])
         {
             temp=a[j];
             a[j]=a[j+1];
             a[j+1]=temp;
          }
     }
}
i02mike escribió:Así de primeras lo que veo un poco raro es que calcular mínimo esté dentro del for. ¿No se supone que eso solo se debería hacer una vez?

Está haciendo ordenación por selección, esa parte es correcta.

El problema no es de concepto sino de algún error tonto. Con el código actual se me hace díficil verlo pues hay algunas prácticas malas. Cosas que haría:

- Eliminar las referencias en las funciones que usan Tarray&, los arrays no requieren de referencias!
- Evitar muchas referencias innecesarias, es preferible devolver un parámetro. Suele quedar más claro y es más fácil analizar el comportamiento de la función.
- Tus funciones son muy específicas y muy enfocadas a tu caso particular cuando deberían ser más generales. Por ejemplo intercambiar podría ser intercambiar dos números a y b cualquiera, no hace falta que sean de un array. Este enfoque facilita reutilizar código y elimina dependencias innecesarias, es más fácil depurar 3 funciones independientes que 3 funciones que dependen entre sí.
- Nombres más descriptivos.
- En intercambiar estas asignando un unsigned a un int, cuidado.
- Eliminar el tipo Tarray, pues no aporta nada.

Este es mi código refactorizado:

/*
* ejercicio2.cpp
*
*  Created on: 05/02/2016
*      Alumno:
*      Titulación:
*      Grupo:
*      PC usado:
*/

#include <iostream>
using namespace std;

const int MAX = 8;

/* ordena los elementos del array a de menor a mayor
* por el método de Selección
*/

int obtenerPosMinimo(const int input[],int index)
{
    int minimo = index;

    for(int i = index+1;i < MAX;i++)
    {
        if(input[i] < input[minimo])
        {
            minimo = i;
        }
    }

    return minimo;
}

void intercambiar(int &a,int &b)
{
    int aux = a;
    a = b;
    b = aux;
}

void ordenar(int input[])
{
    for(int i=0; i<MAX; i++)
    {
        int min = obtenerPosMinimo(input,i);
        intercambiar(input[i],input[min]);
    }

}

int main()
{
    int a[MAX] = { 2, 7, 12, 89, 5, 2, 9, 10 };

    /* Mostramos el array antes de ordenarlo */
    cout << "El array antes de ordenarlo: ";
    for (int i = 0; i < MAX; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;

    /* ordenamos el array */
    ordenar(a);

    /* Mostramos el array después de ordenarlo */
    cout << "El array después de ordenarlo: ";
    for (int i = 0; i < MAX; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;

    return 0;
}


Por alguna razón, ahora funciona bien.
Vale, ahora se lo que se pretendía. No he querido mencionar el método sort (que te lo haría del tirón) porque me imagino que son ejercicios para familiarizarse con los bucles y los arrays.
@i02mike @amchacon

Muchisimas gracias. Me equivoque entre otras cosas en lo del minimo xD
4 respuestas