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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda programación C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Duda programación C  (Leído 3,784 veces)
ironserch

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Duda programación C
« en: 1 Diciembre 2014, 10:48 am »

Hola amig@s tengo un problema con la funcion de la especificacion1.

En ella tengo que determinar en una secuencia indeterminada de entrada estándar compuesta solo por ceros o unos, cuál es la subsecuencia estrictamente más larga.

Suponer la entrada de datos correcta, es decir solo la forman unos y ceros.

Ejemplos:

0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1 La secuencia más larga tiene 7 números (0).

1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 La secuencia más larga tiene 9 números (1).

1 1 1 0 1 1 1 No hay secuencia más larga “estrictamente”.

Mi codigo para esa funcion es:

Código
  1. void especificacion1()
  2. {
  3.    int numero, siguiente, anterior=2;
  4.    int longitud=1, longitud_maxima_anterior, longitud_maxima=1, contador_iguales=0;
  5.  
  6.    printf("Introduce una secuencia de numeros compuesta por '0' y '1' y que acabe por ^Z.\nGracias:\n\n");
  7.  
  8.    if ((scanf("%d", &numero))==EOF)
  9.    {
  10.        printf("\n\nEs una secuencia vacia.\n");
  11.        return 0;
  12.    }
  13.    else
  14.    {
  15.        anterior=numero;
  16.  
  17.        while(scanf("%d", &siguiente)!=EOF)
  18.        {
  19.            if(numero==siguiente)
  20.            {
  21.                longitud++;
  22.                numero=siguiente;
  23.  
  24.                if(longitud>longitud_maxima)
  25.                {
  26.                    longitud_maxima=longitud;
  27.                }
  28.            }else
  29.            {
  30.                longitud_maxima_anterior=longitud;
  31.  
  32.                if(longitud_maxima_anterior=longitud_maxima)
  33.                {
  34.                    contador_iguales++;
  35.                    longitud=1;
  36.                    numero=siguiente;
  37.                }
  38.            }
  39.        }
  40.        if (contador_iguales>1)
  41.        {
  42.            printf("\nNo hay secuencia mas larga \"estrictamente\".\n");
  43.        }else
  44.        {
  45.            printf("\nLa subsecuencia mas larga tiene %d numeros (%d).\n\n", longitud_maxima, /*numero de la subsecuencia mas larga*/);
  46.        }
  47.  
  48.    }
  49.  
  50. }

Si ven que mi codigo se puede mejorar o algo por favor indiquemelo. Muchas gracias =)


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda programación C
« Respuesta #1 en: 1 Diciembre 2014, 11:58 am »

* Si suponemos que se introduce una secuencia correcta, el primer if sobra
* Puedes reutilizar variables si su función es la misma
* Tienes que almacenar en algún sitio el carácter de la secuencia más larga
* La variable que almacena el carácter actual puede ser perfectamente un char
* scanf no te va a devolver EOF si el usuario pulsa "ENTER" ¿Has probado tu programa?


« Última modificación: 1 Diciembre 2014, 12:07 pm por Eternal Idol » En línea

ironserch

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Duda programación C
« Respuesta #2 en: 1 Diciembre 2014, 12:23 pm »

Ante todo gracias por contestar =).

  • Mi primer if seria si encuentra que esta "vacia" (dado que la secuencia puede ser vacia, no tener ni 1 ni 0), y que diga que es una secuencia vacia y si no pues que me haga el resto.
  • En cuanto a lo de la variable que almacena el caracter de la secuencia mas larga no se como ponerlo.

PD: Ejecute mi codigo justo antes de escribir el post y me iba perfectamente, lo unico que me faltaba era la parte de que mostrara el caracter de la secuencia mas larga. Ahora lo volvi a ejecutar y no me funciona! que bien oye! jajaja me rio por no llorar.
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda programación C
« Respuesta #3 en: 1 Diciembre 2014, 12:28 pm »

No hace falta ese if. Eso lo puedes comprobar al final:

