elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Como planteariais este problema?( en C)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Como planteariais este problema?( en C)  (Leído 5,113 veces)
oxi12pek

Desconectado Desconectado

Mensajes: 15



Ver Perfil
Como planteariais este problema?( en C)
« en: 5 Noviembre 2012, 17:13 pm »

Tengo un problemilla.Tengo que entregar esta semana un trabajo en el que hay un ejercicio en el que me pide que guarde en una variable el numero mas alto de un array y el segundo mas alto. No tengo ningun problema para conseguir el mas alto, pero el segundo me cuesta entenderlo. Como lo planteariais? No os pido que me hagais el ejercicio si no comentarme los conceptos para que yo pueda avanzar en mi aprendizaje. No soy de esos que pide ayuda muy facilmente y menos para quitarme trabajo, especialmente en esta aficcion!!!
Gracias.


En línea

Algun dia lo sere...
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Como planteariais este problema?( en C)
« Respuesta #1 en: 5 Noviembre 2012, 17:28 pm »

pide los numeros y almacenalos en el array, luego ordenalo de mayor a menor y quedate con los 2 primeros.

un saludo!


En línea

BatchianoISpyxolo

Desconectado Desconectado

Mensajes: 166


Ver Perfil
Re: Como planteariais este problema?( en C)
« Respuesta #2 en: 5 Noviembre 2012, 17:30 pm »

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.
En línea

Puede que desees aprender a programar desde 0: www.espascal.es
Oblivi0n


Desconectado Desconectado

Mensajes: 392

Odio las ranas.


Ver Perfil
Re: Como planteariais este problema?( en C)
« Respuesta #3 en: 5 Noviembre 2012, 17:51 pm »

El codigo está en java, pero creo que lo entenderas
El caso es tener 2 variables, uno para el maximo, y otro para el submaximo, cuando el maximo cambie, submaximo pasa a valer el anterior valor de maximo

(devuelve una array con los 2 numeros)
P.D: La funcion recibe un array de enteros llamado "numeros"

Código
  1. int [] devolver = new int[2];
  2. int maximo = numeros[0];
  3. int submaximo = numeros[0];
  4.  
  5. for(int i = 0; i < numeros.length;i++){
  6. if(numeros[i] > maximo){
  7. int aux = maximo;
  8. maximo = numeros[i];
  9. submaximo = aux;
  10.  
  11. }
  12. }
  13.  
  14. devolver[0] = maximo;
  15. devolver[1] = submaximo;
  16. return devolver;
En línea

oxi12pek

Desconectado Desconectado

Mensajes: 15



Ver Perfil
Re: Como planteariais este problema?( en C)
« Respuesta #4 en: 5 Noviembre 2012, 18:29 pm »

Me han gustado mucho las dos ideas. Ahora las planteo y subo el resultado haber que os parece.
Muchas gracias por responder.
En línea

Algun dia lo sere...
oxi12pek

Desconectado Desconectado

Mensajes: 15



Ver Perfil
Re: Como planteariais este problema?( en C)
« Respuesta #5 en: 5 Noviembre 2012, 18:39 pm »

Perdon Oblivi0n no he visto tu respuesta antes de responder. Lo entiendo si. Habia pensado en ese mismo ejemplo . Muchas gracias!!!
En línea

Algun dia lo sere...
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Como planteariais este problema?( en C)
« Respuesta #6 en: 5 Noviembre 2012, 19:11 pm »

El caso es tener 2 variables, uno para el maximo, y otro para el submaximo, cuando el maximo cambie, submaximo pasa a valer el anterior valor de maximo
Citar
No exactamente, ya que un número podría ser menor que max y superior a cuasi_max, con lo que éste tomaría su valor.
Sin necesidad de ordenar previamente:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define N   15
  5. int main()
  6.  
  7. {
  8.    int i,a[N],aux,max,cuasi_maxi;
  9.    srand(time(0));
  10.  
  11.    for (i = 0; i < N; i++)
  12.        {
  13.            a[i]= 25+rand() % (101-25) ;
  14.            printf("%d, ", a[i]);
  15.  
  16.        } printf("\b\b \n");
  17.    if (a[0]<=a[1]) {max= a[1]; cuasi_maxi=a[0];}
  18.    else {max= a[0]; cuasi_maxi=a[1];}
  19.    for (i = 2; i < N; i++)
  20.    if (a[i]>=max) {aux=max;max=a[i];cuasi_maxi=aux;}
  21.    else if (a[i]>cuasi_maxi ) {cuasi_maxi=a[i];}
  22.        printf("%d   %d",max,cuasi_maxi);
  23.    return 0;
  24. }
Saludos!.
« Última modificación: 5 Noviembre 2012, 19:12 pm por leosansan » En línea

oxi12pek

Desconectado Desconectado

Mensajes: 15



Ver Perfil
Re: Como planteariais este problema?( en C)
« Respuesta #7 en: 5 Noviembre 2012, 19:20 pm »

