C/Visual C - frecuencia de la letra e dentro de la cadena(string)

 
Vista:
sin imagen de perfil

frecuencia de la letra e dentro de la cadena(string)

Publicado por pegaso2013 (10 intervenciones) el 18/09/2016 17:14:06
saludos buenas tardes

tengo inconvvenintes e crear un programa que cuando el usuario escriba varias sentencias
el output sea la frecuencia de estas pero en porcentage

este es mi codigopor ahora


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
 
int main()
 
{
    char c[1000],ch;
    int i,count =0,eCounter,stringLength;
    printf("Enter your string: ");
    gets(c);
    double frecuency = 0;
 
    while (c[i] != '\0')
    {
        if (c[i] >= 'a' && c[i] <= 'z')
        {
            c[i] -= 32;
        }
        if (c[i] == '\n')
        {
            c[i] = '\0';
        }
 
        i++;
 
 
    }
 
 
    frecuency = ch/i *100;
 
    printf("frecuency of %ch \n", frecuency);
    system ("pause");
}


se que me falta algo para que el out put sea

frecuencia del caracter ## : es 21.00%



gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Aarón Castillo
Val: 75
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

frecuencia de la letra e dentro de la cadena(string)

Publicado por Aarón Castillo (20 intervenciones) el 18/09/2016 20:58:59
Lo primero que noto es que existe un conflicto con una variable que declaras, la cual es "ch".

En esta línea de código:

frecuency = ch/i *100;

Si frecuency es un valor numérico, entonces no debes declarar ch como char, más aún, no hay parte del código en donde actualices a ch, por ello es que te dará un número que no corresponde con la frecuencia que esperas.

Con respecto de la línea para imprimir el resultado:

printf("frecuency of %ch \n", frecuency)

En C, los formatos de impresión se usan con % para imprimir algún valor ya sea *char (string), char, numérico, etc; pero %ch no existe en C, aunque entiendo lo que querías hacer, algo como "Frecuency of character X : ###"; por ello es que la línea anterior debe modificarse a:

printf("frecuency of %c = %f \n",current_char,frecuency)

Cuando imprimes bajo un formato en este caso el primer elemento con % será de tipo char mientras que el segundo será de tipo "float" y cuando colocas las variables asociadas, deben corresponder secuencialmente con los tipos de formatos que especificaste.

Por cierto, sería interesante conocer tu idea para contabilizar las letras, entiendo parcialmente tu lógica pero con un poco más de profundidad seguro se podrán llegar a resultados interesantes.

Cualquier cosa estoy a tus órdenes.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

frecuencia de la letra e dentro de la cadena(string)

Publicado por mike (10 intervenciones) el 18/09/2016 22:48:46
gran saludo
muchas gracias por responder

mi idea sobre este programa es muy parecida a este

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main(){
    char c[1000],ch;
    int i,count=0;
    printf("Enter a string: ");
    gets(c);
    printf("Enter a character to find frequency: ");
    scanf("%c",&ch);
    for(i=0;c[i]!='\0';++i)
    {
        if(ch==c[i])
            ++count;
    }
    printf("Frequency of %c = \%d", ch, count);
    return 0;
}

en esta, el usuario escribe palabras
luego pregunta cual es el caracter con frecuencia que se repite
y luego el print muestra las veces que se repitio esa palabra

lo que estoy tratando es de reproducir este output que las pa
si puedes chekear el archivo adjunto


muchas gracias por su colaboracion
de antemano
me gustaria que si me recomiendas algun buen tutorial de programacion en C :)
gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Aarón Martín
Val: 75
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

frecuencia de la letra e dentro de la cadena(string)

Publicado por Aarón Martín (20 intervenciones) el 19/09/2016 00:07:13
Hola, hay algo que no comprendo, ¿cuál es la diferencia entre el programa que quieres reproducir y el que tú quieres hacer?, porque, en caso de ser lo mismo puedes apoyarte en el original sin ningún problema.

Con respecto de alguna guía de C, yo recomiendo el libro escrito por Dennis Ritchie "The C Programming Language", hay versiones gratuitas en español.

