Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SergioT en 26 Noviembre 2020, 15:25 pm



Título: ¿Cómo crear una función?
Publicado por: SergioT en 26 Noviembre 2020, 15:25 pm
Hola, ¿qué tal? soy nuevo en el foro. Estoy teniendo un inconveniente con un trabajo práctico. Quiero generar una función para que me traiga los meses al main, pero, no me toma el for directamente. Es decir, a la hora de compilar y correr el programa, no me permite cargar los 12 datos que corresponderían a los 12 meses.

Si alguien pudiera ayudarme, lo agradecería mucho.

Código
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <string>
  4. #include <conio.h>
  5. #include <stdlib.h>
  6. using namespace std;
  7. string meses(string)
  8. {
  9. string meses[12];
  10.  
  11. meses[1]="Enero";
  12. meses[2]="Febrero";
  13. meses[3]="Marzo";
  14. meses[4]="Abril";
  15. meses[5]="Mayo";
  16. meses[6]="Junio";
  17. meses[7]="Julio";
  18. meses[8]="Agosto";
  19. meses[9]="Septiembre";
  20. meses[10]="Octubre";
  21. meses[11]="Noviembre";
  22. meses[12]="Diciembre";
  23.  
  24. }
  25. main ()
  26. {
  27. string meses(string);
  28. int dulces[12], Totaldulces;
  29. char i, j;
  30.  
  31. cout<<"Bienvenidos a la fabrica de produccion."<<endl;
  32. for (i=1;i>=12;i++)
  33. {
  34. for (j=1;j>=12;j++)
  35. {
  36. cout<<"Ingrese la cantidad de dulces producidos el mes " << meses[j] <<endl;
  37. cin>>dulces[i];
  38. Totaldulces=Totaldulces+dulces[i];
  39. cout<<"El acumulo es de: $"<<Totaldulces;
  40. }
  41. }
  42. cout<<"El monto total producido para los dulces es de: $"<<Totaldulces<<endl;
  43.  
  44. ;}



Mod: GeSHi obligatorio.


Título: Re: ¿Cómo crear una función?
Publicado por: AlbertoBSD en 26 Noviembre 2020, 15:43 pm
Antes que nada los arreglos se empiezan a contar desde 0.


Código
  1. //Fuera de main
  2. cons char *meses[12] = {"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};
  3.  
  4. //En main
  5. for(int i = 0 ; i < 12; i++){
  6. cout<<"Mes "<<i+1<<" "<<meses[i]<<endl;
  7. }

Saludos!


Título: Re: ¿Cómo crear una función?
Publicado por: SergioT en 26 Noviembre 2020, 15:53 pm
Cuando quiero aplicar lo que me enviaste, me aparece siempre ENERO, y no pasa a Febrero, marzo, etc. ¿por qué puede suceder? ¿Se puede transformar esta función a un string? Muchas gracias desde ya por la respuesta.


Título: Re: ¿Cómo crear una función?
Publicado por: AlbertoBSD en 26 Noviembre 2020, 16:04 pm
El detalle de que no pase de Enero debe se tu codigo por que ejecute el mio y muestra todos los meses.

Sobre si se puede hacer para string claro:

Código
  1. #include<stdio.h>
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5. //Fuera de main
  6. string meses[12] = {"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};
  7.  
  8. int main () {
  9. for(int i = 0 ; i < 12; i++){
  10. cout<<"Mes "<<i+1<<" "<<meses[i]<<endl;
  11. }
  12. }

Lo ejecuto y muestra

Código:
C:\codigos>g++ meses.cpp -o meses.exe

C:\codigos>meses
Mes 1 Enero
Mes 2 Febrero
Mes 3 Marzo
Mes 4 Abril
Mes 5 Mayo
Mes 6 Junio
Mes 7 Julio
Mes 8 Agosto
Mes 9 Septiembre
Mes 10 Octubre
Mes 11 Noviembre
Mes 12 Diciembre


Título: Re: ¿Cómo crear una función?
Publicado por: SergioT en 26 Noviembre 2020, 16:19 pm
Perfecto, ¡Ahí lo resolví! Muchísimas gracias por tu ayuda.

Un saludo, SergioT.


Título: Re: ¿Cómo crear una función?
Publicado por: @XSStringManolo en 26 Noviembre 2020, 16:49 pm
Tienes numerosos fallos en la función.

 El tipo del que declares la función es el tipo de dato que tiene que retornar la función. Ej:
Código
  1. string nombre() {
  2.  /* haces lo que quieras con tu función */
  3.  string nombre = "Paco";
  4.  return nombre;
  5. }
Para llamar a esta función desde otra, por ejemplo main solo necesitas usar el identificador y los paréntesis (no repitas el tipo que retorna la función). En este caso no tiene parámetros la función:
Código
  1. int main() {
  2.  cout << nombre() << endl;
  3.  return 0;
  4. }

Si no quieres que se retorne nada puedes declarar la función como void:
Código
  1. void saludar() {
  2.  cout << "Hola Paco" << endl;
  3. }
  4.  
  5. int main() {
  6.  saludar();
  7.  return 0;
  8. }

Lo usual es hacer que las funciones sean puras, esto significa que se pueda reusar para por ejemplo imprimir distintos nombres en lugar de solo saludar a paco:
Código
  1. void saludar(string nombre) {
  2.  cout << "Hola " << nombre << endl;
  3. }
  4.  
  5. int main() {
  6.  string nombre1 = "Paco";
  7.  string nombre2 = "Lucia";
  8.  saludar(nombre1);
  9.  saludar(nombre2);
  10.  
  11.  return 0;
  12. }

Para que pueden ser útiles las funciones que retornan un tipo? Por ejemplo para unir un vector (es un array que aumenta su tamaño automáticamente):
Código
  1. #include <string>
  2. #include <vector>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. string unir(vector<string> texto, string remplazo) {
  8.  string variableAuxiliar = "";
  9.  for (int i = 0; i < texto.size(); ++i) {
  10.    if (i + 1 != texto.size()) {
  11.      variableAuxiliar += texto[i] + remplazo;
  12.    } else {
  13.      variableAuxiliar += texto[i];
  14.    }
  15.  }
  16.  return variableAuxiliar;
  17. }
  18.  
  19. int main() {
  20.  vector<string> meses = { "enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre" };
  21.  string mesesSeparadosPorGuiones = unir(meses, "-");
  22.  cout << "Meses:" << mesesSeparadosPorGuiones << endl << endl;
  23.  
  24.  cout << "Meses separados por saltos de lineas:" << unir(meses, "\n") << endl;
  25.  return 0;
  26. }

Como ves la llamada a la función unir(vector, "remplazo") esremplazada por el valor que retorna. Asique puedes usarlo desde la función cout, como asignación de valor de un string o en cualquier otro lugar que tenga sentido meter un string, incluso en parámetros de otras funciones.
Entonces podrías hacer algo como:
Código
  1. void imprimir(string cualquierTexto) {
  2.  cout << "El texto introducido es:" << cualquierTexto << endl;
  3. }
  4.  
  5. int main() {
  6.  string saludo = "Hola Paco";
  7.  imprimir(saludo);
  8.  imprimir( unir(meses, "-") );
  9.  return 0;
  10. }

Al poder hacer esto se puede hacer recursividad. Es decir, una llamada que retorna un tipo, si uno de los parámetros es de ese tipo, se puede llamar a si misma.
unir(otroVector, unir(meses, "-") );
Es forma de usar funciones de forma recursiva sirve para conseguir el mismo efecto que con un bucle for o un while. Busca sobre el tema si te interesa.

También hay otro tipo de funciones que se llaman lambdas que son funciones pequeñas que no hace falta que declares fuera de main. Tiene sentido utilizarlas si es para hacer algo que no vas a volver a hacer en el futuro. Puedes echarles un ojo.