Bueno lo he terminado, pero justo cuando lo he terminado me ha entrado la curiosidad de como haria un programa que ordenara los numeros de menor a mayor y he hecho esto:
Código:
int main(void)
{
  int A[N],*p;
  printf("Escribe %d numeros por favor\n",N);
  for(p=A;p<A+N;p++)
    scanf("%d",p);
  standard_atoi(A,N);
  printf("Numeros ordenados de menor a mayor: ");
  for(p=A;p<A+N;p++)
    printf("%d ",*p);
   
}
void standard_atoi(int a[],int n)
{
  int *q,x;
  for(q=a;q<a+n;q++)
    if(*(q-1)>*q){
      x=*q;
      *q=*(q-1);
      *(q-1)=x;
    }


}
Porque no me funciona?
En línea

Algun dia lo sere...
BatchianoISpyxolo

Desconectado Desconectado

Mensajes: 166


Ver Perfil
Re: Como planteariais este problema?( en C)
« Respuesta #8 en: 5 Noviembre 2012, 19:35 pm »

Código:
Lo único que haces es intercambiar los valores cuando a[i-1] es mayor que a[i]

Ordenación por inserción:
Código
  1. void ord_ins(int v[], int n) {
  2.    int i,j,x;
  3.    for (i=1;i<n;i++) {
  4.        x = v[i];
  5.        j = i-1;
  6.        while ( (j>-1) && (v[j]>x) )
  7.            v[j+1] = v[j--];
  8.        v[j+1] = x;
  9.    }
  10. }

Ordenación por quicksort (mediana de 3). Teniendo en cuenta la macro UMBRAL:
Código
  1. void ord_ins(int v[], int n) {
  2.    int i,j,x;
  3.    for (i=1;i<n;i++) {
  4.        x = v[i];
  5.        j = i-1;
  6.        while ( (j>-1) && (v[j]>x) )
  7.            v[j+1] = v[j--];
  8.        v[j+1] = x;
  9.    }
  10. }
  11.  
  12. void intercambiar(int v[], int izq, int der) {
  13.    int t;
  14.    t = v[izq];
  15.    v[izq] = v[der];
  16.    v[der] = t;
  17. }
  18.  
  19. void mediana3 (int v[], int izq, int der) {
  20.    int k = (int)((izq+der)/2);
  21.    if ( v[k] > v[der] ) intercambiar(v, k, der);
  22.    if ( v[k] < v[izq] ) intercambiar(v, k, izq);
  23.    if ( v[k] > v[der] ) intercambiar(v, k, der);
  24. }
  25.  
  26. void quicksort(int v[], int n) {
  27.    void ordenarAux(int v[], int izq, int der) {
  28.        if ( izq+UMBRAL <= der ) {
  29.            mediana3(v,izq,der);
  30.            int pivote = v[izq];
  31.            int i = izq;
  32.            int j = der;
  33.            do {
  34.                do i++;
  35.                while ( v[i] < pivote );
  36.                do j--;
  37.                while ( v[j] > pivote );
  38.                intercambiar(v, i, j);
  39.            } while (j > i);
  40.            intercambiar(v,i,j);
  41.            intercambiar(v,izq,j);
  42.            ordenarAux(v,izq,j-1);
  43.            ordenarAux(v,j+1,der);
  44.        }
  45.    }
  46.    ordenarAux(v,0,n-1);
  47.    if ( UMBRAL == 1 ) ord_ins(v,n);
  48.  
  49. }

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.
« Última modificación: 5 Noviembre 2012, 19:57 pm por BatchianoISpyxolo » En línea

Puede que desees aprender a programar desde 0: www.espascal.es
Oblivi0n


Desconectado Desconectado

Mensajes: 392

Odio las ranas.


Ver Perfil
Re: Como planteariais este problema?( en C)
« Respuesta #9 en: 5 Noviembre 2012, 22:31 pm »

No tiene sentido ordenar y luego extraer, quicksort en el mejor caso es n*log(n), unido a extraer quedaría O(n*log(n) + n).En el caso peor, sería O(n2).La complejidad de mi algoritmo es simplemente O(n). ( ya sé que no estamos discutiendo eficiencia)
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayudenme con este problema, q nose como se hace y ni lo entiendo
.NET (C#, VB.NET, ASP)
luix87 9 5,081 Último mensaje 28 Septiembre 2009, 16:27 pm
por Atrum
ayuda como soluciono este problema :)
PHP
sh0ck-r00t 1 2,164 Último mensaje 3 Octubre 2009, 03:55 am
por Embusterillo de bolsillo
como puedo solucionar este problema con actiosnscript 3 en flash cs4?
Diseño Gráfico
Belial & Grimoire 1 5,156 Último mensaje 13 Enero 2010, 22:15 pm
por peib0l
como solucono este problema
Desarrollo Web
cotin 2 2,233 Último mensaje 22 Marzo 2017, 00:18 am
por cotin
(Pregunta): ¿Como se solucionaria este problema de actualización?
PHP
Leguim 3 2,385 Último mensaje 14 Octubre 2019, 03:23 am
por Leguim
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines