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

#51
Lo único que haces es intercambiar los valores cuando a[i-1] es mayor que a[i]

Ordenación por inserción:
void ord_ins(int v[], int n) {
   int i,j,x;
   for (i=1;i<n;i++) {
       x = v[i];
       j = i-1;
       while ( (j>-1) && (v[j]>x) )
           v[j+1] = v[j--];
       v[j+1] = x;
   }
}


Ordenación por quicksort (mediana de 3). Teniendo en cuenta la macro UMBRAL:
void ord_ins(int v[], int n) {
   int i,j,x;
   for (i=1;i<n;i++) {
       x = v[i];
       j = i-1;
       while ( (j>-1) && (v[j]>x) )
           v[j+1] = v[j--];
       v[j+1] = x;
   }
}

void intercambiar(int v[], int izq, int der) {
   int t;
   t = v[izq];
   v[izq] = v[der];
   v[der] = t;
}

void mediana3 (int v[], int izq, int der) {
   int k = (int)((izq+der)/2);
   if ( v[k] > v[der] ) intercambiar(v, k, der);
   if ( v[k] < v[izq] ) intercambiar(v, k, izq);
   if ( v[k] > v[der] ) intercambiar(v, k, der);
}

void quicksort(int v[], int n) {
   void ordenarAux(int v[], int izq, int der) {
       if ( izq+UMBRAL <= der ) {
           mediana3(v,izq,der);
           int pivote = v[izq];
           int i = izq;
           int j = der;
           do {
               do i++;
               while ( v[i] < pivote );
               do j--;
               while ( v[j] > pivote );
               intercambiar(v, i, j);
           } while (j > i);
           intercambiar(v,i,j);
           intercambiar(v,izq,j);
           ordenarAux(v,izq,j-1);
           ordenarAux(v,j+1,der);
       }
   }
   ordenarAux(v,0,n-1);
   if ( UMBRAL == 1 ) ord_ins(v,n);

}


Ahí tienes dos algoritmos de ordenación en C. Los tengo a mano porque tengo que implementarlos y analizar su complejidad para una práctica en estos momentos.

Saludos.
#52
No funciona por la precisión. :[

Siempre testea el valor de las variables así sabrás que pasa. O a couts o con gdb (por ejemplo)...

La solución está en que si tienes una cantidad inferior a .01 salgas del bucle.. O sea lo puedes hacer así:

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>

using namespace std;

int main(){

float cantidad;
float canta = 0;
float cante = 0;
float canti = 0;
int e = 0;
int f = 0;
int g = 0;
int h = 0;
cout << "escribe la cantidad" << endl;
cin >> cantidad;
while(cantidad > 0)
{
    if(cantidad >= 0.25){
        cantidad -= 0.25;
        e++;
    }
else if(cantidad >= 0.10){
     cantidad -= 0.10;
     f++;
    }
else if(cantidad >= 0.05){
     cantidad -= 0.05;
     g++;
    }
else if(cantidad >= 0.01){
     cantidad -= 0.01;
     h++;
    }
else {
    cantidad = -1;
    h++;
    }
}

cout << "de 0.25 = " << e << endl;
cout << "de 0.10 = " << f << endl;
cout << "de 0.05 = " << g << endl;
cout << "de 0.01 = " << h << endl;
}


¿

float canta = 0;
float cante = 0;
float canti = 0;

?
#53
No he leído mucho pero el error creo que está aquí:

while(cantidad != 0)

Cantidad debe ser mayor o igual a 0. Nunca vas a tener cantidades negativas.

Como tú dices, si tienes 1.4 y vas restando .25, llegará un momento que saltes de un valor > 0 a otro valor < 0 entonces nunca será igual a 0 y el bucle se hará infinito.

Por tanto:

while(cantidad > 0)

Edito: debe ser mayor que 0 para que no se haga ciclo infinito.
#54
La manera más sencilla de pensar es lo siguiente:

Creas una función de máximo y declaras una variable struct con dos campos, x e y de tipo int o simplemente dos variables x e y de tipo int.

x = maximo(vector[0..n-1]); // máximo de todos
y = maximo(vector[0..n-2]); // segundo máximo

En el segundo vector, no puede estar x.

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

Si utilizas MergeSort, HeapSort o QuickSort (por ejemplo) sí sería buena idea ordenarlos.

Si no, puedes usar mi método que también vale.
#55
Cita de: rir3760 en  5 Noviembre 2012, 17:11 PM
Esa operacion:
*sum += a[i];
Si se encuentra en el primer mensaje pero oxi12pek no utilizo las etiquetas de código (debería) y por eso en su lugar aparece el texto en cursiva.

Un saludo

Toda la razón. xD
#56
Cita de: oxi12pek en  5 Noviembre 2012, 16:50 PM
Y porque tengo que inicializar y??? No lo veo claro.

O inicializas y o inicializas *sum dentro de la función.

Por que si no el la primera suma harías

sum = basura + a[0]

Porque y/*sum inicialmente tiene un valor basura, no tiene por qué ser 0.
#57
#include <stdio.h>
void avg_sum(double a[],int n,double *avg, double *sum)
  {
  int i;

  *sum = 0;

  for(i=0;i<n;i++) *sum+=a[i];
  *avg=(*sum/n);
  }

int main(void)
{
  double A[]={1,2,3,4,5,6.6,7.7,88.8,1,4},x,y;
  int j=10;

  avg_sum(A,j,&x,&y);
  printf("Suma total del array: %.2f\n",y);
  printf("Promedio del array: %.2f\n",x);
}


También faltaba indexar el array de doubles.
#58
Programación C/C++ / Re: que pasa con conio.h??
5 Noviembre 2012, 16:28 PM
Si C::B es livianito (respecto a las opciones que trae) y es un buen IDE. El problema es que si tienes que compilar un proyecto en un equipo que no hay un IDE que lo haga fácil pues siempre es bueno crear makefiles para compilar rápido en cualquier lugar.
#60
El problema del ciclo de HRSLASH es la comprobación del if en cada ciclo. El código es correcto y si tu pregunta era como saltar esos números pues con el if perfecto.

En este caso el testeo del if no importa demasiado porque son 43 iteraciones del for, pero si tuvieras 5 millones de iteraciones sí tendría más importancia.