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

c++. Error de principiante

Estas en el tema de c++. Error de principiante en el foro de C/C++ en Foros del Web. Sé que no están aquí para hacer las tareas de nadie. Soy nuevo en C++, y pese a que me gusta y tengo muchas ganas ...
  #1 (permalink)  
Antiguo 15/11/2006, 13:10
Avatar de surfsalinas  
Fecha de Ingreso: mayo-2006
Ubicación: Asturias, España
Mensajes: 125
Antigüedad: 18 años
Puntos: 0
Busqueda c++. Error de principiante

Sé que no están aquí para hacer las tareas de nadie. Soy nuevo en C++, y pese a que me gusta y tengo muchas ganas de aprender ando muy perdido. Debo entregar una práctica de programación el viernes. Una parte del programa en cuestión debe preguntarme mi nombre y cambiar las vocales por otras, la a por la u, y demás. Igual debería darme verguenza preguntarlo pero como ya digo después de mucho leer (aka tengo el libro "problemas resueltos de c++, edit Thomson", y por diversos sitios) El código al que llegué es es siguiente:

#include <iostream>
using namespace std;
int main(void) {
char array_letras[50];
int tamanyo_array=sizeof(array_letras)/sizeof (char);
//se recorre la cadena y se sustituye
for(int i=0;i<tamanyo_array;i++) {
switch(array_letras[i]) {
case 'a':

array_letras[i]='u';
}
}

for(int i=0;i<tamanyo_array;i++) {
switch(array_letras[i]) {
case 'e':

array_letras[i]='a';
}
}

for(int i=0;i<tamanyo_array;i++) {
switch(array_letras[i]) {
case 'i':

array_letras[i]='e';
}
}

for(int i=0;i<tamanyo_array;i++) {
switch(array_letras[i]) {
case 'o':

array_letras[i]='i';
}
}

for(int i=0;i<tamanyo_array;i++) {
switch(array_letras[i]) {
case 'u':

array_letras[i]='o';
}
}


float primero,segundo,tercero,cuarto,quinto,sexto,septim o,octavo,noveno,decimo;
cout<<"Como te llamas?";
cin>>array_letras;
cout<<array_letras;
cout<<" Yo prefiero llamarte ";

//se imprime el array para ver los cambios
for (int i=0; i<tamanyo_array;i++){
cout<<array_letras[i]<<endl;
}


system ("pause");
}

Lo que me ocurre es que la consola imprime unos caracteres muy extraños, una columna a la izquierda. Utilizo dev-C++ en Windows.
¿Alguien me sabría ayudar a que el programa imprima "mi nombre" con los caracteres cambiados?
Ejemplo: si pongo "roberto" en este caso el programa debe mostrar por pantalla "ribarti"
De verdad que antes de preguntar por aquí me he dado bastantes vueltas. De todos modos colgaré el código que obtenga al final, a ver si logro que funcione. Cuando hago una pregunta intento tener en cuenta esto, espero que haya algun alma caritativa por ahí.
__________________
Estoy en blojer.com
  #2 (permalink)  
Antiguo 15/11/2006, 14:21
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Aclaro: no voy a entrar a valorar el codigo en si mismo en cuanto a optimizacion, claridad o seguridad, sino solo lo claramente erroneo o inutil.

Estas haciendo el reemplazo ANTES de leer la cadena. Para no escribir todos esos caracteres podrias hacer el bucle final (y todos los bucles en realidad) usando strlen(array_letras) y de paso inicializa todo el array a 0 usando memset(). En ese bucle usas endl con lo cual todas las letras saldran en una linea diferente. Todas las variables float son redundantes.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 17/11/2006, 17:33
Avatar de surfsalinas  
Fecha de Ingreso: mayo-2006
Ubicación: Asturias, España
Mensajes: 125
Antigüedad: 18 años
Puntos: 0
Gracias por tu respuesta. No acabé el programa... éste era el enunciado, repito que muy sencillo (para alguien que sepa lo que está haciendo). Imagino que en un mes o dos ya dominaré el tema.

"Enunciado.
Parte 1.- El problema a resolver
Con todo esto, se pide un programa que pregunte el nombre al usuario. Se mostrará la longitud del nombre, y la primera aparición de cada vocal se cambiará: a por u, e por a, i por e, o por i, u por o. Finalmente, se mostrará el nombre resultante.

Ademas, el programa debe pedir por teclado 10 números reales. Cada número se leerá como si fuese una cadena de caracteres y se convertirán por código a números reales. Se calculará la media de los valores.
Posteriormente, se indicará para cada valor de los introducidos:

* si es mayor a la media
* si es igual a la media
* si es menor a la media
* la raíz cuadrada del número
* un número aleatorio diferente.

Cada vez que se inicie el programa los números aleatorios y su secuencia deben cambiar automáticamente."

Y aquí parte del código

