Duda programación C

Iniciado por ironserch, 1 Diciembre 2014, 10:48 AM

0 Miembros y 2 Visitantes están viendo este tema.

ironserch

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:

void especificacion1()
{
    int numero, siguiente, anterior=2;
    int longitud=1, longitud_maxima_anterior, longitud_maxima=1, contador_iguales=0;

    printf("Introduce una secuencia de numeros compuesta por '0' y '1' y que acabe por ^Z.\nGracias:\n\n");

    if ((scanf("%d", &numero))==EOF)
    {
        printf("\n\nEs una secuencia vacia.\n");
        return 0;
    }
    else
    {
        anterior=numero;

        while(scanf("%d", &siguiente)!=EOF)
        {
            if(numero==siguiente)
            {
                longitud++;
                numero=siguiente;

                if(longitud>longitud_maxima)
                {
                    longitud_maxima=longitud;
                }
            }else
            {
                longitud_maxima_anterior=longitud;

                if(longitud_maxima_anterior=longitud_maxima)
                {
                    contador_iguales++;
                    longitud=1;
                    numero=siguiente;
                }
            }
        }
        if (contador_iguales>1)
        {
            printf("\nNo hay secuencia mas larga \"estrictamente\".\n");
        }else
        {
            printf("\nLa subsecuencia mas larga tiene %d numeros (%d).\n\n", longitud_maxima, /*numero de la subsecuencia mas larga*/);
        }

    }

}


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

eferion

#1
* 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?

ironserch

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.

eferion

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.

ironserch


eferion

Código (cpp) [Seleccionar]
if ( longitud_maxima == 0 )
  printf( "Es una secuencia vacia.\n" );
else if ( contador_iguales>1 )
  printf("\nNo hay secuencia mas larga \"estrictamente\".\n");
else
  printf("\nLa subsecuencia mas larga tiene %d numeros (%d).\n\n", longitud_maxima, /*numero de la subsecuencia mas larga*/);

ironserch

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

eferion

Con una variable.

Código (cpp) [Seleccionar]

int digitoSecuenciaMasLarga = -1;

// ...

if ( longitud > longitud_maxima)
{
  longitud_maxima= longitud;
 
  if ( digitoSecuenciaMasLarga == -1 )
    digitoSecuenciaMasLarga = numero;
  else if ( digitoSecuenciaMasLarga != numero )
    ++contador_iguales;

  longitud = 0;
}

ironserch

#8
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:

#include <stdio.h>
void main()
{
   int eleccion;
   do{
       printf("\n\nElegir una de las siguientes opciones:\n\n");
       printf("1. ESPECIFICACION 1: Subsecuencia estrictamente mas larga.\n\n");
       printf("2. ESPECIFICACION 2: La longitud de cada subsecuencia es igual que la siguiente.\n");
       printf("3. Salir del menu.\n\n");
       printf("Elige su eleccion: ");
       scanf("%d", &eleccion);

       switch (eleccion)
       {
           case 1: printf("\n\nHas elegido la especificacion %d:\n\n",eleccion);
                   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");
                   especificacion1();
                   break;
           case 2: printf("\n\nHas elegido la especificacion %d:\n\n",eleccion);
                   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");
                   especificacion2();
                   break;
           case 3: break;
           default: puts("\n\nPor favor, introduzca una eleccion correcta. Gracias.");
       }
   }
   while(eleccion!=3);
}
void especificacion1()
{
   int numero, siguiente, anterior=2;
   int longitud=1, longitud_maxima_anterior, longitud_maxima=1, contador_iguales=0;
   int digitoSecuenciaMasLarga = -1;

   printf("Introduce una secuencia de numeros compuesta por \"0\" y \"1\" y que acabe por ^Z.\nGracias:\n\n");

   if ((scanf("%d", &numero))==EOF)
   {
       printf("\n\nEs una secuencia vacia.\n");
       return 0;
   }
   else
   {
       anterior=numero;

       while(scanf("%d", &siguiente)!=EOF)
       {
           if(numero==siguiente)
           {
               longitud++;
               numero=siguiente;

               if(longitud>longitud_maxima)
               {
                   longitud_maxima=longitud;
               }
           }else
           {
               longitud_maxima_anterior=longitud;

               if(longitud_maxima_anterior=longitud_maxima)
               {
                   contador_iguales++;
                   longitud=1;
                   numero=siguiente;
               }
           }
       }
       if(longitud>longitud_maxima)
       {
           longitud_maxima=longitud;

           if(digitoSecuenciaMasLarga==-1)
               digitoSecuenciaMasLarga=numero;
           else if(digitoSecuenciaMasLarga!=numero )
               ++contador_iguales;

           longitud=0;
           printf("%d digitoSecuenciaMasLarga",digitoSecuenciaMasLarga);
       }
       if (contador_iguales>1)
       {
           printf("\nNo hay secuencia mas larga \"estrictamente\".\n");
       }else
       {
           printf("\nLa subsecuencia mas larga tiene %d numeros (%d).\n\n", longitud_maxima /*numero de la subsecuencia mas larga*/);
       }

   }

}
void especificacion2()
{
   char anterior, caracter;
   int longitud=1, i, iguales=1, contsub=1;

   printf("Introduce una secuencia de caracteres acabada por \"$\":\n\n");
   fflush(stdin);
   scanf("%c",&anterior);

   if(anterior=='$')
   {
       printf("\nEs una secuencia vacia.\n");
       return 0;
   }
   fflush(stdin);
   scanf("%c", &caracter);

   while(caracter==anterior)
   {
       longitud++;
       anterior=caracter;
       fflush(stdin);
       scanf("%c", &anterior);
   }
   while((scanf("%c", &caracter))!='$' && iguales)
   {
       contsub++;
       anterior=caracter;
       fflush(stdin);
       scanf("%c", &anterior);

       for(i=2; i<longitud; i++)
       {
           if(caracter!=anterior)
           {
               iguales=0;
               break;
           }
           anterior=caracter;
           fflush(stdin);
           scanf("%c", &anterior);
           if(caracter=='$')
           {
               iguales=0;
               break;
           }
       }
       if(caracter=='$')
       {
           iguales=0;
           break;
       }
       fflush(stdin);
       scanf("%c", &caracter);

       if(caracter==anterior)
       {
           iguales=0;
           break;
       }
   }
   if(iguales)
       printf("\nLa secuencia mantiene la igualdad de longitudes en las subsecuencias.\nHay %d subsecuencia(s).\n\n", contsub);
   else
       printf("\nLa secuencia NO mantiene la igualdad de longitudes en las subsecuencias.\n\n");
}

void especificacion1();
void especificacion2();

eferion

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 ;)