Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - 98Fran

#31
Ahora sí que sí, más claro el agua. No sabía muy bien por donde tirar, o por punteros o por referencias, la nomenclatura cuando es por referencia en una cadena o vector, pero ahora ya lo tengo todo mucho mas claro.

Supongo que cuando avance más en el temario llegare a la sección de variables dinámicas, no había puesto lo del delete[] porque con todos los otros problemas que tenía se me había pasado. (De momento solo se crear variables dinámicas ya que hizo un pequeño inciso en el curso hablando de como ahorrar espacio en la memoria utilizando ese tipo de variables ya que supongo que si es de forma didáctica un par de vectores[100] no van a saturar la RAM pero si fuera algo más elaborado supongo que tiene que haber un limite).


Muchas gracias de verdad ^^. Ya fuera offtopic xD estoy haciendo un juego con unreal y al pasarlo a multijugador los blueprints(es codigo pero en viñetas unidas por nodos, la lógica básica pero no hace falta saber punteros o funciones) no sirven ya que ocurren Bugs cuando modificas ciertos valores y hay que usar C++. Lo que no se es si luego al usar visual studio la forma de programar va a ser distinta a como funciona Dev C++.

PD: Hice la carrera de electrónica y en el primer año di informática (muuuy básico) y llegamos hasta funciones, usábamos la librería <stdlib> para todo y usábamos printf o fprintf si era para una función y scanf, he visto que en algunos post hay gente que no usa <iostream> en C++ si se supone que es la estándar, por?

PD2: He visto que en C++ también se usa la programación orientada a objetos que se usa en unreal y que se parece a java. el C++ no es un lenguaje procedural? como puede ser orientado a objetos también?.
#32
Funciona perfecto tambien:
Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

int pedirNombre(char*);
void contarVocales(char*,int,int*);
void mostrarVocales(int*);


int main(){
int c_vocales[5] ={0,0,0,0,0}, longitud;  //0 == a, 1 == b ... 4 == u;
char nombre[30];

longitud = pedirNombre(nombre);
contarVocales(nombre,longitud,c_vocales);
mostrarVocales(c_vocales);


cout<<"\n"<<nombre<<endl;

cin.get();
return 0;
}

int pedirNombre(char* nombre){
int longitud;

cout<<"Digite su nombre: ";

cin.getline(nombre,30,'\n');
longitud = strlen(nombre);

return longitud;
}

void contarVocales(char*nombre,int n,int*p_vocales){

for(int i=0;i<n;i++){
switch(nombre[i]){
case 'a': *(p_vocales) = *(p_vocales) + 1; break;
case 'e': *(p_vocales+1) = *(p_vocales+1) + 1; break;
case 'i': *(p_vocales+2) = *(p_vocales+2) + 1; break;
case 'o': *(p_vocales+3) = *(p_vocales+3) + 1; break;
case 'u': *(p_vocales+4) = *(p_vocales+4) + 1; break;
}
}
}

void mostrarVocales(int* vocales){
cout<<"num. de a: "<<vocales[0]<<endl;
cout<<"num. de e: "<<vocales[1]<<endl;
cout<<"num. de i: "<<vocales[2]<<endl;
cout<<"num. de o: "<<vocales[3]<<endl;
cout<<"num. de u: "<<vocales[4]<<endl;
}


No sabia que que cuando pasabas un vector a una función lo podías pasar como puntero con "*", hasta lo que he visto cuando se pasaba algo por referencia a una función se hacia con &, y si querías pasar un puntero tenias que crearlo del mismo tipo que el vector, luego vincularlo al primer espacio de la memoria y luego ya se pasaba con "*".

PD: Entonces lo que paso con: (char* nombre)
  • es la posición de memoria de la posición v[0] del vector?
    o
  • es un puntero del vector que se llama nombre y esta en la posición v[0] del vector con su mismo nombre?.

    Y  por qué no se usa (char& letra) como por ejemplo sí pasar un solo char como 'a'.
    En el caso de (char& letra) que es un paso por referencia pasas la dirección de memoria también no? ya que puedes modificar la variable en otra funciones.

    PD2: Lo explicas todo muy bien jajaja gracias por la paciencia que estas teniendo conmigo pero  incluso después de haber victo los pocos videos en youtube que hay de puntero y comprado 2 cursos en udemy de c++, nadie explica en profundidad como funciona la sintaxis y sus posibles variaciones si no que te obligan a aceptarlo todo como dogma y una vez hago mis propios problemas ya no se por donde tirar.
