elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11
71  Programación / Programación C/C++ / Re: Violación de segmento en sockets en: 16 Julio 2018, 10:59 am
Hola,  :D
He ido a iniciar un pequeño socket en C++, me ha dado un mensaje de error en el que decía:.
La línea en la que me da el error pone lo siguiente:Gracias,  :D
fox459

Repasa el prototipo de la llamada socket.
Código:
NAME
       socket - create an endpoint for communication

SYNOPSIS
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int socket(int domain, int type, int protocol);

basta con que declares
Código
  1. int packet_socket;
  2. packet_socket = socket(AF_INET, SOCK_STREAM, 0);

Probablemente tengas mal declarado packet_socket y esté apuntando a alguna dirección sin sentido como por ejemplo;

Código
  1. int *packet_socket; // uninitialized pointer
  2. packet_socket = socket(AF_INET, SOCK_STREAM, 0);
72  Programación / Programación C/C++ / std::list::erase <list> en: 4 Julio 2018, 12:07 pm
Tengo una duda. De la función
Código
  1. iterator erase (iterator position);
la documentación dice:

RETURNS : An iterator pointing to the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.

Mi pregunta es: se deve asumir algún valor "util" en el iterador, como parametro de entrada salida?

El siguiente programa invierte el sugsegmento L[i..i+k) del vector corresponidente a la lista L[0..N), con 0 <=i < N , 0 <= k

Código
  1. #include <iostream>
  2. #include <list>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. // P : length(l) >= 0 , 0 <= i < length(l)  ,k >= 0
  7. void invertSegment(list<char>& l, const int i, const int k){
  8.  list<char>::const_iterator it1,it2;
  9.  it1 = next(l.begin(),i);  //O(l)
  10.  it2 = next(l.begin(),min(i+k,(int)l.size())); // O(i+k)
  11.  for(it2--;it2!=it1 ;it2-- ) // O(k))
  12.    {
  13.      l.insert(it1,*it2);  // O(1)
  14.      it2=l.erase(it2);
  15.    }
  16.  return;    
  17. }
  18.  
  19.  
  20.  
  21. int main() {
  22.  list<char> l;
  23.  int N, i, k;
  24.  char c;
  25.  for ( ; cin >> N >> i >> k; )
  26.    {
  27.      l.clear();
  28.      for (int n = 0; n < N; n++)
  29. {
  30. cin >> c ; l.push_back(c);
  31. }
  32.      invertSegment(l,i,k);
  33.      for (list<char>::const_iterator it=l.begin(); it!=l.end(); it++) cout << *it << " ";
  34.      cout << endl;
  35.    }
  36.  return true;
  37. }
  38.  

En la linea 14, debo asumir

Código
  1. it2=l.erase(it2);

como lo mismo que...

Código
  1. l.erase(it2);

Yo creo que NO, pese a que el programa parce funcionar.

Aquí algunas salidas: La primera linea leem, N, i, k , la segunda la lista de N elementos y la salida marca la lista con la sublista invertida
Código:
6 1 2
1 2 3 4 5 6
1 3 2 4 5 6
6 1 4
1 2 3 4 5 6
1 5 4 3 2 6
6 1 5
1 2 3 4 5 6
1 6 5 4 3 2
6 0 6
1 2 3 4 5 6
6 5 4 3 2 1