* Si la longitud máxima es 0, es que no se ha introducido ninguna secuencia
* En caso contrario, puede suceder que haya una o varias secuencias máximas del mismo tipo ( 0 o 1 )
* O, caso final, hay una o varias secuencias máximas y éstas son de ambos tipos ( 0 y 1 )

Como ves, puedes eliminar ese if y mover su mensaje al final del programa.
En línea

ironserch

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Duda programación C
« Respuesta #4 en: 1 Diciembre 2014, 12:49 pm »

Y como sería el código?
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda programación C
« Respuesta #5 en: 1 Diciembre 2014, 12:53 pm »

Código
  1. if ( longitud_maxima == 0 )
  2.  printf( "Es una secuencia vacia.\n" );
  3. else if ( contador_iguales>1 )
  4.  printf("\nNo hay secuencia mas larga \"estrictamente\".\n");
  5. else
  6.  printf("\nLa subsecuencia mas larga tiene %d numeros (%d).\n\n", longitud_maxima, /*numero de la subsecuencia mas larga*/);
En línea

ironserch

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Duda programación C
« Respuesta #6 en: 1 Diciembre 2014, 14:08 pm »

vale hasta ahi llego pero como pongo para que salga el 0 o 1 dependiendo de la secuencia mas larga?
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda programación C
« Respuesta #7 en: 1 Diciembre 2014, 14:43 pm »

Con una variable.

Código
  1. int digitoSecuenciaMasLarga = -1;
  2.  
  3. // ...
  4.  
  5. if ( longitud > longitud_maxima)
  6. {
  7.  longitud_maxima= longitud;
  8.  
  9.  if ( digitoSecuenciaMasLarga == -1 )
  10.    digitoSecuenciaMasLarga = numero;
  11.  else if ( digitoSecuenciaMasLarga != numero )
  12.    ++contador_iguales;
  13.  
  14.  longitud = 0;
  15. }
En línea

ironserch

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Duda programación C
« Respuesta #8 en: 2 Diciembre 2014, 12:02 pm »

muchas gracias pero donde meto ese if? mire este es el enunciado de mi problema :

Enunciado:


Escribir un programa C que muestre un menú de dos opciones correspondientes a las
especificaciones 1 y 2.

El programa debe validar la introducción de opciones correctas.


Especificación 1.

Determinar en una secuencia indeterminada de entrada estándar compuesta solo
por ceros o unos, cuál es la subsecuencia estrictamente más larga.

Una subsecuencia de una secuencia S de de números enteros se define como un
conjunto de 1 o más caracteres consecutivos e iguales.

Suponer la entrada de datos correcta, es decir solo la forman unos y ceros.
Ejemplos:


0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1 La secuencia más larga tiene 7 números (0).
1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 La secuencia más larga tiene 9 números (1).
1 1 1 0 1 1 1 No hay secuencia más larga “estrictamente”.


Especificación 2.

Una subsecuencia de una secuencia S de caracteres se define como un conjunto de 1 o
más caracteres consecutivos e iguales.

La longitud de una secuencia (subsecuencia) es el número de caracteres que la componen.

Se dice que una secuencia S de caracteres mantiene la igualdad de longitudes en las subsecuencias que la forman, si está constituida por una o más subsecuencias de caracteres, de tal forma que la longitud de cada subsecuencia es igual que la siguiente.

Ejemplos:

  • AAAA7777???? cumple la condición del enunciado (todas sus subsecuencias tienen la misma longitud) y además consta de 3 subsecuencias, la formada por el carácter ‘A’,
    la formada por el carácter ‘7’ y la formada por el carácter ‘?’
  • zzzzzXX NO cumple la condición del enunciado


En la entrada estándar está grabada una línea de caracteres, acabada con un ‘$’, que
representa una secuencia. El carácter ‘$’ no forma parte de la secuencia.

Determinar, mostrando un mensaje explicativo en la salida estándar, si la secuencia
de caracteres de entrada es vacía (una secuencia es vacía si solo está formada por el
carácter ‘$’), o si cumple o no la condición enunciada.