#33
Al final he podido resolverlo (aun que dudo que sea de la manera mas adecuada xD):
Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

int pedirNombre();
void contarVocales(int);
void mostrarVocales();

int *p_vocales; // punteros de los contadores;
char *nombre;

int main(){
int c_vocales[5] ={0,0,0,0,0}, longitud;  //0 == a, 1 == b ... 4 == u;
p_vocales = &c_vocales[0];

longitud = pedirNombre();
contarVocales(longitud);
mostrarVocales();


cout<<"\n"<<nombre<<endl;

cin.get();
return 0;
}

int pedirNombre(){
int longitud;

cout<<"Digite su nombre: ";
nombre = new char[30];
cin.getline(nombre,30,'\n');
longitud = strlen(nombre);

return longitud;
}

void contarVocales(int n){

for(int i=0;i<n;i++){
switch(nombre[i]){
case 'a': *(p_vocales) = *(p_vocales) + 1; break;
case 'e': *(p_vocales+1) = *(p_vocales+1) + 1; break;
case 'i': *(p_vocales+2) = *(p_vocales+2) + 1; break;
case 'o': *(p_vocales+3) = *(p_vocales+3) + 1; break;
case 'u': *(p_vocales+4) = *(p_vocales+4) + 1; break;
}
}
}

void mostrarVocales(){
cout<<"num. de a: "<<p_vocales[0]<<endl;
cout<<"num. de e: "<<p_vocales[1]<<endl;
cout<<"num. de i: "<<p_vocales[2]<<endl;
cout<<"num. de o: "<<p_vocales[3]<<endl;
cout<<"num. de u: "<<p_vocales[4]<<endl;
}


