Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[C++] ¿como lo soluciono?

Estas en el tema de [C++] ¿como lo soluciono? en el foro de C/C++ en Foros del Web. Buenas. Tengo un ejercicio en C y pongo una palabra y me cuenta sus digitos... #include <conio.h> #include <stdio.h> #include <string.h> void main() { char ...
  #1 (permalink)  
Antiguo 14/01/2013, 04:35
 
Fecha de Ingreso: enero-2013
Mensajes: 11
Antigüedad: 11 años, 3 meses
Puntos: 0
[C++] ¿como lo soluciono?

Buenas.
Tengo un ejercicio en C y pongo una palabra y me cuenta sus digitos...


#include <conio.h>
#include <stdio.h>
#include <string.h>

void main()
{
char var[] = "supermercado";
int longitud = strlen(var);
printf("La logitud de la cadena es %d",longitud);
getch();
}


funciona perfectamente... lo pase a c++ y funciona perfectamente.

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <string.h>
using namespace std;

int main()
{
char var[] = "supermercado";

int longitud = strlen(var);
cout << "La logitud de la cadena es " << longitud;
getch();
}


Y lo que quiero es añadir la palabra que yo quiera y no me funciona.

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <string.h>
using namespace std;

int main()
{

char var[] = palab;
cout << "Palabra: "; cin >> palab;

int longitud = strlen(var);
cout << "La logitud de la cadena es " << longitud;
getch();
}


Gracias un saludo!
  #2 (permalink)  
Antiguo 14/01/2013, 05:12
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: [C++] ¿como lo soluciono?

No entiendo muy bien lo que quieres hacer en esta linia:

Código C++:
Ver original
  1. char var[] = palab;
Que es "palab"? Porque no está declarado en ningun sitio.

Entiendo que tu intención es obtener la palabra por teclaro y guardarla en la variable "var". El problema es que no indicas el tamaño del array. En el primer ejemplo te funciona porque, aunque no lo indicas, al poner el valor en la declaración, el compilador le asigna automáticamente el valor adecuado.
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 14/01/2013, 05:21
 
Fecha de Ingreso: enero-2013
Mensajes: 11
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: [C++] ¿como lo soluciono?

Cita:
Iniciado por Malenko Ver Mensaje
No entiendo muy bien lo que quieres hacer en esta linia:

Código C++:
Ver original
  1. char var[] = palab;
Que es "palab"? Porque no está declarado en ningun sitio.

Entiendo que tu intención es obtener la palabra por teclaro y guardarla en la variable "var". El problema es que no indicas el tamaño del array. En el primer ejemplo te funciona porque, aunque no lo indicas, al poner el valor en la declaración, el compilador le asigna automáticamente el valor adecuado.
es decir, que añada...

const unsigned longitud=20;
typedef char palab[longitud];


es decir...

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <string.h>
using namespace std;

const unsigned longitud=20;
typedef char var[longitud];

int main()
{
char palab;

cout << "Palabra: "; cin >> palab;
char var[] = palab;

int longitud = strlen(var);
cout << "La logitud de la cadena es " << longitud;
getch();
}
  #4 (permalink)  
Antiguo 14/01/2013, 05:38
 
Fecha de Ingreso: enero-2013
Mensajes: 11
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: [C++] ¿como lo soluciono?

De esta forma tan sencilla no se puede hacer, ya que la palabra la doy directamente, tendria que crear un registro+array, meter la palabra dentro del array y contar las casillas rellenadas del array...

¿es correcto no?

el problema que tengo por array es que, como es una palabra y no tiene un caracter o algo que me indique que es el final (como por ejemplo "supermercado."), el "." indica fin y asi es facil, pero sino tengo algo que me indique cual es el fin, me preguntara siempre hasta que rellene la longitud entera del array... Por eso intentaba hacerlo de esa manera, pero creo que no se puede.
  #5 (permalink)  
Antiguo 14/01/2013, 06:00
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: [C++] ¿como lo soluciono?

O no te he entendido bien, o no has entendido tu bien como funcionan los arrays en C++, pero algo falla xD

Si tu haces:

Código C++:
Ver original
  1. const unsigned longitud=20;
  2. char var[longitud];

Y luego por teclado te ponen "palabra.", la funcion strlen te devolveria 8 (7 de palabra + 1 del punto). La función strlen no cuenta hasta un punto o un signo de puntuación, sino hasta el caracter "\0" y este es introducido por cin al final de la palabra de forma automática.