En caso de que se cumpla la condición enunciada, debe mostrarse además el número
de subsecuencias encontradas.


Y mi codigo completo que tengo seria este:

Código
  1. #include <stdio.h>
  2. void main()
  3. {
  4.    int eleccion;
  5.    do{
  6.        printf("\n\nElegir una de las siguientes opciones:\n\n");
  7.        printf("1. ESPECIFICACION 1: Subsecuencia estrictamente mas larga.\n\n");
  8.        printf("2. ESPECIFICACION 2: La longitud de cada subsecuencia es igual que la siguiente.\n");
  9.        printf("3. Salir del menu.\n\n");
  10.        printf("Elige su eleccion: ");
  11.        scanf("%d", &eleccion);
  12.  
  13.        switch (eleccion)
  14.        {
  15.            case 1: printf("\n\nHas elegido la especificacion %d:\n\n",eleccion);
  16.                    printf("Determinar en una secuencia indeterminada de entrada estandar compuesta solo por '0' o '1', decir cual es la subsecuencia estrictamente mas larga.\n\n");
  17.                    especificacion1();
  18.                    break;
  19.            case 2: printf("\n\nHas elegido la especificacion %d:\n\n",eleccion);
  20.                    printf("Determinar si en una secuencia de caracteres mantiene la igualdad de longitudes en las subsecuencias que la forman, si esta constituida por una o mas subsecuencias de caracteres, de tal forma que la longitud de cada subsecuencia es igual que la siguiente.\n\n");
  21.                    especificacion2();
  22.                    break;
  23.            case 3: break;
  24.            default: puts("\n\nPor favor, introduzca una eleccion correcta. Gracias.");
  25.        }
  26.    }
  27.    while(eleccion!=3);
  28. }
  29. void especificacion1()
  30. {
  31.    int numero, siguiente, anterior=2;
  32.    int longitud=1, longitud_maxima_anterior, longitud_maxima=1, contador_iguales=0;
  33.    int digitoSecuenciaMasLarga = -1;
  34.  
  35.    printf("Introduce una secuencia de numeros compuesta por \"0\" y \"1\" y que acabe por ^Z.\nGracias:\n\n");
  36.  
  37.    if ((scanf("%d", &numero))==EOF)
  38.    {
  39.        printf("\n\nEs una secuencia vacia.\n");
  40.        return 0;
  41.    }
  42.    else
  43.    {
  44.        anterior=numero;
  45.  
  46.        while(scanf("%d", &siguiente)!=EOF)
  47.        {
  48.            if(numero==siguiente)
  49.            {
  50.                longitud++;
  51.                numero=siguiente;
  52.  
  53.                if(longitud>longitud_maxima)
  54.                {
  55.                    longitud_maxima=longitud;
  56.                }
  57.            }else
  58.            {
  59.                longitud_maxima_anterior=longitud;
  60.  
  61.                if(longitud_maxima_anterior=longitud_maxima)
  62.                {
  63.                    contador_iguales++;
  64.                    longitud=1;
  65.                    numero=siguiente;
  66.                }
  67.            }
  68.        }
  69.        if(longitud>longitud_maxima)
  70.        {
  71.            longitud_maxima=longitud;
  72.  
  73.            if(digitoSecuenciaMasLarga==-1)
  74.                digitoSecuenciaMasLarga=numero;
  75.            else if(digitoSecuenciaMasLarga!=numero )
  76.                ++contador_iguales;
  77.  
  78.            longitud=0;
  79.            printf("%d digitoSecuenciaMasLarga",digitoSecuenciaMasLarga);
  80.        }
  81.        if (contador_iguales>1)
  82.        {
  83.            printf("\nNo hay secuencia mas larga \"estrictamente\".\n");
  84.        }else
  85.        {
  86.            printf("\nLa subsecuencia mas larga tiene %d numeros (%d).\n\n", longitud_maxima /*numero de la subsecuencia mas larga*/);
  87.        }
  88.  
  89.    }
  90.  
  91. }
  92. void especificacion2()
  93. {
  94.    char anterior, caracter;
  95.    int longitud=1, i, iguales=1, contsub=1;
  96.  
  97.    printf("Introduce una secuencia de caracteres acabada por \"$\":\n\n");
  98.    fflush(stdin);
  99.    scanf("%c",&anterior);
  100.  
  101.    if(anterior=='$')
  102.    {
  103.        printf("\nEs una secuencia vacia.\n");
  104.        return 0;
  105.    }
  106.    fflush(stdin);
  107.    scanf("%c", &caracter);
  108.  
  109.    while(caracter==anterior)
  110.    {
  111.        longitud++;
  112.        anterior=caracter;
  113.        fflush(stdin);
  114.        scanf("%c", &anterior);
  115.    }
  116.    while((scanf("%c", &caracter))!='$' && iguales)
  117.    {
  118.        contsub++;
  119.        anterior=caracter;
  120.        fflush(stdin);
  121.        scanf("%c", &anterior);
  122.  
  123.        for(i=2; i<longitud; i++)
  124.        {
  125.            if(caracter!=anterior)
  126.            {
  127.                iguales=0;
  128.                break;
  129.            }
  130.            anterior=caracter;
  131.            fflush(stdin);
  132.            scanf("%c", &anterior);
  133.            if(caracter=='$')
  134.            {
  135.                iguales=0;
  136.                break;
  137.            }
  138.        }
  139.        if(caracter=='$')
  140.        {
  141.            iguales=0;
  142.            break;
  143.        }
  144.        fflush(stdin);
  145.        scanf("%c", &caracter);
  146.  
  147.        if(caracter==anterior)
  148.        {
  149.            iguales=0;
  150.            break;
  151.        }
  152.    }
  153.    if(iguales)
  154.        printf("\nLa secuencia mantiene la igualdad de longitudes en las subsecuencias.\nHay %d subsecuencia(s).\n\n", contsub);
  155.    else
  156.        printf("\nLa secuencia NO mantiene la igualdad de longitudes en las subsecuencias.\n\n");
  157. }
  158.  
  159. void especificacion1();
  160. void especificacion2();
  161.  
