Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ccm777 en 11 Noviembre 2013, 20:57 pm



Título: secuencia digital
Publicado por: ccm777 en 11 Noviembre 2013, 20:57 pm
tengo que hacer un ejercicio en el que calcule una estadistica para una secuencia digital:se obtiene una secuencia formada por 1 y 0 y hay que calcular el numero de tansiciones y el valor medio, tengo esto pero me falla
#include <stdio.h>
int main(void)
{
   int num;
   int contador;
   double suma;
   double media;
   int anterior;
   int actual;
   
   suma=0.0;
   contador=0;
   
   printf("Escriba una secuencia:");
   scanf("%d",&num);
   actual=1;
   anterior=0;
   
   
   while((num=='0')||(num=='1')){
      while((actual=='0'&& anterior=='1')||(actual=='1'&& anterior=='0')){
         contador=contador+1;
         anterior=actual;
         
      }
   }
   printf("El numero de saltos es: %d",contador);
   
   while((num=='0')||(num=='1')){
      suma=suma+num;
      
      contador=contador+1;

      media=suma/contador;
   
   }   
   printf("La suma es:%g",suma);   
   printf("contador: %d",contador);   
   printf("\n La media es: %g",media);   
   
   return 0;
}


Título: Re: secuencia digital
Publicado por: Almapa en 11 Noviembre 2013, 21:56 pm
Tiene algo que ver con este otro?
http://foro.elhacker.net/programacion_cc/contador_de_dos_caracteres_consecutivos_en_c-t402507.0.html


Título: Re: secuencia digital
Publicado por: ccm777 en 12 Noviembre 2013, 12:56 pm
si gracias ya encontre el fallo para contar los saltos pero sigo sin encontrar el de la suma


Título: Re: secuencia digital
Publicado por: rir3760 en 12 Noviembre 2013, 15:13 pm
Tu programa no funcionara correctamente ya que lees el numero como un entero y después tratas de procesar cada uno de sus dígitos con bucles como este:
Código
  1. printf("Escriba una secuencia:");
  2. scanf("%d", &num);
  3.  
  4. /* ... */
  5.  
  6.  
  7. while ((num == '0') || (num == '1')){

En su lugar puedes leer la secuencia de dígitos binarios como una cadena con scanf y a continuación realizas el proceso de conteo de transiciones y media (NPI). Mas o menos así:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char bit[128];
  7.   int num_bits;
  8.   int i;
  9.  
  10.   printf("Introduce el numero: ");
  11.   fflush(stdout);
  12.   if (scanf("%127[01]%n", bit, &num_bits) != 1)
  13.      return EXIT_FAILURE;
  14.  
  15.   /* Algun proceso, por ejemplo impresion de los bits */
  16.   printf("Valor de cada bit (%d):\n", num_bits);
  17.   for (i = 0; i < num_bits; i++)
  18.      printf("bit[%2d] == \'%c\'\n", i, bit[i]);
  19.  
  20.   return EXIT_SUCCESS;
  21. }

Un saludo


Título: Re: secuencia digital
Publicado por: kikian94 en 18 Noviembre 2013, 18:59 pm
hola, he hecho el programa pero me da error y no lo encuentro, creo que esta todo bien, pero siempre me dice caracter erroneo
Código
  1. int main/*
  2. *
  3. *
  4. *
  5. */
  6.  
  7. for(i=0;i<MAXC;i++){
  8. cadena[i]='0';
  9. }
  10.  
  11. printf("Secuencia:");
  12. fflush(stdout);
  13. gets(cadena);
  14. fflush(stdin);
  15. errorcadena=estadisticaSecuencia(cadena,&transicciones,&mediatotal);
  16. if(errorcadena==CARACTERERROR){
  17. printf("caracter erroneo");
  18.  
  19. }else{
  20. printf("la media es:%d",mediatotal);
  21. printf("numero de transiciones: %d", transicciones);
  22. }
  23. /*
  24. *
  25. *
  26. *
  27. **/
  28. return 0;
  29.  
  30. int estadisticaSecuencia(char cadenaOriginal[], int *transiciones, int *media){
  31.  
  32. int error=CORRECTO;
  33.  
  34. int contador=0;
  35. int i=0;
  36. char caracter;
  37. char caracterAnterior;
  38. int suma=0;
  39.  
  40.  
  41. while(cadenaOriginal[i]!='\n' && error==CORRECTO){
  42.      caracter=cadenaOriginal[i];
  43.  
  44.  
  45. if(caracter!='1' && caracter!='0' && caracter !='\0'){
  46.  
  47. error= CARACTERERROR;
  48. }
  49. else{
  50. if(caracter=='1'){
  51. suma++;
  52. contador++;
  53. }
  54. if(caracter=='0'){
  55. contador++;
  56. }
  57. if( (caracter=='1' && caracterAnterior=='0') || (caracter=='0' && caracterAnterior=='1')){
  58. (*transiciones)++;
  59.  
  60. }
  61. caracterAnterior = caracter;
  62.  
  63. }
  64. i++;
  65. }
  66. (*media)=suma/contador;
  67.  
  68. return error;
  69. }
  70.  
  71.  
  72.  
  73.  
  74.  


Título: Re: secuencia digital
Publicado por: rir3760 en 19 Noviembre 2013, 02:31 am
he hecho el programa pero me da error y no lo encuentro, creo que esta todo bien, pero siempre me dice caracter erroneo
Para verificar que el programa funcione correctamente debes publicar el código fuente completo.

En cuanto al fragmento que pones no deberías utilizar gets y fflush(stdin). Mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)

Y en la función "estadisticaSecuencia" asumes que la cadena pasada como su primer argumento incluye el carácter '\n' pero eso no sucederá porque lees la linea con gets (esta lee una linea almacenándola en la dirección indicada pero sin incluir el avance de linea).

Un saludo