73  Programación / Programación C/C++ / Re: metodo de recursividad en: 27 Junio 2018, 16:27 pm
Esta podría ser una solución elegante
Código
  1. #include <stdio.h>
  2.  
  3. void rombo(unsigned altura) {
  4. ...
  5.    if(i<h) { // Mientras el reglón no ha llegado a la altura del rombo
  6.        int j;
  7.        for(j=0; j<=h/2-w/2; ++j) // Calculo los espacios por escalon
  8.            putchar(' ');         //    y los imprimo
  9.        for(j=0; j<w; ++j) // Imprimo
  10.            putchar('*');  //    los asteriscos
  11.        putchar('\n'); // Al siguiente reglón
  12. ...}
  13.  
  14. int main() {
  15.    rombo(6);
  16. }

hmmm... por lo general, si se meten bucles, se pierde la recursividad (caso base, caso recursivo, funcion de avance...

Mi propuesta

Código:
height: 0
*
height: 2
 *
***
 *
height: 4
  * 
 ***
*****
 ***
  * 
height: 6
   *   
  *** 
 *****
*******
 *****
  *** 
   *   
height: 8
    *   
   ***   
  ***** 
 *******
*********
 *******
  ***** 
   ***   
    *   
height: 10
     *     
    ***   
   *****   
  ******* 
 *********
***********
 *********
  ******* 
   *****   
    ***   
     *     
height: 12
      *     
     ***     
    *****   
   *******   
  ********* 
 ***********
*************
 ***********
  ********* 
   *******   
    *****   
     ***     
      *     
height: 14
       *       
      ***     
     *****     
    *******   
   *********   
  *********** 
 *************
***************
 *************
  *********** 
   *********   
    *******   
     *****     
      ***     
       *       
height: 16
        *       
       ***       
      *****     
     *******     
    *********   
   ***********   
  ************* 
 ***************
*****************
 ***************
  ************* 
   ***********   
    *********   
     *******     
      *****     
       ***       
        *       
height: 18
         *         
        ***       
       *****       
      *******     
     *********     
    ***********   
   *************   
  *************** 
 *****************
*******************
 *****************
  *************** 
   *************   
    ***********   
     *********     
      *******     
       *****       
        ***       
         *         
height: 20
          *         
         ***         
        *****       
       *******       
      *********     
     ***********     
    *************   
   ***************   
  ***************** 
 *******************
*********************
 *******************
  ***************** 
   ***************   
    *************   
     ***********     
      *********     
       *******       
        *****       
         ***         
          *         
height: 22
           *           
          ***         
         *****         
        *******       
       *********       
      ***********     
     *************     
    ***************   
   *****************   
  ******************* 
 *********************
***********************
 *********************
  ******************* 
   *****************   
    ***************   
     *************     
      ***********     
       *********       
        *******       
         *****         
          ***         
           *           
height: 24
            *           
           ***           
          *****         
         *******         
        *********       
       ***********       
      *************     
     ***************     
    *****************   
   *******************   
  ********************* 
 ***********************
*************************
 ***********************
  ********************* 
   *******************   
    *****************   
     ***************     
      *************     
       ***********       
        *********       
         *******         
          *****         
           ***           
            *         






Código
  1. #include <stdio.h>
  2.  
  3. void printLineR(const int N, const int n,const int start)
  4. {
  5.  if (start==N+1) return;
  6.  else
  7.    {
  8.      const int nn = n<=(N/2)?n:N-n;
  9.      if (start < (N/2) - nn ) printf(" ");
  10.      if ((((N/2) - nn)<=start) && (start <= (N/2 + nn))) printf("*");
  11.      if ((start > (N/2 + nn))) printf(" ");
  12.      printLineR(N,n<=(N/2)?n:N-n,start+1);
  13.    }
  14. }
  15.  
  16. void printLine(const int N,const int n)
  17. {
  18.  printLineR(N,n,0);
  19.  printf("\n");
  20. }
  21.  
  22.  
  23. void diamondR(const int N, const int n)
  24. {
  25.  if (n == N+1)  return;
  26.  else
  27.    {
  28.      printLine(N,n);
  29.      diamondR(N,n+1);
  30.    }
  31.  
  32. }
  33. /* 0 <= N */
  34. void diamond(const int N)
  35. {
  36.  diamondR(N,0);
  37. }
  38.  
  39. int main()
  40. {
  41.  int N=25;
  42.  for (int n=0; n<N ; n+=2 )
  43.    {
  44.      printf("height: %d\n",n);
  45.      diamond(n);
  46.    }
  47. }
  48.  
  49.  
  50.  
74  Programación / Programación C/C++ / Re: Pequeña duda Fibonacci TDA Pila en: 24 Junio 2018, 12:35 pm
Al Gran Fibonacci le debemos todo

Muchas gracias @SrMcLister, entonces mi algoritmo quedaria asi:
//Aunque no me convence del todo ya que al ingresar 1 o 2 me devuelve el valor de la pila.cima y no es lo que busco pero funciona :D

Código
  1. int fibonacci(int n)
  2. {
  3. tpila pila;
  4. init_stack(pila);
  5. while(pila.cima<n-1){
  6. push_stack(pila, pila.datos[pila.cima]+pila.datos[pila.cima-1]);
  7. }
  8. return top_stack(pila);
  9. }
  10.  
....

A ver: Independientemente de lo que devuelves, el errror más grande es que no "respetas" las operaciones del tad Pila... estás acceidiendo a su representación interna, cosa que el usuario que programa Fibonacci no tiene que ver....


Aquí hay dos problemas que separar
  • implementar el TAD pila
  • usar el TAD pila para resolver el problema de Fibonacci

Yo la primera, la doy por implementada en la STL, aunque es posbile que para tí sea necesario implementar la tuya propia.

Alla va mi propuesta ( tu puedes adatparla a la implementación de tu pila)
Código
  1. #include <stack> // from STL
  2. #include <algorithm> // for min
  3. #include <iostream>  // cout, cin
  4. using namespace std;
  5.  
  6.  
  7. /*
  8.  
  9. Starting on 0!
  10.  
  11. P : 0 <= N ...
  12. I :
  13.    0 <= n <= N
  14.    top(stack) = fib(n)
  15.    n > 1 -> top (pop(stack)) = fib(n-1)
  16.  
  17.  */
  18. int Fibonacci(const int N)
  19. {
  20.  stack<int> s ;
  21.  s.push(1);
  22.  s.push(1);
  23.  for(int n=min(N,1) ;  n<N ; n++)
  24.    {
  25.    int n1= s.top() ;
  26.    s.pop();
  27.    int n2 = s.top();
  28.    s.pop();
  29.    s.push(n1);
  30.    s.push(n2+n1);
  31.    }
  32.  return s.top();
  33. }
  34.  
  35.  
  36. #define MAX 10000
  37. int main(int argc, char **args)
  38. {
  39.  int N;
  40.  for (; cin >> N  ; ) cout << Fibonacci(N) << endl;
  41.  return 0;
  42. }


Y algunos casos de prueba.

  • Las lineas 2,4,6,8,10,12... revelan la secuencia de Fibonacci
    1,1,2,3,5,8,13,21,34
  • Las lineas 1,3,5,7,9,11... revelan el orden de los términos de aquellas
    0,1,2,3,4,5,6,7,8
Código
  1. 0
  2. 1
  3. 1
  4. 1
  5. 2
  6. 2
  7. 3
  8. 3
  9. 4
  10. 5
  11. 5
  12. 8
  13. 6
  14. 13
  15. 7
  16. 21
  17. 8
  18. 34

75  Programación / Programación C/C++ / Re: funcion en c++ que calcule valor de un numero decimal redondeado a n num decimal en: 24 Junio 2018, 11:19 am
El problema es bonito.  Sucede que no se puede plantear como tú haces, ya que la función redondeo solo te puede dar -- el redondeo a la parte entera.

Te acuerdas cuando aprendiste a dividir con papel y lápiz a mano? Pues se trata de hacer lo mismo pero más rápido por computador.

Los números racionales, desde tiempos de la Grecia clásica, se conciben como "razón" entre dos números enteros (p y q ). Como los griegos no conocían el 0, cosa que lastró el desarrollo de matemáticas en Occidente, esta definición no plantea problemas.

Pero nosotros, desde tiempos de los arabes que los trajeron de la India (la de verdad, no la que creyó encontrar Colón en Santo Domingo  :xD :xD , saludos a los hermanos de Santo Domingo) , debemos completar esta definición exigiendo "q > 0"

Atendiendo a su representación decimal, se pueden dividir en dos
  • enteros, los que no tienen parte decimal propiamente
  • decimales, los que tienen parte decimal, ya sea finita o infinita periódica

En nuestro caso, vamos a considerar los enteros como un caso especial de los decimales, con una serie infinita de decimales con el dígito 0.   3 ~ 3.00000000000000000000000000000000......
O sea que el "primer decimal" , será el orden de unidades, el segundo de las décimas, el tercero de las centésimas...

Código
  1. #include <stdio.h>
  2.  
  3.  
  4. /* Formal Spec
  5.    P : N >= 0 , p>=0 , q > 0
  6.    Q :
  7.      rat(p/q) - (p/q + \sum i : 1 <= i <= N : pow(10,-i)*((r_{i-1}*10)/q)
  8.       <= pow(10,-N)
  9.  
  10.    where r_{0} = p%q ;
  11.          r_{n+1} = r_{n}*10 % q
  12.  
  13.    Informally, any rational number can be expressed with arbitrary precission
  14.    just by operating its sucessive remainders.
  15. */
  16. void exprDecUpToN(const int p, const int q,
  17.                   int V[], const int N)
  18. {
  19.  int n,r;
  20.  for(n=1, V[0]=(p/q), r=(p%q);n<N;n++)
  21.    {
  22.      V[n] = (10*r)/q;
  23.      r = (10*r)%q;
  24.    }
  25.  return;
  26. }
  27.  
  28. #define MAX 10000
  29. int main(int argc, char **args)
  30. {
  31.  int N,p, q, V[MAX];
  32.  
  33.  for (; scanf("%d %d %d",&N,&p,&q)==3 ; )
  34.    {
  35.      exprDecUpToN(p,q,V,N+1);
  36.      int n;
  37.      printf("%d.",V[0]);
  38.      for (n=1; n<N+1; n++) printf("%d",V[n]);
  39.      printf("\n");
  40.    }
  41.  return 0;
  42. }


Y ahora unos ejemplos de ejecución. El protocolo de entrada exige primerto meter el número de decimales deseado, el primer entero y el segundo (recuerda que debe ser mayor qie 0).
Llama la atención el último que es decimal infinito periódico.
Código:

1 1 2
0.5
2 1 2
0.50
4 56 8
7.0000
18 1 3
0.333333333333333333
2 3 4
0.75
4 3 4
0.7500
40 56 8
7.0000000000000000000000000000000000000000
500 47 7
6.7142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857
76  Programación / Programación C/C++ / Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :) en: 21 Junio 2018, 12:34 pm
Hola!
Ya lo tengo de nuevo, completo, con especificación algebraica, implementación, programa principal y todo! (no se pedía todo)



Como esto es un foro de C/C++ , empezamos por el final, la implementación...  Tened en cuenta que sólo se pedía el struct y la operación equals (Mismo Ciclo). Me ha salido más fácil que ayer!! :laugh: ;-)