No se si esto resuelve la duda porque tu último post no lo he terminado de entender.
__________________
Aviso: No se resuelven dudas por MP!
  #6 (permalink)  
Antiguo 14/01/2013, 06:24
 
Fecha de Ingreso: enero-2013
Mensajes: 11
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: [C++] ¿como lo soluciono?

Cita:
Iniciado por Malenko Ver Mensaje
O no te he entendido bien, o no has entendido tu bien como funcionan los arrays en C++, pero algo falla xD

Si tu haces:

Código C++:
Ver original
  1. const unsigned longitud=20;
  2. char var[longitud];

Y luego por teclado te ponen "palabra.", la funcion strlen te devolveria 8 (7 de palabra + 1 del punto). La función strlen no cuenta hasta un punto o un signo de puntuación, sino hasta el caracter "\0" y este es introducido por cin al final de la palabra de forma automática.

No se si esto resuelve la duda porque tu último post no lo he terminado de entender.
jaja me has resuelto una gran duda que tenia sobre el strlen jaja
estaba hablando de otro ejercicio que hice y no sabia como leer la palabra sin ponerme una terminacion, y es con strlen.. vale..

lo que no se es como colocar esto:

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <string.h>
using namespace std;

const unsigned longitud=20;
typedef char var[longitud];

int main()
{
char palab;

cout << "Palabra: "; cin >> palab;
char var[] = palab;

int longitud = strlen(var);
cout << "La logitud de la cadena es " << longitud;
getch();
}

el problema es char var[] = palab;, no se como meter la palabra dentro, me estoy volviendo loco ya jaja
  #7 (permalink)  
Antiguo 14/01/2013, 06:36
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: [C++] ¿como lo soluciono?

Segun tu código:
Código C++:
Ver original
  1. char palab;
  2.  
  3. cout << "Palabra: "; cin >> palab;
  4. char var[] = palab;

palab es un char, por lo tanto solo puede almacenar un carácter. Al hacer

Código C++:
Ver original
  1. cin >> palab;

solo guardarás la primera letra de la palabra.

Porque quieres leer en una variable la palabra y luego copiarla en el array? Porque no haces que el cin trabaje directamente sobre el array?
__________________
Aviso: No se resuelven dudas por MP!
  #8 (permalink)  
Antiguo 14/01/2013, 07:11
 
Fecha de Ingreso: enero-2013
Mensajes: 11
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: [C++] ¿como lo soluciono?

asi no?

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <string.h>
using namespace std;

typedef struct {
char letra;
} TPalabra;

const unsigned longitud=20;
typedef TPalabra Palabras[longitud];

void Leer(Palabras &todos)
{
cout << "Palabra: ";
for (int i=0; i<longitud; i++) {
cin >> todos[i].letra;
}
cout << "La logitud de la cadena es " << strlen(Palabras);
}

int main()
{
Palabras pal;
Leer(pal);
}


esta es la parte que comente antes del strlen... y el cin >> todos[i].letra; no para de preguntarmelo porque tengo la condicion i<longitud.. este es el problema de todo..
  #9 (permalink)  
Antiguo 14/01/2013, 07:27
 
Fecha de Ingreso: enero-2013
Mensajes: 11
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: [C++] ¿como lo soluciono?

Ya casi funciona!!

void Leer(Palabras &todos)
{ int i=0;
cout << "Palabra: "; cin >> todos[i].letra;
for (i=1; i<longitud && todos[i].letra != '\0'; i++) {
cin >> todos[i].letra;
}
cout << "La logitud de la cadena es " << i;
}
  #10 (permalink)  
Antiguo 14/01/2013, 07:40
 
Fecha de Ingreso: enero-2013
Mensajes: 11
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: [C++] ¿como lo soluciono?

Código C++:
Ver original
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. using namespace std;
  6.  
  7. typedef struct {
  8.   char letra;
  9. } TPalabra;
  10.  
  11. const unsigned longitud=20;
  12. typedef TPalabra Palabras[longitud];
  13.  
  14. void Leer(Palabras &todos)
  15. { int i=0;
  16.     cout << "Palabra: "; cin >> todos[i].letra;
  17.     for (i=1; i<longitud && todos[i].letra == '\0'; i++) {
  18.       cin >> todos[i].letra;
  19.     }
  20.     cout << "La logitud de la cadena es " << i;
  21. }
  22.  
  23. int main()
  24. {
  25.   Palabras pal;
  26.   Leer(pal);
  27. }

