Pasar arreglos a una función en C

Por default, los arrreglos en C se pasan a una función como referencia y no como valor. Esto significa que todas las modificaciones que hagamos dentro de la función en C al arreglo que recibimos como parámetro, realmente se realizan en el arreglo original que se utilizó como argumento al momento de llamar a la función.

Al escribir una función en C, la forma de indicar que uno de los parámetros que se va a recibir es un arreglo de una dimensión, es decir de que tipo va a ser el arreglo y el nombre con el cual vamos a manipular dicho arreglo dentro de nuestra función seguido de corchetes que abren y cierran; nuestra función también debe recibir un segundo parámetro que nos indique el tamaño del arreglo, o dicho de otra forma, el número de elementos de los que consta nuestro arreglo, recordemos que como el arreglo se pasa a la función como referencia, lo que esta recibiendo la función en realidad es un apuntador al primer elemento del arreglo, pero no sabe en donde termina el arreglo, por eso es necesario que la función también reciba como parámetro el número de elementos del arreglo.

Por ejemplo, el prototipo de una función en C que va a regresar un entero y va a recibir un arreglo de 10 elementos de tipo entero sería algo asi:

int MiFuncion(int mi_arreglo[], int num_elemetos);

Para llamar a la función anterior, se pone como primer argumento el nombre del arreglo (sin corcehetes) y como segundo argumento el número de elementos del arreglo. Supongamos que tenemos un arreglo de 10 elementos de tipo entero llamado numeros y queremos guardar en una variable llamada «x» el valor que nos regresa la función «MiFuncion» al llamarla pasandole como argumentos el arreglo «numeros», haríamos algo como esto

x = MiFuncion(numeros, 10);

El siguiente programa solicita al usuario que ingrese 10 números de tipo entero y los almacena en un arreglo; después le pide que introduzca un número para que busque su posición dentro del arreglo..

El programa utiliza una función llamada BuscaNumero que recibe como parámetros el arreglo con los 10 números capturados, el número de elementos del arreglo (en este caso 10) y el número del cual se desea saber su posición dentro del arreglo.. La función regresa -1 si el número que se busca no se encuentra en el arreglo y en caso contrario, regresa la primera posición del arreglo que contiene dicho número.

El programa también utiliza una función llamada MuestraArreglo que no regresa valor alguno, sólo recibe como parámetros el arreglo y el número de elementos. Esta función imprime en pantalla los elementos del arreglo separados por un tabulador.

#include <stdio.h>

int BuscaNumero(int valores[], int tamanio, int busca)
{
int i=0, posicion=-1;

do
  {
   if (valores[i]==busca)
       posicion=i;
   else
       ++i;
  }
while(i<tamanio && posicion<0);

return posicion;
}

void MuestraArreglo(int valores[], int tamanio)
{
 int i=0;

 for (i=0; i<tamanio; ++i)
      printf("%d\t",valores[i]);
 printf("\n");
}

int main()
{
 int x=0, numero=0, posicion=0;
 int ar_numeros[10] = {0};

 printf("Introduzca los 10 numeros enteros que se almacenaran en el arreglo\n");
 for (x=0; x<10; ++x)
     {
      printf("Valor para el elemento [%d]: ", x);
      scanf("%d",&ar_numeros[x]);
     }
 printf("\n");

 printf("Introduzca el número que desea buscar en el arreglo\n");
 scanf("%d",&numero);
 printf("\n");
 MuestraArreglo(ar_numeros,10);

 posicion=BuscaNumero(ar_numeros,10,numero);
 if (posicion != -1)
     printf("El número %d está en la posición %d del arreglo\n",numero, posicion);
 else
     printf("El número %d no está en el arreglo\n",numero);

 return 0;
}

Para pasar a una función un arreglo de dos dimensiones, si debemos indicar el tamaño de la segunda dimensión del arreglo

Ejemplo:int MiFuncion(int mi_arreglo[][5], int num_elementos);

El siguiente programa le pide al usuario que introduzca 9 números y los almacena en un arreglo de dos dimensiones, en este caso una matriz de 3×3; posteriormente utiliza una función llamada ImprimeMatriz para mostrar como quedaron almacenados los números en la matriz. Dicha función recibe como parámetros, la matriz de 3×3 y el tamaño de la primera dimensión (normalmente la primera dimensión son filas y la segunda dimensión columnas).

#include <stdio.h>

void ImprimeMatriz(int m[][3], int filas)
{
 int i=0,j=0;

 for (i=0; i<filas; ++i)
     {
      for (j=0; j<3; ++j)
          {
           printf("%d ",m[i][j]);
          }
      printf("\n");
     }
}

int main()
{
 int x=0,y=0;
 int matriz[3][3] = {{0},{0},{0}};

 printf("Introduzca los valores para la matriz\n");
 for (x=0; x<3; ++x)
     {
      for (y=0; y<3; ++y)
          {
           printf("Valor para el elemento [%d][%d]: ", x, y);
           scanf("%d",&matriz[x][y]);
          }
      printf("\n");
     }

 printf("Matriz\n");
 ImprimeMatriz(matriz, 3);

 return 0;
}

Etiquetas: ,

84 respuestas to “Pasar arreglos a una función en C”

  1. samuel ramos Says:

    void ImprimeMatriz(int m[][3], int filas)

    Y si en vez de poner el 3 pusiese una variable como por ejemplo columnas que habría que hacer?

    • rtmex Says:

      C no maneja arreglos dinámicos, así que si quieres usar una variable como tu lo planteas, tendrías que haberla declarado antes y haberle asignado un valor. Por ejemplo:

      int columnas=3;
      void ImprimeMatriz(int m[][columnas], int filas)
      {
       int i=0,j=0;
       
       for (i=0; i<filas; ++i)
           {
            for (j=0; j<columnas; ++j)
                {
                 printf("%d ",m[i][j]);
                }
            printf("\n");
           }
      }
      
  2. Skratch bit Says:

    y si quiero que la funcion reciba un arreglo, trabaje en el, por ejemplo ordenarlo y que retorne un arreglo, como se podria hacer?, usando punteros?, porque lo hago pero el primer elemento me aparece un numero extraño, creo que es la direccion del primer elemento…. por ejemplo: el arreglo son 3, 2, 2, 0 6. al pasar por la funcion queda: 5451440, 2, 2, 3, 6. me elimina el primer elemento. Como podria solucionar eso?

  3. Novato Says:

    Muchas gracias por los ejemplos. Un saludo.

  4. héctor Says:

    buenísimo me ayudó mucho, mil gracias

  5. jesus salas Says:

    y si quiero q por medio de una función permita buscar un elemento y determinar a través de un mensaje si existe ó no dentro del arreglo.

    • rtmex Says:

      Hola

      Eso es muy sencillo, sólo modificas la función para que ya no regrese la posición en caso de que el elemento se encuentre en el arreglo y -1 en caso de que no se encuentre, sino que ahora no regresará valor alguno, sino que imprimirá un mensaje indicando si se encuentra o no el elemento en el arreglo.

      void BuscaNumero(int valores[], int tamanio, int busca)
      {
      int i=0, posicion=-1;
       
      do
        {
         if (valores[i]==busca)
             posicion=i;
         else
             ++i;
        }
      while(i<tamanio && posicion<0);
      
      if (posicion >= 0) 
          printf("El elemento se encuentra en el arreglo");
      else
          printf("El elemento no se encuentra en el arreglo");
      }
      
  6. nominado Says:

    exelente!

  7. Matias Vallejo Says:

    hola, cómo me ayudaron tus ejemplos, podrías ayudarme con este:
    2. Elabore un programa el cual invoque a una función que tome como parámetro de entrada el contenido de una variable string (LETRAS) y regrese al punto de llamada el número de palabras diferentes de la variable leída. Considere que las palabras están separadas por un espacio en blanco.

    • rtmex Says:

      Ok, se ve que es una tarea, como ya mencioné en algún otro post, este blog no es para hacerle la tarea a algún estudiante. Así que lo que voy a hacer es indicarte que instrucciones puedes usar para hacer lo que te piden y tú tendrás que estudiarlas y hacer tú programa.

      Debido a que están hablando de una «variable string» y en C no existe el tipo string (para manejar cadenas se hace un arreglo de tipo char), supongo que entónces están hablando de C++ (ahí si existe el tipo String).
      Lo que te piden lo puedes hacer utilizando la función find. Ahora sólo para estar claros, el texto dice «regrese al punto de llamada el número de palabras diferentes de la variable leída»; esto me indica que el comportamiento de la función que te piden que hagas en tú programa debe ser el siguiente:

      Caso 1
      La variable tipo String contiene el texto «palabra1 palabra2 palabra3»
      Tu función debería regresar el número 3, ya que la variable contiene 3 palabras diferentes

      Caso 2
      La variable tipo String contiene el texto «palabra1 palabra2 palabra1 palabra3 palabra4 palabra2»
      Tu función debería regresar el número 4, ya que la variable contiene 4 palabras diferentes debido a que palabra1 y palabra2 aparecen 2 veces, y el ejercicio dice palabras diferentes

      Espero esto te sirva.

      Saludos

  8. andres Says:

    al momento de ingresar 2 veces o mas un numero ,quisiera que me lo muestre las posiciones de este ,gracias

  9. WSQ10 Lists – Learning to program 2016 Says:

    […] Array in a function […]

  10. espitia Says:

    Como almaceno en un vector el nombre, el sexo y la edad de un grupo de personas e imprimir lo siguiente:

    a) Promedio de edades.
    b) Cuantas mujeres existen
    c) Cuantos hombres existen
    c) Los nombres de todas las personas que tienen la menor edad

    • rtmex Says:

      Puedes hacer una matriz de 3 x n (3 columnas x n renglones o filas), una columna para el nombre, una para el sexo y otra para la edad; la edad la tendrás que almacenar como char (en C no puedes almacenar datos de diferentes tipos en una misma matriz) y convertirlo a algún tipo numérico para hacer tus operaciones como el promedio de edades, ordenar con base en la edad, etc. N es el número máximo de registros (personas) que podrá admitir tu matriz.

      Si lo quieres hacer en C++ en lugar de C, hay mejores soluciones, te recomiendo que leas este post que escribí para que te des una idea Usando cadenas, vectores y estructuras con la STL

      Saludos

  11. david retiz Says:

    y si quiero que el usuario ingrese el tamaño de la matriz, y que tambien busque un numero y diga en que posicion de matriz esta ?

    • rtmex Says:

      En C no hay arreglos dinámicos, así que el tamaño de la matriz tiene que estar determinado desde que declaras la matriz.

  12. Nancy López Says:

    y si quiero hacer lo del primer programa pero con caracteres?

  13. Milton Says:

    interesante. se puede crear funciones de tal manera que al ingresar por teclado un string digamos «efecto1» lo evalue y luego devuelva algún entero para entrar a un switch y ejecutar lo que corresponda? entiendo que el switch no acepta strings.

    gracias.
    Milton

  14. Miguel Angel Says:

    Buenas tardes estoy programando en C y tengo esta duda, si tengo un puntero inicializado al primer elemento de un vector y quiero ordenarlo con funciones como puedo regresar el puntero o vector ya ordenado por las funciones? espero alguien me pueda ayudar.

  15. Hanel Says:

    Tengo un codigo donde primero lleno una matriz y luego los valores de las posiciones pares e impares deban guardarse en vectores diferentes y a cada vector hay que imprimir la suma de los valores pero al hacerlo no me aparecen unos números extraños que no corresponden al valor de la suma cuál podría ser el error que se está cometiendo?

  16. Gabriel Gurrero Says:

    buenas tengo dudas en una es que tengo que poner 10 numeros de menor a mayor en sus pociones y que mar que el numero y posición del numero pero desde en medio marca la posiciones sabe como es

    • rtmex Says:

      Hola Gabriel, no entendí eso de que «pero desde en medio marca la posiciones». Además necesitas dar más información, los números los va a ir capturando el usuario o ya los tienes en otro arreglo? Hay varios métodos de ordenación como quick sort, buble sort, etc.

  17. Alejandro Alvarez Castañeda Says:

    Tengo unas dudas con un programa que estoy haciendo un proyecto y debo separarlo en funciones entonces tengo una funcion de lectura, hasta ahi todo perfecto el problema es en la funcion de impresion ya que lo que estoy leyendo son datos que van dentro de un arreglo y nose como pasar esos datos de ese arreglo a la funcion de imprimir

    1. tengo una estructura y dentro de esa estructura tengo los arreglos
    2. la funcion main donde van las funciones que tengo que realizar
    3. la funcion de leer
    4. la funcion de imprimir

    parte de mi codigo es asi:

    int registro()
    {
    struct alumnos a[50];
    int q;
    int c;
    int i=0;
    int ca=0;
    int op3;

    printf(«Matricula: «); scanf(«%d», &a[i].matricula); fflush(stdin);
    printf(«\nNombre: «); gets(a[i].nombre); fflush(stdin);
    printf(«\nApellido: «); gets(a[i].apellido); fflush(stdin);
    printf(«\nCorreo: «); gets(a[i].correo); fflush(stdin);
    printf(«\nCelular»); gets(a[i].celular); fflush(stdin);
    for(q=0;q<6;q++)
    {
    printf("\n Cal %d del alumno %d: ",q,i); scanf("%d",&a[i].cal[q]); fflush(stdin);
    a[i].cal[6]=((a[i].cal[0]*.20)+(a[i].cal[1]*.20)+(a[i].cal[2]*.20)+(a[i].cal[3]*.20)+(a[i].cal[4]*.10)+(a[i].cal[5]*.10));
    }
    ca=ca+1;
    for(i=0;i<ca;i++)
    {
    for(q=0;q<7;q++)
    {
    printf ("cal %d del alumno %d: ",q,i); printf("%d\n", a[i].cal[q]);
    }
    }
    printf("para regresar al menu presione 1: "); scanf("%d",&op3);
    system("cls");
    return ca;

    }
    void impresion_datos()
    {
    struct alumnos a[50];
    int x,i;
    printf("Matricula\t\tNombre\t\t\tApellido\t\tCelular\t\tCorreo");
    for(i=0;i<x;i++)
    {
    printf("%d\t\t",a[i].matricula);
    printf("%d\t\t",a[i].nombre);
    printf("%d\t\t",a[i].apellido);
    printf("%d\t\t",a[i].celular);
    printf("%d\t\t",a[i].correo);
    }

    en la impresion debo estar muy mal pero no se como mandar los datos de leer a la funcion de imprimir

    espero me puedaas ayudar

    • rtmex Says:

      El problema que tienes que es dentro de la función registro defines un arreglo a que no es visible fuera de esa función, es decir, es un arreglo local. Y en la función impresion_datos defines otro arreglo que aunque se llama a, no es el mismo que el que definiste en la función registro; ese arreglo es un arreglo local dentro de la función impresion_datos

      Hay dos posibles soluciones:
      1. Define el arreglo a como una variable global, es decir antes de la función main, y ya no definas nuevamente el arreglo ni en la función registro ni en la función impresion_datos.
      2. Puedes definir el arreglo a como variable local dentro de la función main, modificar las funciones registro e impresion_datos para que reciban como parámetro un arreglo y cuando mandes a llamar esas funciones, el arreglo que les vas a pasar como parámetro sería el arreglo a que definiste en la función main

      Saludos

  18. Alejandro Alvarez Castañeda Says:

    pero sera definir la estructura dentro de la funcion main y con eso se arreglaria??

    • rtmex Says:

      Una cosa es definir la estructura y otra cosa es crear variables que sean del tipo de la estructura que definiste. Tu estructura se llama «alumnos» y luego, defines un arreglo de 50 elementos llamado «a» en donde cada uno de los elementos del arreglo es del tipo «alumnos».
      Como te dije en el comentario anterior, el problema es que estas definiendo los arreglos dentro de las funciones registro e impresion_datos, el arreglo «a» que defines dentro de la función registro, no tiene relación con el arreglo «a» que defines dentro de la función impresion_datos.

      Pon la linea struct alumnos a[50]; antes de la función main y borra esa linea de código tanto de la función registro como de la función impresion_datos. Esto sería la solución número uno de la que hablé en mi comentario anterior

      • Alejandro Alvarez Castañeda Says:

        si, pero no se me permite poner nada en el area global
        entonces lo que quiero saber es como hacer que lo que escriba en la funcion leer, lo pueda imprimir con la funcion de impresion

      • rtmex Says:

        Entónces aplica la solución número 2 que te di :)

      • Alejandro Alvarez Castañeda Says:

        pero es que si entiendo lo que dices pero nose como escribirlo en mi programa para que lo de leer lo pueda imprimir….por eso te decia que si te podia pasar el programa completo :(

      • rtmex Says:

        El prototipo de tu función para leer los datos tendría que quedar algo como int registro(struct alumnos arreglo[], int elementos)
        El prototipo de tu función para imprimir los datos tendría que quedar algo como void impresion_datos(struct alumnos arreglo[], int elementos)

        Te pongo un ejemplo de como mandarías a llamar la función para imprimir los datos
        impresion_datos(a, 50);

      • Alejandro Alvarez Castañeda Says:

        igual en el registro ?
        quedaria:

        registro(a,50)

        para mandar los datos del registro hacia «a» del main

      • Alejandro Alvarez Castañeda Says:

        Matricula Nombre Apellido Celular Correo12312 6477828 6477878 6477978 6477928 0 6478024 6478074 6478174 6478124 0 6478220 6478270 6478370 6478320 32763 6478416 6478466 6478566 6478516 6478705 6478612 6478662 6478762 6478712 0 6478808 6478858 6478958 6478908 0 6479004 6479054 6479154 6479104 32763 6479200 6479250 6479350 6479300 6479984 6479396 6479446 6479546 6479496 0 6479592 6479642 6479742 6479692 10 6479788 6479838 6479938 6479888 7471220 6479984 6480034 6480134 6480084 538976288 6480180 6480230 6480330 6480280 0 6480376 6480426 6480526 6480476 2 6480572 6480622 6480722 6480672 0 6480768 6480818 6480918 6480868 6481120 6480964 6481014 6481114 6481064 1 6481160 6481210 6481310 6481260 0 6481356 6481406 6481506 6481456 0 6481552 6481602 6481702 6481652 1 6481748 6481798 6481898 6481848 0 6481944 6481994 6482094 6482044 3473460 6482140 6482190 6482290 6482240 538189843 6482336 6482386 6482486 6482436 5374168 6482532 6482582 6482682 6482632 5439570 6482728 6482778 6482878 6482828 64 6482924 6482974 6483074 6483024 0 6483120 6483170 6483270 6483220 1574896 6483316 6483366 6483466 6483416 0 6483512 6483562 6483662 6483612 1375731794 6483708 6483758 6483858 6483808 32763 6483904 6483954 6484054 6484004 160 6484100 6484150 6484250 6484200 0 6484296 6484346 6484446 6484396 6484564 6484492 6484542 6484642 6484592 0 6484688 6484738 6484838 6484788 143423664 6484884 6484934 6485034 6484984 56140 6485080 6485130 6485230 6485180 187998870 6485276 6485326 6485426 6485376 0 6485472 6485522 6485622 6485572 0 6485668 6485718 6485818 6485768 0 6485864 6485914 6486014 6485964 0 6486060 6486110 6486210 6486160 0 6486256 6486306 6486406 6486356 75 6486452 6486502 6486602 6486552 0 6486648 6486698 6486798 6486748 1224736841 6486844 6486894 6486994 6486944 0 6487040 6487090 6487190 6487140 1572864 6487236 6487286 6487386 6487336 0 6487432 6487482 6487582 6487532 4199739 6487628 6487678 6487778 6487728 0 6487824 6487874 6487974 6487924 0 6488020 6488070 6488170 6488120
        ——————————–
        Process exited after 25.53 seconds with return value 3221225477
        Presione una tecla para continuar . . .

        me imprime estas cosas :(
        en serio necesito tu ayuda

      • rtmex Says:

        Obviamente en el código dentro de las funciones debes reemplazar a por arreglo, es decir, en lugar de scanf(“%d”, &a[i].matricula); debes poner scanf(“%d”, &arreglo[i].matricula);

        Debes volver a leer el artículo detenidamente, analizarlo y entenderlo, con eso y con los comentarios que hemos intercambiado tienes todo lo que necesitas. Aunque probablemente te de la impresión de que no quiero ayudarte, creeme que te ayudo más orientándote para que tú mismo lo resuelvas que haciendote el código, «si quieres ayudar a alguien con hambre no le des pescado, enseñale a pescar».

      • Alejandro Alvarez Castañeda Says:

        si, entiendo que quieras ayudarme pero en serio estoy desesperado jaja no es porque piense eso, es que lo necesito completo para mañana y esto es solo una parte de todo lo que falta

      • Alejandro Alvarez Castañeda Says:

        te mandare el codigo una vez mas, solo necesito que me digas cual es el error :(

        #include
        #include
        struct alumnos
        {
        int matricula;
        char nombre[50];
        char apellido[50];
        char correo[50];
        char celular[12];
        int cal[7];
        };
        int registro(struct alumnos b[], int elementos);
        void impresion_datos(struct alumnos b[], int elementos);
        int main()
        {
        struct alumnos a[50];
        int op,z=0;
        while(z<50)
        {
        printf("teclee la opcion que desea realizar: ");
        printf("\n1. Registrar los datos del alumno\n2.Modificar alumno\n3. Eliminar alumno\n4. Imprimir los datos de los alumnos\n5. Imprimir calificaciones de los alumnos\n6. Salir");
        scanf("%d",&op);
        system("cls");
        switch (op)
        {
        case 1: registro(a,50);break;
        case 2: impresion_datos(a,50); break;
        }
        z++;
        }
        }
        int registro(struct alumnos b[], int elementos)
        {
        int q;
        int c;
        int i=0;
        int ca=0;
        int op3;

        printf("Matricula: "); scanf("%d", &b[i].matricula); fflush(stdin);
        printf("\nNombre: "); gets(b[i].nombre); fflush(stdin);
        printf("\nApellido: "); gets(b[i].apellido); fflush(stdin);
        printf("\nCorreo: "); gets(b[i].correo); fflush(stdin);
        printf("\nCelular"); gets(b[i].celular); fflush(stdin);
        for(q=0;q<6;q++)
        {
        printf("\n Cal %d del alumno %d: ",q,i); scanf("%d",&b[i].cal[q]); fflush(stdin);
        b[i].cal[6]=((b[i].cal[0]*.20)+(b[i].cal[1]*.20)+(b[i].cal[2]*.20)+(b[i].cal[3]*.20)+(b[i].cal[4]*.10)+(b[i].cal[5]*.10));
        }
        ca=ca+1;
        for(i=0;i<ca;i++)
        {
        for(q=0;q<7;q++)
        {
        printf ("cal %d del alumno %d: ",q,i); printf("%d\n", b[i].cal[q]);
        }
        }
        printf("para regresar al menu presione 1: "); scanf("%d",&op3);
        system("cls");
        }
        void impresion_datos(struct alumnos b[], int elementos)
        {
        int i;
        printf("Matricula\t\tNombre\t\t\tApellido\t\tCelular\t\tCorreo");
        for(i=0;i<50;i++)
        {
        printf("%d\t\t",b[i].matricula);
        printf("%d\t\t",b[i].nombre);
        printf("%d\t\t",b[i].apellido);
        printf("%d\t\t",b[i].celular);
        printf("%d\t\t",b[i].correo);
        }
        }

      • rtmex Says:

        Ok, te recomiendo sustituir for(i=0;i<50;i++) por for(i=0;i<elementos;i++)
        Tu principal problema está cuando mandas a imprimir los datos, estas poniendo printf("%d\t\t",b[i].nombre); y la variable nombre es un arreglo de chars, por lo tanto debes poner printf("%s\t\t",b[i].nombre);
        Lo mismo con las otras variables de la estructura.
        Saludos

      • Alejandro Alvarez Castañeda Says:

        bueno ya arregle eso y ahora me imprime unos simbolos raros, si me impime lo que ingrese pero despues de eso unos simbolos….
        perdon por abrumarte con tantas dudas, pero es un trabajo importante

        y otra cosa, sabes que puedo poner para que se impriman de mayor a menor por matricula?? es que no se que hacer para ordenar los datos

      • rtmex Says:

        Eso es porque en tu función registro, sólo capturas la información para el primer elemento de los 50 del arreglo, entónces, los otros 49 elementos del arreglo apuntan a direcciones de memoria que quien sabe que contengan; y en tu función impresion_datos si imprimes los 50 elementos. La solución es que en tu finción registro hagas un ciclo para capturar información para los 50 elementos del arreglo, no sólo para el primero

        En cuanto a lo de ordenarlos, hay muchos métodos de ordenación, quick sort, buble sort, etc. investígalos y utiliza uno

      • Alejandro Alvarez Castañeda Says:

        pero y si el usuario no quiere poner 50 y pone solo 3 por ejemplo??

      • rtmex Says:

        Entónces primero debes inicializar las matrículas con un valor que no es válido como matrícula, por ejemplo -1. Y en el ciclo en donde imprimes los datos, antes de imprimir, checas si el valor del campo matricula es diferente de -1; así sólo imprimes la información de los elementos que tienen matriculas válidas (es decir, que el usuario capturó)

      • Alejandro Alvarez Castañeda Says:

        nono, no me refiero a eso si no a que si el ya no quiere ingresar mas datos, ya ves que es para 50 registros pero y si solo se desean hacer 3??

        y ahora tengo otro problema, solo me imprime el ultimo que ingrese :(

        no tendras otro medio para ayudarme y mandarte fotos del programa porque en serio necesito ayuda y no me ha salido poder hacerlo yo solo

      • rtmex Says:

        En la función registro haces un ciclo, y pones un aviso al usuario cada vez que capture la matricula que diga algo como Matricula (0 para terminar):, y checas si el usuario ingresa 0, significa que ya no quiere capturar más registros, entonces sales del ciclo, es decir, ya no capturas ese registro ni los que falten. Si el usuario no ingresa cero, capturas la matricula en el registro correspondiente y pides los otros datos (nombre, apellido, etc.)

      • Alejandro Alvarez Castañeda Says:

        eso hice pero ahora al momento de imprimir solo me imprime el ultimo que registre

  19. Alejandro Alvarez Castañeda Says:

    disculpa te podria pasar todo el codigo para saber que hacer porque trato de mandar los arreglos pero no me funciona aun

  20. laura valentina Says:

    Hola, cómo me ayudaron tus ejemplos, podrías ayudarme con estos:

    1. Solicite o ingrese 25 valores, con notas de 0 a 5 (con un decimal, por ejemplo 5.0 y
    3.5) que ingrese el usuario a través del teclado o lo genere el sistema, luego imprimir el
    promedio y decir si aprobó o no (dichas notas mayores o iguales a 3.5)

    2.Crear un programa que capture una cadena de texto con una longitud no mayor a 40
    caracteres, luego en un mensaje imprimir solo las vocales y en otro mensaje imprimir sólo las
    consonantes.

    3.Realizar una función que reciba como parámetro una frase cualquiera que ingrese el usuario, la
    función deberá retornar dicha frase al revés

    4. Un Supermercado efectúa durante el mes 15 ventas a distintos clientes, el supermercado
    desea tener a disposición un programa que permita capturar el precio total de dichas ventas y
    con base a eso desea saber lo siguiente:
    1. ¿Cuántas ventas fueron mayores a 550?
    2. ¿Cuántas ventas fueron mayores a 200 y menores o iguales a 550?
    3. Calcular los promedios de cada grupo (puntos a y b), es decir el promedio de las ventas
    mayores a 550, y el promedio de las ventas que están entre 200 y son menores a 550.
    4. ¿Cuáles ventas fueron mayores a 550?
    5. ¿Cuáles ventas fueron mayores a 200 y menores o iguales a 550?
    6. Imprimir por pantalla lo solicitado en los puntos anteriores

    5.Crear un programa que permita capturar, almacenar y ordenar de mayor a menor en un arreglo
    20 números enteros que ingrese el usuario a través de la consola (los números deben ser
    menores que 100), luego capturar un número por fuera del arreglo e imprimir los números del
    arreglo que sean mayores al número ingresado por fuera del arreglo

    GRACIAS.

    • rtmex Says:

      Laura: Que bueno que te hayan servido los ejemplos que he puesto en este blog. No lo tomes a mal pero no resuelvo tareas, con gusto te ayudo si tienes alguna duda concreta sobre algún tema que ya hayas investigado previamente. La única forma de aprender es investigar e intentar hacer los programas, no te desanimes.

      Todo lo que te piden no es realmente muy complicado. Te recomiendo este texto de la Universidad de Navarra «Aprenda lenguaje ANSI C como si estuviera en primero», puedes descargarlo sin costo para fines personales http://www4.tecnun.es/asignaturas/Informat1/ayudainf/aprendainf/AnsiC/leng_c.pdf

      Saludos

  21. santiago Says:

    buenas sera que me puede colaborar en pasar este codigo con funciones gracias..
    #include
    #include

    int main(int argc, char *argv[])
    {

    int i,x=0,vector[12], n=12, dato, centro,inf=0,sup=n-1;

    for (i=0;i<12;i++){
    printf("Escriba un número");
    scanf("%d",&vector[i]);
    }

    printf("Escriba el número a buscar");
    scanf("%d",&dato);

    while(inf<=sup)
    {
    centro=(sup+inf)/2;
    if (vector[centro]==dato)
    {
    printf("Existe\n");
    x=1;
    break;
    }
    else if(dato < vector [centro] )
    {
    sup=centro-1;
    }
    else
    {
    inf=centro+1;
    }
    }

    if (x==0)
    {
    printf("No existe\n");
    }

    system("PAUSE");
    return 0;

    }

  22. Gustavo Heramzky Says:

    Me ayudan con este Ejercicio? Llevo rato intentando hacerlo pero no puedo… Gracias.
    Crear
    un programa para controlar las salidas de los buses con destino a San Pedro Sula,
    Choluteca, La Ceiba, Comayagua de una central, la cual cuenta con cuatro unidades una
    para cada ruta, en el
    programa
    se le solicita al usuario el nombre, la id
    entidad, edad, y
    cuál
    de los 62 asientos desea tomar, antes de asignarle el boleto se comprobara que el
    asiento no este ocupado,
    además
    de las tareas que presente el
    menú
    :
    Transportes
    “EL Pobre

    a)Ingreso de pasajeros
    b)Listado por unida
    c)Búsquedade pasajeros por nombre
    d)Listado de asientos disponibles
    e)Total recaudado por unidad
    Para el total se cobrara el boleto según tabla a excepción
    de la tercera edad que paga un
    25% menos y los niños menores de 10 a
    ños pagan medio boleto.
    Buenos Aires
    D.150.00
    Cordoba
    D.100.00
    Chile
    D.200.00

    • rtmex Says:

      Hola Gustavo
      Definitivamente este blog no es para resolver tareas, sin embargo, algún lector tal vez te ayude, incluso yo podría ayudarte (si el tiempo me lo permite) pero generalmente las personas relacionadas con Software Libre no hacen el trabajo de los demás, para ayudarte necesitan ver que tú realmente estás intentando hacer el trabajo por tu cuenta, ¿qué has investigado? ¿cuál es exactament el problema que tienes?. Es decir, muestra el código que has hecho y explica en qué parte tienes problema, de otra forma dudo que alguien te ayude.

      La mejor forma de aprender es haciendo las cosas, si tienes una duda concreta comentala y con gusto intentaré ayudarte a que descubras en donde está el error y lo arregles.

      Saludos

  23. Gustavo Heramzky Says:

    Me equivoque de Ejercicio Jajajajaja, este es el que queria.
    No se como hacer para que en venta de producto me muestre los Datos ya regristado en ingreso nuevo…

    #include
    #include
    #include

    void login();

    void menu();

    struct producto {
    int codigo;
    int precioV;
    int precioC;
    char nombre[10];

    };

    void ingresonuevo(){

    struct producto nuevo;

    int codigo,precioV,precioC;
    system(«color 0a»);
    printf(«\tINGRESO DE NUEVO PRODUCTO»);

    printf(«\nNombre del Producto»);
    scanf(«%s»,&nuevo.nombre);
    printf(«\nCodigo de Producto:»);
    scanf(«%d»,&nuevo.codigo);
    printf(«\nPrecio de Venta»);
    scanf(«%d»,&nuevo.precioV);
    printf(«\nPrecio de Costo»);
    scanf(«%d»,&nuevo.precioC);
    login();

    }

    void ventadeproducto(){
    struct producto nuevo;
    system(«color 09»);
    printf(«\tVENTA DE PRODUCTO»);
    printf(«\tProductos a la Venta:»);
    printf(«\nNombre: %s»,nuevo.nombre);
    printf(«\nCodigo: %d»,nuevo.codigo);
    printf(«\nPrecio: %d»,nuevo.precioV);

    }
    int main(){
    login();
    menu();
    int op,pro;
    int num=0;
    system(«cls»);
    do
    {
    menu(); scanf(«%d»,&op);

    switch(op)
    {
    case 1:

    ingresonuevo();
    break;
    case 2:
    printf(«En Mantenimiento So sorry D:»);
    break;
    case 3:
    ventadeproducto();
    break;

    }

    } while(op != 7);
    return 0;

    }

    void login(){
    char nombre[10];
    char pass[10];
    int i,xd=1;
    do
    {
    system(«cls»);
    printf(«¿Nombre de usuario?»);
    scanf(«%s»,&nombre);
    if (strcmp(nombre, «ita»)==0){
    printf(«Nombre de usuario correcto, por favor ingrese su contrasena:»);
    scanf(«%s»,&pass);
    if (strcmp(pass, «654321»)==0){

    printf(«Contrasena correcta, bienvenido, sera redirigido a la aplicacion»);
    system(«pause»);
    xd=2;

    }
    else
    if(pass != «654321»){
    printf(«Contrasena incorrecta, por favor ingrese un usuario y contrasena valida»);
    system(«pause»);
    }
    }
    else
    if(nombre != «ita»){
    printf(«Nombre de usuario incorrecto, por favor ingrese su nombre de usuario nuevamente»);
    system(«pause»);
    }

    }while(xd!=2);

    }

    void menu(){

    printf(«\tMenu Principal»);
    printf(«\n1.Ingreso de nuevo Producto»);
    printf(«\n2.Ingreso de nuevo Usuario»);
    printf(«\n3.Venta de Producto»);
    printf(«\n4.Listado de Producto»);
    printf(«\n5.Listado de Productos Agotados»);
    printf(«\n6.Terminar Programa»);
    printf(«\n7.Salir.»);

    }

    • rtmex Says:

      Creo que tienes que declarar un arreglo que almacene datos del tipo struct producto. También puedes hacerlo con listas ligadas; y en tu función ingresonuevo agregas un elemento ya sea al arreglo o a la lista ligada cada vez

  24. Gustavo Heramzky Says:

    Eso era, solo declare un Arreglo y movi la Estructura y Funciono Perfecto, gracias!
    Otra cosa, ¿Hay alguna manera para Regristar un Nuevo usuario?
    En Ejercicio me Pide que Haga un Inicio se Sesion, el cual es ita y 654321, Pero Luego pide que se cree otro Usuario, ya cuando el Programa se este Ejecutando

    • rtmex Says:

      Haz una estructura para los usuarios, por ejemplo struct usuario, que tenga los campos char nombre[10] y char pass[10] y luego haces un arreglo que almacene elementos del tipo struct usuario. Es algo similar a lo que hiciste con los productos.

  25. andres Says:

    En un arreglo de 30 posiciones, se debe cargar una frase la cual termina con el caracter punto.
    Luego de tener el arreglo con la frase, se deben contar cuantas vocales, consonantes y espacios tiene la frase.

    como lo podría hacer.

    • rtmex Says:

      Pues hay diferentes soluciones, una opción es que declares tres variables de tipo entero, llamadas por ejemplo vocales, espacios y consonantes. En un ciclo vas recorriendo el arreglo y con un if checas si el contenido de la ubicación en la que te encuentras en ese momento es una vocal incrementas en uno la variable llamada vocales, si no (else) pones otro if para checar si es un espacio, en cuyo caso incrementas en uno la variable espacios. Si no (otro else) pones un if más para checar si es una consonante y en caso de serlo, incrementas en uno el valor de la variable consonantes.

  26. Empresa de mantenimiento Tarragona Says:

    Acostumbro cada dia buscar articulos para pasar un buen rato leyendo y de esta forma he encontrado vuetro post. La verdad me ha gustado el post y pienso volver para seguir pasando buenos ratos.
    Saludos

  27. Ziboltis Says:

    Buen día, tengo una función que recibe como parámetro un arreglo y se encarga de modificarlo. Dentro de main mando llamar dicha función con un primer arreglo y trabaja correctamente, el problema es que posteriormente mando llamar de nuevo la función pero con otro arreglo como parámetro y aquí ya no trabaja bien, lo que hace el programa es volver a modificar el arreglo que había mandado en la primer llamada a la función y no el segundo arreglo. ¿Por qué pasa esto?

    Saludos y gracias

  28. Ccy Says:

    Hola buen día, me podrían ayudar orientándome como hacer este código en dev c++

    Opcion Plantel
    0 Centro Historico
    1 Iztapalapa
    2 San Lorenzo Tezonco
    3 Del Valle
    Teclear el numero del plantel donde se encuentra
    0↵
    Teclear el numero del plantel a donde se dirige
    3↵
    Se encuentra en plantel Centro Historico y se dirige a plantel Del Valle
    El tiempo estimado de viaje es de 55.80 minutos
    La distancia que recorrera es de 5.10 kilometros

    Desarrolle un programa que cumpla con las características antes mostradas y que cuente con
    las siguientes funciones:

    – Utilice una función que indique cuándo el usuario tecleó el mismo plantel como origen y
    destino. Esta función también deberá indicar si el usuario eligió al menos uno de los dos
    valores como fuera del rango posible de los planteles.

    – Utilice una función que calcule el tiempo de desplazamiento entre planteles con la siguiente
    fórmula: T = factor_tabla * 93. El resultado se obtendrá en minutos.

    – Utilice una función que calcule la distancia entre planteles con la siguiente formula:
    D = factor_tabla * 8.5. El resultado se obtendrá en kilómetros.

    Para cualquiera de las funciones puede elegir libremente que parámetros enviar y si las
    funciones deben o no regresar valores.

    Para obtener el valor de factor_tabla, se deberán guardar los siguientes valores en un
    arreglo de dos dimensiones con valores reales y tomarlos de ahí cuando se necesite:
    Origen /
    Destino C. H. (0) IZT. (1) S. L.T. (2) D. V. (3)
    C. H. (0) 0 0.42 0.81 0.6
    IZT. (1) 0.5 0 0.38 0.95
    S. L. T. (2) 0.9 0.47 0 0.85
    D.V. (3) 0.7 0.91 0.8 0

  29. Carmen Says:

    Hola, me pueden ayudar?

    Realizar la carga de un vector de 12 posiciones donde cada elemento es una cadena de caracteres. Finalizada la carga del vector, realizar la impresión del mismo. Cada cadena tiene 18 caracteres. Utilizar lenguaje C.

  30. rtmex Says:

    Te recomiendo que realices este curso que cree sobre arreglos en C, es completamente gratis y vienen ejercicios con el código correspondiente, específicamente el capítulo llamado «Arreglos de caracteres» https://top-systems.teachable.com/p/arreglos-en-c-usando-linux

  31. Dominick Alvarez Rojas Says:

    Hola muy buen artículo me srivió mucho pero tengo una consulta, al pasar como parámetro un arreglo de dos dimensiones es necesario saber el tamaño del segundo índice? Que tal si de antemano no se sabe?. Por ejemplo ingreso el número de filas y columnas; por lo que luego declaro el arreglo así: int Arr[fil][col]; como podría recibir mi función ese arreglo? Teniendo en cuenta que de antemano no se cuantas columnas fijas hay?. Agradecería que respondieras. Saludos y gracias.

    • rtmex Says:

      C no maneja arreglos dinámicos, así que si quieres usar una variable como tu lo planteas, tendrías que haberla declarado antes y haberle asignado un valor. Por ejemplo:

      int columnas=3;
      void ImprimeMatriz(int m[][columnas], int filas)
      {
       int i=0,j=0;
        
       for (i=0; i<filas; ++i)
           {
            for (j=0; j<columnas; ++j)
                {
                 printf("%d ",m[i][j]);
                }
            printf("\n");
           }
      }
      

      Desde luego la variable columnas, en lugar de ser 3, puede ser un valor que el usuario haya tecleado

  32. gustavo Says:

    HOLA ME PIDEN REALIZAR ESTA FUNCION: QUE LA IMPLEMENTE CON SWITCH CASE, ESE NO ES EL PROBLEMA NO ENTIENDO BIEN QUE HACER, EL VECTOR SERIA TOMARIA DATOS DEL PROGRAMA PRINCIPAL Y EN LA FUNCION LOS CALCULA COMO RESULTADO?
    Implemente una función que realice las cuatro operaciones básicas entre un vector y un número de
    tipo float y retorne el resultado (modificando por referencia el propio vector). La operación se indicará
    en un parámetro adicional. El prototipo de la función es el siguiente:
    int calculo vector(float vector[], unsigned int largo, float numero, char operacion);
    Donde:
    Cada elemento del vector y número son los números con los cuales se debe realizar la operación.
    largo: Largo del vector.
    operación: La operación matemática a realizar:
    1. ’+’: Realiza la suma.
    2. ’-’: Realiza la resta.
    3. ’*’: Realiza el producto.
    4. ’/’: Realiza la división.
    La función retorna EXITO (0) si se pudo realizar el cálculo, y ERROR (-1) si ocurrió algún
    error.
    Importante: Para la implementación utilice estructura de selección switch.
    5.6.
    Ejercicio 6
    Implemente una función que obtenga varias caracterı́sticas estadı́sticas del contenido de un vector. El

    • rtmex Says:

      Así es, declaras un vector en main y luego lo pasas como parámetro a la función, junto con el tamaño del vector, el número que utilizarás para la operación y el tipo de operación. Ya hasta te dieron el prototipo de la función así que no deberías tener problema

  33. Arrays como parámetros en funciones - Ethical Hack Says:

    […] Pasar arreglos a una función en C […]

  34. user new Says:

    <es de mal gusto , explicar algo basico y en el ejemplo te mandas con cosas complejas !!! por eso mismo NO sirve para nada

  35. Arreglos de estructuras en C | Código Fuente Says:

    […] El siguiente programa es un ejemplo en donde se captura el nombre y edad de 10 empleados y se pasa el arreglo a una función que regresa el promedio de edad. En un post anterior ya escribí sobre pasar arreglos a una función en C […]

  36. Roly Says:

    hola necesito ayuda:

    quiero pasar un arreglo como parámetro a una función en el programa principal. Dentro de la función, igualo cada elemento del arreglo a otro arreglo que está dentro de una estructura previamente declarada en el programa principal. quisiera saber si las modificaciones que le haga al arreglo de la estructura modifica también al arreglo original q se pasó como parámetro, y viceversa, si las modificaciones del arreglo original modifican al arreglo en la estructura.

  37. William Alvarado Says:

    Una función que reciba un arreglo y su talla y llene al arreglo con valores aleatorios entre 1 y 20

    Una función que reciba un vector de enteros, su talla y un valor de tipo entero al
    que denominamos buscado. La función devolverá (mediante return) el valor 1 si buscado tiene el
    mismo valor que algún elemento del vector y 0 en caso contrario. La función devolverá, además,
    la distancia entre buscado y el elemento más próximo a él.

    A lo largo de la función se debe manipular el arreglo con sintaxis de punteros, ejemplo: *(a + i)

    Dentro de la función main muestre el arreglo creado, para esto deberán crear un puntero que recorra el arreglo y a través de él se irán mostrando los elementos

    que me recomiendan para hacer este codigo, no entiendo muy bien

  38. osvaldo Says:

    una disculpa, en mi programa intento que se asignes valores a la matriz que declare, pero por alguna razón mi contador y todas las variables que declaro, después de la primera vuelta toman el valor de la matriz, por ejemplo, después de la primera vuelta i vale 8.4.
    pd: Se que el código no requiere el ciclo, pero estoy haciendo algo un poco más complejo y este explica el problema con el que me encuentro.

    #include
    #include
    int main(){

    double A[2][2],i,n=3,a,b=1,c,d;

    for(i=0;i<=n;i++){

    A[1][1]=7.2;

    printf("%f\n",i);

    A[1][2]=6.3;

    printf("%f\n",i);

    A[2][1]=8.4;
    printf("%f\n",i);

    A[2][2]=9.5;

    printf("%f\n",i);

    }
    printf("%f\n",n);
    return 0;
    }

    • osvaldo Says:

      #include stdio.h
      #include math.h
      int main(){

      double A[2][2],i,n=3,a,b=1,c,d;

      for(i=0;i<=n;i++){

      A[1][1]=7.2;

      printf("%f\n",i);

      A[1][2]=6.3;

      printf("%f\n",i);

      A[2][1]=8.4;
      printf("%f\n",i);

      A[2][2]=9.5;

      printf("%f\n",i);

      }
      printf("%f\n",n);
      return 0;
      }

      • rtmex Says:

        El problema es que en tu matriz no existe A[2][1] ni A[2][2] ya que tu matriz es de 2×2, eso significa que tienes A[0][0], A[0][1], A[1][0] y A[1][1]

  39. Jose Says:

    hola tengo una duda, como puedo hacer una funcion que cree un arreglo con los primeros 20 numeros descuadrados

    • rtmex Says:

      Disculpa mi ignorancia pero ¿qué son los números descuadrados?

      • jose Says:

        numero descuadrado es aquel que empieza con el cuadrado de su ultimo digito. por ejemplo 4938247

      • rtmex Says:

        En ese caso puedes generar números al azar, obtener su cuadrado y en el arreglo guardar el cuadrado del primer número seguido del número que generaste al azar. Ejemplo, generas aleatoriamente el número 5, obtienes el cuadrado de 5 que es 25, entonces el primer elemento del arreglo sería 255, etc.

Deja un comentario