¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Desarrollo informático
  3. Lenguaje C
Extrait - Desarrollo informático Aprenda a diseñar antes de programar
Extractos del libro
Desarrollo informático Aprenda a diseñar antes de programar Volver a la página de compra del libro

Lenguaje C - Algoritmíca: iniciación

Objetivos del capítulo

Los objetivos de este capítulo son presentar la sintaxis del lenguaje, los tipos de datos utilizables, algunas funciones, los operadores y las estructuras lógicas.

Al final de este capítulo, el lector será capaz de desarrollar algunas aplicaciones estructuradas.

Todos los programas están escritos en lenguaje C y se compilan y ejecutan usando el software Code::Blocks.

Primer programa

1. Programa completo

El siguiente programa presenta las principales características del lenguaje C:

/* ========================================================================== */ 
/* Proyecto: initInt -- Introducir dos números, visualización de la suma      */ 
/* -------------------------------------------------------------------------- */ 
/* Autor: M. Gineste                                                          */ 
/* ========================================================================== */ 
  
#include <stdio.h>  
  
int main()  
{  
   int a, b, sum;  
  
   printf("Introduzca dos números: ");  
   scanf("%d %d", &a, &b);  
   sum = a + b;  
   printf("La suma es %d\n\n", sum);  
  
   return 0;  
} 

A continuación se muestra el resultado de la ejecución de este programa:

images/a1.png

2. Explicaciones detalladas del programa

a. Los comentarios

En lenguaje C, un comentario empieza por /* y termina por */.

El programa empieza con cinco líneas de comentarios:

/* ========================================================================== */ 
/* Proyecto: initInt -- Introducir dos números, visualización de la suma      */ 
/* -------------------------------------------------------------------------- */ 
/* Autor: M. Gineste                                                          */ 
/* ========================================================================== */ 

Un comentario se puede escribir en varias líneas. Podemos escribir:

/* ========================================================================= ...

Los tipos básicos

1. Tipos enteros

Hay tres tipos de entero: int, short (short int), long (long int).

Ejemplos

int i;  
short s;   /* o short int s;        */  
long l;    /* o long int l;         */  
  
i = 10;  
s = 10;  
l = 10L;   /* Constante de tipo long */ 

Los tres tipos se diferencian por su tamaño en número de bytes; por lo tanto, por el ámbito de los valores que podemos almacenar.

Una variable de tipo int ocupa cuatro bytes. Un short debería ser más pequeño, un long más grande. Pero estos tamaños pueden ser diferentes de una máquina a otra.

El tipo char también es un tipo entero en un byte. Es perfecto para almacenar el código ASCII de un carácter, de ahí su nombre.

Todos estos tipos se pueden declarar sin signo: unsigned, lo que limita su utilización a los números enteros positivos. Esto cambia el ámbito de los valores que podemos almacenar. 

Ejemplo

Una variable char puede contener los valores incluidos entre -128 y +127.

Una variable unsigned char puede contener los valores incluidos entre 0 y +255.

2. Tipos flotantes

Hay dos tipos flotantes (números con «coma»): float, double.

Ejemplo

float f;  
double d;  ...

Ejemplos de formatos numéricos para la función printf()

Formato

Variable que se va a mostrar

%d

Entero (int, short, char)

%ld

Entero (long)

%6d

Entero justificado a la derecha en 6 columnas

%-6d

Entero justificado a la izquierda en 6 columnas

%f

Real (float, double)

%17.3f

Real justificado a la derecha en 17 columnas, con 3 cifras después de la coma

%-17.3f

Real justificado a la izquierda en 17 columnas, con 3 cifras después de la coma

El siguiente programa muestra algunas posibilidades de la función printf() para la presentación de datos numéricos:

int main()  
{  
   int a;  
   float b;  
  
   a = 17;  
   b = 17.0;  
  
   printf("%%d  : %d\n", a);  
   printf("%%6d : %6d\n", a);  
   printf("%%-6d: %-6d\n\n", a);  
  
   printf("%%f      : %f\n", b);  
   printf("%%17.3f  : %17.3f\n", b);  
   printf("%%-17.3f : %-17.3f\n\n", b);  
  
   return 0;  
} 

El resultado de la ejecución es el siguiente:

images/a5.png

Principales códigos de formato de la función scanf()

Formato

Entrada esperada

Tipo del argumento

%c

un único carácter

char*

%s

una cadena de caracteres

char*

%d

un entero

int*

%ld

un entero de tipo long

float*

%f

un real (número con coma)

float*

%lf

un real de tipo double

double*

La estrella junto al tipo de argumento (ejemplo: int*) significa que el argumento debe ser una dirección de variable.

Ejemplo

double a;   
  
printf("Escribir el valor de a:");   
scanf("%lf", &a); 

a es una variable de tipo double, el formato es %lf, &a es la dirección de a.

Algunos operadores

1. Operadores aritméticos

Operador

Efecto

+

Suma

-

Resta

*

Multiplicación

/

División

%

Módulo

Los paréntesis ( y ) son operadores que permiten indicar el orden de ejecución de los operadores.

Ejemplo

La expresión (a + b) % c suma las variables a y b, y después calcula el resto de la división (módulo) de este total por c.

