Curso de C para Ingeniería



 

Curso de C para Ingeniería 

 
Esta página ofrece un conjunto de documentos pdf con el desarrollo del temario. Cada tema está explicado en un conjunto de vídeos grabados en clase y después editados con las explicaciones claves de cada tema. Los vídeos de los cuatro primeros temas están públicos en la plataforma YouTube. Para cualquier duda o consulta no dude en dejarnos su comentario abajo.
 

Prólogo

El posible lector de esta página, puede preguntarse y con razón, ¿Por qué es necesario otro libro de C? Efectivamente en las bibliotecas de nuestros centros hay numerosos libros de texto para aprender C. Asimismo en la red hay también infinidad de manuales o apuntes editados por distintos departamentos universitarios. Por tanto, necesidad como tal no hay. Sin embargo, aparte de aquello tan castizo de “cada maestrito tiene su librito”, el objetivo de estos apuntes es dar una visión ligeramente distinta de la habitual. Desde nuestro punto de vista, la enseñanza del lenguaje C en los estudios de ingeniería se presenta de una forma antipática, dando más importancia al lenguaje a que el alumno aprenda a programar.

El objetivo de esta página es aprender C pero simultáneamente aprender a programar con algunos fundamentos adecuados para un curso de iniciación a la programación. Algunas cuestiones que distinguen en los temas que siguen son las siguientes:
·       Se simplifica el lenguaje C obviando algunos detalles que no añaden ninguna funcionalidad interesante: sentencia do_while, operador ?, operador ++ como prefijo, operadores de bits, tipos sin sentido actualmente como short, unsigned, etc.

·        Se trabaja con funciones desde el primer momento, planteando todos los problemas para ser resueltos mediante ellas. De esta forma el alumno debe aprender desde el principio los conceptos de modularidad y reutilización.

·        Las variables arrays o struct deben ser siempre declaradas a través de sus tipos previamente definidos. Igualmente los argumentos de las funciones deben ser tipos declarados.

·        Los arrays siempre son tratados diferenciando tamaño y dimensión. Las funciones que tratan arrays como entrada o salida deben recibir o devolver el tamaño del array respectivamente.

·       Los tratamientos de los algoritmos básicos sobre arrays: recorridos, filtros, búsqueda, etc, se exponen mediante esquemas.

·       Los punteros se explican más tarde de lo que suele ser habitual, y sólo con su uso imprescindible, esto es, para definir argumentos de entrada/salida a funciones.
 
 ·      En los problemas siempre se pide una función y el programa principal que la invoque. Numerosos ejercicios reutilizan las funciones de problemas anteriores. Los problemas son algorítmicos, puros de aprender a programar, pero no son algoritmos que podrían denominarse de “idea feliz”, sino que tienen un esquema claro asociado.

·       No se hace apenas mención a los típicos y tan extendidos problemas o ejercicios, pensados más para desarrollar la memoria que para aprender a programar. No encontrará en este manual los ejercicios que dan importancia fundamental a la sintaxis del C, buscando más el error del alumno que su aprendizaje.
 
 
     Añadimos la posibilidad de autoevaluarse mediante preguntas tipo test y de rellenar espacios en blanco
 
 
 

Añadimos una colección de enunciados y problemas resueltos por categorías.


