Hola Soy nuevo[DUDA]

Iniciado por mewto2014, 7 Febrero 2014, 18:40 PM

0 Miembros y 2 Visitantes están viendo este tema.

mewto2014

hola muchachos estoy estudiando la carrera de ingeniera a computacion y como ven soy nuevo solo queria saber que libros me recomiendan leer se lo basico , basico como programas chicos y al verdad los profes ya quieren que ya sepamos y lo basico se me estropea un poco o se me confunden

en fin muchas gracias manejo c .

y si me pueden ayudar en esto se los agradeceria:
1° que es una funcion?

segun lei es una forma de separa el programa por partes no? para llamarla cuando la necesites por ejemplo:

void hola();
{
printf("Hola usuario");
}


main()
{
hola();
}

estoy bien en este concepto?

y como son las funciones de paso x valor y funciones con para metros/sin parametros?

segun lei es lo mismo como lo anterior no???

gracias


vangodp

#1
No solo para separar el código.
printf("Hola usuario"); es una función. Estas usando la función printf() que imprime por pantalla la cadena de texto "Hola Usuario"

Algunas funciones pueden ser sencillas pero otras pueden ser muy muy complejas, llegando a superar con crece lo que puede contener en main.

Tu imaginación es el limite.

Una función hace algo.
Puede imprimir algo, o bien calcular números o muchas otras cosas.
;)
main() también es una funcion

main es un programa(principal), y a las demás funciones se les dice subprogramas.
Programas pueden llamar a subprogramas y a su vez subprogramas pueden llamar a otros subprogramas.
Todos juntos componen un programa(conjunto de programas y subprogramas) mas complejo.

Has usado una función(subprograma) dentro de otra ;)

leosansan

Cita de: mewto2014 en  7 Febrero 2014, 18:40 PM
..........................................................

y si me pueden ayudar en esto se los agradecería:
1° que es una función?

según leí es una forma de separa el programa por partes no? para llamarla cuando la necesites por ejemplo:

void hola();
{
printf("Hola usuario");
}


main()
{
hola();
}

estoy bien en este concepto?

.....................................


En esencia ese es el concepto de función: porción de un programa que ejecuta una determinada tarea o tareas. Es una forma de hacer el programa modular, esto es, por partes o trozos  de forma que, por ejemplo,  distintos programadores se pudieran encargar cada uno de una parte o sencillamente que sea más fácil su control y/o corrección.

En el ejemplo que pones te falta:

* determinar el tipo de función que es main: int. Cuestiones del estándar de C.

* Y en consecuencia, al ser int debe devolver un int, return 0 para indicar que todo ha ido bien.


Cita de: mewto2014 en  7 Febrero 2014, 18:40 PM

y como son las funciones de paso x valor y funciones con para metros/sin parámetros?

según leí es lo mismo como lo anterior no???


Igual que una imagen vale más que mil palabras, espero que este ejemplo te aclare el uso de parámetros, teniendo en cuenta que tú ya has puesto un ejemplo sin parámetros:

Código (cpp) [Seleccionar]

#include <stdio.h>
void hola(char a[10], int num);

int main(){
char nombre[10]="leosansan";
int numero=10;
  hola(nombre,numero);
  return 0;
}

void hola(char a[10], int num){
  printf("Hola usuario %s eres un %d.",a,num);
}


Fíjate además que una cosa es "presentar" o declarar una función:

Código (cpp) [Seleccionar]
void hola(char a[10], int num);

y otra cosa es el "cuerpo" de la función o función propiamente dicho:

Código (cpp) [Seleccionar]
void hola(char a[10], int num){
  printf("Hola usuario %s eres un %d",a,num);
}


¡¡¡¡ Saluditos! ..... !!!!



xoker

Buenas, tal como te comentan eso es una funcion, sobre el paso por referencia, valor, parametros y demas, te dejo aqui un video que hice yo mismo hace tiempo donde se explica que es una funcion, como usarla, etc... Son unos cuantos videos, por lo que puedes ver los que quieras:

[youtube=640,360]https://www.youtube.com/watch?v=Vc37jP4hE1s&list=PLw8RQJQ8K1ySN6bVHYEpDoh-CKVkL_uOF&index=18[/youtube]

Aqui te pongo el primer video de funciones.

Un saludo.

mewto2014

muchas gracias a todos ya me empieza a clarar lagunos cosas que los profes no explican

trarare de razonarlo y correrlos en mi compilador sus ejemplos aver que tal me va seguire viendo esto gracias

Yoel Alejandro

#5
Una función es una porción de programa (le llamamos "rutina") que puede tomar argumentos de entrada, y devolver un valor de salida.

Una función que es obligatoria en cualquier programa de C es main(). Ya que estás comenzando, y para que aprendas a hacerlo bien desde el principio, te digo que cualquiera de los programas en C que vayas a hacer (espero sean muchos  :) ) deberá seguir más o menos la siguiente estructura:

