Listar secuencia de años hasta encontrar año con cifra repetida

Iniciado por sora_ori, 12 Marzo 2014, 23:07 PM

0 Miembros y 1 Visitante están viendo este tema.

sora_ori

Buenas,

Tengo un programa en C que me pide un año y luego me calcula cuantos años tienen que pasar hasta encontrar una cifra que sea repetida, es decir, año 2014 tiene 6 secuencias de años con cifras NO repetidas, ya que 2020 se repite una cifra (el 2).

He logrado que me diga que faltan 6 secuencias, pero ahora me gustaría que me las listará, ejemplo:

- 2014
- 2015
- 2016
- 2017
- 2018
- 2019

¿Se podría hacer?


Mi código actual:

#include <stdio.h>
#include <string.h>
#include <time.h>

#define FALSE 0
#define TRUE 1

/******* Declaracion de funcions ******/
int obtenerAnio();
int tipoAnio(int año);
int calcularSec (int año);

/******* Variables globales ******/
int obtenerAnioOK=FALSE;  // Para NO acceder a la opción 3 antes
int tipoAnioOK=FALSE;    // Para NO acceder a la opción 3 antes

/* MENU PRINCIPAL */
int main(void){
  int opcion=0;
  int año; // Variable año utilizada en las funciones
  do{
    system("cls");
    printf("\n1.- Obtener año");
    printf("\n2.- Tipo de año");
    printf("\n3.- Calcular secuencia");
    printf("\n0.- Salir\n\n");
    printf("\nIntroduce una opcion: ");
    fflush(stdin);
    scanf("%i", &opcion);
    switch (opcion) {
           case 1:
                obtenerAnioOK=FALSE;   // Hacer antes la opción 1 antes que la 3
                tipoAnioOK=FALSE;     // Hacer antes la opción 2 antes que la 3
                año = obtenerAnio();   // Guardaremos en "any" lo que guarde la función obtenirAny
                break;
           
           case 2:
                if (!tipoAnio(año)) printf("\nEl año %i no tiene ninguna cifra repetida\n", año); // Mientras tipusAny no sea igual a "anyo"
                else printf("\nEl año %i tiene cifras repetidas", año);
                break;
               
           case 3:
                if ((obtenerAnioOK)&&(tipoAnioOK)){ // Después de hacerse la opción 1 y 2 TRUE
                                 printf("\nHay %i secuencias de año con cifras no repetidas.", calcularSec(año));
                } // Fin if
                else ("\nDe momento no se ha introducido el año o el tipo de anyo\n");
                break;
               
           case 0:
                break;
               
           default:
                   printf("ERROR, opcion incorrecta!\n");
                   break;
    } // Fin switch
    getch();
  }while (opcion != 0);
  system("pause");
  return 0;
} // Fin main


/************* OBTENER año ***********/
int obtenerAnio(){
    int año; // Variable "año" para guardar la fecha introducida
    do{
        system("cls");
        printf("\tINTRODUCE EL año\n");
        printf("\nIntroduce un numero de cuatro digitos entre 1000 y 9999: ");
        fflush(stdin);
        scanf("%i", &año); // Guardar
        }while ((año<1000)||(año>9999)); // Hacer mientras anyo sea + pequeño de 1000 y + grande de 9999
               
               obtenerAnioOK=TRUE; // FLAG TRUE
        return año;
} // Fin


/*** TIPO año ***/
int tipoAnio(int año){
    int cifras[10] = {0,0,0,0,0,0,0,0,0,0}; // Todas las cifras valen 0 por defecto
    int i=0, x=0, cont=0;
   
    while (año > 0) {
          x = año % 10;     // Se queda con la resta, la cifra a tratar
          año = año / 10;   // Quita el ultimo digito a la cifra
          cifras[x] = 1;     // Asigna 1 a la posició de la cifra tratada
    } // Fin while
   
    for (i=0; i<10; i++) cont = cont + cifras[i];
   
    tipoAnioOK=TRUE; // FLAG TRUE
   
    if (cont == 4) return 0; // No hay ninguna cifra repetida
    else return 1; // Alguna cifra esta repetida
} // Fin