Código
  1. /*
  2. CYCLE: Informally, a circular permutation, ie.
  3.  
  4.   [1,4,23,7]~[4,23,7,1]~[23,7,1,4]~[7,1,4,23]
  5. */
  6. #define MAX 10000
  7. #include <cassert>
  8. #include <cstdlib>
  9. #include <cstdio>
  10.  
  11. // Implementation on static memory.
  12. typedef struct {
  13.  int V[MAX];
  14.  int N;
  15. } CycleSeq, *pCycleSeq;
  16.  
  17. CycleSeq* cycle(const int V[],const int N)
  18. {
  19.  // Pre: assumed Def(canonical(V))
  20.  CycleSeq *A;
  21.  if (!(A = (pCycleSeq)malloc(sizeof(CycleSeq))))
  22.    {
  23.      perror("malloc");
  24.      exit(1);
  25.    };
  26.  A->N = N ;
  27.  for(int n=0; n<N ; n++) A->V[n]=V[n];
  28.  return A;
  29. }
  30.  
  31. int contains(const int i,const CycleSeq *A)
  32. {
  33.  // Pre: true O(n)
  34.  int n;
  35.  for (n=0 ; n<A->N && (A->V[n]!=i) ; n++);
  36.  return (n<A->N);
  37.  
  38. }
  39.  
  40. int next(const int i,const CycleSeq *A)
  41. {
  42.  // Pre: contains(A,i) O(n)
  43.  int n ;
  44.  for ( n=0 ; A->V[n]!=i ; n++);
  45.  return (A->V[(n+1)%A->N]);
  46.  
  47. }
  48.  
  49. /* Comment: Compare cannonical forms . (Was SameCycle)*/
  50. int equals(const CycleSeq *A, const CycleSeq *B)
  51. {
  52.  
  53.  if (A->N != B->N) return 0;
  54.  
  55.  if (A->N == 0 ) return 1 ;
  56.  
  57.  // e.o.c
  58.  assert((A->N == B->N) && A->N );
  59.  
  60.  int n ;
  61.  int mA, mB;
  62.  for (mA=mB=0, n = 1 ; n < A->N ; n++)
  63.    {
  64.      if (A->V[mA]>A->V[n]) mA = n ;
  65.      if (B->V[mB]>B->V[n]) mB = n ;
  66.    };
  67.  // mA mB holds minimum positions; count matches in cannonical form.
  68.  for(n=0; (n < A->N) && (A->V[(mA+n)%A->N]==B->V[(mB+n)%A->N]); n++);
  69.  return (n == A->N);
  70. }
  71.  
  72. #include <iostream>
  73. using namespace std;
  74. #define MAX 10000
  75.  
  76. int main(int argc, char *args[])
  77. {
  78.  CycleSeq *B,*A;
  79.  int V1[MAX],V2[MAX];
  80.  int N1,N2;
  81.  for( ; cin >> N1 && cin >>N2 ; )
  82.    {
  83.      for(int n=0; n<N1; n++) cin >> V1[n];
  84.      for(int n=0; n<N2; n++) cin >> V2[n];
  85.      A= cycle(V1,N1);
  86.      B= cycle(V2,N2);
  87.      cout << equals(A,B) << endl;
  88.      free(A);
  89.      free(B);
  90.    }
  91. }