"//no consigo que funcione la suma. Funcionaba perfectamente pero despues y de forma inexplicable para mí me devuelve siempre el mismo valor
//con lo que para cualquier número me devuelve que es menor a la media. El resultado de la suma siempre me sale 6.09+e36 o similar.
//al cambiar las letras del nombre, aparecen unos símbolos irreconocibles, junto al nombre con los caracteres cambiados correctamente.
//por lo que me dijeron el código es una chapuza, aunque en principio debería funcionar. Como no solucioné el problema de la suma no seguí con lo de la raíz, a ver si me informo aunque sea fuera de plazo
//práctica 1, rc1
#include <iostream>
using namespace std;
int main(void) {
char array_letras[50];
int tamanyo_array=sizeof(array_letras)/sizeof (char);
//se recorre la cadena y se sustituye


float primero,segundo,tercero,cuarto,quinto,sexto,septim o,octavo,noveno,decimo;
float suma_valores=primero+segundo+tercero+cuarto+quinto +sexto+septimo+octavo+noveno+decimo;
float valor_media=suma_valores/10;
cout<<"Como te llamas?";
cin>>array_letras;
cout<<"Vamos a ver cuanto te mide"<<endl;
system ("pause");
cout<<"Tu nombre, " <<array_letras <<", mide " << strlen (array_letras)<< " caracteres."<<endl;
cout<<array_letras;
cout<<" ,yo prefiero llamarte ";
for(int i=0;i<tamanyo_array;i++) {
switch(array_letras[i]) {
case 'a':

array_letras[i]='u';
}
}

for(int i=0;i<tamanyo_array;i++) {
switch(array_letras[i]) {
case 'e':

array_letras[i]='a';
}
}

for(int i=0;i<tamanyo_array;i++) {
switch(array_letras[i]) {
case 'i':

array_letras[i]='e';
}
}

for(int i=0;i<tamanyo_array;i++) {
switch(array_letras[i]) {
case 'o':

array_letras[i]='i';
}
}

for(int i=0;i<tamanyo_array;i++) {
switch(array_letras[i]) {
case 'u':

array_letras[i]='o';
}
}

//se imprime el array para ver los cambios
for (int i=0; i<tamanyo_array;i++){
cout<<array_letras[i];
}


system ("pause");

cout<<array_letras<<" , ahora el programa necesita 10 valores reales. Tras escribir cada valor pulsa la tecla enter. Voy a jugar un poco con ellos."<<endl;
cin>>primero>>segundo>>tercero>>cuarto>>quinto>>se xto>>septimo>>octavo>>noveno>>decimo;
cout<<"La suma de todos ellos es ";
cout<<suma_valores<<endl;

cout<<"La media es ";
cout<<valor_media<<endl;

if(primero<valor_media)
cout<<"El primer valor, "<<primero<<" es inferior a la media"<<endl;
if(primero>valor_media)
cout<<"El primer valor, "<<primero<<" es mayor a la media"<<endl;
if(segundo<valor_media)
cout<<"El segundo valor, "<<segundo<<" es inferior a la media"<<endl;
if(segundo>valor_media)
cout<<"El segundo valor, "<<segundo<<" es mayor a la media"<<endl;
if(tercero<valor_media)
cout<<"El tercero valor, "<<tercero<<" es inferior a la media"<<endl;
if(tercero>valor_media)
cout<<"El tercero valor, "<<tercero<<" es mayor a la media"<<endl;
if(cuarto<valor_media)
cout<<"El cuarto valor, "<<cuarto<<" es inferior a la media"<<endl;
if(cuarto>valor_media)
cout<<"El cuarto valor, "<<cuarto<<" es mayor a la media"<<endl;
if(quinto<valor_media)
cout<<"El quinto valor, "<<quinto<<" es inferior a la media"<<endl;
if(quinto>valor_media)
cout<<"El quinto valor, "<<quinto<<" es mayor a la media"<<endl;
if(sexto<valor_media)
cout<<"El sexto valor, "<<sexto<<" es inferior a la media"<<endl;
if(sexto>valor_media)
cout<<"El sexto valor, "<<sexto<<" es mayor a la media"<<endl;
if(septimo<valor_media)
cout<<"El septimo valor, "<<septimo<<" es inferior a la media"<<endl;
if(septimo>valor_media)
cout<<"El septimo valor, "<<septimo<<" es mayor a la media"<<endl;
if(octavo<valor_media)
cout<<"El octavo valor, "<<octavo<<" es inferior a la media"<<endl;
if(octavo>valor_media)
cout<<"El octavo valor, "<<octavo<<" es mayor a la media"<<endl;
if(noveno<valor_media)
cout<<"El noveno valor, "<<noveno<<" es inferior a la media"<<endl;
if(noveno>valor_media)
cout<<"El noveno valor, "<<noveno<<" es mayor a la media"<<endl;
if(decimo<valor_media)
cout<<"El decimo valor, "<<decimo<<" es inferior a la media"<<endl;
if(decimo>valor_media)
cout<<"El decimo valor, "<<decimo<<" es mayor a la media"<<endl;


system ("pause");
}"

Para quien pueda interesarle. De todas formas dije que lo subía y ahí queda, espero reírme dentro de una temporada, de mi "falta de tacto" en c++
__________________
Estoy en blojer.com
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 10:45.