/*                             SALIDA:
---------------------------------------------------------------
Digite su nombre: aaaaeaeeieioiou
num. de a: 5
num. de e: 4
num. de i: 3
num. de o: 2
num. de u: 1

aaaaeaeeieioiou

---------------------------------------------------------------
PD: tenía mal lo del conteo que había puesto:
Código (cpp) [Seleccionar]
case 'a': *(p_vocales+i) = *(p_vocales+i) + 1; break;

Y no tenia que usar la i y otro error que me salto era que no podía usar ++ con los punteros:
Código (cpp) [Seleccionar]
case 'a': *(p_vocales) ++; break;

Aun que no se si usando esto serviría también:
Código (cpp) [Seleccionar]
case 'a': *(p_vocales) += 1; break;

Muchisimas gracias, ando un poco liado con la nomenglatura a la hora de pasar vectores por las funciones, pero al menos ya tengo esto resuelto  ;-) ;-). Si me resolvieses la duda de como pasar vectores ya sea int o cadenar char por referencia en funciones te lo agradecería muchimo tambien jajaja. Mil gracias ^^.
#34
Muchas gracias!!!, ahora surge otro problema xD:

Código (cpp) [Seleccionar]


#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

int pedirNombre(char&);
void contarVocales(int);
void mostrarVocales();

int *p_vocales; // punteros de los contadores;
char *nombre;

int main(){
int c_vocales[5] ={0,0,0,0,0}, longitud;  //0 == a, 1 == b ... 4 == u;
char usuario[30];

nombre = &usuario[0];
p_vocales = &c_vocales[0];

longitud = pedirNombre(usuario[30]);
contarVocales(longitud);
mostrarVocales();



cin.get();
return 0;
}

int pedirNombre(char& us){
int longitud;

cout<<"Digite su nombre: ";
cin.getline(us,30,'\n');
longitud = strlen(us);

return longitud;
}

void contarVocales(int n){

for(int i=0;i<n;i++){
switch(*(nombre+i)){
case 'a': *(p_vocales+i) = *(p_vocales+i) + 1; break;
case 'e': *(p_vocales+i) = *(p_vocales+i) + 1;; break;
case 'i': *(p_vocales+i) = *(p_vocales+i) + 1;; break;
case 'o': *(p_vocales+i) = *(p_vocales+i) + 1; break;
case 'u': *(p_vocales+i) = *(p_vocales+i) + 1; break;
}
}

}

void mostrarVocales(){
cout<<"num. de a: "<<p_vocales[0]<<endl;
cout<<"num. de e: "<<p_vocales[1]<<endl;
cout<<"num. de i: "<<p_vocales[2]<<endl;
cout<<"num. de o: "<<p_vocales[3]<<endl;
cout<<"num. de u: "<<p_vocales[4]<<endl;
}


Me da error a la hora de usar cin.getline en la cadena de caractares que he pasado.
#35
Estoy empezando con C++ y hay algo que no entiendo por qué esta pasando, aquí esta mi codigo:

Código (cpp) [Seleccionar]
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

int pedirNombre();
void contarVocales(char*,int);
void mostrarVocales();

int *p_a, *p_e, *p_i, *p_o, *p_u; // punteros de los contadores;
char *nombre;

int main(){

contarVocales(nombre,pedirNombre());
mostrarVocales();



getch();
return 0;
}

int pedirNombre(){
int longitud;
char usuario[30];

cout<<"Digite su nombre: ";
cin.getline(usuario,30,'\n');
longitud = strlen(usuario);

nombre = &usuario[0];

return longitud;
}

void contarVocales(char* nombre,int n){
int c_a, c_e, c_i, c_o, c_u; //contador vocales;

c_a = 0;
c_e = 0;
c_i = 0;
c_o = 0;
c_u = 0;

p_a = &c_a;
p_e = &c_e;
p_i = &c_i;
p_o = &c_o;
p_u = &c_u;

for(int i=0;i<n;i++){
switch(*(nombre+i)){
case 'a': c_a++; break;
case 'e': c_e++; break;
case 'i': c_i++; break;
case 'o': c_o++; break;
case 'u': c_u++; break;
}
}
}

void mostrarVocales(){
cout<<"num. de a: "<<*p_a<<endl;
cout<<"num. de e: "<<*p_e<<endl;
cout<<"num. de i: "<<*p_i<<endl;
cout<<"num. de o: "<<*p_o<<endl;
cout<<"num. de u: "<<*p_u<<endl;
}


SALIDA:
---------------------------------------------------------------------------------------
Digite su nombre: aaaaaeeeeiiioou
num. de a: 1
num. de e: 4
num. de i: 3
num. de o: 2
num. de u: 1
---------------------------------------------------------------------------------------------

Si pongo un cout dentro de la funcion contarVocales() *p_a me da el valor correcto pero una vez sale de esa funcion y se meustra en la funcion mostrarVocales() me da el valor 1 todo el rato. El resto de vocales funcionan correctamente menos en la vocal a que es como si se borrase el valor al acabar la funcion y se sustituye por 1.

PD: he declarado los punteros de forma global por que no se otra forma de pasarlos a otra función y no se si puede pasar mas de un valor por el return (todos los ejemplos que he visto solo pasan 1 dato por el return).

PD2: por que cuando se usa una variable global como *nombre se declara dentro de el prototipo de función si en teoría si lo pasas sin referenciar también sive puesto que es un puntero global, es decir, en ves de usar:

Código (cpp) [Seleccionar]
void contarVocales(char*,int);

usar:

Código (cpp) [Seleccionar]
void contarVocales();

y escribir directamente la variable como en:

Código (cpp) [Seleccionar]
int pedirNombre();


Tengo un cacao con eso, debo o no debo poner las variables globales dentro del parentesis?¿ por lo que se si lo hago sin ser un puntero y no utiliza & pasaría una copia del valor (para asi no modificar el valor de la variable y usarlo en otra funciones si hace falta) pero en los punteros no veo la diferencia la verdad.

Se que es mucho pero la verdad agradecería a algún iluminado que me resuelva estas dudas que me están volviendo loco  ;D ;D. No quiero seguir más adelante con el curso ya que prefiero tener todo bien claro antes de profundizar más. Gracias!!!