Ipol:Modulo1

From Wiki
Jump to: navigation, search

Para empezar

Existen varias formas de empezar a programar en C. En particular, a la hora de crear/compilar los archivos, básicamente se puede hacer de dos formas:

  • "A pedal" usando un editor de texto para editar código (e.g. gedit) y gcc para compilarlo.
  • Usando un entorno de desarrollo integrado (e.g. NetBeans, ver Entornos de desarrollo).
    Nota: recomendamos para este curso recomendamos utilizar la primera opción, ya que los entornos de desarrollo hacen transparente al usuario varias partes del proceso de compilación, entre otras cosas que son interesantes de ver al principio.

Introducción al lenguaje C

Creación/edición de un programa sencillo

  • Crear un archivo con el nombre primer.c.
  • Utilice el editor de texto para escribir un programa. Por ejemplo:

  1. include <stdio.h>

int main() {

   printf("Hola mundo!\n");

}

Archivos: primer.c.

Compilación/ejecución de un programa por línea de comando

En la línea de comando posicionarse en la carpeta donde se guardó el archivo primer.c.

  • Realizar la compilación (preprocesado/compilación/ensamblado/enlazado) con la siguiente instrucción:

> gcc primer.c -o primer

  • Ejecutar el programa:

> ./primer

  • Inspeccionar la salida del programa:

Hola Mundo!

Variables

  • Considere el siguiente fragmento de código:

int a = 3; int b = 10; int sum; sum = a + b; printf("la suma de %d y %d es: %d",a,b,sum);

  • realice las siguientes actividades
    • Incluir el fragmento anterior en un programa. Compilar y ejecutar el mismo:

> gcc segundo.c -o segundo > ./segundo La suma de 3 y 10 da: 13.

    • Deducir como imprimir texto y números enteros.
    • Agregar la variable float div. Realizar la división de a entre b, guardando el resultado en div. Para imprimir números flotantes utilizar %f en lugar de %d.

float div; div = a/b; printf("El cociente entre %d y %d da (sin cast a float): %f.\n",a,b,div);

    • Verificar el funcionamiento del programa:

El cociente entre 3 y 10 da (sin cast a float): 0.000000.

    • ¿El resultado es el esperado?. En caso negativo corrija el código para obtener el resultado correcto:

float div2; div2 = (float)a/(float)b; printf("El cociente entre %d y %d da (con cast a float): %f.\n",a,b,div2);

  • Salida:

El cociente entre 3 y 10 da (con cast a float): 0.300000.

    • ¿Por qué es necesario realizar la conversión de int a float? ¿Es necesario en el caso inverso?.
  • Escriba un programa que reciba desde la entrada estándar (teclado en este caso) y ponga en la salida estándar (pantalla) el carácter presionado, el carácter siguiente y el carácter precedente. Utilizar las funciones char, getchar() y putchar(char c) de la biblioteca stdio.
Archivos: segundo.c segundo2.c.

Operadores

  • Considere las expresiones dadas a continuación. Asuma que x, y y z valen 0, 1 y 2 respectivamente. Para cada expresión piense que valor toma. Verificar que el resultado pensado sea el correcto.
    • x + y * z
      Respuesta: x + y * z = 2.
    • x == 0 && y != 4
      Respuesta: x==0 && y!=4 = 1.
    • !z || y
      Respuesta: !z || y = 1.
    • y ? x : z
      Respuesta: y ? x : z = 0.
    • x - y < z
      Respuesta: x - y < z = 1.
  • Los operadores binarios permiten manipular bits en tipos de dato enteros. Escribir un programa para mostrar como poner a 1 o a 0 bits individuales de una palabra, realizándolo de dos maneras diferentes:
    • Utilizando un entero donde solamente está en 1 el bit a modificar.
    • Especificando el bit mediante un entero.
Archivos: tercer.c tercer2.c.

Control de flujo

  • Escriba un programa que imprima el cuadrado de los primeros 10 enteros.
  • Escriba un programa que dado un número inicial x, lo divida repetidamente entre 2 hasta que el resultado sea menor que 1.
Archivos: cuarto.c cuarto2.c.

Funciones

Todo código ejecutable en C reside dentro de una función. La función main() es el punto de entrada al programa, es decir, la ejecución del programa comienza siempre en la primera línea de dicha la función. El primer programa escrito contenía una función main(), que a su vez llamaba la función printf() de la biblioteca estándar stdio. El primer paso hacia escribir programas más legibles es descomponer su funcionalidad en funciones (luego serán agrupadas en módulos).

  • Escribir una función que devuelva el máximo de dos números enteros: int maximo(int a, int b).
  • En el mismo archivo escribir la función main() que defina dos enteros (darles cualquier valor) y luego llamar la función para hallar el máximo. Imprimir el resultado.
  • Mover la función maximo a un archivo diferente. Guardar este nuevo archivo con el nombre auxiliares.c. Escribir el archivo de encabezado correspondiente.
  • Compilar sin enlazar el archivo auxiliares.c.

>gcc -c auxiliares.c

  • Compilar sin enlazar el archivo que contiene el main (para ejemplificar supondremos se llama quinto.c).

>gcc -c quinto.c

  • Enlazar ambos códigos objeto (.o) para crear el ejecutable quinto.

>gcc auxiliares.o quinto.o -o quinto

  • Verificar el funcionamiento del programa.
Archivos: quinto.c auxiliares.c auxiliares.h.

Makefile

make es una herramienta de generación o automatización de código, que lee las instrucciones para generar el programa u otra acción del archivo makefile. Más información sobre makefile.

  • Agregar al archivo auxiliares.c (del anterior ejercicio) una función que devuelva el mínimo de dos números enteros: int minimo(int a, int b).
  • Crear un makefile que compile sin enlazar los archivos auxiliares.c y quinto.c, y luego enlace ambos códigos objeto (.o) para crear el ejecutable quinto.
Archivos: makefile

Arreglos

Escriba un programa que modifique un arreglo de números flotantes según se especifique en un segundo arreglo de enteros. Cada número flotante se divide por el número entero correspondiente (igual indice) y en caso de ser nulo (el número entero) se deja sin modificar. Los arreglos iniciales se definen explícitamente en su declaración. Realizar dos versiones:

  • Utilizando un ciclo while.
  • Utilizando un ciclo for.
Archivos: sexto.c sexto2.c.

Preprocesado

En el programa de "arreglos":

  • Definir el tamaño de los arreglos utilizando #define TAM 10 (si no lo ha hecho aún, en este caso el tamaño es 10).
  • Compilar deteniendo el proceso luego del preprocesado (para ejemplificar supondremos que el archivo se llama septimo.c).

>gcc -E septimo.c -o septimo.i

  • Inspeccionar la salida del preprocesador septimo.i e identificar las ocurrencias de TAM.
Sugerencia: Si desea que la salida sea más sencilla, no incluya stdio.h y elimine los printf.
Archivos: septimo.c.

Tipos de variables

Para el compilador que utilice (en este caso gcc), investigar el tamaño asignado a variables de tipo:

  • int
  • float
  • double
  • char
Sugerencia: Utilizar la función sizeof().

Respuestas para gcc:

int: 4 bytes.
float: 4 bytes.
double: 8 bytes.
char: 1 byte.