Código (cpp) [Seleccionar]

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

int main( ) {

   /* aquí va lo que quieres que haga el programa */

   return 0;
}


Te explico. Las primeras tres líneas que llevan #include son para incluir las bibliotecas básicas de C, sin ellas no podrás hacer casi nada. Existen muchas bibliotecas, pero con esas tres que te indico podrás recibir datos desde el teclado, imprimir datos en la pantalla, y manipular cadenas. Luego viene el main() que como te dije es obligatorio, y el return 0. Este return es para especificar lo que devuelve (o "retorna") la por ahora única función que existe en tu programa, que main(). Generalmente en un main() se devolverá cero si el programa se ejecutó satisfactoriamente, y un valor negativo (-1 por ejemplo) si ocurrió un error durante el programa. Por último, lo que va entre un /* y un */ es un comentario de C, o sea, algo que el programador pone para explicar su programa pero que no es tomado en cuenta para generar el ejecutable.

Ahora, supón que quieres incluir una segunda función "hola" que imprima "Hola usuario" [en el argot de la informática esta típica bienvenida suele ponerse como "Hola mundo", jeje]. Pues, TODAS funciones que crees en tu programa deben ser llamadas desde la función principal main() ¿comprendes?.

Una segunda cosa que debes saber es que cualquier función que crees deberá llevar su "prototipo", por cierto antes de main(). El prototipo dice el tipo y número de argumentos de la función, así el tipo del valor de retorno si hubiera alguno. Si no lleva argumentos se escribe "void". Vamos con un ejemplo, tu función "hola" no lleva argumentos de entrada ni de salida, por ello se puede declarar:

Código (cpp) [Seleccionar]

void hola ( main );


o:

Código (cpp) [Seleccionar]

void hola ( );


sin poner nada entre los paréntesis. La primera forma es la "correcta" en C, aunque la segunda se admite. No olvides el punto y coma después de la declaración de función, así como al final de cualquier línea de instrucción de C.

Lo otro que debes hacer es escribir la definición de la función. En otras palabras, escribir el código que indique lo que tú quieres que la función haga. Eso sería, como ya lo hiciste:

Código (cpp) [Seleccionar]

void hola( void) {
   printf( "Hola mundo\n" );


pero mira que lo correcto es que pongas la definición de hola después del main(), y no antes!! Es decir, el prototipo de hola va antes de main() (los prototipos siempre son lo primer del programa después de los #include), pero la definición de cualquier función hecha por tí debe ir después de main(). Como te dije, debes acostumbrarte a hacerlo bien desde el principio para que llegues a ser un gran programador de C.

Bueno, ahora te voy a dar el código final de TODO el programa, listo para que lo compiles y lo pruebes. Debe quedar así:

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>

/* aquí prototipo de hola */
void hola( void );

/* aquí viene el main */
int main ( ) {

   hola( );
   return 0;
}

/* aquí la definición de hola */
void hola( void ) {

   printf( "Hola mundo");
}


Nota por cierto que en el código de la función hola no va ningún return porque esta función no devuelve nada.

Esta es una mini guía con la que puedes empezar, y espero leas y te instruyas para que llegues a conocer mucho de C.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

Yoel Alejandro

#6
Continuando con este mini-tutorial (considera que es apeeeeeenas una introducción al fascinante mundo de C, del cual una vez entras no quieres salir jeje), seguro ahora querrás saber cómo incluir una función que tome argumentos. Por ejemplo, quieres una función que dado "x" y dado "y" calcule "x+y" y lo devuelva al usuario. Suponemos que "x" e "y" son de tipo entero. El tema de los "tipos" es C es algo que obligatoriamente debes empezar a leer, ya que C es un lenguaje fuertemente tipado, y si esto no se maneja bien puedes tener muchos errores.

Sigamos pues, esta función que llamaremos f1 debe tener el prototipo:

Código (cpp) [Seleccionar]

int f1( int x, int y)


Esto es, toma dos argumentos de tipo entero, y devuelve un entero. Ya sabiendo esto, y habiendo entendido el ejemplo anterior, te doy el código del programa completo para que lo analices  ;-)

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
   
/* aquí prototipo de hola */
int f1( int x, int y );
 
/* aquí viene el main */
int main ( ) {
   
   int x, y, s;

   x = 3;
   y = 4;
   s = f1(x, y);
   printf( "La suma de %d y %d es: %d\n", x, y, s );
   return 0;
}
   
/* aquí la definición de f1 */
int f1( int x, int y ) {
   
  return x + y;
}


Este programa al ser ejecutado debería imprimir en pantalla el mensaje "La suma de 3 y 4 es: 7". Observa que en el main() primero hemos asignado el valor 3 a "x", y el valor 4 a "y", luego calculamos "s" como el valor devuelto por la función f1 con sus argumentos x, y; es decir, la suma x+y (que será 7).

En el printf verás unos simbolitos %d, %d, %d. Eso se llama "especificadores de control de formato". Ellos dicen que serán sustituidos por el valor de ciertas variables de tipo entero dadas al final del printf. El primer %d será sustituido por el valor del primer argumento que sigue a la cadena de control de formato dentro de printf, el cual es x. El segundo %d será sustituido por y, el tercero por s. Como ves es fácil de entender, pero ojo que hay varios especificadores de formarto aparte de %d, así como banderas de espacio, de signo, etc, que hacen de printf una función muy versátil y potente, y si la usas bien podrás escribir casi cualquier mensaje en la pantalla.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

Yoel Alejandro

Lo otro que preguntaste "parámetros pasados por valor", significa que en C todas las variables se pasan "por valor" (se pueden simular llamadas por referencia usando punteros pero ese es un tema más avanzado).

Esto quiere decir que cuando una función recibe una variable como argumento, ella saca una copia de este valor y lo usa internamente. Pero el valor externo de la varible queda sin alterar. En C existen distintos "ámbitos" o espacio de trabajo, y cada función tiene su espacio de trabajo privado lo cual significa que las variables dentro del cuerpo de una función son locales, o sea, la función en cuestión es la única que las ve y nadie más.

Vamos con un ejemplo. Tienes una función f la cual toma una variable x como argumento y hace lo siguiente:

Código (cpp) [Seleccionar]

void f( int x ) {

    x = x + 1;
}


es decir, incrementa su valor en una unidad. Ahora, esa función va dentro de un main donde existe la variable x:

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
     
/* aquí prototipo de f */
int f( int x, int y );
     
/* aquí viene el main */
int main ( ) {
   
   int x;
     
   x = 2;
   f( x );    /* llamamos a la función f */
   printf( "El valor de x es: %d\n", x );
   return 0;
}
     
/* aquí la definición de f */
void f( int x ) {
     
    x = x + 1;
}


¿Qué valor de x imprime el programa al ser ejecutado? Pues, el valor 2, ¡y no 3!

Lo que ocurre es que la función f agarra la variable x le saca una "copia" y la usa en su espacio de trabajo interno. Este valor copia de x será 2, y durante el "tiempo de vida" de la función su valor es cambiado a 3. Pero al retornar la función, sus variables internas se destruyen ..... físicamente. Sí, son físicamente borradas de la memoria del programa, luego ya no existen más. Ese valor de x = 3 ya no existe más al retornar la función f por lo tanto el valor que ve printf es el valor 2 que existe dentro del aḿbito del main().

Espero haya quedado claro el tema de los parámetros por valor, y siempre ten en cuenta que las variables definidas dentro de una función tienen un ámbito local, y por lo tanto una vida temporal. Saber esto bien te evitará dolores de cabeza en el futuro.

........... Espero sigas incursionando en el apasionante mundo de C, y cualquier cosa vuelve a preguntar ........  :)
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

leosansan

#8
Cita de: yoel_alejandro en  8 Febrero 2014, 03:31 AM
Lo otro que preguntaste "parámetros pasados por valor", significa que en C todas las variables se pasan "por valor" (se pueden simular llamadas por referencia usando punteros pero ese es un tema más avanzado).


Tampoco es para tanto.

El caso es que si quieres usar una función y pasar le un valor y en dicha función modificar el valor de dicha variable y usar ese nuevo valor en la función original, lo que hay que hacer es pasar le la dirección donde se almacena la variable en cuestión, y esto se consigue anteponiendo le a la variable el símbolo "&" que indica que se trata de la dirección donde se almacena la variable y que se está en disposición de cambiar su valor:


Código (cpp) [Seleccionar]
incrementa_x( &x );

Y ¿cómo diferencia la función el que se está pasando la dirección de la variable en lugar de su valor?. Con el uso de un " * " :

Código (cpp) [Seleccionar]
void incrementa_x( int *x )

Siguiendo con el ejemplo que tan claramente expuso yoel_alejandro, en este caso sería:

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>

/* aquí prototipo de la funcion incrementa_x */
void incrementa_x( int *x );

/* aquí viene el main */
int main ( ) {

  int x;
  x = 2;
  incrementa_x( &x );    /* llamamos a la función incrementa_x */
  printf( "El valor de x es: %d\n", x );
  return 0;
}

/* aquí la funcion incrementa_x */
void incrementa_x( int *x ) {

   *x = *x + 1;
}


Ahora el valor que imprimes en main para la variable x es 3: ¡¡¡la función sí ha modificado el valor que le pasé!!!.

Por cierto, es aconsejable poner nombres con significado a las funciones, que indiquen mínimamente lo que hacen, si no al revisar el código hay que echarle mucha imaginación para ver qué diablos hace la función.


¡¡¡¡ Saluditos! ..... !!!!