2. Operadores de comparación

Operador

Efecto

>

El operando situado a la izquierda es superior al operando situado a la derecha.

<

El operando situado a la izquierda es inferior al operando situado a la derecha.

>=

El operando situado a la izquierda es superior o igual al operando situado a la derecha.

<=

El operando situado a la izquierda es inferior o igual al operando situado a la derecha.

==

El operando situado a la izquierda es igual al operando situado a la derecha.

!=

El operando situado a la izquierda es diferente del operando situado a la derecha.

Ejemplo

if (a == b)  
{  
   Instrucciones;  
}   

Las instrucciones se ejecutan si a y b contienen el mismo valor. Preste atención al doble signo «igual».

3. Operadores de asignación

Operador

Efecto

=

Vuelve a copiar el operando situado a la derecha en la variable situada a la izquierda.

+=

Añade el operando situado a la derecha en la variable situada a la izquierda.

-=

Resta el operando situado a la derecha, de la variable situada a la izquierda.

Ejemplos

a = b;

Copia el contenido de b en a.

a += b;

Añade el contenido de b al de a.

4. Operadores lógicos

Operador

Significado

&&

Y

| |

O (inclusivo)

!

No

Ejemplo

if ((a == b) && (b!= c))  
{  
   Instrucciones;  
}   

Las instrucciones se ejecutan si a y b contienen el mismo valor Y si b y c contienen valores diferentes....

Estructuras lógicas

if

Instrucción de comprobación.

Si la expresión es verdadera, el programa ejecuta el conjunto de instrucciones 1. En caso contrario, el conjunto de instrucciones 2.

if(expresión)  
{          
   instrucciones 1  
} 
else  
{  
   instrucciones 2  
} 

switch

Instrucción de comprobación de opción múltiple.

switch (expresión)  
{  
   case constante 1: instrucciones 1  
   case constante 2: instrucciones 2  
   . . . .  
   case constante n: instrucciones n  
   default         : instrucciones  
} 

while

Bucle repetitivo.

Las instrucciones se ejecutan mientras la expresión sea verdadera. La comprobación se realiza al inicio del bucle.

while(expresión)  
{  
   instrucciones  
} 

for

Bucle repetitivo.

  • Expresión 1 se ejecuta una vez antes del inicio del bucle.

  • El bucle se ejecuta mientras expresión 2 sea verdadera.

  • Expresión 3 se ejecuta al final de cada bucle.

for (expresión 1; expresión 2; expresión 3)  
{  
   instrucciones  
} 

do while

Bucle repetitivo.

Las instrucciones se ejecutan mientras la expresión sea verdadera. La comprobación se realiza al final del bucle.

do  
{   
   instrucciones  
}  
while(expresión); 

break

Se sitúa al final de un bloque de instrucciones de una estructura switch o de un bucle (do...while, while, for). El programa continúa su ejecución por la instrucción siguiente a la llave que cierra el bloque.

La utilización del break es indispensable en la estructura switch. Su utilización en un bucle implica en general una mala elección de estructura. Solo se utilizará en el switch.

1. La estructura alternativa

a. Organigrama

images/a7.png

El esquema anterior es un organigrama.

  • Los rectángulos representan los bloques de instrucciones. Un bloque es una sucesión de instrucciones incluidas entre { y }.

  • Los rombos representan las condiciones que se van a comprobar. En C, una expresión...

Trabajo práctico: estructuras lógicas

1. Tema

Ejercicio 1

Mostrar la lista de los 10 primeros números con su raíz cuadrada (*) y el acumulado de las raíces cuadradas.

Ejercicio 2

Mostrar la lista de los primeros números con su raíz cuadrada (*), el acumulado de las raíces cuadradas, hasta este que el acumulado sea > 30.

Ejercicio 3

Introducir números hasta que su suma sea mayor que 100.

Ejercicio 4

Introducir un número (n).

Si este número es primo, mostrar: «n es un número primo», en caso contrario, mostrar: «n es divisible por div» (div: valor del primer divisor encontrado).

Volver a comenzar esta operación cinco veces.

Ejercicio 5

Introducir un número (n).

Si este número es primo, mostrar: «n es un número primo», en caso contrario, mostrar: «n es divisible por div» (div: valor del primer divisor encontrado).

Volver a comenzar esta operación hasta que se hayan introducido tres números primos. 

Indicación útil: la función sqrt()

  • El cálculo de la raíz cuadrada se obtiene llamando a la función sqrt() de la librería de funciones matemáticas.

  • Se describe en el archivo math.h, que hay que incluir en nuestro programa: #include math.h

  • La descripción de la función es: double sqrt(double): recibe un argumento de tipo double y devuelve un double.

2. Estructuras lógicas: proposición de corrección

a. Ejercicio 1

La visualización de los diez primeros números es un bucle repetitivo. Sabemos que habrá que mostrar diez filas. El bucle for se adapta perfectamente:

#include <stdio.h>  
#include <math.h>  
  
int main()  
{  
   int i;  
   double raiz, acumulado;  
   acumulado= 0;  
   printf("\nNúmero       Raíz        Acumulado\n\n");  
   for (i = 1; i <=...