Enlace a los problemas (añadido 20/11/2014)


 
 Tema 1. Conceptos de programación (pdf) (actualizado Curso 2015-16)
                     
  • Breve enumeración de los conceptos de ordenador, programa informático, sistema operativo, lenguaje de programación y compilador. Breve descripción del lenguaje C.
  • Se describen conceptos como Ingeniería del Software y Algoritmo. Se describe un programa para el cálculo del factorial de un número mediante diagrama de flujo, seudocódigo y código C.
  • Se establecen las bases de la programación, haciendo hincapié en la división de los problemas en funciones y su reutilización.
  • Introducción al diseño de programas: Ejercicio Saltos de Trampolín (Enunciado en pdf)
  • Vídeos del curso 2014-15 con el mismo enunciado anterior (Enunciado en pdf)
    • https://youtu.be/giqPcsSYbjA Un programa está formado por datos y algoritmos. Concepto de tipo de datos: números enteros, números reales, cadenas de caracteres, fechas, horas, etc. Ejemplo de algoritmo: máximo de unos valores
    • https://youtu.be/Z-N3a9nAPIo Explicación del problema para obtener las medallas de una competición de saltos de trampolín. Prueba de ejecución del programa que lo resuelve. Principios de los conceptos de módulos o división de un algoritmo. Concepto de reutilización.
    • https://youtu.be/N30Elk_xoAI Se establece la similitud entre algoritmo y receta de cocina. Se establece el concepto de que una función debe devolver un valor, no imprimirlo en la pantalla. Presentación de algunos algoritmos básicos: máximo, mínimo, ordenar, filtro, etc y la necesidad de resolverlos por esquema.
    • https://youtu.be/KhiEeY0XR8Y  Concepto de modulo, subprograma, función. Se introducen las estructuras algorítmicas básicas: selectivas y repetitivas. Ejemplos en un cajero automático. Ejemplos en el programa del salto de trampolín. Ejemplos en el algoritmo de cálculo del máximo de un conjunto de elementos.
    • https://youtu.be/y9k87DKum3o  Diseño de las partes (funciones) en las que se divide el programa que resuelve los saltos de trampolín. Módulo principal. Lectura de datos. Inicialización de datos. Conceptos iniciales de bucles.
    • https://youtu.be/NoOXBPQABEU Continuación del problema anterior. Primeros pasos de un esquema de suma o contador.
    • https://youtu.be/9o7zB2S0-Fk Tercer y último vídeo para resolver el problema de los saltos de trampolín. Se hace especial mención en cómo se invoca a una función (módulo)y el paso de parámetros.

Autoevaluación
 

Tema 2. Primeros pasos en C (pdf) (actualizado Curso 2015-16)
  • Descripción de los elementos sintácticos que componen un programa en C: separadores, limitadores, palabras claves, identificadores, operadores, constantes y operadores.
  • Funciones en C: declaración o prototipo, invocación o llamada y definición. Diferencias entre parámetros formales y reales.
  • Funciones en C (2ª parte): función main, comunicación entre las funciones y el programa principal. Ámbito de las variables.

Problemas resueltos

Autoevaluación
 
 
 
Tema 3. Sentencias de control (pdf) (actualizado Curso 2015-16)
Vídeos

Problemas resueltos
Autoevaluación

 
Vídeos
 
Problemas resueltos

Autoevaluación 

Tema 5. Esquemas algorítmicos (pdf) (actualizado Curso 2015-16)
 
Problemas resueltos
Autoevaluación 

Tema 6. Punteros (pdf) (actualizado Curso 2015-16)
 
Problemas resueltos 

Tema 7. Registros (pdf) (actualizado Curso 2015-16)
Problemas resueltos

Autoevaluación 

Tema 8. Ficheros (pdf) (actualizado Curso 2015-16)
 
Problemas resueltos 

Autoevaluación 
 
Exámenes:
 
 


  
 