Ahora que si eres del tipo más pragmático, hay tutoriales didácticos como The Coding Game, en los cuales el objetivo es resolver acertijos usando diversos lenguajes de programación, C incluído.

Si necesitas algo más, estoy para ayudarte.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

frecuencia de la letra e dentro de la cadena(string)

Publicado por mike (10 intervenciones) el 19/09/2016 00:48:26
saludos buenas tardes

muchas gracias por responder :)

el programa que desep reproducir contiene las siguinetes caracteristicas:

programa que pone a prueba esta en una cuerda.
Crea una cadena (conjunto de caracteres) que puede contener 1000 caracteres.
Pide al usuario que introduzca una cadena.
Calcular la frecuencia de la letra e dentro de la cadena.

CONSEJOS que me dieron

Mirar hacia atrás en el ejemplo de cadena.
caminar a través de la cadena mediante la repetición (probablemente un bucle while).
Vaya desde el principio hasta cuando se ve el '\ 0'.
tendrá dos variables de control.
El primero será mantener su posición en la cadena, de 0 a cada vez que se ve el '\ 0'.
La segunda contará cada vez que se ve un carácter electrónico.
TIPs: No se olvide de contar si el personaje es 'e' o 'E'.
Calcule la frecuencia:
Frecuencia= (eCounter / StringLength) * 100
T posible que tenga que introducir elenco!
TIPs: longitud de la cadena es de hasta hasta que se vea '\ 0', NO 1000!
Si conoces cómo utilizar la función strlen (), puede hacerlo.



si no estoy mal mi programa original casi que contiene todo
solo falta organizarlo un poco mas
de verda te agradeceria tu colaboracion

gracias por la recomendaciones
las estoy revisando :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Aarón Castillo
Val: 75
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

frecuencia de la letra e dentro de la cadena(string)

Publicado por Aarón Castillo (20 intervenciones) el 19/09/2016 01:05:36
Hola,

Para empezar a ayudarte sólo dime cuál fue tu lógica en este apartado de código:

