UNIDAD IV

Lenguajes Imperativos

Profesor Miguel Cantillana

Programación 1
Ingeniería en Computación e Informática
Trimestre 2020-1

Introducción al lenguaje C

Introducción al lenguaje C

  • El C es un lenguaje de programación creado en 1972 por Dennis M. Ritchie en los Laboratorios Bell
  • Evolución de un lenguaje más antiguo: B (a su vez basado en BCPL)
  • A su vez hay otros lenguajes populares que derivan de él (como el C++) o se inspiran en él (como el Java)
  • Aunque no fue estandarizado hasta 1989 (ANSI C)
    • En 1990 fue ratificado como estándar ISO

Introducción al lenguaje C

  • Es uno de los lenguajes de programación más utilizados
  • Inicialmente muy utilizado para desarrollar sistemas operativos
    • Ej: Linux está desarrollado en C
  • Se ha usado de manera intensiva también en entornos científicos
    • Junto con el FORTRAN ha sido posiblemente el lenguaje de programación más popular
    • Existen multitud de librerías científicas con las funciones más interesantes ya codificadas

Introducción al lenguaje C

  • Es un lenguaje imperativo estructurado que posee estructuras de alto nivel…
    • …pero que también permite programación de bajo nivel
  • Algunos detalles:
    • Case sensitive: No son iguales mayúsculas que minúsculas
    • Las instrucciones se separan con un punto y coma (;)

Introducción al lenguaje C

  • Algunos compiladores:
    • Windows: Dev-C++, Borland C
    • Linux: GNU C (gcc)
  • Editores:
    • Existen entornos de desarrollo integrados (IDE) que incluyen editores propios y gran automatización de las tareas => Programación Visual
    • Windows: Notepad (Bloc de notas), Notepad++
    • Linux: vi, emacs, gedit

Editar, compilar, montar, ejecutar…

Nuestro primer programa!

/* Este es un programa C. Imprime un mensaje
en la pantalla del computador */


#include <stdio.h>


int main()
{
 printf("¡Bienvenido a la programación en C! \n");
 return 0;
}

Caracteres especiales

#include <stdio.h>
int main() {
 printf("Aqui no hay un salto de linea...");
 printf("Pero aquí si \n");
 printf("Esto lo digo \"entre comillas\" \n");
 printf("Aqui pongo una barra inversa: \\ \n");
 return 0;
}
  • La barra inversa (\) se utiliza para indicar algunos caracteres especiales

    • Para imprimir el símbolo de comillas (“): \”

    • Para imprimir la propia barra inversa: \\

    • Salto de línea: \n

    • Una tabulación: \t

    • Un pitido (beep): \a

    • Borrado: \b

Identificadores y variables

  • Un identificador puede estar compuesto de cualquier combinación de:
    • letras (minúsculas y mayúsculas)
      • Salvo letras con tilde, ñ, ç, …
    • dígitos
    • el símbolo subrayado '_'.
  • La única restricción es que el primer carácter no puede ser un dígito
  • No se limita la longitud de los identificadores
    • Algunas implementaciones sólo reconocen los 8 primeros y otras (ANSI) los 31 primeros caracteres.
  • Case sensitive: Hay diferencia entre mayúsculas y minúsculas
  • Existe un conjunto de caracteres que tienen un significado especial: * + - / % = ! & ~ ^ < > ? \ # ( ) { } [ ] “ ' | ; : , . (blanco)

Ejemplos de identificadores

Válidos No Válidos Razón
x 4num 1er cararcter numérico
y2 “x” Caracter ilegal “
​suma_1 orden-no Caracter ilegal ‘-’
_t indice lis Espacio ilegal
TABLA número No se admiten tildes

Palabras reservados

  • Existen una serie de palabras que usa el propio lenguaje
    • No pueden ser usadas en los identificadores
  • Lista:
    • auto break case char const continue default do double else enum extern float for goto if int long register return signed sizeof short static struct switch typedef union unsigned void volatile while

Variables

  • Una variable:
    • Se identifica a través de su nombre (identificador) y
    • Es capaz de almacenar un valor (entero, real, texto, lógico, …)
  • Manejando variables somos capaces de manejar datos
  • En C cada variable tiene un tipo asociado que define:
    • El espacio que ocupa en memoria
    • Las operaciones que podemos hacer con ella

Tipos de datos en C

  • Representación de datos en C está relacionada con la arquitectura del computador
    • Memoria se direcciona por bytes
  • Un dato cualquiera tiene
    • Un tipo (caracter, entero, punto flotante)
    • Un valor (que puede ser indeterminado)
    • Una posición de memoria donde está almacenado

Tipo de dato char

  • Al menos 8 bits
    • Debe poder almacenar un caracter ASCII
  • Rangos mínimos
    • signed char: -128 a 127
    • unsigned char: 0 a 255
  • Rango de char depende del compilador
    • Por omisión, char puede ser signed o unsigned 

Tipo de dato int

  • Al menos 16 bits
  • Rangos mínimos
    • int: -32768 (-2^15) a 32767 (2^15 – 1)
    • unsigned int: 0 a 65535 (2^16 - 1)