36 comentarios:

  1. Me esta siendo muy util como refuerzo muchas gracias!!

    ResponderEliminar
  2. Interesante me ayudo con un proyecto que tenia.

    ResponderEliminar
  3. ¿Cómo se usa la herramienta C-ING? https://docs.google.com/file/d/0B4pbOp0zCsphaWNHNUNHQlNDSEE/edit?usp=sharing

    SALUD!!!

    ResponderEliminar
    Respuestas
    1. No funciona, igual es porque tengo windows xp. ¿ No hay otra alternativa ?
      Gracias

      Eliminar
    2. No debe ser un problema de Windows.
      ¿Tienes Java actualizado?
      Actualiza a la nueva versión de C-ING que hemos puesto hoy, a ver si así ...

      Eliminar
    3. El C-ing con windows xp no funciona y la nueva versión de java no puede instalarse. ¿ No tienes una versión que funcione con xp ?
      Gracias

      Eliminar
  4. Podrias actualizar los videos del Tema 3 y 4? Como he estado enfermo no he podido asistir a las clases... Gracias!!!

    ResponderEliminar
    Respuestas
    1. Pero Javier, ¿te has descargado e instalado la herramienta C-ING?

      Eliminar
    2. Ya lo hemos probado en el portatil, y ahora, misteriosamente, tambien va en el sobremesa!

      Gracias!!!!!

      Eliminar
  5. Al descargarme la aplicacion que es .jar solo la puedo abrir con winrar y no se instalarla, ¿como se hace?

    ResponderEliminar
    Respuestas
    1. Un .jar es un ejecutable java. Primero hay que asegurarse de tener actualizado java en nuestro ordenador, para ello descarga e instala de http://www.java.com/es/download/
      la última version.

      Después descarga y guarda en tu ordenador la herramienta C-ING y cliquea sobre el fichero o con el botón derecho la opción abrir con debe salir la opción Java.

      Una vez el programa se abra, solo debes dar un correo (mejor que sea válido para recibir actualizaciones) y un password.

      Una vez crees el usuario, ya puedes acceder a la tabla de videos que intentaremos ir actualizando a lo largo del curso, sin necesidad de descargarse otra vez la herramienta.

      Eliminar
  6. Muy util como apoyo y muy bien explicado... Un Saludo
    Informatica Tutoria

    ResponderEliminar
  7. Ha dejado de funcionar, alguien sabe por qué

    ResponderEliminar
  8. Qué es lo que ha dejado de funcionar?

    ResponderEliminar
  9. buenas tardes,al descargar la aplicacion C-ING no me deja abrirla, porque podria ser?

    ResponderEliminar
    Respuestas
    1. ¿Tienes actualizado Java en tu ordenador? Mira la respuesta del 19 de abril.

      Eliminar
    2. si la tengo actualizada, lo tengo descargado , y al abrirlo no me responde el programa

      Eliminar
    3. Acabo de comprobarlo y todo funciona bien. Puede ser que tengas algún antivirus o firewall que te impida su ejecución. Prueba a deshabilitarlos o instalar C-ING en un ordenador que no tenga instalados este tipo de programas.

      Eliminar
  10. hola buenas, a mi no me deja descargar el programa de C-Ing teniendo ya el de Java, que debo hacer?

    ResponderEliminar
  11. Hola, ¿que no te deja descargar o que no puedes ejecutar?

    ResponderEliminar
  12. ¿Podría explicarme la diferencia entre la función print y return?

    ResponderEliminar
  13. Julia, como dicen en la TV, me alegro que me hagas esta pregunta, que además es un error muy común, aunque sinceramente no sé de dónde viene porque printf y return no tienen nada que ver. La sentencia printf (realmente es una función de stdio.h) sirve para mostrar en la consola de ejecución resultados. La sentencia return devuelve en el nombre de una función el valor que ésta debe calcular. Pongamos un ejemplo, con estas dos funciones que calculan el número de segundos transcurridos desde el principio del día hasta un instante del día dado por tres argumentos horas, minutos y segundos:

    long segundosTranscurridos_1(int hor, int min, int seg){
    long res;
    res=3600*hor+60*min+seg;
    return res;
    }

    void segundosTranscurridos_2(int hor, int min, int seg){
    long res;
    res=3600*hor+60*min+seg;
    printf("el número de segundos transcurridos es %ld",res);
    }

    Como se puede ver la primera diferencia es que la segunda función es de tipo void y la primera devuelve un entero con el valor calculado (es de tipo int). Por tanto a la hora de invocarse desde la función principal u otra función debemos escribir:

    void main(void){
    int segt1;

    segt1=segundosTranscurridos_1(17,12,37);

    segundosTranscurridos_2(17,12,37);
    }

    Pero donde realmente se puede apreciar la diferencia entre ambas implementaciones es en un intento de REUTILIZACIÓN. Imaginemos que nos piden calcular los segundos transcurridos entre dos instantes. Esta función tendría esta implementación:

    long segundosEntreDos(int h1, int m1, int s1, int h2, int m2, int s2){
    long dif;

    dif=segundosTranscurridos_1(h2,m2,s2)-segundosTranscurridos_1(h1,m1,s1);
    return dif;
    }

    Ahora intenta hacer esta función con segundosTranscurridos_2 (la que tiene el printf). Ya verás como no puedes.

    En definitiva, las funciones (casi) SIEMPRE deben tener un return y sólo las funciones que sirven para imprimir resultados en la consola deben tener un printf, porque si no su reutilización es imposible.

    ResponderEliminar
  14. Buenas, un saludo muy especial desde Cali y para agradecerle por sus videos. Me he topado con un codigo el cual no lo he podido entender, sera posible que me ayude.

    #include
    int misterio(int n){
    if (n==5)
    return(5);
    else
    return(n+misterio(n-1)*misterio(n-1));
    }
    int main(void){
    int
    n=7;
    printf("Misterio:%d\n",misterio(n));
    }

    ResponderEliminar
    Respuestas
    1. La función misterio es una función recursiva, se llama así porque es una función que en su código se llama a sí misma. En la primera invocación en el main misterio se invoca con el parámetro n=7, lo que hace que la función misterio devuelva
      7+misterio(6)^2

      Ahora se invoca misterio con el argumento 6 que de nuevo devolverá 6+misterio(5)^2

      Finalmente misterio con 5 como argumento devuelve 5. Por tanto misterio(5) devuelve 5, misterio de 6 entonces 6+5^2=31

      y misterio de 7 devuelve 7+31^2=968

      En el curso que tenemos en este blog no incluimos recursividad, pensamos que la recursividad resuelve de manera interesante ciertos problemas de programación, pero no es un concepto adecuado para un curso de introducción a la programación y menos para ingeniería.

      Eliminar
  15. Hola, he estado viendo los videos, la verdad las explicaciones son excelentes, queria saber si existe posibilidad de que se suban videos explicando temas de PILA, COLA, LISTA.

    ResponderEliminar
  16. Hola Juan Pablo, no incluimos en el temario listas en C por dos razones. La primera y más importante es porque las listas en C es más antiguo que los disquetes. Dile a tus profesores que actualicen un poquito sus temarios, que hace ya 15 años que estamos en el siglo XXI y en informática el año pasado ya es antiguo.

    La segunda razón, relacionada con la anterior, es que las listas "hechas a mano" son absolutamente inútiles ya que todos los lenguajes actuales ya las traen implementadas como tipos básicos.

    Es como si para implementar un int tuvieran que enseñarte a poner los bits uno a uno.

    ResponderEliminar
  17. Hola, en primer lugar gracias por el curso, que me hace entender casi a la primera la programación en este lenguaje.
    Lo segundo es plantear una consulta (no sé si este es el lugar adecuado) sobre el comportamiento y la modificacion a realizar en esta funcion para que me devuelva el resultado que espero. A saber, la intencion de esta función es que devuelva el maximo y el minimo de los numeros pares que se recogen en el array de enteros. He visto que hay algún ejercicio parecido. Si inicio el array desde 1 a 10 me dice que el primer par es 1 y el ultimo es 10. Cómo hay que inicializar *min y *max para que el resultado sea el correcto?
    Gracias por adelantado.

    void maxMinEven(const ArrayTable t, int n, int *min, int *max,int *contEven,int *contOdd){
    int i;
    *min=t[0];
    *max=t[0];

    for(i=0;i*max)
    *max=t[i];

    if(t[i]<*min)
    *min=t[i];
    }
    else{
    (*contOdd)++;/*incremento el contenido de la direccion de memoria de contImp*/
    }

    }
    }

    ResponderEliminar
  18. Cuidado con el for que no está bien, el HTML se come símbolos.
    Una operación de filtro+maximo o filtro+minimo no se puede hacer directamente como planteas: la inicialización de las variables max y min no la puedes hacer con el primer elemento (de índice 0) porque no sabes si cumple o no el filtro. Es más podría pasar que ningún elemento del array cumpliera el filtro. Este problema debe hacerse con dos funciones, una que haga el filtro y devuelva un array con los números pares y cuántos y otra que calcule el máximo del array devuelto por el anterior siempre que el número de elementos sea mayor que 0.
    Un código podría ser


    typedef int TablaEnteros[TAM];

    void max_min(const TablaEnteros t, int n, int *max, int *min){
    int i;

    *min=t[0];
    *max=t[0];

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

    if(t[i]<*min){
    *min=t[i];
    }
    if (t[i]>*max){
    *max=t[i];
    }
    }
    }

    void max_min_pares(const TablaEnteros t, int n, int * max, int * min){
    TablaEnteros tpar;
    int i, npar=0;

    for(i=0;i<n;i++){
    if(t[i]%2==0){
    tpar[npar]=t[i];
    npar++;
    }
    }
    if (npar>0){
    max_min(tpar, npar, max, min);
    }
    else{
    printf("Ningún número del array es par\n");
    }
    }

    void main(void){
    TablaEnteros tabla={2, 4, 5,6, 43, 32, 21, 34, 5, 6, 8};
    int max, min;
    max_min_pares(tabla, 11, &max, &min);
    printf("max %d min %d\n",max, min);
    }

    ResponderEliminar
  19. En el examen de la convocatoria de febrero de Experimentos con Bacterias, no me llega a quedar claro por qué se usa el tamaño NDIAS y NHORAS. Si yo hubiera definido en el struct de experimento un numFilas y un numColumnas, ¿podría usarlos en lugar de las constantes?

    ResponderEliminar
  20. En el enunciado del ejercicio se dice que los experimentos son fijos cinco veces al día durante tres días. Por eso deben definirse como constantes, tal y como dice también el enunciado.

    La opción de definir nfil y ncol como campos del struct también la hemos empleado en otros problemas, en los cuales el número de filas y columnas de la matriz puede ser variable, pero no es este el caso porque aquí eran fijos.

    En este caso la matriz MatrizVal tiene de dimensiones NDIAS y NHORAS y además está "completa", es decir, no hace falta guardar en variables el tamaño real, ya que en este caso coinciden dimensión y tamaño.

    Esto no es lo habitual, ya que como se puede ver en la mayoría de los problemas con arrays hay que ir "arrastrando" los tamaños. En este problema no se puso, precisamente para simplificar su resolución.

    ResponderEliminar
  21. Por favor actualice la versión de Java. No funciona con la última, ni en Yosemite ni tampoco en 10.

    Muchas gracias y enhorabuena por el blog.

    ResponderEliminar
    Respuestas
    1. Esta página del blog es de C, pero aún así no entiendo que programa dices que no funciona con Java. ¿Puedes decirme qué ejercicio no funciona y cuál es el error?

      Eliminar
  22. Disculpe por no explicarme bien. El problema es que C-ING no me funciona ni con Windows 10 y en Yosemite. Aparece un mensaje en cual indica que el programa debe de actualizarse.

    Saludos.

    ResponderEliminar
  23. Hemos actualizado C-ING.jar, pruébalo ahora. Gracias

    ResponderEliminar
  24. Ya funciona en Windows, pero no en Yosemite. Probablemente sea un error de mi configuración.

    Muchas gracias por compartir este curso tan útil.

    Saludos desde la UCAM.

    ResponderEliminar