contador de dos caracteres consecutivos en C

Iniciado por kellogs95, 10 Noviembre 2013, 15:01 PM

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

kellogs95

Hola pues eso: Necesito hacer un programilla y queria saber si alguien podria decirme al menos el error que he cometido.

Este no es el programa total ya que tengo que meterlo en una funcion.

el programa tendria que sumar al contador+1 cada vez que hubiese un '0' y un '1' juntos: ej; 10101110  ...... contador=3


#include <stdio.h>
int main (void){

char actual;
char anterior;
int contador = 0;

printf ( "\n Introduzca la serie digital terminada en (enter):");

while (actual != '\n'){

if ((anterior == '0') && (actual = '1')){
anterior = actual;
contador++;}

if ((anterior == '1') && (actual== '0')){
anterior = actual;
contador++;}

scanf ("%c", &actual);}

printf (" Numero de grupos es: %d", contador);
fflush (stdout);

return 0;
}


rir3760

* Lo primero que salta a la vista es el uso de las variables "actual" y "contador" sin antes asignarles un valor, eso sucede en la primera iteración del bucle.

* En la primera sentencia if del bucle:
if ((anterior == '0') && (actual = '1')){
Utilizas el operador de asignación "=" cuando debería ser el de comparación "==".

* Debes actualizar el valor de la variable "anterior" en cada iteración del bucle, una opción aquí es, si los dígitos son distintos, asignar el valor '\0' para descartar el par de dígitos (al parecer esa es la intención en tu programa).

El bucle corregido (se puede acortar utilizando el operador lógico OR "||"):
char anterior = '\0';

/* ... */

while (scanf("%c", &actual) == 1 && actual != '\n'){
   if ((anterior == '0') && (actual == '1')){
      anterior = '\0';
      contador++;
   }else if ((anterior == '1') && (actual == '0')){
      anterior = '\0';
      contador++;
   }else
      anterior = actual;
}


Una forma mas corta esta basada en el uso del especificador "%1[01]" con scanf, con el nos aseguramos de leer un solo carácter igual a '0' o '1' (seguido de un '\0', por eso se utilizan arrays) y en caso de que los bits sean iguales se puede regresar uno a la entrada estándar con ungetc:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char a[2];
   char b[2];
   int i;
   
   printf("Introduzca la serie digital:");
   fflush(stdout);
   
   i = 0;
   while (scanf("%1[01]%1[01]", a, b) == 2)
      if (*a != *b)
         i++;
      else
         ungetc(*b, stdin);
   
   printf("Numero de pares distintos: %d\n", i);
   
   return EXIT_SUCCESS;
}


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

kellogs95