Autor
|
Tema: Listar secuencia de años hasta encontrar año con cifra repetida (Leído 2,444 veces)
|
sora_ori
Desconectado
Mensajes: 269
|
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{ printf("\n3.- Calcular secuencia"); printf("\nIntroduce una 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 }while (opcion != 0); return 0; } // Fin main /************* OBTENER año ***********/ int obtenerAnio(){ int año; // Variable "año" para guardar la fecha introducida do{ printf("\tINTRODUCE EL año\n"); printf("\nIntroduce un numero de cuatro digitos entre 1000 y 9999: "); 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
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
No tengo muy seguro que sea tuyo el código 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: 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
#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! ..... !!!!
|
|
|
En línea
|
|
|
|
sora_ori
Desconectado
Mensajes: 269
|
El código es la solución de un ejercicio de la escuela  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
|
|
|
En línea
|
|
|
|
dato000
Desconectado
Mensajes: 3.034
|
El código es la solución de un ejercicio de la escuela  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.
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
UPPSS:::: creo que colqué el código equivocado, no sé incluso si era el original. El que yo había modificado es:/** 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 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:/** 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! ..... !!!!
|
|
« Última modificación: 13 Marzo 2014, 21:25 pm por leosansan »
|
En línea
|
|
|
|
sora_ori
Desconectado
Mensajes: 269
|
jajaja muchas gracias por las molestias, te estoy muy agradecido!
Un saludo
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
¿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 ForoUn saludo
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.314
|
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! ..... !!!!
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
El Congreso de EE UU congela la ley SOPA hasta encontrar consenso
Noticias
|
wolfbcn
|
1
|
1,508
|
16 Enero 2012, 18:54 pm
por cker
|
|
|
Hasta 15 años de cárcel en Etiopía por utilizar Skype
Noticias
|
wolfbcn
|
0
|
1,378
|
25 Junio 2012, 21:36 pm
por wolfbcn
|
|
|
Leer secuencia de doubles hasta tecla enter
Programación C/C++
|
radix.2007
|
3
|
2,511
|
10 Febrero 2013, 21:57 pm
por radix.2007
|
|
|
¿Hasta tres años de cárcel por rootear un Android?
Noticias
|
wolfbcn
|
0
|
2,266
|
22 Septiembre 2013, 01:56 am
por wolfbcn
|
|
|
España registró en 2018 la cifra más baja de nacimientos en 20 años
Foro Libre
|
Machacador
|
1
|
1,291
|
11 Diciembre 2019, 21:14 pm
por B€T€B€
|
|