Tipo de dato long int

  • Al menos 32 bits
  • Puede abreviarse como long
  • Rangos mínimos
    • long: -2147483648 (-2^31) a 2147483647 (2^31 – 1)
    • unsigned long: 0 a 4294967295 (2^32 – 1)

Tipo de dato long long int

  • Tipo de dato long long int
  • Al menos 64 bits
  • Puede abreviarse como long long
  • Introducido en estándar ISO C99
  • Rangos mínimos
    • long long: -2^63 a 2^63 – 1
    • unsigned long long: 0 a 2^64 – 1

Punto flotante

  • Números decimales representados en codificación llamada “punto flotante”
    • float: precisión simple ` Tamaño típico: 32 bits
    • double: precisión doble ` Tamaño típico: 64 bits
    • long double: precisión extendida ` Tamaño típico: 80 bits

Punto flotante

  • float
    • 10^-38 ≤ float ≤ 10^38
    • -10^38 ≤ float ≤ -10^-38
  • double
    • 10^-308 ≤ double ≤ 10^308
    • -10^308 ≤ double ≤ -10^-308
  • long double
    • 10^-4932 ≤ long double ≤ 10^4932
    • -10^4932 ≤ long double ≤ -10^-4932

Modificadores

Leyendo variables

  • Para leer una variable de tipo entero usamos la función scanf()
  • Toma dos argumentos
  • Una cadena de caracteres con un % seguido del correspondiente modificador
  • La variable en la que queremos almacenar el valor leído precedida del símbolo &
  • Recordad declarar la variable antes de usarla!
#include <stdio.h>
int main() {
 int entero; /*Declaramos la variable*/
 scanf("%d", &entero); /*Leemos un valor en la variable*/
 printf("El valor que hemos leido es %d“, entero);
}

Operadores aritméticos

Operadores aritméticos

  • a++ es más eficiente que a+=1
  • a+=n es más eficiente que a=a+n
  • No se produce conversión de tipos:
    • La división de enteros es un número entero
    • Para convertir enteros a reales se puede multiplicar por 1.0

Operadores aritméticos

Operadores aritméticos

  • El resultado de una operación lógica es «cierto» (true) o «falso» (false)
  • El valor 0 es equivalente a «falso»
  • Cualquier valor distinto de 0 es equivalente a «cierto»
  • No se debe confundir el operador de asignación (=) con el de comparación (==)
  • Es un error típico usar = cuando se debe usar ==
  • El compilador no avisa

if-else

int i; /*Un numero entero*/
printf("Introduce un número entero:\n");
scanf("%d", i);
printf("El número introducido es ");
if (i < 0){
 printf("negativo\n");
 }else {
 printf("positivo\n");
}

if-else

Switch Case

//Ejemplo de sintaxis:

switch ( expresión )
{
	case valor1:
	  ... sentenciasA...
	break;

	case valor2:
	  ... sentenciasB ...
	break;

	case valor3:
	case valor4:
	  ... sentenciasC ...
	break;

	default:
	  ... sentenciasD ...
}

e.g Switch Case

// Program to create a simple calculator
#include <stdio.h>

int main() {
    char operator1;
    double n1, n2;

    printf("Enter an operator (+, -, *, /): ");
    scanf("%c", &operator1);
    printf("Enter two operands: ");
    scanf("%lf %lf",&n1, &n2);

    switch(operator1)
    {
        case '+':
            printf("%.1lf + %.1lf = %.1lf",n1, n2, n1+n2);
            break;

        case '-':
            printf("%.1lf - %.1lf = %.1lf",n1, n2, n1-n2);
            break;

        case '*':
            printf("%.1lf * %.1lf = %.1lf",n1, n2, n1*n2);
            break;

        case '/':
            printf("%.1lf / %.1lf = %.1lf",n1, n2, n1/n2);
            break;

        // operator doesn't match any case constant +, -, *, /
        default:
            printf("Error! operator is not correct");
    }

    return 0;
}

Ejercicios en clases I

Utilizando diagramas de flujo resolver los siguientes ejercicios

  1. Desarrolle un algoritmo que permita leer dos valores distintos, determinar cual de los dos valores es el mayor y mostrar por pantalla.
  2. Desarrolle un algoritmo que permita leer un valor cualquiera N y escriba si dicho número es par o impar.

Ejercicios en clases II

  1. Escriba un programa que pida dos números enteros y que calcule la división, indicando si la división es exacta o no.
  2. Escriba un algoritmo para indicar el nivel de riesgo que tiene a partir de su edad con el COVID-19.
  3. Escriba un programa que determine si un carácter ingresado es letra, número o simbolo.

  4. Los tres lados a, b y c de un triángulo deben satisfacer la desigualdad triangular: cada uno de los lados no puede ser más largo que la suma de los otros dos.Escriba un programa que reciba como entrada los tres lados de un triángulo, e indique si acaso el triángulo es inválido o no.

Introducción al lenguaje C

By Miguel Cantillana

Introducción al lenguaje C

Introducción al lenguaje C

  • 523