no funciona bien por lo que dije anteriormente, fuf
  #11 (permalink)  
Antiguo 14/01/2013, 08:27
 
Fecha de Ingreso: enero-2013
Mensajes: 7
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: [C++] ¿como lo soluciono?

no seran las comillas de palab???
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <string.h>
using namespace std;

int main()
{
char var[] = "palaba";

int longitud = strlen(var);
cout << "La logitud de la cadena es " << longitud;
getch();
}


pero yo creo que seria mejor que palabra la metas desde fuera (no estoy seguro de como pero seguramente usando scanf o algo que sea similar)
  #12 (permalink)  
Antiguo 14/01/2013, 09:16
 
Fecha de Ingreso: enero-2013
Mensajes: 11
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: [C++] ¿como lo soluciono?

Cita:
Iniciado por xignasix Ver Mensaje
no seran las comillas de palab???
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <string.h>
using namespace std;

int main()
{
char var[] = "palaba";

int longitud = strlen(var);
cout << "La logitud de la cadena es " << longitud;
getch();
}


pero yo creo que seria mejor que palabra la metas desde fuera (no estoy seguro de como pero seguramente usando scanf o algo que sea similar)
que va.. asi no... pero gracias de todos modos.
  #13 (permalink)  
Antiguo 14/01/2013, 09:45
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: [C++] ¿como lo soluciono?

Te lo pongo porque veo que al final no lo conseguirás sacar y estas muy muy cerca:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.  
  10. char var[200];
  11. cout << "Palabra: "; cin >> var;
  12.  
  13. int longitud = strlen(var);
  14. cout << "La logitud de la cadena es " << longitud;
  15. }

El problema es cuando te pongan una palabra de mas de 200 carácteres
__________________
Aviso: No se resuelven dudas por MP!
  #14 (permalink)  
Antiguo 14/01/2013, 11:19
 
Fecha de Ingreso: enero-2013
Mensajes: 11
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: [C++] ¿como lo soluciono?

Cita:
Iniciado por Malenko Ver Mensaje
Te lo pongo porque veo que al final no lo conseguirás sacar y estas muy muy cerca:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.  
  10. char var[200];
  11. cout << "Palabra: "; cin >> var;
  12.  
  13. int longitud = strlen(var);
  14. cout << "La logitud de la cadena es " << longitud;
  15. }

El problema es cuando te pongan una palabra de mas de 200 carácteres
me estaba complicando mucho me parece a mi... Lo quiero para pocos caracteres, por eso lo queria... Muchas gracias!!
  #15 (permalink)  
Antiguo 14/01/2013, 14:11
 
Fecha de Ingreso: enero-2013
Mensajes: 11
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: [C++] ¿como lo soluciono?

Buenas, una cosa..

Queria conseguir leer el numero de digitos de una palabra y lo hemos conseguido, pero lo quieria para no tener problema al añadir una palabra en un array y asi un contador añada hasta el numero de digitos que hemos leido anteriormente... Pero ahora tengo un problema... He conseguido que lea la palabra y me diga la longitud hasta donde quiero añadir en un array, pero no se como hacer que me lea caracter por caracter...

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cctype>
  3. #include <conio.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. using namespace std;
  7.  
  8. // REGISTRO:
  9. typedef struct {
  10.   char letra;
  11. } TPalabra;
  12.  
  13. // ARRAY:
  14. const int longitud=200;
  15. typedef TPalabra palabras[longitud];
  16.  
  17. void leer(palabras &todos) {
  18.     int i=0;
  19.     char var[longitud];
  20.  
  21.     cout << "Palabra: "; cin >> var; //en var añadimos la palabra que quiero,  ej: "hola"
  22.     int longit = strlen(var);
  23.     cout << "La logitud de la cadena es " << longit << endl; //en longit me mostrara su longitud, ej: "4"
  24.     getch();
  25.  
  26.  
  27.  //aqui añadir la palabra [B]hola [/B]por digtos, ej: "todos[0].letra" sea la "h", "todos[1].letra" sea la "o"... y asi hasta 4 veces (que es longit)...
  28.   while(i<longit) {
  29.      var[todos[i].letra]; //aqui tengo el problema... si tengo (var = hola) no se como mostrar solo la h, o, l, a..
  30.      i++;
  31.   }
  32. }
  33.  
  34.  
  35. int main()
  36. {
  37.   palabras pal;
  38.  
  39.   leer(pal);
  40. }