Y algunos casos de prueba emepzando por los de la foto.

 Protocolo de entrada.
  • Linea que marca la longitud de las permutaciones ciclicas
  • Componentes de la primera permucacion
  • Componentes de la segunda permucacion
  • Acaba cuando no se dan pares de longitudes

Protocolo de salida: 1 marca TRUE ( permutaciones ciclicas equivalentes) 0 marca FALSE

Código:
5 5
6 23 4 71 9
71 9 6 23 4
1
5  5
71 9 6 23 4
6 23 4 71 9
1
5  5
6 23 4 71 9
6 23 71 4  9
0

Otros casos que no tienen que ver con esos.
Código:
1 1 
3 3
1
1 1
3 4
0
2 2
1 2
2 1
1
2 3
1 2
1 2 3
0
4 4
1 4 23 7
4 23 7 1
1
4  4
4 23 7 1
23 7 1 4
1
4  4
23 7 1 4
7 1 4 23
1
4  4
7 1 4 23
1 4 23 7
1
4  4
1 4 23 7
23 7 1 4
1
4 4
23 7 1 4
23 1 7 4
0

y Ahora.... Para los que busquen algo "pure mathematical", sin C... aquí os dejo la especifiación ecuacional del tipo Ciclic... No se si tiene fallos...

Código:
 CYCLE: Informally, a circular permutation, ie.

  [1,4,23,7]~[4,23,7,1]~[23,7,1,4]~[7,1,4,23]


  Algebraic Spec:
  ---------------

  TAD CYCLE is

  uses SEQ;

  carrier Cycle;

  ops
  ---

  cycle : Seq -> Cycle   [non free cons]

  partial next : Int Cycle -> Int   [ obs ]

  aux ops
  --------

  contains : Int Cycle -> Bool  [obs]

  partial canonical  : Seq -> Seq  // extends TAD SEQ, but safe

  var
  ---
  n:Int, c:Cycle , s: Seq

  axioms
  ------

  contains(n,c) -> Def(next(n,c))

  nonRepeated(s) -> Def(canonical(s))

  Def(canonical(s)) -> Def(cycle(s))

  contains(n,cycle(s)) = contains(n,s)

  // canonical form of a a seq.
 length(s) = length(cannonical(s))

  let
    M = length(s)
  in
    (M==0 ||
           let
              ms,ms' = min(s) , min(canonical(s))
           in  
           \forall i : 0<= i < M : s.at[(ms+i)%M]=cannonical(s).at[(ms'+i)%M])

  cycle(seq) = cycle(cannonical(seq))  

Y unos breves apuntes  sobre la implementación, expresando el invariante de representación y la función de abstracción.

A lo mejor estas cosas no parecen imporantes, pero sirven para guiarme en como hago las cosas luego en C.


Código:
  Impl:
  -----

    int V[MAX];
    int N;

  INV : N<=MAX && \forall : 0 <= i < N : frec(V[i],V)=1

  ABSTRACTION : (V1,N1) ~ (V2,N2)

     N1=N2 and
     (N1 = 0 ||
     let A = min i : 0 <= i < N1 : V1[i]
         B = min i : 0 <= i < N2 : V2[i]
     in
     \forall : 0 <= i < N1 : V1[(A+i) mod N1)] = V2[(B+i) mod N1)] )
        



77  Programación / Programación C/C++ / Re: Ayuda con ejercicio en: 20 Junio 2018, 23:31 pm

...
Así conseguirás que funcione:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.    int buscarMayor(int *p, int n);
  5.  
  6.    int main()
  7.    {
  8.        int vec[5] = {1, 4, 5, 2, 2},
  9.            mayor;
  10.        mayor = buscarMayor(vec,5);
  11.        printf("El mayor es: %d", mayor);
  12.        return 0;
  13.    }
  14.  
  15.    int buscarMayor(int *p, int n)
  16.    {
  17.        int may = *p;
  18.        while(--n){
  19.            if (*p > may)
  20.                may = *p;
  21.            p++;
  22.        }
  23.        return may;
  24.    }
  25.  

Saludos.

Aún est mal. Valga el contraejemplo:

Código
  1.        int vec[5] = {1, 4, 2, 2, 5}

Devolverá 4, cuando el mayor es el 5.

Sólo hay que hacer un pequeño cambio,

Código
  1.       int may = *p++;  // mind the post-increment

O alternativamente, anticipar el incremento de p en el cuerpo
Código
  1. int buscarMayor( int *p, int n)
  2. {
  3.  int may = *p;
  4.  while(--n){
  5.    if (*++p > may) // mind the pre-increment
  6.      may = *p;
  7.  }
  8.  return may;
  9. }

78  Programación / Programación C/C++ / Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :) en: 20 Junio 2018, 20:56 pm
Hola Sonia.

No he tenido mucho tiempo, porque me voy a ver el partido del mundial de España-Irán   :xD :D.

Echa un vistazo a esto... (No he probado, mañana edito una respuesta más elaborada, e implemento el programa principal, aunque no lo pide)


Código
  1. #define MAX 10000
  2. #include <assert.h>
  3.  
  4. /* Static memory implementation */
  5.  
  6. typedef struct {
  7.  int V[MAX];
  8.  int N;
  9. } CycleSeq, *pCycleSeq;
  10.  
  11.  
  12. /* Comment: Compare cannonical forms */
  13. int SameCycle(CycleSeq *A, CycleSeq *B)
  14. {
  15.  
  16.  if (A->N != B->N) return 0;
  17.  
  18.  if (A->N == 0 ) return 1 ;
  19.  
  20.  // otherwise
  21.  assert((A->N == B->N) && A->N );
  22.  
  23.  int n ;
  24.  int mA, mB;
  25.  for (mA=mB=0, n = 1 ; n < A->N ; n++)
  26.    {
  27.      if (A->V[mA]>A->V[n]) mA = n ;
  28.      if (B->V[mB]>B->V[n]) mB = n ;
  29.    };
  30.  // mA mB holds minimum positions;
  31. // count coincidences in cannonical form.
  32.  int count;
  33.  for(count=0; (count < A->N) && (A->V[mA]==B->V[mB]); mA=(mA+1)% A->N,mB=(mB+1)%A->N  )
  34.    count++;
  35.  return count == A->N;
  36. }
