• Viernes 8 de Noviembre de 2024, 18:47

Autor Tema:  Problema con un programa (Novato =D)  (Leído 1914 veces)

rock_neurotiko

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Problema con un programa (Novato =D)
« en: Lunes 8 de Marzo de 2010, 22:13 »
0
Hola compañeros, sé que soy nuevo, pero he leido ya algunos posts, y he de advertir que estoy empezando  ^_^  asi que lo siento si mis preguntas parecen de niño (es mas, no tengo mas de 17 años xD)

----------

Para empezar, estoy haciendo un programa que simule un programa de una serie (perdidos), que, en el fondo no sirve para nada mas que para ocio, pero me viene muy bien para empezar a programar.
El programa consiste en que tu introduces un codigo, si lo introduces bien te sale una cuenta atras de 108 minutos (que para el programa lo pondria de segundos) y si lo introduces mal te respondería "error del sistema" para volver al principio.

Bien, como el numero ha introducir es muy largo (4815162342) y nisiquiera con unsigned long sirve, tuve que buscar una solucion, y esa es que hay que ir introduciendo los numeros uno a uno (4-8-15-16-23-42) con la consiguiente equivocacion en cada una.
Aqui hago alguna pregunta,¿ hay algun tipo de variable, que se me haya escapado por ahi, que pueda tener el numero entero?

He conseguido lo de los numeros uno a uno(tras unos cuarenta y cinco minutos de intento y error y pensar) y despues he conseguido que el "error del sistema" se repita unas cuantas veces para que parezca mas real.

Aquí es donde he conseguido mi programa "beta" ya que, por desgracia, todavia no tengo conocimientos para la cuenta atras. Solo quiero que me ayuden a saber qué tengo que estudiar, o qué puedo usar para poder hacer la cuenta atrás.

Aquí os dejo el código que tengo :D
Código: C
  1.  
  2. #include <stdio.h>
  3.  
  4. void main()
  5.  
  6. {
  7.     inicio:
  8.     int bucle;
  9.     int numero4;
  10.     int numero8;
  11.     int numero15;
  12.     int numero16;
  13.     int numero23;
  14.     int numero42;
  15.     printf("**************************************************************n");
  16.     printf("***********************INICIATIVA DHARMA**********************n");
  17.     printf("**********************NUMERO DE SEGURIDAD:********************n");
  18.     printf("************************4-8-15-16-23-42***********************n");
  19.     printf("*Introducir los numeros de seguridad uno a uno pulsando Enter*n");
  20.     printf("**************************************************************n");
  21.     printf("nn");
  22.     printf(":<")  ;
  23.     scanf("%d", &numero4);
  24.  
  25.     while(numero4!=4)
  26.     {   for (bucle=1;bucle<=500;bucle++)
  27.     printf("22/09/2004-15:16-Error del sisteman");
  28.     goto inicio;
  29.     }
  30.     printf(":<a")  ;
  31.     scanf("%d", &numero8);
  32.     while (numero8!=8)
  33.     {for (bucle=1;bucle<=500;bucle++)
  34.     printf("22/09/2004-15:16-Error del sisteman");
  35.     goto inicio;
  36.     }
  37.     printf(":<")  ;
  38.     scanf("%d", &numero15);
  39.     while (numero15!=15)
  40.     {   for (bucle=1;bucle<=500;bucle++)
  41.     printf("22/09/2004-15:16-Error del sisteman");
  42.     goto inicio;
  43.     }
  44.     printf(":<")  ;
  45.     scanf("%d", &numero16);
  46.     while (numero16!=16)
  47.     {   for (bucle=1;bucle<=500;bucle++)
  48.     printf("22/09/2004-15:16-Error del sisteman");
  49.     goto inicio;
  50.     }
  51.     printf(":<")  ;
  52.     scanf("%d", &numero23);
  53.     while (numero23!=23)
  54.     {   for (bucle=1;bucle<=500;bucle++)
  55.     printf("22/09/2004-15:16-Error del sisteman");
  56.     goto inicio;
  57.     }
  58.         printf(":<")  ;
  59.     scanf("%d", &numero42);
  60.     while (numero42!=42)
  61.     {   for (bucle=1;bucle<=500;bucle++)
  62.     printf("22/09/2004-15:16-Error del sisteman");
  63.     goto inicio;
  64.     }
  65.     printf("nnEspere 108 minutosnnn");
  66.     goto inicio;
  67. }
  68.  
  69.  

Vndecid

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Re: Problema con un programa (Novato =D)
« Respuesta #1 en: Lunes 8 de Marzo de 2010, 22:56 »
0
Hola . Lo de la cuenta atras te la debo... pero el temita de los numeros te convendria usar una "cadena de caracteres"...
pero primero tenes que entender que es un vector....;-)!

Ya te di la "pista"...
------------------------
Tambien ese "goto" lo podrias cambair por un dowhile
y creo que podrias usarla mascara en scanf...asi
--------------------
scanf("%d-%d-%d",&numero1,&numero2,&numero3);
Pro No vas a tener que poner enter en medio de cada uno de los numeros
Contra : le llegas a errar y en vez de poner - le pones otra cosa y se clava.
--------------
Insisto lo podes hacer con una cadena de caracteres.
Existe una funcion en string.h que es strcmp. Esa funcion permite comparar dos cadenas de caracteres una ya la tenes la otra la podes pedir asi
fgets(linea,500,sdtin)  (y antes de todo eso declara char linea[500]; y char  *aux; aux=linea;
despues del fgets haces
while(*aux!='n')
  aux++;
*aux=''
y printf("%s",linea) y ya tenes tu numero echo cadena de caracteres despues haces
strcmp("numero entre comillas",linea);
si el valor es 0 las lineas son iguales

rock_neurotiko

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Problema con un programa (Novato =D)
« Respuesta #2 en: Lunes 8 de Marzo de 2010, 23:14 »
0
Muchas gracias por responder tan rapido.
Lo de la cuenta atras es algo que me esta sacando de quicio, lo he intentado con tm_min y muchos, pero no saco nada en claro...

y lo del numero largo... se lo que es un vector, pero nose como podre usarlo aqui, quizas cuando lea mas lo entendere gracias ^^

y el goto por dowhile... lo cierto es que ese goto creo que esta bien, porque he encandenado una cadena de whiles que si en alguna se produce salta el error y vuelve al principio, y si no, sigue sin saltar el error y vuelve al principio... nose, esa parte me gusta como la tenga, hasta que consiga saber si puedo poner un solo numero (4815162342) para hacer una sola sentencia while.

Gracias :D

Vndecid

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Re: Problema con un programa (Novato =D)
« Respuesta #3 en: Lunes 8 de Marzo de 2010, 23:35 »
0
Bueno si sabes que es un vector entonces vas a entender esto:
Una cadena de caracteres es un vector que DEBE tener esta estructura (numero ascii-numero ascii-numero ascii-) donde es lo que indica el fin de la cadena.
Hasta ahi creo que entendes bien Ok?.
Tambien sabes esto:(TABLA ASCCI no me permiten poner enlaces)

Que los numero en ASCII entre el 48 y el 57 incluidos los dos son solamente numeros.
Entonces deberias  hacer una funcion que te permita entrar solo numeros (pero eso es demasiado complicado si recien empezas) o
hacaer una funcion mas o menos asi

i
Código: C
  1. int verifica(char *linea) //Devuelve un UNO si la cadena tiene un caracter distinto a un numero debe ser utilizadop con una cadena NORMALIZADA
  2. {
  3.    while(*linea!='')
  4.    {
  5.        if(*linea<48 || linea>57)
  6.             return 1;
  7.        linea++;
  8.    }
  9. return 0;
  10. }
  11.  

Código: C
  1. void normalizar(char *linea)//Saca el enter de una cadena(el n)
  2. {
  3.     while(*linea!='n')
  4.          linea++;
  5. *linea='';
  6. }
  7.  
  8.  

y despues en el main pones

Código: C
  1. strcmp("4815162342",linea);//Devolvera un 0 SI LAS CADENAS SON IGUALES
  2.  
  3.  

acordate de poner #include<string.h>

Lo del goto....si vas a una Universidad no te dejan usar el goto indiscriminadamente ...Si, si lo se, es HERMOSO usar el goto pero existe un problema.No en este programa en particular.Despues de pasado un tiempo (1 dia) si el programa es un poco mas grande ni la persona que hizo el programa entiendo que hace el programa con muhos gotoes y es en serio ademas es una sentencia "vieja" se uitilizaba cuando no exsitian las sentencias ya armadas...
Te recomiendo ("La biblia blanca") "El lenguaje de programación c kernighan y ritchie"

Bye...

rock_neurotiko

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Problema con un programa (Novato =D)
« Respuesta #4 en: Martes 9 de Marzo de 2010, 00:04 »
0
He leido todo lo que has puesto y he entendido algo (es normal que no comprenda todo, soy autodidacta hasta ahora que me estais enseñando =D)

El codigo que me has enseñado es para que se pueda ingresar el numero 4815162342 directamente, pero al ponerlo en mi codigo (uno nuevo, y solamente con esta para ver el funcionamiento) despues de muchos errores por mi parte he llegado a un solo error:
"Statement missing ; in function main()

el codigo es el siguiente:

Código: C
  1. #include <stdio.h>
  2. #include <string.h>
  3. void main()
  4.  
  5. {
  6.     inicio:
  7.     char nt;
  8.     printf(":<")  ;
  9.     scanf("%d-%d-%d",&nt);
  10.  
  11.  
  12.     nt verifica(char*linea)
  13.     {
  14.      while(*linea!='')
  15.      {
  16.           if(*linea<48 || linea>57)
  17.                  return 1;
  18.           linea++;
  19.      }
  20.  return 0;
  21.     }
  22.  void normalizar(char *linea)
  23. {
  24.       while(*linea!='n')
  25.              linea++;
  26.  *linea='';
  27.  }
  28.  strcmp("4815162342",linea);
  29.  
  30. }
  31.  


El error me da en esta linea:

Código: C
  1.     nt verifica(char*linea)
  2.  


Lo cierto es que no se que es... :S



De todas formas, seguire aprendiendo haber si consigo aprender todo lo que me estais enseñando :D
Y me he descargado el libro que me has dicho, muchas gracias.

Vndecid

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Re: Problema con un programa (Novato =D)
« Respuesta #5 en: Martes 9 de Marzo de 2010, 00:20 »
0
veo que no sabes lo que es una funcion.Explico
Una FUNCION es un MINIPROGRAMA que hace una accion determinada
Cuyo cuerpo es asi

ANTES DEL MAIN

(tipo de dato que devuelve int char etc o void si no debuelve nada) (nombre de la funcion) ((tipo de dato de entrada,tipo de dato de estrada));

MAIN

DESPUES DEL MAIN

(mismo tipo de dato que pusiste arriba cuando declaraste la funcion) (mimso nombre que puesiste arriba cuando declaraste la funcion) ((mismo tipo de dato de entrada espacio nombre de la variable,mismo tipo de dato de entrada espacio otro nombre de  variable y sigue asi)
{
lo que hace la funcion
return variable que devuelve
}

ACA UN EXCELENTE EJEMPLO con las FUNCIONES que yo te di si usas linu funciona bien si usas borland Abstente a las consecuencias (risa malefica) JAJAJAJ JAAAAAAAAAAAAJAAAAAAAAAJJJJJJAAAAAAAAAAJAAAAAAAAA(fin de risa malefica)
Copia pega e investiga...(por ahora no te inmiscuyas en los * por que se te va a armar flor de quilombo)

bash-4.0$ gcc sd.c
bash-4.0$ ./a.out
Ingrese NUMERO: 123
LA LINEA NO ES IGUAL A 12345 -->Funciona

Código: C
  1.  
  2. #include<stdio.h>
  3. #include<string.h>
  4.  
  5.  
  6. int verifica(char *);
  7. void normalizar(char *);
  8.  
  9. int main (void)
  10. {
  11.     char linea[50];
  12.     printf("Ingrese NUMERO: ");
  13.     fgets(linea,50,stdin);
  14.  
  15.     normalizar(linea);
  16.  
  17.     if(verifica(linea)!=0)
  18.         printf("LA LINEA CONTIENE CARACTERES!!!!");
  19.     else
  20.         if(strcmp("12345",linea)==0)
  21.             printf("La linea es igual a 12345");
  22.         else
  23.             printf("LA LINEA NO ES IGUAL A 12345");
  24.  
  25.  
  26.  
  27. }
  28.  
  29.  
  30. int verifica(char *linea) //Devuelve un UNO si la cadena tiene un caracter distinto a un numero debe ser utilizadop con una cadena NORMALIZADA
  31. {
  32.    while(*linea!='')
  33.    {
  34.        if(*linea<48 || *linea>57)
  35.             return 1;
  36.        linea++;
  37.    }
  38. return 0;
  39. }
  40.  
  41.  
  42. void normalizar(char *linea)//Saca el enter de una cadena(el n)
  43. {
  44.     while(*linea!='n')
  45.          linea++;
  46. *linea='';
  47. }
  48.  
  49.