¿como puedo solucionarlo?

haciendo lo siguiente, consigo sacar letra por letra, pero claro, no lo puedo meter en el array...
Código C++:
Ver original
  1. while(i<longit) {
  2.      cout << var[i];
  3.      i++;
  4.   }

cout << var[i]; -> asi consigo sacar las letras "h", "o", "l" y "a", del ejemplo "hola", pero no se como hacerlo para que tengo el valor de "todos[i].letra"

¿como puedo solucionarlo?

Última edición por byxtyle; 14/01/2013 a las 15:55
  #16 (permalink)  
Antiguo 14/01/2013, 17:23
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: [C++] ¿como lo soluciono?

Entiendo que quieres que leer devuelva en "pal" la palabra leida.

Si es asi, el bucle while correcto seria

Código C++:
Ver original
  1. while(i<longit) {
  2.          todos[i].letra = var[i];
  3.          i++;
  4.       }
__________________
Aviso: No se resuelven dudas por MP!
  #17 (permalink)  
Antiguo 15/01/2013, 02:38
 
Fecha de Ingreso: enero-2013
Mensajes: 11
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: [C++] ¿como lo soluciono?

Malenko, pensaba que lo que queriamos introducir en un array, nunca se podian meter haciendo una variable, lo importante que funciona por fin!

MUCHAS GRACIAS!!!
  #18 (permalink)  
Antiguo 15/01/2013, 03:06
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: [C++] ¿como lo soluciono?

Sí, es importante que funcione, pero también que hayas entendido porque ;)
__________________
Aviso: No se resuelven dudas por MP!
  #19 (permalink)  
Antiguo 19/01/2013, 06:40
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 11 años, 10 meses
Puntos: 127
Respuesta: [C++] ¿como lo soluciono?

byxtyle, no es tu culpa, tú eres sólo una víctima. No me parece muy inteligente el diseño de un lenguaje que según qué circunstancias tiene esas excepciones. Una persona tarda en entender que C aplica ciertas excepciones en lugar de usar una metodología homogénea.

Si un array es un puntero hacia el primer elemento del array lo lógico es pensar que el compilador actuase igualmente ante arrays de chars que ante arrays de int, pero no, los genios de C consideraron que era correcto

Código C:
Ver original
  1. int a[] = {3,2,1};
  2. cout << a; // dirección memoria del primer elemento de a, o sea, 3;
  3. char b[] = "e";
  4. cout << b; // imprime e

A cualquier novato esto lo despista y piensa que los chars son entidades especiales, más lejos de la realidad, tanto el array de chars como el de enteros se recolocan en la memoria siendo simples dword ptr y byte ptr al referenciarse.

No sólo eso, si no que si no especificas la longitud y usas un string literal (literal es que va entre comillas) ese string es en sí mismo un objeto ya recolocado en memoria por lo que lo que hace es doble operación para definirlo en memoria y recopiarlo en otra dirección afectando muy positivamente al rendimiento:

Código ensamblador:
Ver original
  1. mov  ax,word ptr ds:[00F9CC8Ch]  // en esa dirección de memoria es un dword con [B]e[/B] y \0
  2. mov  word ptr [b],ax  // lo mueve nuevamente a la dirección que apunta b

en la memoria es

0x00F9CC8C: 65
0x00F9CC8D: 00

Y como se ve, también añade un \0 (00h), por lo que es un 2x1! Hay una explicación fundamental para usar 00 y es que es el carácte NUL de fin de cadena, que en cualquier caso me parece más lógico que haya que indicarlo manualmente para que la persona entienda de una vez que se trata de un array con un tamaño+1.

Luego, también consideran que char tiene que ser char porque ellos son los listos número 1 y obviamente nadie iba a usar un entero ultramegacorto si no es para chars ascii así que ellos mandan y char es carácter, aunque sea un simple entero de 8 bits que es un __int8.

Los enteros de 1 byte tampoco se pueden imprimir como números aunque se definan como __int8, el mínimo es __int16 en cualquier caso, y por tanto en el type casting consume más recursos haciendo muchas chorradas por lo que (__int16) __int8 tiene que volver a convertirlo todo haciendo llamadas, incluso si usas __int8 sin typecasting no te preocupes que el compilador lo convertirá a char haciendo una llamada a std::operator<<<std::char_traits<char> >.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 19/01/2013 a las 07:18

Etiquetas: c++
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:30.