1
2
3
4
5
6
7
8
if (c[i] >= 'a' && c[i] <= 'z')
{
c[i] -= 32;
}
if (c[i] == '\n')
{
c[i] = '\0';
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

frecuencia de la letra e dentro de la cadena(string)

Publicado por mike (10 intervenciones) el 19/09/2016 01:31:19
mi logica estaba incorrecta
no habia entendido el problema

entiedo que en este caso es el carather "e" que vamos a evaluar cuando el usuario
escriba los strings

yo trataba de hacer un while loop , en el cual cuando usurario escrbiera una seria de palabras, este detecte solo la letra "e"


habia una parte que solo estaba tratando de recrear basado en otro problema anterior
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Aarón Castillo
Val: 75
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

frecuencia de la letra e dentro de la cadena(string)

Publicado por Aarón Castillo (20 intervenciones) el 19/09/2016 02:30:27
Hola,

En ese caso desde mi perspectiva creo que ya no necesitas más correcciones, si tienes la lógica bien definida y te diste cuenta en dónde te equivocaste creo que puedes seguir sólo sin dificultad alguna.

Solamente recuerda que en el código que tomas como referencia se encuentra esta instrucción.

printf("Frequency of %c = \%d", ch, count);

Si tú quieres imprimir porcentajes con expansión decimal debes cambiar a esto:

printf("Frequency of %c = \%f", ch, count);

Porque de dejarlo como en el primer ejemplo te imprimirá sólo la parte entera.

Cualquier otra cosa estoy a tus órdenes.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

frecuencia de la letra e dentro de la cadena(string)

Publicado por mike (10 intervenciones) el 19/09/2016 19:14:03
Muy buenos diias Aron saludos
coordial

he podido completar el codigo
y me gustarua mucho tu opinion

deseo saber como se pudiese ser mejor este codigo y claro si hay una manera mas facil
talves usando un while

1
2
3
while(string[1] ! = '\0')
 
if the (string[1] = 'e" && string [i] <='E')

soy muy novato disculpa que haga muchas preguntas
gracias de nuevo
ha otra cosa , utilizo codeblocks y xcode
con el xcode creo que no le gusta mucho usar "gets"
con el codeblock no hya problema
habria alguna forma de remover ese warning
warning: this program uses gets(), which is unsafe.

cual seria tu me jor recomendacion cual copiler usar :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<stdio.h>
#include<string.h>
#include<math.h>
 
int main(void)
{
 
    int i;
    double eCount=0;
    double total;
    char str[1000], ch, cp;
    ch = 'e';
    cp = 'E';
    printf("Enter the String : ");
    gets(str);
 
 
    for(i=0; str[i]!='\0'; i++)
    {
        if(ch==str[i] || cp==str[i])
        {
            eCount++;
        }
    }
 
    total =  (eCount/i)*100;
 
    printf("Frequency of the character %c and %c = %.0f",ch, cp, eCount);
    printf("\nNumber of letters = %d", i);
    printf("\ne and E to total letters ratio = %.2f%% \n", total);
    printf("\n");
 
    return (0);
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Aarón Castillo
Val: 75
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

frecuencia de la letra e dentro de la cadena(string)

Publicado por Aarón Castillo (20 intervenciones) el 20/09/2016 04:33:49
Hola qué tal,

He revisado tu código y para serte honesto ya no puede ser optimizado más, si has estudiado algo de complejidad algorítmica tendrás una idea del porqué, sino te lo menciono rápido, un loop es necesario y suficiente para poder recorrer las palabras y contar las letras.

Para estos fines, el ciclo while y el for son equivalentes por lo que da igual cuál colocas.

Sólo tengo una duda y no sé qué quieras hacer en este caso:

if the (string[1] = 'e" && string [i] <='E')

¿Por qué el <= E?.

Con respecto de lo segundo, no he usado xcode porque no tengo una Mac :(, pero de acuerdo a una liga que encontré, el uso de gets en xcode está obsoleto:

http://forums.macrumors.com/threads/warning-this-program-uses-gets-which-is-unsafe.1411406/

Yo siempre uso gcc porque es el compilador por defecto en sistemas Unix, pero no sé si se encuentre sistemas Mac.

Cualquier otra cosa estoy a tus órdenes.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

frecuencia de la letra e dentro de la cadena(string)

Publicado por mike (10 intervenciones) el 20/09/2016 04:53:24
saludos muchas gracias por tu repuesta
no sabia mucho
if the (string[1] = 'e" && string [i] <='E') este creo que esta mal
con respecto a esta parte del codigo creo que mejo asi =="E"

mi idea es que el string capture solo las letras "e" y la "E"
cuando el usuario escriba las palabras


creo que el primero para ser sincero lo vi en alguna web
claro y en ese utilizanba de la letra "a" a la letra "z"
asi que solo lo copie

soy honesto, la ultima clase de porgramacion fue hace dos allos y ya se me estaba olviando
por eso las preguntas

La verda no tengo una mac., tengo una hackintosh jjejejejej
viendo video en you tube pude instalar el osx capitan
y hice otras particiones para guardar datos y pensaba instalar Ubuntu, que me lo han recomendado para
poder hacer los codigos
la verda corre muy bien y es muy estable
:)




IMG_4072
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Aarón Castillo
Val: 75
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

frecuencia de la letra e dentro de la cadena(string)

Publicado por Aarón Castillo (20 intervenciones) el 20/09/2016 04:56:47
Hola,

Ya veo, en ese caso si vas a instalar Ubuntu la recomendación es usar gcc, es lo más estable que existe, seguramente usando gcc no tendrás problemas con el gets().

Y no hay problema con lo de la programación, mientras tengas la idea la implementación se vuelve trivial.

Sigo a tus órdenes.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

frecuencia de la letra e dentro de la cadena(string)

Publicado por mike (10 intervenciones) el 20/09/2016 06:34:50
muchisimasss graciassss

de antemano :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

frecuencia de la letra e dentro de la cadena(string)

Publicado por mike (10 intervenciones) el 21/09/2016 22:59:47
buenas tardes saludos

aaron cuando tengas tiempo podrias chekiar este codigo
es una derivacion del anterior


pero en este no estoy especifianco una solo palabara como en el anterio que que era 'e'
en este se hace que busque la frecuencia de cual quier letra

y lo que deseo hacer es que tambien incluya las letras Mayusculas gracias

pero cuando lo testeo con letras mayusculas no sale
si solo le pongo dddddddd
y le digo que busque la d
okey
pro si le doy que DDDDddd
solo lee las minusculas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<stdio.h>
 
#include<string.h>
 
 
 
int main(void)
 
{
 
 
 
    int i;
 
    double count=0;
    double length=0;
 
    char str[1000], ch = 0;
 
    printf("Enter the String : ");
 
    gets(str);
 
    printf("Enter a character to find frequency : ");
 
    scanf("%c",&ch);
 
    for(i=0; str[i]!='\0'; i++)
 
    {
 
        if(ch==str[i])
 
        {
 
            count++;
 
        }
 
    }
 
 
    length = (double)i + 1;
 
    printf("# of time  the character %c = %2.lf \n", ch,count);
 
    printf("letters ratio show is = %.2f%% \n", length);
 
 
    return (0);
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Aarón Castillo
Val: 75
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

frecuencia de la letra e dentro de la cadena(string)

Publicado por Aarón Castillo (20 intervenciones) el 22/09/2016 00:27:54
Hola qué tal Mike,

El problema que tienes se debe a que en tu programa no estás pidiendo que se revisen las letras en mayúsculas, sea cual sea la letra.
Dicho de otra forma, sólo estás pidiendo que se revise la letra que introduce el usuario y nada más, sin mayúsculas; o si lo introdujeras al revés, en minúsculas (intenta solicitar la letra D en tu última cadena DDDDDDdddd y verás).

El problema radica en la línea:

if(ch==str[i])

Suponiendo que no quieres mantener diferencia entre el número de mayúsculas y minúsculas de la letra ingresada por el usuario y sólo quieres la letra en sí, entonces puedes hacer esto:

if (ch == tolower(str[i]))

Con esto, al ir leyendo letra por letra de la palabra entonces se va a convertir en minúsculas y así se adapta a lo que propusiste al inicio.

La función tolower convierte a letra minúscula cualquier letra, si ya estaba en minúscula no hace nada; para hacer uso de esta función tienes que importar #include<ctype.h>

Algo muy importante es considerar el caso en el que la letra ingresada sea una 'D' y no una 'd', porque entonces el if anterior va a fallar.
En ese caso tienes dos opciones, o le pides al usuario forzosamente letras minúsculas o consideras el caso en que la letra ingresada es mayúscula.

if (letra_ingresada_es_minúscula){
haz_algo();
} else {
haz_otra_cosa();
}

Espero esta guía te sirva de algo.

Cualquier cosa sigo a tus órdenes.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

frecuencia de la letra e dentro de la cadena(string)

Publicado por mike (10 intervenciones) el 22/09/2016 03:13:31
AAroon ere todo un Crack :)

en funciones son muy nuevo creo apenas
nos van a dictar esas clases

me ha ayudo mucho tu explicacion

muchas gracias

cual quier cosa en que te pueda colaborar dejame saber
yo vivo en Usa mas exacto en Orlando florida :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Aarón Martín
Val: 75
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

frecuencia de la letra e dentro de la cadena(string)

Publicado por Aarón Martín (20 intervenciones) el 22/09/2016 18:44:00
¡Muchas gracias por tu cumplido :)!

No estoy seguro si en este foro se puedan añadir contactos, de no ser así, ¿tendrás alguna cuenta de Twitter, Linkedin o lo que se le parezca?.

No sé si seas hispano pero tu español es muy bueno. Aunque supongo que estando en Orlando, hablar español es algo muy cotidiano.

Quedo a tu disposición.


Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

frecuencia de la letra e dentro de la cadena(string)

Publicado por mike (10 intervenciones) el 23/09/2016 01:15:16
Saludos Aaron

Tengo nombre americano jejejej pero
Soy hispano primera generation en usa se pudiera decir

Mi ortografia en espaniol soy honesto , no es la mejor pero ayi vamos

Tengo google
Me puedes ayadir
[email protected]

Un saludo
Mike
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar