¿Cómo crear una función?

Iniciado por SergioT, 26 Noviembre 2020, 15:25 PM

0 Miembros y 1 Visitante están viendo este tema.

SergioT

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.

#include <stdio.h>
#include <iostream>
#include <string>
#include <conio.h>
#include <stdlib.h>
using namespace std;
string meses(string)
{
string meses[12];

meses[1]="Enero";
meses[2]="Febrero";
meses[3]="Marzo";
meses[4]="Abril";
meses[5]="Mayo";
meses[6]="Junio";
meses[7]="Julio";
meses[8]="Agosto";
meses[9]="Septiembre";
meses[10]="Octubre";
meses[11]="Noviembre";
meses[12]="Diciembre";

}
main ()
{
string meses(string);
int dulces[12], Totaldulces;
char i, j;

cout<<"Bienvenidos a la fabrica de produccion."<<endl;
for (i=1;i>=12;i++)
{
for (j=1;j>=12;j++)
{
cout<<"Ingrese la cantidad de dulces producidos el mes " << meses[j] <<endl;
cin>>dulces[i];
Totaldulces=Totaldulces+dulces[i];
cout<<"El acumulo es de: $"<<Totaldulces;
}
}
cout<<"El monto total producido para los dulces es de: $"<<Totaldulces<<endl;

;}





Mod: GeSHi obligatorio.

AlbertoBSD

Antes que nada los arreglos se empiezan a contar desde 0.


//Fuera de main
cons char *meses[12] = {"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};

//En main
for(int i = 0 ; i < 12; i++){
cout<<"Mes "<<i+1<<" "<<meses[i]<<endl;
}


Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

SergioT

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.

AlbertoBSD

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 (cpp) [Seleccionar]
#include<stdio.h>
#include <iostream>
#include <string>
using namespace std;
//Fuera de main
string meses[12] = {"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};

int main () {
for(int i = 0 ; i < 12; i++){
cout<<"Mes "<<i+1<<" "<<meses[i]<<endl;
}
}


Lo ejecuto y muestra

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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

SergioT

Perfecto, ¡Ahí lo resolví! Muchísimas gracias por tu ayuda.

Un saludo, SergioT.

@XSStringManolo

#5
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 (cpp) [Seleccionar]
string nombre() {
 /* haces lo que quieras con tu función */
 string nombre = "Paco";
 return nombre;
}

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 (cpp) [Seleccionar]
int main() {
 cout << nombre() << endl;
 return 0;
}


Si no quieres que se retorne nada puedes declarar la función como void:
Código (cpp) [Seleccionar]
void saludar() {
 cout << "Hola Paco" << endl;
}

int main() {
 saludar();
 return 0;
}


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 (cpp) [Seleccionar]
void saludar(string nombre) {
 cout << "Hola " << nombre << endl;
}

int main() {
 string nombre1 = "Paco";
 string nombre2 = "Lucia";
 saludar(nombre1);
 saludar(nombre2);
 
 return 0;
}


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 (cpp) [Seleccionar]
#include <string>
#include <vector>
#include <iostream>

using namespace std;

string unir(vector<string> texto, string remplazo) {
 string variableAuxiliar = "";
 for (int i = 0; i < texto.size(); ++i) {
   if (i + 1 != texto.size()) {
     variableAuxiliar += texto[i] + remplazo;
   } else {
     variableAuxiliar += texto[i];
   }
 }
 return variableAuxiliar;
}

int main() {
 vector<string> meses = { "enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre" };
 string mesesSeparadosPorGuiones = unir(meses, "-");
 cout << "Meses:" << mesesSeparadosPorGuiones << endl << endl;

 cout << "Meses separados por saltos de lineas:" << unir(meses, "\n") << endl;
 return 0;
}


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 (cpp) [Seleccionar]
void imprimir(string cualquierTexto) {
 cout << "El texto introducido es:" << cualquierTexto << endl;
}

int main() {
 string saludo = "Hola Paco";
 imprimir(saludo);
 imprimir( unir(meses, "-") );
 return 0;
}


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.