Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: EmmanuelTR9 en 8 Octubre 2019, 05:28 am



Título: Orden de letras de manera alfabetica en C
Publicado por: EmmanuelTR9 en 8 Octubre 2019, 05:28 am

Hola ante todo he estado intentando lograr ordenar las letras con su orden respectivo pero no logro hacerlo, y publico aca si me podrian ayudar. Al ingresar una letra la debe de empezar a acomodar pero no se muy bien como hacer ello.

Código:
#include <stdio.h>
#include <conio.h>

int fin=27;
char Caracter;
char Abecedario[27];
main(void){
do {
printf("Solicitar Caracter: ");
scanf("%d,", &Caracter);


} while(fin != 27);
printf("\nGracias ");
getch();
}


Título: Re: Orden de letras de manera alfabetica en C
Publicado por: engel lex en 8 Octubre 2019, 05:39 am
si son char, en el scanf no capturas con %d capturas con %c

te recomiendo buscar el algoritmo de ordenamiento de burbuja, es el mas simple de los algoritmos de organizacion


Título: Re: Orden de letras de manera alfabetica en C
Publicado por: EmmanuelTR9 en 8 Octubre 2019, 06:13 am
si son char, en el scanf no capturas con %d capturas con %c

te recomiendo buscar el algoritmo de ordenamiento de burbuja, es el mas simple de los algoritmos de organizacion

Si he intentado con ese metodo pero no logro poderlo adaptar ya que tengo que usar do while


Título: Re: Orden de letras de manera alfabetica en C
Publicado por: engel lex en 8 Octubre 2019, 06:30 am
un for es un do while compacto

en resumen

Código
  1. // el for comun
  2. for(int i = 0; i < 10; i++){
  3.  
  4.  // hacer cosas
  5.  
  6. }
  7.  
  8. // un do while de funcionamiento similar
  9.  
  10. int i = 0;
  11. do{
  12.  
  13.  // hacer cosas
  14.  
  15.  i++;
  16. }while(i < 10)
  17.  
  18.  
  19.  

con este conocimiento puedes adaptar los codigos comunes, intentalo, muestra que lograste y si tines dudas, realizalas

aqui sobre el ordenamiento de burbuja en detalle
https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Algoritmos_y_Estructuras_de_Datos (https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Algoritmos_y_Estructuras_de_Datos)


Título: Re: Orden de letras de manera alfabetica en C
Publicado por: EmmanuelTR9 en 8 Octubre 2019, 16:09 pm
un for es un do while compacto

en resumen

Código
  1. // el for comun
  2. for(int i = 0; i < 10; i++){
  3.  
  4.  // hacer cosas
  5.  
  6. }
  7.  
  8. // un do while de funcionamiento similar
  9.  
  10. int i = 0;
  11. do{
  12.  
  13.  // hacer cosas
  14.  
  15.  i++;
  16. }while(i < 10)
  17.  
  18.  
  19.  

con este conocimiento puedes adaptar los codigos comunes, intentalo, muestra que lograste y si tines dudas, realizalas

aqui sobre el ordenamiento de burbuja en detalle
https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Algoritmos_y_Estructuras_de_Datos (https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Algoritmos_y_Estructuras_de_Datos)


Ya intente pero no logro ingresar de manera manual cada una de la letra

Código:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main(void)
    {
      int fin;
      char ch, entrada[27], salida[27];
      int no[26] = {0}, n, c, t, x;
     
      printf("Escribe las palabras a ordenar\n");
      scanf("%s", entrada);
     
      n = strlen(entrada);
      for (c = 0; c < n; c++)
      {
        ch = entrada[c] - 'a';
        no[ch]++;
      }
      t = 0;
      for (ch = 'a'; ch <= 'z'; ch++)
      {
        x = ch - 'a';
        for (c = 0; c < no[x]; c++)
        {
          salida[t] = ch;
          t++;
        }
      }
      salida[t] = '\0';
      printf("%s\n", salida);
      return 0;
    }


Título: Re: Orden de letras de manera alfabetica en C
Publicado por: dijsktra en 8 Octubre 2019, 18:41 pm
si son char, en el scanf no capturas con %d capturas con %c

te recomiendo buscar el algoritmo de ordenamiento de burbuja, es el mas simple de los algoritmos de organizacion

A ver, según entiendo yo, si dice "según se lee la letra se acomoda", no se trata de ordenar, sino de insertar en un vector ordenado una letra. Pero el mayor problema, veo yo, tiene que ver con el hecho de capturar caracteres de la entrada estandard. Eso es otro problema, porque la entrada buferada exige que le des al intro, y a la vez el intro es un caracter (que a t'i no te vale para tu proposito).


Propuesta:

Código
  1. /*
  2.  P : N>0 and sorted(A,0,N-1) and V=A
  3.  Q : perm(V,A) and sorted(V,0,N)
  4.  
  5.  
  6.  I : perm(V,A) and sorted(V,0,n) and sorted(V,n, N)
  7. and (0<n<N-1 - > V[n-1]<V[n+1]) and 0 <= n <= N-1
  8.  
  9.  !B : n==0 || V[n]>=V[n-1]
  10.  
  11.   B : n > 0 && V[n]<V[n-1]
  12.  
  13. |- I and !B -> Q
  14.  
  15. Quote:
  16.  
  17.   C(n) = n >= 0
  18.  
  19. |- I -> C(n) >= 0
  20.  
  21. Invariant snapshot:
  22. -------------------
  23.  
  24. 0                 n           N
  25. +-----+-----+-----+-----+-----+
  26. |  0  |  1  |  3  |  2  |  4  |
  27. +-----+-----+-----+-----+-----+
  28.  
  29. Init:
  30. -----
  31.  n = N- 1
  32.  
  33. |- P -> I[n/N-1]
  34.  
  35. Step:
  36. ----
  37.   n= n- 1
  38.  
  39. |- I and B and n=T -> (n<T)[n/n-1]
  40.  
  41. Restore:
  42. --------
  43.  
  44.   V[n],V[n-1]=V[n-1],V[n]
  45.  
  46. Pseudocode:
  47. -----------
  48.  
  49.    n=N-1
  50.    while n>0 and V[n]<V[n-1] do
  51.      V[n],V[n-1]=V[n-1],V[n]
  52.      n=n-1
  53.    done
  54.  
  55. */
  56.  
  57. void *insertChar(char V[], int N)
  58. {
  59.  for(int n=N-1 ; (n && V[n]<V[n-1]);n--)
  60.    {
  61.      const int An=V[n];  /* To do swapping */
  62.      V[n]=V[n-1];
  63.      V[n-1]=An;
  64.    }
  65.  return V;
  66. }
  67.  
  68.  
  69.  
  70. #include <stdio.h>
  71. #include <string.h>
  72.  
  73.  
  74. #define MAX 100000
  75. int main(int argc, char* args[])
  76. {
  77.  int N;
  78.  char V[MAX];
  79.  memset(V,0, MAX);
  80.  
  81.  for(N=0 ; (scanf("%c",&c)==1) && c!='\n' ; )
  82.    {
  83.      V[N++]=c;
  84.      printf("%d %c %s\n",strlen(V),c,insertChar(V,N));
  85.    }
  86.  return 0;
  87. }

Ejemplp:

Código:
 gcc char.cc -o char && ./char
enunlugardelamancha
1 e e
2 n en
3 u enu
4 n ennu
5 l elnnu
6 u elnnuu
7 g eglnnuu
8 a aeglnnuu
9 r aeglnnruu
10 d adeglnnruu
11 e adeeglnnruu
12 l adeegllnnruu
13 a aadeegllnnruu
14 m aadeegllmnnruu
15 a aaadeegllmnnruu
16 n aaadeegllmnnnruu
17 c aaacdeegllmnnnruu
18 h aaacdeeghllmnnnruu
19 a aaaacdeeghllmnnnruu


Título: Re: Orden de letras de manera alfabetica en C
Publicado por: EmmanuelTR9 en 9 Octubre 2019, 04:00 am
A ver, según entiendo yo, si dice "según se lee la letra se acomoda", no se trata de ordenar, sino de insertar en un vector ordenado una letra. Pero el mayor problema, veo yo, tiene que ver con el hecho de capturar caracteres de la entrada estandard. Eso es otro problema, porque la entrada buferada exige que le des al intro, y a la vez el intro es un caracter (que a t'i no te vale para tu proposito).


Propuesta:

Código
  1. /*
  2.  P : N>0 and sorted(A,0,N-1) and V=A
  3.  Q : perm(V,A) and sorted(V,0,N)
  4.  
  5.  
  6.  I : perm(V,A) and sorted(V,0,n) and sorted(V,n, N)
  7. and (0<n<N-1 - > V[n-1]<V[n+1]) and 0 <= n <= N-1
  8.  
  9.  !B : n==0 || V[n]>=V[n-1]
  10.  
  11.   B : n > 0 && V[n]<V[n-1]
  12.  
  13. |- I and !B -> Q
  14.  
  15. Quote:
  16.  
  17.   C(n) = n >= 0
  18.  
  19. |- I -> C(n) >= 0
  20.  
  21. Invariant snapshot:
  22. -------------------
  23.  
  24. 0                 n           N
  25. +-----+-----+-----+-----+-----+
  26. |  0  |  1  |  3  |  2  |  4  |
  27. +-----+-----+-----+-----+-----+
  28.  
  29. Init:
  30. -----
  31.  n = N- 1
  32.  
  33. |- P -> I[n/N-1]
  34.  
  35. Step:
  36. ----
  37.   n= n- 1
  38.  
  39. |- I and B and n=T -> (n<T)[n/n-1]
  40.  
  41. Restore:
  42. --------
  43.  
  44.   V[n],V[n-1]=V[n-1],V[n]
  45.  
  46. Pseudocode:
  47. -----------
  48.  
  49.    n=N-1
  50.    while n>0 and V[n]<V[n-1] do
  51.      V[n],V[n-1]=V[n-1],V[n]
  52.      n=n-1
  53.    done
  54.  
  55. */
  56.  
  57. void *insertChar(char V[], int N)
  58. {
  59.  for(int n=N-1 ; (n && V[n]<V[n-1]);n--)
  60.    {
  61.      const int An=V[n];  /* To do swapping */
  62.      V[n]=V[n-1];
  63.      V[n-1]=An;
  64.    }
  65.  return V;
  66. }
  67.  
  68.  
  69.  
  70. #include <stdio.h>
  71. #include <string.h>
  72.  
  73.  
  74. #define MAX 100000
  75. int main(int argc, char* args[])
  76. {
  77.  int N;
  78.  char V[MAX];
  79.  memset(V,0, MAX);
  80.  for(N=0 ; (scanf("%c",&V[N++])==1) ; )
  81.    {
  82.      if (V[N-1]=='\n') break; // Hack. I don't know how to
  83.       // avoid '\n'  as character.
  84.      const char c=V[N-1];
  85.      insertChar(V,N);
  86.      printf("%d %c %s\n",strlen(V),c,V);
  87.    }
  88.  return 0;
  89. }

Ejemplp:

Código:
 gcc char.cc -o char && ./char
asdfdgfhj1234
1 a a
2 s as
3 d ads
4 f adfs
5 d addfs
6 g addfgs
7 f addffgs
8 h addffghs
9 j addffghjs
10 1 1addffghjs
11 2 12addffghjs
12 3 123addffghjs
13 4 1234addffghjs

Intente realizar como el mencionado pero no pude me puedes orientar un poco mas porfavor


Título: Re: Orden de letras de manera alfabetica en C
Publicado por: dijsktra en 9 Octubre 2019, 11:20 am
Intente realizar como el mencionado pero no pude me puedes orientar un poco mas porfavor
Copia el programa, estúdialo y dale curso en tu computador...
Te sale ? Que parte te confunde?
Sobre todo, distingue lo esencial (el algoritmo) de lo accesorio (la entrada/salida de datos).


Título: Re: Orden de letras de manera alfabetica en C
Publicado por: @XSStringManolo en 9 Octubre 2019, 13:20 pm
Los char no dejan de ser números internamente. La letra A es el número 65, la B el 66...


Para ordenar yo buscaría si coincide el resultado con el esperado:

  
Código
  1. int diccionario[100];
  2.   for(int i = 65 ; i <= 90; ++i)
  3.   {
  4.   diccionario[i-65] = i;
  5.   }/* El resultado sería algo como:
  6. diccionario[0] = 65;
  7. diccionario[1] = 66;
  8. ...
  9. diccionario[25] = 90;
  10. */
  11.  
  12.   for(int i = 97 ; i <= 122; ++i)
  13.   {
  14.   diccionario[i-71] = i;
  15.   }/* El resultado sería algo como:
  16. diccionario[0] = 65; Equivale a 'A'
  17. diccionario[1] = 66; Equivale a 'B'
  18. diccionario[25] = 90; Equivale a 'Z'
  19. diccionario[26] = 97; Equivale a 'a'
  20. diccionario[27] = 98;
  21. ...
  22. diccionario[50]= 122; equivale a 'z'
  23.  
  24. Imprime los contenidos del array y los ajustas.*/
  25.  
  26.  
  27.   if (caracter1 == diccionario[i])
  28.   {
  29.   resultado[x] = caracter1;
  30.   }
  31.  
Por si no queda claro, esto es lo mismo ue hacer:
HOLA

Código
  1. Está la A (int 65) en [0]? No.
  2. {
  3. No hacer nada.
  4. }
  5.  
  6. Está la A (int 65) en [1]? No.
  7. {
  8. No hacer nada.
  9. }
  10.  
  11. Está la A (int 65) en [2]? No.
  12. {
  13. No hacer nada.
  14. }
  15.  
  16. Está la A (int 65) en [3]? Si.
  17. {
  18. ArrayResultado[0] = palabra[3];
  19. }
  20.  
  21. Está la a (int 92) en [0]? No.
  22. {
  23. No hacer nada.
  24. }
  25.  
  26. Está la a (int 92) en [1]? No.
  27. {
  28. No hacer nada.
  29. }
  30.  
  31. Está la a (int 92) en [2]? No.
  32. {
  33. No hacer nada.
  34. }
  35.  
  36. Está la a (int 92) en [3]? No
  37. {
  38. No hacer nada.
  39. }
  40.  
  41. ...
  42.  

Básicamente vas mirando por orden alfabético cada letra del diccionario si está o no en todas las letras de la palabra.
Si encuentras la letra, esta se añade a un array resultado, que será el que contenga las letras ordenadas.

Tanto la lógica como la implementación es sencilla.


https://elcodigoascii.com.ar/
https://www.tutorialspoint.com/cprogramming/c_type_casting.htm


Título: Re: Orden de letras de manera alfabetica en C
Publicado por: CalgaryCorpus en 9 Octubre 2019, 15:47 pm
Es innecesario poner los codigos ASCII, o saberselos o tener una tabla.
Siempre que se quiere tener el codigo de la letra 'a' se puede usar 'a'

Código
  1. for( int i = 65; i <= 90; i++ )
puede reemplazarse por
Código
  1. for( int i = 'a'; i <= 'z'; i++ )

los caracteres literales son SIEMPRE vistos como la representacion numerica de ellos, asi que tambien seria posible expresiones como  'z'-'a' si es que se necesita saber la distancia entre el ultimo caracter a utilizar y el primero (eventualmente hay que sumarle 1 a esto, si se hace necesario).

Lo mismo con las mayusculas.


Título: Re: Orden de letras de manera alfabetica en C
Publicado por: Serapis en 9 Octubre 2019, 23:44 pm
Más sencillo aún:

Código:
int k, num
buleano escape
array de chars arrayChar(0 a 25)  // consideramos solo 26 letras o también la 'ñ'?

Bucle
 num = ((pedir caracter al usuario) - 65).ToInt  // ó 97 si partes desde 'a' hasta 'z', etc... debes adaptarlo a lo que te pidan.
 
 si ((num => 0)  y (num <=25)) 
    Si arrayChar(num) = ""
        arrayChar(num) = (num + 65).ToChar
        k +=1
        si k=26
            escape = TRUE
        fin si
    //Osi num = ???   //cierto carácter podría actuar como escape...(recuerda que restamos 65 al valor, para posicionarlo en su lugar en el array)
    //    escape = true   
    fin si
 fin si
Repetir Mientras (escape = FALSE)  // una condición de salida basado en???

// volcar la salida:
bucle para k desde 0 hasta 25
    Si arrayChar(k) <> ""
       imprimir arrayChar(k)
    fin si
siguiente

 


Título: Re: Orden de letras de manera alfabetica en C
Publicado por: @XSStringManolo en 10 Octubre 2019, 07:31 am
Más sencillo aún:

Código:
int k, num
buleano escape
array de chars arrayChar(0 a 25)  // consideramos solo 26 letras o también la 'ñ'?

Bucle
 num = ((pedir caracter al usuario) - 65).ToInt  // ó 97 si partes desde 'a' hasta 'z', etc... debes adaptarlo a lo que te pidan.
 
 si ((num => 0)  y (num <=25)) 
    Si arrayChar(num) = ""
        arrayChar(num) = (num + 65).ToChar
        k +=1
        si k=26
            escape = TRUE
        fin si
    //Osi num = ???   //cierto carácter podría actuar como escape...(recuerda que restamos 65 al valor, para posicionarlo en su lugar en el array)
    //    escape = true   
    fin si
 fin si
Repetir Mientras (escape = FALSE)  // una condición de salida basado en???

// volcar la salida:
bucle para k desde 0 hasta 25
    Si arrayChar(k) <> ""
       imprimir arrayChar(k)
    fin si
siguiente

 
Si pones "ana" te guarda "an" en vez de "aan" no?




Título: Re: Orden de letras de manera alfabetica en C
Publicado por: dijsktra en 10 Octubre 2019, 08:44 am
Más sencillo aún:


Pero qué.... :-X :-X :-X

  • CalgaryCorpus ya ha comentado que no es necesario operar con enteros.
  • El programa solo acaba si la palabra tiene las 25 letras al menos una vez cada una! (Asumiendo que k=1 al principio, cosa que no se expresa)
  • Si acaba, el programa da siempre la misma solución ABCDEFG..Z



Título: Re: Orden de letras de manera alfabetica en C
Publicado por: Serapis en 10 Octubre 2019, 15:29 pm
Si pones "ana" te guarda "an" en vez de "aan" no?

En efecto... entiendo que quiere guardar las letras sin repetición.
El interesado, no explicita el caso concreto, tampoco creo haber leído en otros mensajes (suyos) que exponga más claramente la cuestión o donde amplíe detalles.

Cita de: dijsktra
     CalgaryCorpus ya ha comentado que no es necesario operar con enteros.
En efecto, no son necesarios... pero cuando explicas a un principiante, la solución más óptima rara vez resulta ser la más útil para él, un pequeño rodeo que pueda seguir, suele serle más útil para entender.

En el mismo sentido, por ejemplo engel-lex le sugiere Bubblesort, a todas luces ineficiente, pero que puede entender perfectamente, por el mismo motivo, no procede indicarle Quicksort (por ejemplo).


Cita de: dijsktra
    El programa solo acaba si la palabra tiene las 25 letras al menos una vez cada una! (Asumiendo que k=1 al principio, cosa que no se expresa)
    Si acaba, el programa da siempre la misma solución ABCDEFG..Z
El interesado no especifica en parte alguna cual es la condición de escape, luego no hay certeza ninguna al respecto... cada cual ha asumido, lo que le ha parecido más razonable.

Yo por ejemplo, asumí en una primera impresión (como lo más razonable) que el usuario introduce una palabra (o frase), y el bucle debiera tomar las letras únicas que contiene dicha introducción y mostrarlas alfabéticamente ordenadas ...
...pero luego viendo que en el código que expone en el bucle introduce la petición con cada ciclo, entonces cambio para asumir que la entrada es carácter a carácter (aunque sea principiante, sería de esperar que como mínimo sepa discernir que si se piden caracteres, solicitar uno en cada ciclo, o si se pide operar con una palabra, solicitarla una sola vez)....
Luego, entiendo ahí que el bucle acaba o bien cuando se completa (cuando se introducen todas las letras y el array queda lleno (de ahí: si k=26;  escape = TRUE), cosa bastante rara, porque uno puede ponerse tonto pulsando letras y no recordar cual queda por introducir y tirarse media hora introduciendo caracteres salvo que al final decida ser exhaustivo e introducirlas todas ordenadas, pero posibilidad que hay que cubrir), o bien que el bucle acaba con alguna indicación especial (por ejemplo al pulsar determinada tecla, o incluso terminar tras la introducción de solo 26-27 caracteres, sean cuales sean).... 
       
Pero vamos, me parece válido cualquier solución que dé salida al bucle bajo otras condiciones. Toda vez que el interesado, no lo especifica, que cada cual resuelva dicha ambigüedad de alguna manera, resulta razonable.