Hola,
Estoy tratando de hacer lo siguiente: introducir un texto, que lo convierta en minúsculas todo y que diga las veces que aparece cada letra
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>
main()
{
char cadena[255];
char aux[255];
int i,j, tamano;
int a=0;
printf ("dime una palabra:");
gets(cadena);
tamano=strlen(cadena);
for (i=0;i<tamano;i++)
{
for (j=0;j<255;j++)
{
if (cadena[i]=j)
a++;
}
printf("%d\t",aux[a]);
}
getch();
}
Si le pones etiquetas de codigo lo leo.
En el texto no te sale la dimensión de algunos arrays porque querías poner, por ejemplo:
Variable[i]
Y el código
[i]
Es para poner en cursiva un texto. Para solucionarlo, ponlo entre etiquetas GeSHi como ha dicho ya daniyo, y entonces, lo leeremos.
Saludos.
Lo siento pero no tengo ni idea de que son esas etiquetas
un saludo
Dale a editar mensaje, seleccionas el código, y arriba a la derecha (donde está para poner negrita, subrayado...),. hay un cuadro en el que pone "GeSHi", pulsas, buscas C y ya.
La etiqueta de code=c ponla al principio del código, y la de /code ponla al final
Muchisimas gracias
A mí se me ocurre lo siguiente:
Podrías crear una cadena auxiliar, en la que copiaras el contenido de la cadena de caracteres que quieres contar el número de veces que aparece cada letra.
Con un bucle for anidado, vas comprobando el primer carácter con todos los demás de la cadena, y en caso de coincidir, aumentas el el contador de dicha letra en uno. Además, si coinciden, sustituyes en la cadena auxiliar dicho carácter por un espacio, para que cuando el bucle for llegue a dicho carácter no tengas que contar letras.
Espero haberme expresado bien...
Saludos.
Para empezar no necesitas conio.h.
Despues, ¿tiene que decirte las veces que aparece cada letra del abecedario o las veces que aparece una determinada letra?
Te dejo esto:
#include <string.h>
#include <ctype.h>
#include <stdio.h>
int main(){
char cadena[256];
char letra;
printf("Introduce una cadena:\t");
gets(cadena);
int tamano=strlen(cadena);
for(int i=0; i<tamano; i++){
cadena[i]=tolower(cadena[i]);
}
printf("Las letras de su cadena son:")//aqui no se que quieres hacer
printf("¿Que letra quiere contar?");
gets(letra);
int count=0;
for(j=0; j<tamano; j++){
if(strcmp(cadena[j], letra)==0)count++;
}
printf("La letra aparece %i veces", count);
return 0;
}
Saludos, espero que te sirva.
Daniyo, unas aclaraciones. En C, cuando es sólo un carácter, no se puede pedir con gets, hay que utilizar scanf.
Además, para comparar dos caracteres, no se usa la función strcmp, sino como si compararas dos números.
También creo que se refiere el enunciado a que cuentes todos los caracteres de la cadena, no solo uno que le pida el usuario.
Te dejo el código de daniyo corregido, AlonsoQ. En caso de que sea contando todos los caracteres de la cadena, prueba a mirar lo que te dije en mi último mensaje, y si tienes alguna duda, pregunta y te intento ayudar a hacer el código.
#include <string.h>
#include <ctype.h>
#include <stdio.h>
int main(){
char cadena[256];
char letra;
int i;
printf("Introduce una cadena:\t");
gets(cadena);
int tamano=strlen(cadena);
for( i=0; i<tamano; i++){
cadena[i]=tolower(cadena[i]);
}
printf("¿Que letra quiere contar?");
scanf("%c", &letra);
int count=0;
for(j=0; j<tamano; j++){
if(cadena[j] == letra) count++;
}
printf("La letra aparece %d veces", count);
return 0;
}
Edito:
Por cierto, AlonsoQ, te recomiendo inicializar todas las variables justo después de "int main(){", y no esparcidas por todo el código. Ahora mismo no pasa nada, porque son códigos sencillos, pero mejor que te vayas acostumbrando para cuando trabajes con programas más complejos.
Gracias, DickGumshoe, es que tu sabes que soy de C++, y no sabia muy bien como iban gets y scanf. De todas formas no tenia muy claro que era lo que queria hacer, y le he dejado un pequeño codigo improvisado para que lo modifique y haga lo que quiera.
Saludos.
Gracias a los dos,
Pero el problema no es ese exactamente, pues el programa ha de contar todas y cada una de las letras. Ejemplo salida, para la palabra foro; f:1; o:2; r:1
un saludo
¿Has probado con esto que dije?
Citar
A mí se me ocurre lo siguiente:
Podrías crear una cadena auxiliar, en la que copiaras el contenido de la cadena de caracteres que quieres contar el número de veces que aparece cada letra.
Con un bucle for anidado, vas comprobando el primer carácter con todos los demás de la cadena, y en caso de coincidir, aumentas el el contador de dicha letra en uno. Además, si coinciden, sustituyes en la cadena auxiliar dicho carácter por un espacio, para que cuando el bucle for llegue a dicho carácter no tengas que contar letras.
Espero haberme expresado bien...
Saludos.
Sino, te lo intento explicar mejor.
Saludos.
Yo creo que con lo que te hemos dejado, te puedes hacer el resto del codigo.
Saludos.
Lo he modificado tratando de escribir según me indicas. Lo siento pero a pesar de que intento pasarlo al lenguaje del ordenador lo más que consigo es lo que he modificado
un saludo
conio.h sobra, ya te lo he dicho. Y podrias crear una matriz con todas las letras del abecedario y luego ir comparando, o algo asi. Yo creo que con lo que te hemos dado no es muy dificil hacer el resto.
Saludos.
Inténtalo, y te ayudamos a partir de lo que pongas :)
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
using std::cout;
using std::endl;
using std::cin;
using std::string;
using std::map;
using std::sort;
int main() { // ==============
string cadena;
map<char, size_t> contador;
register map<char, size_t>::iterator it;
cout << "ingresa el texto: ";
cin >> cadena;
cout << endl;
cout << "Longitud: " << cadena.length() << endl;
for (register size_t i = 0; i < cadena.length(); i++) {
contador[cadena[i]]++;
}
cout << "Caracter.\tRepeticiones." << endl;
for (it = contador.begin(); it != contador.end(); ++it) {
cout << (*it).first << "\t" << (*it).second << endl;
}
con.get(); // Pausamos
return 0;
}
Dulces Lunas!¡.
hola ALONSOQ tengo años que no manejo c++, yo puro vb6 y no lo tengo instalado el c++ en mi pc pero tedejo este codigo aver si tesirve me base en el codigo que pusiero los demas compañeros:
char Caracter;
char Cadena[256];
int contador=0;
printf("Introduce la cadena...")
gets(Cadena);
int Cadena_largo=strlen(cadena);
for(int x=0;x<Cadena_largo;x++)
{
Caracter=Cadena[x];
for(int y=0;y<Cadena_largo;y++)
{
if (Cadena[y]==Caracter)
{
Contador++;
}
}
printf("La Letra ",Caracter," Se Repitio ",Contador," veces...");
Contador=0;
}
return 0;
corrijanme si estoy mal llaque no esta compilado.
y si es eso lo que quieres
saludos flamer
Hay va otrp supercensillo de entender :P.Para que te hagas una idea.
#include <string.h>
#include <ctype.h>
#include <stdio.h>
int main(){
char cadena[30];
char letra[30];
int count=0;
strcpy(cadena,"hola mundo");
strcpy(letra,"hola");
for(int j=0; j<4; j++){
if(cadena[j]==letra[j])count++;
}
printf("La letra aparece %d veces", count);
scanf("%d");
return 0;
}
Cita de: BlackZeroX (Astaroth) en 2 Julio 2012, 21:17 PM
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
using std::cout;
using std::endl;
using std::cin;
using std::string;
using std::map;
using std::sort;
int main() { // ==============
string cadena;
map<char, size_t> contador;
register map<char, size_t>::iterator it;
cout << "ingresa el texto: ";
cin >> cadena;
cout << endl;
cout << "Longitud: " << cadena.length() << endl;
for (register size_t i = 0; i < cadena.length(); i++) {
contador[cadena[i]]++;
}
cout << "Caracter.\tRepeticiones." << endl;
for (it = contador.begin(); it != contador.end(); ++it) {
cout << (*it).first << "\t" << (*it).second << endl;
}
con.get(); // Pausamos
return 0;
}
Dulces Lunas!¡.
BlackceroX,
Podrías ponerlo en C; no entiendo nada. Modifico lo que he estado haciendo ( lo cambio en el primer mensaje a ver que te parece)
mil gracias
te funsiono el mio
saludos
Cita de: Flamer en 2 Julio 2012, 21:22 PM
hola ALONSOQ tengo años que no manejo c++, yo puro vb6 y no lo tengo instalado el c++ en mi pc pero tedejo este codigo aver si tesirve me base en el codigo que pusiero los demas compañeros:
char Caracter;
char Cadena[256];
int contador=0;
printf("Introduce la cadena...")
gets(Cadena);
int Cadena_largo=strlen(cadena);
for(int x=0;x<Cadena_largo;x++)
{
Caracter=Cadena[x];
for(int y=0;y<Cadena_largo;y++)
{
if (Cadena[y]==Caracter)
{
Contador++;
}
}
printf("La Letra ",Caracter," Se Repitio ",Contador," veces...");
Contador=0;
}
return 0;
corrijanme si estoy mal llaque no esta compilado.
y si es eso lo que quieres
saludos flamer
Gracias por tu aportación, esto es lo que llevo hecho, pero no funciona
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>
main()
{
char cadena[255];
char aux[255];
int i,j, tamano;
char caracter;
int a=0;
printf ("dime una palabra:");
gets(cadena);
tamano=strlen(cadena);
for (i=0;i<tamano;i++)
{
caracter=cadena[i];
for (j=0;j<255;j++)
{
if (cadena[j]=caracter)
a++;
}
printf("%d\t",a);
}
getch();
}
aaaaa lo que se me viene ala mente orita es que terrepite las letras contadas dime si estoy mal o en que te marca error para corregir si es que puedo por que como digo tengo muncho qu no programo en c++
saludos
Cita de: ALONSOQ en 2 Julio 2012, 23:22 PM
Podrías ponerlo en C; no entiendo nada.
Que lastima...
Dulces Lunas!¡.
¡Buenas!
Aqui tienes el pseudocodigo:
cadena texto;
entero repeticiones[rango: 'a'..'z'] = {0...0},i=0
leer texto
minusculas(texto)
mientas texto[i] != 0
si texto[i] es letra
repeticiones[texto[i]] = repeticiones[texto[i]] + 1
fin si
i = i + 1
fin mientras
Asi tienes las veces que se repite cada letra en el texto introducido.
Ahora solo tienes que adaptarlo a C.
¡Saludos!
Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.
#include <string.h>
#include <ctype.h>
#include <stdio.h>
int main(){
char cadena[30];
char letra[30];
int count=0;
strcpy(cadena,"hola mundo hola");
strcpy(letra,"feo");
int sizecdn=strlen(cadena);
int sizecdn2=strlen(letra);
for(int k=0;k<sizecdn2;k++){
for(int j=0; j<sizecdn; j++){
if(cadena[j]==letra[k])count++;
}
printf("La letra %c aparece %d veces\n",letra[k], count);
count=0;
}
scanf("%d");
return 0;
}
Aqui creo que lo tienes :).
perdon el codigo en C++ era asi:
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
using std::cout;
using std::endl;
using std::cin;
using std::string;
using std::map;
using std::sort;
int main() { // ==============
string cadena;
map<char, size_t> contador;
register map<char, size_t>::iterator it;
cout << "ingresa el texto: ";
getline(cin, cadena);
cout << endl;
cout << "Longitud: " << cadena.length() << endl;
for (register size_t i = 0; i < cadena.length(); i++) {
contador[cadena[i]]++;
}
cout << "Caracter.\tRepeticiones." << endl;
for (it = contador.begin(); it != contador.end(); ++it) {
cout << (*it).first << "\t" << (*it).second << endl;
}
cin.get(); // Pausamos
return 0;
}
en C
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
inline size_t readLine(FILE *file, char **line) {
size_t size = 0;
(*line) = (char*)malloc(1);
while (((*line)[size] = getchar()) != '\n')
(*line) = (char*)realloc((*line), ++size + 1);
(*line)[size] = '\0';
return size;
}
int main() { // ==============
register size_t countChars[256];
char *line;
size_t size;
memset(countChars, 0, 256 * sizeof(size_t));
size = readLine(stdin, &line);
if (!line)
{
fprintf(stderr, "No se pudo leer la linea del teclado.");
return EXIT_FAILURE;
}
// Contamos cada caracter.
for (register size_t i = 0; i < size; i++)
countChars[(int)(line[i])]++;
for (register int i = 0; i < 256; i++)
{
if (countChars[i])
{ // Mopstramos solo las letras que se tenian en la frase.
printf("%c (%d) = %d\n", (char)i, i, countChars[i]); // caracter (ascii) = repetido
}
}
free(line);
getchar();
return 0;
}
Dulces Lunas!¡.
Muchas gracias a todos,
Cita de: SXF en 3 Julio 2012, 02:09 AM
#include <string.h>
#include <ctype.h>
#include <stdio.h>
int main(){
char cadena[30];
char letra[30];
int count=0;
strcpy(cadena,"hola mundo hola");
strcpy(letra,"feo");
int sizecdn=strlen(cadena);
int sizecdn2=strlen(letra);
for(int k=0;k<sizecdn2;k++){
for(int j=0; j<sizecdn; j++){
if(cadena[j]==letra[k])count++;
}
printf("La letra %c aparece %d veces\n",letra[k], count);
count=0;
}
scanf("%d");
return 0;
}
Aqui creo que lo tienes :).
Muchas gracias SXF,
A partir de tu codigo he desarrollado lo que me piden ( para cualquier palabra) serí mucho pedirte que me volvieras a echar un cable, ya que si por ejemplo introduzco la palabra PEPE, el código me devuelve: la P aparece 2 veces, la E aparece 2 veces, la P aparece 2 veces, la E aparece 2 veces.
Me gustaría poder omitir las letras que ya han aparecido
muchas gracias por tu ayuda, me ha servido de mucho tu explicación. Te adjunto el código
#include <string.h>
#include <ctype.h>
#include <stdio.h>
int main(){
char palabra [30];
char cadena[30];
char letra[30];
int count=0;
int tamano=0;
printf("dime una palabra:");
gets(palabra);
tamano=strlen(palabra);
for (int p=0;p<tamano;p++)
{
strcpy(cadena,palabra);
}
/*strcpy(letra,"hola");*/
int sizecdn=strlen(cadena);
/* int sizecdn2=strlen(letra);*/
for(int p=0;p<tamano;p++){
for(int j=0; j<sizecdn; j++){
if(cadena[j]==palabra[p])count++;
}
printf("La letra %c aparece %d veces\n",palabra[p], count);
count=0;
}
scanf("%d");
return 0;
}
Como una de las variables "palabra" o "cadena" es auxiliar, en una de ellas, cada vez que encuentres una carácter que coincida, puedes sustituirlo por un espacio.
Saludos.
Yo lo que haría seria contar las palabras del texto "feo" en este caso
t[f]=t[f] + 1;
t[e]=t[e] + 1;
t[o]=t[o] + 1;
antes tienes que inicializar el array t a 0;
t[a] =0;
t[b] =0,
....etc
y ya tendrías la condición ;
Si (t[f] >=2 ) break; o cualquier otro tratamiento que consideres oportuno, copiar el array en otro donde no aparezcan las palabras repetida....etc
Mira acabo de ver este post y creo que te puede ayudar:
http://foro.elhacker.net/programacion_cc/ayuda_saber_si_se_repiten_caracteres_en_una_misma_cadena-t366079.0.html
¡Buenas!
A ver si esto te sirve...
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(int argc, char *argv[])
{
int repeticiones['z' - 'a' + 1],i;
char cadena[256];
fgets(cadena,256,stdin);
if(cadena[strlen(cadena) - 1] != '\n')
while(getchar() != '\n');
for(i = 0 ; i < 'z' - 'a' + 1 ; i++)
repeticiones[i] = 0;
for(i = 0 ; cadena[i] ; i++)
if((cadena[i] = tolower(cadena[i])) >= 'a' && cadena[i] <= 'z')
repeticiones[cadena[i] - 'a']++;
for(i = 0 ; i < 'z' - 'a' + 1 ; i++)
if(repeticiones[i])
printf("%c: %3d\n",'a' + i, repeticiones[i]);
printf("Pulsar intro...");
while(getchar() != '\n');
return 0;
}
¡Saludos!
Perdornar que no haya podido contestaros antes,
Muchísimas gracias a los dos por vuentro interés en ayudarme, voy a ver si descifro algo, teniendo en cuenta que soy lo anterior a novato
un saludo