/*** CALCULAR SECUENCIA ***/
int calcularSec (int año){
    int cont=0;
   
    while (!tipoAnio(año++)) cont++; // Mientras tipusAnio pasando any+1, hasta que la función retorne 0, contador ++
                                     // Osea, retornara el número de veces que se ha ejecutado la función tipuusAny hasta dar 0 pasando una variable +1 todo el rato
    return cont;
} // Fin


Gracias

leosansan


No tengo muy seguro que sea tuyo el código  :rolleyes: tiene errores como el uso de la ñ en las variables, faltan un par de librerías, conio para el getch y stdlib para el system.

Pero no seré yo quien prejuzgue si es así o no.

En cualquier caso te he corregido los errores para que primero compile, cosa que no hacia, y de paso te he añadido el uso de los acentos y de la ñ en los printf, no así en las variables ya que ahí no se pueden usar .... y como no, la secuencia de años que pedias:


Citar

1.- Obtener año
2.- Tipo de año
3.- Calcular secuencia
0.- Salir


Introduce una opción: 3

Hay 7 secuencias de año con cifras no repetidas.1234
1235
1236
1237
1238
1239
1240


Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>

#define FALSE 0
#define TRUE 1

/******* Declaracion de funcions ******/
int obtenerAnio();
int tipoAnio(int año);
int calcularSec (int año);

/******* Variables globales ******/
int obtenerAnioOK=FALSE;  // Para NO acceder a la opción 3 antes
int tipoAnioOK=FALSE;    // Para NO acceder a la opción 3 antes

/* MENU PRINCIPAL */
int main(void){
  int opcion=0,i;
  int año; // Variable año utilizada en las funciones
  do{
    system("cls");
    printf("\n1.- Obtener a\xA4o");
    printf("\n2.- Tipo de a\xA4o");
    printf("\n3.- Calcular secuencia");
    printf("\n0.- Salir\n\n");
    printf("\nIntroduce una opci\xA2n: ");
    fflush(stdin);
    scanf("%i", &opcion);
    switch (opcion) {
           case 1:
                obtenerAnioOK=FALSE;   // Hacer antes la opción 1 antes que la 3
                tipoAnioOK=FALSE;     // Hacer antes la opción 2 antes que la 3
                año = obtenerAnio();   // Guardaremos en "any" lo que guarde la función obtenirAny
                break;

           case 2:
                if (!tipoAnio(año)) printf("\nEl a\xA4o %i no tiene ninguna cifra repetida\n", año); // Mientras tipusAny no sea igual a "anyo"
                else printf("\nEl a\xA4o %i tiene cifras repetidas", año);
                break;

           case 3:
                if ((obtenerAnioOK)&&(tipoAnioOK)){ // Después de hacerse la opción 1 y 2 TRUE
                                 printf("\nHay %i secuencias de a\xA4o con cifras no repetidas.", calcularSec(año));
                for (i=0;i<calcularSec(año);i++)
                   printf ("%d\n",año+i);
                } // Fin if
                else ("\nDe momento no se ha introducido el a\xA4o o el tipo de anyo\n");
                break;

           case 0:
                break;

           default:
                   printf("ERROR, opci\xA2n incorrecta!\n");
                   break;
    } // Fin switch
    getch();
  }while (opcion != 0);
  system("pause");
  return 0;
} // Fin main


/************* OBTENER año ***********/
int obtenerAnio(){
    int año; // Variable "año" para guardar la fecha introducida
    do{
        system("cls");
        printf("\tINTRODUCE EL a\xA4o\n");
        printf("\nIntroduce un n\xA3mero de cuatro d\xA1gitos entre 1000 y 9999: ");
        fflush(stdin);
        scanf("%i", &año); // Guardar
        }while ((año<1000)||(año>9999)); // Hacer mientras anyo sea + pequeño de 1000 y + grande de 9999

               obtenerAnioOK=TRUE; // FLAG TRUE
        return año;
} // Fin


/*** TIPO año ***/
int tipoAnio(int año){
    int cifras[10] = {0,0,0,0,0,0,0,0,0,0}; // Todas las cifras valen 0 por defecto
    int i=0, x=0, cont=0;

    while (año > 0) {
          x = año % 10;     // Se queda con la resta, la cifra a tratar
          año = año / 10;   // Quita el ultimo digito a la cifra
          cifras[x] = 1;     // Asigna 1 a la posició de la cifra tratada
    } // Fin while

    for (i=0; i<10; i++) cont = cont + cifras[i];

    tipoAnioOK=TRUE; // FLAG TRUE

    if (cont == 4) return 0; // No hay ninguna cifra repetida
    else return 1; // Alguna cifra esta repetida
} // Fin

/*** CALCULAR SECUENCIA ***/
int calcularSec (int año){
    int cont=0;

    while (!tipoAnio(año++)) cont++; // Mientras tipusAnio pasando any+1, hasta que la función retorne 0, contador ++
                                     // Osea, retornara el número de veces que se ha ejecutado la función tipuusAny hasta dar 0 pasando una variable +1 todo el rato
    return cont;
} // Fin


¡¡¡¡ Saluditos! ..... !!!!




sora_ori

El código es la solución de un ejercicio de la escuela   ;D

Gracias por tu ayuda, eso era lo que quería, pero he tenido que cambiar la variable "año" por "año" de nuevo porque sino peta por todos los lados, si que lo he mantenido en los "printf".


Saludos

dato000

Cita de: sora_ori en 13 Marzo 2014, 17:06 PM
El código es la solución de un ejercicio de la escuela   ;D

Gracias por tu ayuda, eso era lo que quería, pero he tenido que cambiar la variable "año" por "año" de nuevo porque sino peta por todos los lados, si que lo he mantenido en los "printf".


Saludos

Te recomiendo que nunca uses ese tipo de caracteres como "ñ" porque dara problemas de un compilador a otro ya sea para declaración de variables o en el momento de crear librerias o cosas así, lo mejor es usar una referencia similar que indique el nombre de esa variable sin usar ese tipo de caracteres.



leosansan

#4
UPPSS:::: creo que colqué el código equivocado, no sé incluso si era el original. El que yo había modificado es:

Código (cpp) [Seleccionar]

/** Determinar a partir de un año que se introduce
si no tiene cifras repetidas y los años siguientes
hasta encontrar otro año donde se repita algún dígito **/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>

#define FALSE 0
#define TRUE 1

/******* Declaracion de funcions ******/
int obtenerAnio();
int tipoAnio(int año);
int calcularSec (int año);

/******* Variables globales ******/
int obtenerAnioOK=FALSE;  // Para NO acceder a la opción 3 antes
int tipoAnioOK=FALSE;    // Para NO acceder a la opción 3 antes

/* MENU PRINCIPAL */
int main(void){
 int opcion=0,i;
 int año; // Variable año utilizada en las funciones
 do{
   system("cls");
   printf("\n1.- Obtener a\xA4o");
   printf("\n2.- Tipo de a\xA4o");
   printf("\n3.- Calcular secuencia");
   printf("\n0.- Salir\n\n");
   printf("\nIntroduce una opci\xA2n: ");
   fflush(stdin);
   scanf("%i", &opcion);
   switch (opcion) {
          case 1:
               obtenerAnioOK=FALSE;   // Hacer antes la opción 1 antes que la 3
               tipoAnioOK=FALSE;     // Hacer antes la opción 2 antes que la 3
               año = obtenerAnio();   // Guardaremos en "any" lo que guarde la función obtenirAny
               break;

          case 2:
               if (!tipoAnio(año)) printf("\nEl a\xA4o %i no tiene ninguna cifra repetida\n", año); // Mientras tipusAny no sea igual a "anyo"
               else printf("\nEl a\xA4o %i tiene cifras repetidas", año);
               break;

          case 3:
               if ((obtenerAnioOK)&&(tipoAnioOK)){ // Después de hacerse la opción 1 y 2 TRUE
                                printf("\nHay %i secuencias de a\xA4o con cifras no repetidas.", calcularSec(año));
               for (i=0;i<calcularSec(año);i++)
                  printf ("%d\n",año+i);
               } // Fin if
               else ("\nDe momento no se ha introducido el a\xA4o o el tipo de anyo\n");
               break;

          case 0:
               break;

          default:
                  printf("ERROR, opci\xA2n incorrecta!\n");
                  break;
   } // Fin switch
   getch();
 }while (opcion != 0);
 system("pause");
 return 0;
} // Fin main


/************* OBTENER año ***********/
int obtenerAnio(){
   int año; // Variable "año" para guardar la fecha introducida
   do{
       system("cls");
       printf("\tINTRODUCE EL a\xA4o\n");
       printf("\nIntroduce un n\xA3mero de cuatro d\xA1gitos entre 1000 y 9999: ");
       fflush(stdin);
       scanf("%i", &año); // Guardar
       }while ((año<1000)||(año>9999)); // Hacer mientras anyo sea + pequeño de 1000 y + grande de 9999

              obtenerAnioOK=TRUE; // FLAG TRUE
       return año;
} // Fin


/*** TIPO año ***/
int tipoAnio(int año){
   int cifras[10] = {0,0,0,0,0,0,0,0,0,0}; // Todas las cifras valen 0 por defecto
   int i=0, x=0, cont=0;

   while (año > 0) {
         x = año % 10;     // Se queda con la resta, la cifra a tratar
         año = año / 10;   // Quita el ultimo digito a la cifra
         cifras[x] = 1;     // Asigna 1 a la posició de la cifra tratada
   } // Fin while

   for (i=0; i<10; i++) cont = cont + cifras[i];

   tipoAnioOK=TRUE; // FLAG TRUE

   if (cont == 4) return 0; // No hay ninguna cifra repetida
   else return 1; // Alguna cifra esta repetida
} // Fin

/*** CALCULAR SECUENCIA ***/
int calcularSec (int año){
   int cont=0;

   while (!tipoAnio(año++)) cont++; // Mientras tipusAnio pasando any+1, hasta que la función retorne 0, contador ++
                                    // Osea, retornara el número de veces que se ha ejecutado la función tipuusAny hasta dar 0 pasando una variable +1 todo el rato
   return cont;
} // Fin


Sorry por la confusión.

¿Pero qué diablos pasa?, yo no tengo puesto año sino a n i o, observarlo  escribiendo lo anterior seguido en un mensaje y lo veréis, lo cambia el muy cabrito

Citar

año=A n i o



El programa cambia automáticamente "a n i o" por año, hacer si no la prueba y picar  en citar para ver el original y veréis que no está puesto año o escribirlo en un mensaje y pre visualizar. Menuda pifia

Probaré con anyo ...si, éste no lo cambia.

Entonces no me había confundido de código y el que había puesto era el mio sólo que cambiado por el procesador de texto que usamos al escribir los mensajes .....$#@?'¡~# diablos rayos y centellas, que pifia de procesador.

Pues vamos allá lo cambio todo y listo, pero conste, y me repito porque esto es muy fuerte, que es una pifia de este procesador de texto que usamos para escribir los mensajes:


Código (cpp) [Seleccionar]

/** Determinar a partir de un año que se introduce
si no tiene cifras repetidas y los años siguientes
hasta encontrar otro año donde se repita algún dígito **/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>

#define FALSE 0
#define TRUE 1

/******* Declaracion de funcions ******/
int obtenerAnio();
int tipoAnio(int Anyo);
int calcularSec (int Anyo);

/******* Variables globales ******/
int obtenerAnioOK=FALSE;  // Para NO acceder a la opción 3 antes
int tipoAnioOK=FALSE;    // Para NO acceder a la opción 3 antes

/* MENU PRINCIPAL */
int main(void){
 int opcion=0,i;
 int anyo; // Variable año utilizada en las funciones
 do{
   system("cls");
   printf("\n1.- Obtener a\xA4o");
   printf("\n2.- Tipo de a\xA4o");
   printf("\n3.- Calcular secuencia");
   printf("\n0.- Salir\n\n");
   printf("\nIntroduce una opci\xA2n: ");
   fflush(stdin);
   scanf("%i", &opcion);
   switch (opcion) {
          case 1:
               obtenerAnioOK=FALSE;   // Hacer antes la opción 1 antes que la 3
               tipoAnioOK=FALSE;     // Hacer antes la opción 2 antes que la 3
               anyo = obtenerAnio();   // Guardaremos en "any" lo que guarde la función obtenirAny
               break;

          case 2:
               if (!tipoAnio(anyo)) printf("\nEl a\xA4o %i no tiene ninguna cifra repetida\n", anyo); // Mientras tipusAny no sea igual a "anyo"
               else printf("\nEl a\xA4o %i tiene cifras repetidas", anyo);
               break;

          case 3:
               if ((obtenerAnioOK)&&(tipoAnioOK)){ // Después de hacerse la opción 1 y 2 TRUE
                                printf("\nHay %i secuencias de a\xA4o con cifras no repetidas.", calcularSec(anyo));
               for (i=0;i<calcularSec(anyo);i++)
                  printf ("%d\n",anyo+i);
               } // Fin if
               else ("\nDe momento no se ha introducido el a\xA4o o el tipo de anyo\n");
               break;

          case 0:
               break;

          default:
                  printf("ERROR, opci\xA2n incorrecta!\n");
                  break;
   } // Fin switch
   getch();
 }while (opcion != 0);
 system("pause");
 return 0;
} // Fin main


/************* OBTENER año ***********/
int obtenerAnio(){
   int anyo; // Variable "año" para guardar la fecha introducida
   do{
       system("cls");
       printf("\tINTRODUCE EL a\xA4o\n");
       printf("\nIntroduce un n\xA3mero de cuatro d\xA1gitos entre 1000 y 9999: ");
       fflush(stdin);
       scanf("%i", &anyo); // Guardar
       }while ((anyo<1000)||(anyo>9999)); // Hacer mientras anyo sea + pequeño de 1000 y + grande de 9999

              obtenerAnioOK=TRUE; // FLAG TRUE
       return anyo;
} // Fin


/*** TIPO año ***/
int tipoAnio(int Anyo){
   int cifras[10] = {0,0,0,0,0,0,0,0,0,0}; // Todas las cifras valen 0 por defecto
   int i=0, x=0, cont=0;

   while (Anyo > 0) {
         x = Anyo % 10;     // Se queda con la resta, la cifra a tratar
         Anyo = Anyo / 10;   // Quita el ultimo digito a la cifra
         cifras[x] = 1;     // Asigna 1 a la posició de la cifra tratada
   } // Fin while

   for (i=0; i<10; i++) cont = cont + cifras[i];

   tipoAnioOK=TRUE; // FLAG TRUE

   if (cont == 4) return 0; // No hay ninguna cifra repetida
   else return 1; // Alguna cifra esta repetida
} // Fin

/*** CALCULAR SECUENCIA ***/
int calcularSec (int Anyo){
   int cont=0;

   while (!tipoAnio(Anyo++)) cont++; // Mientras tipusAnio pasando any+1, hasta que la función retorne 0, contador ++
                                    // Osea, retornara el número de veces que se ha ejecutado la función tipuusAny hasta dar 0 pasando una variable +1 todo el rato
   return cont;
} // Fin


Ahora no cambia nada. Pero es alucinante lo que puede uno currar para que un mi**da de procesador de texto te tire al suelo el curro que te has pegado.

Sorry,sorry..
....

¡¡¡¡ Saluditos! ..... !!!!



sora_ori

jajaja muchas gracias por las molestias, te estoy muy agradecido!


Un saludo

rir3760

Cita de: leosansan en 13 Marzo 2014, 19:21 PM
¿Pero qué diablos pasa?, yo no tengo puesto año sino a n i o, observarlo  escribiendo lo anterior seguido en un mensaje y lo veréis, lo cambia el muy cabrito

...

El programa cambia automáticamente "a n i o" por año, hacer si no la prueba y picar  en citar para ver el original y veréis que no está puesto año o escribirlo en un mensaje y pre visualizar. Menuda pifia

Probaré con anyo ...si, éste no lo cambia.

Entonces no me había confundido de código y el que había puesto era el mio sólo que cambiado por el procesador de texto que usamos al escribir los mensajes .....$#@?'¡~# diablos rayos y centellas, que pifia de procesador.
Si encuentras eso realmente molesto abre un tema sobre ello en el foro Sugerencias y dudas sobre el Foro

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

leosansan

Cita de: rir3760 en 14 Marzo 2014, 02:32 AM
Si encuentras eso realmente molesto abre un tema sobre ello en el foro Sugerencias y dudas sobre el Foro

Un saludo

No es propiamente molesto sino más bien irritado,.

Creo que no cuesta tanto informar de alguna manera de las "peculiaridades" del procesador de texto que usamos, como el hecho de que [ i ], sin el espacio en blanco, no aparece porque se usa como indicativo de las letras en cursivas.

Fue un calentón momentáneo por la surprise!.


¡¡¡¡ Saluditos! ..... !!!!