« Última modificación: 2 Diciembre 2014, 12:05 pm por ironserch » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda programación C
« Respuesta #9 en: 2 Diciembre 2014, 12:23 pm »

Lo primero que deberías hacer antes de escribir una sola línea de código es pensar en la forma de resolver el problema que te plantean.

Puedes hacer diagramas, pseudocódigo, ... el caso es que el método que uses debería decirte la forma que debe tener el programa para hacer lo que tu quieres.

Tú me pides que te diga algo del estilo "mira, en la línea X pegas este texto; en la línea Y sustituye esto por esto otro y lo de la línea Z lo comentas todo" pero ese tipo de soluciones las va a borrar el moderador en cuanto las vea.

Te he dado una solución a tu problema... el if tiene como finalidad ejecutar su contenido únicamente cuando se haya encontrado una secuencia más larga que la actual... seguro que eres capaz de encontrar el sitio adecuado donde insertar el código ;)
En línea

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

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda programación
Programación General
Franki 5 3,949 Último mensaje 15 Mayo 2010, 11:34 am
por Kase
Duda de programacion
Dudas Generales
Dimitrixs 2 2,736 Último mensaje 8 Agosto 2011, 23:52 pm
por sepan
[Duda] programacion en c
Programación C/C++
gonpiar 4 2,738 Último mensaje 4 Marzo 2012, 23:37 pm
por rir3760
duda de programacion web
Desarrollo Web
nprio 3 2,309 Último mensaje 29 Abril 2012, 03:09 am
por engel lex
DUDA-Programación en C
Programación C/C++
mariota1 4 2,218 Último mensaje 21 Octubre 2012, 03:03 am
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines