Buenos días,tengo muchas dudas con un ejercicio de caracteres.

Iniciado por el gusanillo, 26 Febrero 2018, 11:07 AM

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

el gusanillo

Escribid un programa que dado un array de 10 caracteres (introducidos a mano en el código),calcule cuántas veces aparecen dos caracteres iguales seguidos. Si por ejemplo hay tres caracteres iguales seguidos,consideremos que un carácter no puede pertenecer a dos parejas.

MAFUS

Piensa en una lista de caracteres aleatorios y no conoces su orden en una cinta de papel y esta cinta de papel pasa por debajo de un hoja con una ventanita que solo deja ver un carácter. Tienes una lápiz para escribir los resultados.
¿Cómo procederías?


    |----------------| < hoja opaca
    |       _ventana |
====|===???|A|????===|==== < cinta con caracteres
    |       -        |
    |----------------|

Los ? son los caracteres que quedan ocultos y solo se mostrarán al pasar por la ventana

Mahlahj

Supongo te has de referir a la moda de los datos... ¿?

dijsktra

#3
Un problema bonito y "raro"...
Ahí va un programa que vale para cualquiera N carcateres, (hasta 1000), metidos por teclado, hasta que se mete el fin de fichero... (no incluye separadores entre los caracteres)


#include <iostream>
#include <algorithm> // min, max

using namespace std;

#define MAX 1000

/*


 P : N >= 0
 Q : count = #i : 0 <= i < N-1: twin(V,N,i)

 where twin(V,N,i) ::= V[i]==V[i+1]) &&
                       ((i==0) ||
                       ((i>0) and V[i]!=V[i-1]) ||
                       (i>1) and V[i-1]==V[i-2])

*/
int twins(const int V[MAX], const int N)
{
 int n,count;
 for(n=count=0; n<N-1 ; n+=1+(V[n]==V[n+1]))
   count += (V[n]==V[n+1]) ;
 return count;
}

int main(int argc, char *args[])
{
 char c;
 int N;
 int V[MAX];
 for ( N=0  ; (N<MAX) && (cin >> c) ; N++ )  V[N]= c;
 cout << N << " " << twins(V,N) << endl;
 return 0;
}

/*

0           n                             N
+-----+-----+-----+-----+-----+-...-+-----+
|  a  |  a  |  a  |  b  |  b  |     |  r  |
+-----+-----+-----+-----+-----+-...-+-----+

(Bizarre...)

 I : Q[N/n] and
     0 <= n <= N
     
 B : n<N-1
 C(n) : N-n >= 0
 step : n = n + (1 + V[i]==V[i+1])
 O(n) (linear)

*/





a

El primer parametro da el numero de caracteres leidos (N) el segundo, el numero de "parejas" según el criterio del problema

1 0

aaa

3 1

aaaaa

5 2

aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooo*

46 15

(La linea tiene 46 caracteres y 15 parejas)

Y la bonita. Es importante el * porque cin no toma separadores y saldrian más parejas de las normales, juntando los renglones.

aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooo*
oooaaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnn*
nnnoooaaabbbcccdddeeefffggghhhiiijjjkkklllmmm*
mmmnnnoooaaabbbcccdddeeefffggghhhiiijjjkkklll*
lllmmmnnnoooaaabbbcccdddeeefffggghhhiiijjjkkk*
kkklllmmmnnnoooaaabbbcccdddeeefffggghhhiiijjj*
jjjkkklllmmmnnnoooaaabbbcccdddeeefffggghhhiii*
iiijjjkkklllmmmnnnoooaaabbbcccdddeeefffggghhh*
hhhiiijjjkkklllmmmnnnoooaaabbbcccdddeeefffggg*
ggghhhiiijjjkkklllmmmnnnoooaaabbbcccdddeeefff*
fffggghhhiiijjjkkklllmmmnnnoooaaabbbcccdddeee*
eeefffggghhhiiijjjkkklllmmmnnnoooaaabbbcccddd*
dddeeefffggghhhiiijjjkkklllmmmnnnoooaaabbbccc*
cccdddeeefffggghhhiiijjjkkklllmmmnnnoooaaabbb*
bbbcccdddeeefffggghhhiiijjjkkklllmmmnnnoooaaa*


15 lineas por 15 parejas da 225 parejas


690 225


Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)

el gusanillo

Buenas tardes, muchas gracias por la ayuda.Dedico el fin de semana para trabajarlo y plantear posibles dudas.
Un saludo.