79  Programación / Programación C/C++ / Re: dándole vueltas a un problemilla c++ necesito un poco de ayuda en: 20 Junio 2018, 18:52 pm
Quizás no le parezca solucionado, porque no obedece a lo que él espera, y en tal caso, lo que falla es su especificación de pareja.[...]

Según el planteamiento, exige soluciones distintas. Qué especifique con claridad la consideración de pareja... puede que así tenga solucionado su problema o aún no.

Exacto!,  ;-)  esa es la cuestión. Especificar sin ambigüedad. Por eso yo intento siempre dar una especificación formal, sin ambigüedades. Mi propuesta era:

Código:
/*
 
 
  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])
 
*/

"Ahí" dice que un caracter es adyacente (twin no es la palabra mejor, en fin...) al siguiente  V[n]==V[n+1]) si no está atado ya inmediatamente anterior V[n]!=V[n-1]. Es posible que no esté atado (aun siendo igual) si ya el anterior estaba atada al anterior del anterior...El razonamiento se aplica a cualquiera, menos al primero (n == 0)  que no tiene anterior"

Uno puede estar de acuerdo con ella o no, (las definiciones se proponen, pero no se demuestran) pero si se escoje, el programa dado en

https://foro.elhacker.net/programacion_cc/buenos_diastengo_muchas_dudas_con_un_ejercicio_de_caracteres-t480917.0.html;msg2155561#msg2155561


 cumple lo que se le pide.
80  Programación / Programación C/C++ / Re: [Función fscanf] en: 20 Junio 2018, 15:42 pm
Una solución pasa por dejar usar las rutinas "high-level IO", los streams, a las de "low-level IO", los "file descriptors".

El incoveniente es que perdemos la funcionalidad de la rutina
Código
  1. long ftell(FILE *stream)

Esto no es así necesariamente. Me corrijo a mí mismo. En high-level contamos con
Código
  1. int fgetc(FILE *stream);

que, sin buscar patrones como scanf, hace lo que queremos, conservando el ftell
El erroes es que en vez de scanf , la rutina qie había que haber utilizado era
fgetc

El nuevo programa, más sencillo queda:

Código
  1. #include <stdlib.h> // exit()...
  2. #include <assert.h> // assert
  3. #include <stdio.h> //p printf
  4. #include <ctype.h> // isprint
  5.  
  6. int main()
  7. {
  8.  char c;
  9.  int n;
  10.  FILE* fs;
  11.  const char *pattern="%d\t%c\t%d\n";
  12.  char row[80];
  13.  if (!(fs=fopen("texto.txt","r")))
  14.    {
  15.      perror("fopen");
  16.      exit(EXIT_FAILURE);
  17.    }
  18.  printf("ASCII\tPrint\tPos\n");
  19.  while((c=fgetc(fs))!=EOF)
  20.    {
  21.      assert(isascii(c));
  22.      if ((n=sprintf(row,pattern,c,isprint(c)?c:' ',ftell(fs)))<0)
  23. {
  24.  perror("sprintf");
  25.  exit(EXIT_FAILURE);
  26. }
  27.      printf(row);
  28.    }
  29.  if (c!=EOF)
  30.    {
  31.      perror("fgetc");
  32.      exit(EXIT_FAILURE);
  33.    }
  34.  fclose(fs);
  35.  exit(EXIT_SUCCESS);
  36. }
  37.  

Y la salida, como en el caso anterior, leyendo "texto.txt", queda
Código
  1.  
  2. ASCII Print Pos
  3. 115 s 1
  4. 117 u 2
  5. 112 p 3
  6. 104 h 4
  7. 111 o 5
  8. 108 l 6
  9. 97 a 7
  10. 115 s 8
  11. 97 a 9
  12. 100 d 10
  13. 107 k 11
  14. 106 j 12
  15. 104 h 13
  16. 111 o 14
  17. 108 l 15
  18. 97 a 16
  19. 115 s 17
  20. 97 a 18
  21. 100 d 19
  22. 10 20
  23. 97 a 21
  24. 100 d 22
  25. 104 h 23
  26. 111 o 24
  27. 108 l 25
  28. 97 a 26
  29. 100 d 27
  30. 115 s 28
  31. 97 a 29
  32. 10 30
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines