Proceso de Admisión 2019 - CINVESTAV

149
Proceso de Admisión 2019 Curso de Programación Básica Dr. Wilfrido Gómez Flores

Transcript of Proceso de Admisión 2019 - CINVESTAV

Page 1: Proceso de Admisión 2019 - CINVESTAV

Proceso de Admisión 2019

Curso de Programación Básica

Dr. Wilfrido Gómez Flores

Page 2: Proceso de Admisión 2019 - CINVESTAV

Tópicos:

1. Introducción

2. Elementos básicos de C

3. Estructuras y sentencias de control

4. Estructuras de datos estáticas

5. Punteros

6. Funciones

1/148 Programación Básica Junio 2019

Page 3: Proceso de Admisión 2019 - CINVESTAV

Introducción

Características generales del lenguaje C

2/148 Programación Básica Junio 2019

Page 4: Proceso de Admisión 2019 - CINVESTAV

Introducción

Un compilador es un programa informático que traduce un programa que ha sidoescrito en un lenguaje de programación a lenguaje de máquina

3/148 Programación Básica Junio 2019

Page 5: Proceso de Admisión 2019 - CINVESTAV

Introducción

// Primer programa en C#include <stdio.h>

main(){

printf("hello , world\n");}

/*Este programa imprime en pantalla una cadenade caracteres con las palabras hello , world*/

Programa 1: Primer programa en C

4/148 Programación Básica Junio 2019

Page 6: Proceso de Admisión 2019 - CINVESTAV

Introducción

Comentarios en el código:

• Caracteres // para una sola línea• Caracteres /* y */ para un bloque de líneas

Finalizar una sentencia con ; (punto y coma)

Directivas #include, #define, y main() no terminan con ;

El archivo de código fuente tiene extensión .c

Compilación (Linux):

gcc hello.c -o hello2

Ejecución (Linux):

./hello2

5/148 Programación Básica Junio 2019

Page 7: Proceso de Admisión 2019 - CINVESTAV

Tipos de datos

Tipos de datos básicos:

char – un sólo byte capaz de almacenar un carácter

int – un entero, típicamente refleja el tamaño natural de losenteros en el sistema huésped

float – punto flotante de precisión simple, no tiene más desiete dígitos significativos

double – punto flotante de doble precisión, puede tener hasta16 dígitos significativos

6/148 Programación Básica Junio 2019

Page 8: Proceso de Admisión 2019 - CINVESTAV

Tipos de datos

RangoTipo Modificador

Mínimo MáximoFormato Bytes

unsigned 0 255 %c 1char

signed −128 127 %c 1

unsigned 0 65, 535 %u 2short

signed −32, 768 32, 767 %d 2

unsigned 0 4, 294, 967, 295 %lu 4int

longsigned −2, 147, 483, 648 2, 147, 483, 647 %ld 4

float −3.40× 1038 3.40× 1038 %f 4

−1.79× 10308 1.79× 10308 %lf 8double

long −1.18× 104932 1.18× 104932 %Lf 8

Los modificadores opcionales que pueden acompañar a los tipos básicos son:con signo, sin signo, largo y corto; y se aplican con las palabras clave: signed,unsigned, long y short, respectivamente. El tipo void se utiliza para declararfunciones que no retornan un valor o para indicar que una función no aceptaargumentos.

7/148 Programación Básica Junio 2019

Page 9: Proceso de Admisión 2019 - CINVESTAV

Tipos de datos

Tipos derivados:

Puntero – es una dirección de memoria que indica dónde selocaliza un objeto de un tipo especificado

Estructura – es un conjunto de uno o más campos de igual odiferentes tipos

Arreglo – es un conjunto de objetos, todos del mismo tipo, queocupan posiciones sucesivas en memoria

Funciones – es una subrutina que puede tomar argumentos devarios tipos de datos y retorna un valor de un tipo especificado

8/148 Programación Básica Junio 2019

Page 10: Proceso de Admisión 2019 - CINVESTAV

Tipos de datos

Nombres de tipos – se pueden declarar nuevos nombres de tipos dedatos (sinónimos de otros tipos) mediante el especificador typedef:

typedef tipo_C identificador;

donde

tipo_C es cualquier tipo de datos definido en C, básico o deri-vadoidentificador es el nuevo nombre dado a tipo_C

Por ejemplo, se propone el tipo ENTERO como sinónimo de int me-diante la instrucción

typedef int ENTERO;

9/148 Programación Básica Junio 2019

Page 11: Proceso de Admisión 2019 - CINVESTAV

Variables

Variable – espacio de memoria cuyo tipo especifica la cantidad dememoria necesaria para guardar información

Cada variable debe declararse antes de ser utilizada

El valor de una variable puede cambiar a lo largo de la ejecuciónde un programa

Características:

• Nombres conformados de letras y dígitos• El primer carácter del nombre siempre es una letra• El guión bajo ‘_’ cuenta como una letra• Letras mayúsculas y minúsculas son diferentes, por ejemplo,x y X son variables diferentes

10/148 Programación Básica Junio 2019

Page 12: Proceso de Admisión 2019 - CINVESTAV

Variables

Palabras clave – identificadores predefinidos reservados, es decir,no se pueden usar como nombres de variables:

auto double int struct

break else long switch

case enum register typedef

char extern return union

const float short unsigned

continue for signed void

default goto sizeof volatile

do if static while

11/148 Programación Básica Junio 2019

Page 13: Proceso de Admisión 2019 - CINVESTAV

Variables

Declaración de variables – enunciar el nombre de la variable yasociarle un tipo:

[clase] tipo_C identificador;

donde

• clase determina si una variable tiene un carácter global(static o extern) o local (auto o register)

• tipo_C determina el tipo de datos de la variable• identificador indica el nombre de la variable

Las variables pueden declararse en tres sitios diferentes:

1. Dentro de las funciones (variables locales)2. Fuera de todas las funciones (variables globales)3. En la definición de los parámetros de las funciones

12/148 Programación Básica Junio 2019

Page 14: Proceso de Admisión 2019 - CINVESTAV

Variables

#include <stdio.h>

int main (void) {typedef int ENTERO;float valor_f1 =1.2389 , valor_f2 =5.4321 , sumaf;ENTERO valor_i1=5, valor_i2=7, sumai;

sumai = valor_i1+valor_i2;sumaf = valor_f1+valor_f2;

printf(" %d+ %d= %07d\n",valor_i1 ,valor_i2 ,sumai );printf(" %2.2f+ %2.4f= %10.1f\n",valor_f1 ,valor_f2 ,sumaf);

return 0;}

Programa 2: Declaración de variables

13/148 Programación Básica Junio 2019

Page 15: Proceso de Admisión 2019 - CINVESTAV

Constantes

Constante – valor que, una vez fijado por el compilador, no cam-bia durante la ejecución del programa

Puede ser un número, un carácter o una cadena de caracteres

Se pueden definir constantes de dos formas:

1. Usando la directiva #define

2. Usando la palabra clave const

14/148 Programación Básica Junio 2019

Page 16: Proceso de Admisión 2019 - CINVESTAV

Constantes

#include <stdio.h>

#define val 10#define floatVal 4.5#define charVal ’G’ // Comillas simples#define stringVal "ABC" // Comillas dobles

int main(void){

printf("Constante entera: %d\n",val);printf("Constante de punto flotante: %.1f\n",floatVal );printf("Constante caracter: %c\n",charVal );printf("Cadena constante: %s\n",stringVal );

return 0;}

Programa 3: Declaración de constantes usando #define

15/148 Programación Básica Junio 2019

Page 17: Proceso de Admisión 2019 - CINVESTAV

Constantes

#include <stdio.h>

int main(){

const int val = 10;const float floatVal = 4.5;const char charVal = ’G’;const char stringVal [10] = "ABC";

printf("Constante entera: %d\n",val);printf("Constante de punto flotante: %.1f\n",floatVal );printf("Constante caracter: %c\n",charVal );printf("Cadena constante: %s\n",stringVal );

return 0;}

Programa 4: Declaración de constantes usando const

16/148 Programación Básica Junio 2019

Page 18: Proceso de Admisión 2019 - CINVESTAV

Funciones de entrada/salidaFunciones de entrada y salida – permiten al programa comunicarsecon el exterior:

printf – escribe bytes en el stdout (monitor), usa formatosespecíficos:

printf("Hola mundo \n");

printf("Imprimir %c %d %f \n”,’a’,28,3.0e+8);

scanf– ingresa bytes (caracteres ASCII) desde el stdin (tecla-do), usa formatos y argumentos específicos:

scanf("%f",&flotante);

scanf("%c\n",&caracter);

scanf("%f %d %c",&flotante, &entero, &caracter);

scanf("%s",cadena); //No lleva &

scanf("%ld",&entero_largo);

17/148 Programación Básica Junio 2019

Page 19: Proceso de Admisión 2019 - CINVESTAV

Funciones de entrada/salida

Tipo Formato Salida%d (int) entero con signo base 10%i (int) entero con signo base 10%u (int) entero sin signo base 10%o (int) entero sin signo base 8%x (int) entero sin signo base 16 (0,1,...,9,a,b,...,f)%X (int) entero sin signo base 16 (0,1,...,9,A,B,...,F)%f (double) valor con signo de la forma [−]dddd.dddd%e (double) valor con signo de la forma [−]d.dddde[±]ddd%E (double) valor con signo de la forma [−]d.ddddE[±]ddd%g (double) valor con signo en formato f ó e

Numérico

%G (double) igual que G, pero introduce E en vez de e%c carácter simple%s cadena de caracteresCarácter% % imprime el carácter de porcentaje ( %)

Especificadores de formato para la función printf

18/148 Programación Básica Junio 2019

Page 20: Proceso de Admisión 2019 - CINVESTAV

Funciones de entrada/salidaSecuencia Descripción\n Nueva línea. El cursor pasa a la primera posición de la siguiente línea.\r Retorno de carro. El cursor pasa a la primera posición de la línea actual.\t Tabulador. El cursor pasa a la siguiente posición de tabulación.\a Alarma. Emite un sonido beep.\b Espacio atrás. Retrocede el cursor una posición a la izquierda.\f Alimentación de página. Crea una nueva página.\v Tabulación vertical.\\ Muestra la barra invertida.\" Muestra la doble comilla.\’ Muestra una comilla simple.\? Muestra el carácter de interrogante.

Secuencias de escape utilizadas por la función printf. Son una combinación debarra invertida ‘\’ y un carácter, y se clasifican en:

Gráficos – corresponden con signos de puntuación usados para escribirNo gráficos – representan a acciones, por ejemplo, mover el cursor de lapantalla al principio de la línea siguiente

19/148 Programación Básica Junio 2019

Page 21: Proceso de Admisión 2019 - CINVESTAV

Funciones de entrada/salida

Especificador de precisión para printf – combina un punto yun entero para indicar el número de posiciones decimales para losnúmeros de punto flotante y se puede colocar justo después delespecificador del ancho mínimo del campo

• Por ejemplo, %10.3d asegura que la longitud del ancho míni-mo del campo sea de 10 caracteres con 3 posiciones decimales

Con el especificador %s, scanf leerá caracteres hasta encontrar unespacio, enter, tabulador, o un retorno de carro

• La cadena de caracteres se guarda en un arreglo que debe serlo suficientemente grande como para almacenarla

• Al final añade automáticamente el carácter nulo ‘\0’

20/148 Programación Básica Junio 2019

Page 22: Proceso de Admisión 2019 - CINVESTAV

Funciones de entrada/salida#include <stdio.h>#define TAM_MAXIMO 80

int main(void){

char cadena[TAM_MAXIMO ];int x, y;float z;

printf("Introduzca dos enteros separados por un espacio: ");scanf(" %d %d" ,&x, &y);

printf("Introduzca un valor flotante: ");scanf(" %f",&z);

printf("Introduzca una cadena: ");scanf(" %s",cadena );

printf("Usted introdujo: ");printf(" %d %d\t %.3f\t %s\n",x,y,z,cadena );

return 0;}

Programa 5: Uso de las funciones printf y scanf21/148 Programación Básica Junio 2019

Page 23: Proceso de Admisión 2019 - CINVESTAV

Funciones de entrada/salida

Ejercicio (5 min): Escribir y ejecutar en tu sistema un programaque pida tu nombre, fecha de nacimiento y edad, y despliegue estainformación en pantalla

22/148 Programación Básica Junio 2019

Page 24: Proceso de Admisión 2019 - CINVESTAV

Operadores y expresiones

Los operadores son símbolos que indican la forma en cómo se manipulan losdatos. Se aplican a variables u otros objetos denominados operandos.

23/148 Programación Básica Junio 2019

Page 25: Proceso de Admisión 2019 - CINVESTAV

Operadores aritméticos

Operador Operación Descripción Ejemplo+ Suma

Los operandos pueden ser enteroso flotantes

5+2→7- Resta 5-2→3* Multiplicación 5*2→10/ División 5/2→2.5% Módulo Los operandos deben ser enteros 5 %2→1

Operadores aritméticos

24/148 Programación Básica Junio 2019

Page 26: Proceso de Admisión 2019 - CINVESTAV

Operadores aritméticos

#include <stdio.h>

int main(void){

int a=10, b=3, c;float w=2.0, x=3.77 , y, z;

c = w-x; // La resta es -1 de tipo enteroy = a+b; // La suma es 13.0 de tipo flotantez = a*x; // La multiplicacion es 37.7 de tipo flotante

return 0;}

Programa 6: Uso de operadores aritméticos. Nota: el resultado siempre serádel tipo de dato de la variable a donde se asignará

25/148 Programación Básica Junio 2019

Page 27: Proceso de Admisión 2019 - CINVESTAV

Operadores lógicos

Tipo Operador OperaciónUnario ! Negación (NOT)

&& Conjunción (AND)Binario

|| Disyunción (OR)

a b !a a&&b a||b0 0 - 0 00 1 1 0 11 0 - 0 11 1 0 1 1

Los operadores lógicos actúan sobre operandos lógicos que se interpretan comoFALSO (0) y VERDADERO (1). El resultado de los operadores lógicos es de tipoint. Los operandos pueden ser enteros, reales o punteros.

26/148 Programación Básica Junio 2019

Page 28: Proceso de Admisión 2019 - CINVESTAV

Operadores lógicos

#include <stdio.h>

int main(void){

int p = 10, q = 0, and , or , not;

and = p&&q; // El resultado es 0or = p||q; // El resultado es 1not = !p; // El resultado es 0

return 0;}

Programa 7: Operadores lógicos.

27/148 Programación Básica Junio 2019

Page 29: Proceso de Admisión 2019 - CINVESTAV

Operadores relacionales

EjemploOperador Operando

a=1 y b=2> a mayor que b a>b→0>= a mayor o igual b a>=b→0< a menor que b a<b→1<= a menor o igual que b (a+1)<=b→1== a igual que b a==b→0!= a diferente que b (a+b)!=3→0

Los operadores relacionales se utilizan para formar expresiones lógicas FALSO (0)y VERDADERO (1). Los operandos pueden ser de tipo entero, real o puntero. Unaexpresión Booleana da como resultado los valores lógicos 0 y 1.

28/148 Programación Básica Junio 2019

Page 30: Proceso de Admisión 2019 - CINVESTAV

Operadores relacionales

#include <stdio.h>

int main(void){

int p, q;float x=15, y=18, z=20;

p = x==y; // p = 0q = (x<y)&&(y<=z); // q = 1

return 0;}

Programa 8: Expresiones Booleanas

29/148 Programación Básica Junio 2019

Page 31: Proceso de Admisión 2019 - CINVESTAV

Operadores lógicos para manejo de bits

Operador Descripción& Operación AND a nivel de bits| Operación OR a nivel de bits^ Operación XOR a nivel de bits<< Desplazamiento a la izquierda>> Desplazamiento a la derecha∼ Complemento a uno (unario)

p q p&q p|q p^q0 0 0 0 00 1 0 1 11 1 1 1 01 0 0 1 1

Los operadores lógicos para manejo de bits ejecutan operaciones bit-a-bit. Solopueden ser aplicados a datos de tipo entero (char, int, short, long), no puedenser flotantes

30/148 Programación Básica Junio 2019

Page 32: Proceso de Admisión 2019 - CINVESTAV

Operadores lógicos para manejo de bits

#include <stdio.h>

int main(void){

unsigned char a = 5; // a = 00000101unsigned char b = 9; // b = 00001001

printf("a = %X, b = %X\n", a, b);printf("a&b = %X\n", a&b); // 00000001 (0x1)printf("a|b = %X\n", a|b); // 00001101 (0xD)printf("a^b = %X\n", a^b); // 00001100 (0xC)printf("~a = %X\n", a = ~a); // 11111010 (0xFA)printf("b<<1 = %X\n", b<<1); // 00010010 (0x12)printf("b>>1 = %X\n", b>>1); // 00000100 (0x4)

return 0;}

Programa 9: Uso de operados lógicos para manejo de bits

31/148 Programación Básica Junio 2019

Page 33: Proceso de Admisión 2019 - CINVESTAV

Operadores de asignación

Operador Descripción Equivalentex=y Asignación x=yx+=y Suma y asignación x=x+yx-=y Resta y asignación x=x-yx*=y Multiplicación y asignación x=x*yx/=y División y asignación x=x/yx %=y Módulo y asignación x=x %yx<<=y Desplazamiento a la izquierda y asignación x=x<<yx>>=y Desplazamiento a la derecha y asignación x=x>>yx&=y AND bit-a-bit y asignación x=x&yx|=y OR bit-a-bit y asignación x=x|yx^=y XOR bit-a-bit y asignación x=x^y

Operadores de asignación

32/148 Programación Básica Junio 2019

Page 34: Proceso de Admisión 2019 - CINVESTAV

Operadores de incremento y decremento

El operador de incremento ‘++’ suma 1 a su operando, mientrasque el operador de decremento ‘--’ sustrae 1

Pueden ser prefijos (antes de la variable, ++x) o sufijos (despuésde la variable, x++)

Por ejemplo, si n=1, entonces

x = n++; // asigna e incrementa

se tendrá x=1 y n=2, y en el caso

x = ++n; // incrementa y asigna

se tendrá x=2 y n=2.

33/148 Programación Básica Junio 2019

Page 35: Proceso de Admisión 2019 - CINVESTAV

Expresión condicional

La expresión condicional, provee una alternativa para escribir cons-trucciones condicionales de forma compacta. Por ejemplo:

if (a > b)

x = a;

else

x = b;

computa en x el máximo de a y b, puede ser escrita como la expresióncondicional

z = (a > b) ? a : b; /* z = max(a, b) */

34/148 Programación Básica Junio 2019

Page 36: Proceso de Admisión 2019 - CINVESTAV

Otros operadores

Operador de coma (,) – separa expresiones, las cuales se evalúande izquierda a derecha: aux = v1, v1 = v2, v2 = aux;

Operador de indirección (*) – accede a un valor indirectamentea través de un puntero. El resultado es el valor direccionado porel operando

Operador de dirección–de (&) – provee la dirección de su ope-rando

Operador sizeof (tamaño de) – provee el tamaño en bytes desu operando, cuyo resultado es un entero sin signo

35/148 Programación Básica Junio 2019

Page 37: Proceso de Admisión 2019 - CINVESTAV

Precedencia y asociatividadNivel Precedencia Asociatividad1 () [] ->. izquierda a derecha2 ! ∼ ++ -- * & (tipo) sizeof derecha a izquierda3 * / % izquierda a derecha4 + - izquierda a derecha5 << >> izquierda a derecha6 < <= > >= izquierda a derecha7 == != izquierda a derecha8 & izquierda a derecha9 ^ izquierda a derecha10 | izquierda a derecha11 && izquierda a derecha12 || izquierda a derecha13 ?: derecha a izquierda14 = += -= *= /= %= &= ^= |= <<= >>= derecha a izquierda15 , izquierda a derecha

Precedencia: prioridad de las operaciones en las expresiones que contienen másde un operador. Asociatividad: con operadores de misma prioridad, especifica siun operando se agrupa con el de su izquierda o el de su derecha

36/148 Programación Básica Junio 2019

Page 38: Proceso de Admisión 2019 - CINVESTAV

Precedencia y asociatividadLa operaciones matemáticas tienen un orden de precedencia, al-gunas operaciones se resuelven antes que otra. Un paréntesis enun lugar diferente de las operaciones puede dar lugar a distintosresultados.

Por ejemplo:

Desarrollo 1:

a = 12/3+2*2-1

= 4+4-1

= 8-1

= 7

Desarrollo 2:

a = 12/(3+2)*2-1

= 12/5*2-1

= 2.4*2-1

= 4.8-1

= 3.8

Desarrollo 3:

a = (12/3)+2*(2-1)

= 4+2*1

= 4+2

= 6

37/148 Programación Básica Junio 2019

Page 39: Proceso de Admisión 2019 - CINVESTAV

Precedencia y asociatividad

Ejercicio (15 min):1) Determinar el resultado de las siguientes operaciones:

int a1 = 5 * 3 + 2 - 4;

int a2 = 2 + 4 + 3 * 5 / 3 - 5;

double a3 = 5 % 3 & 4 + 5 * 6;

double a4 = 5 & 3 && 4 || 5 | 6;

2) Verificar tus resultados escribiendo un programa

38/148 Programación Básica Junio 2019

Page 40: Proceso de Admisión 2019 - CINVESTAV

Conversión implícita de tipos

Conversión implícita – cuando los operando dentro de una expresión son detipos diferentes, se convierten automáticamente a un tipo común, de acuerdo aciertas reglas. En general, las únicas conversiones automáticas son aquellas queconvierten un operando ‘angosto’ (menor precisión) a uno más ‘ancho’ (mayorprecisión) sin pérdida de información

39/148 Programación Básica Junio 2019

Page 41: Proceso de Admisión 2019 - CINVESTAV

Conversión implícita de tiposReglas de conversión implícita:

1. Cualquier operando de tipo float es convertido a tipo double2. Si un operando es de tipo long double, el otro operando es conver-

tido a long double3. Si un operando es de tipo double, el otro operando es convertido a

double4. Cualquier operando de tipo char o short es convertido a tipo int5. Cualquier operando de tipo unsigned char o unsigned short es

convertido a tipo unsigned int6. Si un operando es de tipo unsigned long, el otro operando es con-

vertido a unsigned long7. Si un operando es de tipo long, el otro operando es convertido a

long8. Si un operando es de tipo unsigned int, el otro operando es con-

vertido a unsigned int

40/148 Programación Básica Junio 2019

Page 42: Proceso de Admisión 2019 - CINVESTAV

Conversión implícita de tipos

Ejemplo:

long a;

unsigned char b;

int c;

float d;

int f;

f = a + b * c / d;

1. b es convertido a unsigned int (regla 5)2. c es convertido a unsigned int (regla 8). Se

realiza la multiplicación (*) y se obtiene elresultado de tipo int

3. d es convertido a double (regla 1)4. El resultado de b*c es convertido a double

(regla 3). Se realiza la división (/) y se obtiene elresultado de tipo double

5. a es convertido a double (regla 3). Se realiza lasuma (+) y se obtiene un resultado de tipo double

6. El resultado de a + b * c / d, para ser asignadoa f, es convertido a entero por truncamiento, estoes, eliminando la parte fraccionaria

41/148 Programación Básica Junio 2019

Page 43: Proceso de Admisión 2019 - CINVESTAV

Conversión implícita de tipos

En resumen:

Los operandos que intervienen en una determinada operación,son convertidos al tipo de precisión más alta

La aritmética de punto flotante se realiza en doble precisión

En una asignación, el valor de la parte derecha es convertido altipo del valor de la parte izquierda

42/148 Programación Básica Junio 2019

Page 44: Proceso de Admisión 2019 - CINVESTAV

Conversión explícita de tipos

Conversión explícita – se realiza mediante una construcción deno-minada cast, que tiene la forma:

(nombre-de-tipo)expresión;

La expresión es convertida al tipo especificado aplicando las reglasde conversión expuestas anteriormente. Por ejemplo,

int x = 5;

float y;

y = (float)x/2;

en este caso el valor asignado a la variable y será 2.5.

43/148 Programación Básica Junio 2019

Page 45: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 1.a: Escriba un programa para redondear un enteroi al siguiente múltiplo más grande de otro entero j.

Entrada:

Introduzca los valores de i y j: 256 7

Salida:

El siguiente múltiplo más grande es 259

44/148 Programación Básica Junio 2019

Page 46: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

#include <stdio.h>

int main(void){

int i, j, k;

printf("Introduzca los valores de i y j: ");scanf(" %d %d" ,&i, &j);

k = i+j-i %j;

printf("El siguiente multiplo mas grande es %d\n",k);return 0;

}

Programa 10: Solución del Ejercicio 1.a

45/148 Programación Básica Junio 2019

Page 47: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 1.b: El peso de una mercancía dada en kilogramos (kg) es la entradaa través del teclado. Escriba un programa para convertir e imprimir este peso engramos (g), quintales (qt), toneladas métricas (ton) y libras (lbs), considerandohasta tres dígitos decimales. Las equivalencias que deben tomarse en cuentason: 1 kg = 1000 g, 1 qt = 100 kg, 1 ton = 1000 kg, y 1 kg = 2.204 lbs.

Entrada:

Introduzca el peso en kilogramos: 45.87

Salida:

El peso en gramos es 45870.000El peso en quintales es 0.459El peso en toneladas metricas es 0.046El peso en libras es 101.097

46/148 Programación Básica Junio 2019

Page 48: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

#include <stdio.h>

int main(void){

float kg , g, qt, ton , lbs;

printf("Introduzca el peso en kilogramos: ");scanf(" %f", &kg);

g = kg *1000.0;qt = kg /100.0;ton = kg /1000.0;lbs = kg *2.204;

printf("El peso en gramos es %0.3f\n", g);printf("El peso en quintales es %0.3f\n", qt);printf("El peso en toneladas metricas es %0.3f\n", ton);printf("El peso en libras es %0.3f\n", lbs);return 0;

}

Programa 11: Solución del Ejercicio 1.b

47/148 Programación Básica Junio 2019

Page 49: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 1.c: Considere un cajero automático en el cual existen billetes de ochodenominaciones: 1, 2, 5, 10, 50, 100, 500 y 1000. Si se introduce por tecladouna cantidad entera N de dinero que se desea retirar, escriba un programa paracalcular el menor número de billetes que combinados dan la cantidad N.

Entrada:

Introduce la cantidad que deseas retirar: 1547

Salida:

$1000: 1$500: 1$100: 0$50: 0$10: 4$5: 1$2: 1$1: 0Número de billetes: 8

48/148 Programación Básica Junio 2019

Page 50: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

#include <stdio.h>

int main(void){int N, n1000 , n500 , n100 , n50 , n10 , n5 , n2 , n1 , T;printf("Introduce la cantidad que deseas retirar: ");scanf(" %d", &N);

n1000 = N/1000; N = N %1000;n500 = N/500; N = N %500;n100 = N/100; N = N %100;n50 = N/50; N = N %50;n10 = N/10; N = N %10;n5 = N/5; N = N %5;n2 = N/2; N = N %2;n1 = N/1; N = N %1;T = n1000+n500+n100+n50+n10+n5+n2+n1;

printf("\n $1000: %d", n1000);printf("\n $500: %d", n500);printf("\n $100: %d", n100);printf("\n $50: %d", n50);printf("\n $10: %d", n10);printf("\n $5: %d", n5);printf("\n $2: %d", n2);printf("\n $1: %d", n1);printf("\n Numero de billetes: %d\n", T);return 0;

}

Programa 12: Solución del Ejercicio 1.c

49/148 Programación Básica Junio 2019

Page 51: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 1.d: Escriba un programa que reciba los valores en grados de latitudy longitud de dos lugares sobre la Tierra y calcule la distancia en kilómetrosentre estos puntos. La fórmula para calcular la distancia es:

D = 2r arcsin

(√sin2

(ϕ2 − ϕ1

2

)+ cos (ϕ1) cos (ϕ2) sin

2

(λ2 − λ1

2

)),

donde r = 6335.439 es el diámetro aproximado de la Tierra en km, (ϕ1, λ1)

son la latitud y longitud del punto 1, y (ϕ2, λ2) son la latitud y longitud delpunto 2. Para realizar este ejercicio se debe considerar lo siguiente:

El argumento de cada función trigonométrica está dado en radianes.Se requiere la biblioteca math.h para utilizar funciones matemáticas.Para compilar el comando es gcc programa.c -o programa -lm

Entrada:

Ingrese la latitud y longitud del punto 1: 53.320 -1.729Ingrese la latitud y longitud del punto 2: 53.318 -1.699

Salida:

La distancia entre los puntos 1 y 2 es 1.993848 km

50/148 Programación Básica Junio 2019

Page 52: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

#include <stdio.h>#include <math.h>

#define PI 3.14159#define R 6335.439

int main(void){

float L1 , L2 , G1, G2, D, aux;

printf("Ingrese la latitud y longitud del punto 1: ");scanf(" %f %f", &L1, &G1);printf("Ingrese la latitud y longitud del punto 2: ");scanf(" %f %f", &L2, &G2);

L1 = L1*PI /180.0;L2 = L2*PI /180.0;G1 = G1*PI /180.0;G2 = G2*PI /180.0;

aux = pow(sin((L2-L1) / 2), 2) +cos(L1) * cos(L2) *pow(sin((G2-G1) / 2), 2);

D = 2 * R * asin(sqrt(aux));

printf("La distancia entre los puntos 1 y 2 es %f km\n",D);return 0;

}

Programa 13: Solución del Ejercicio 1.d

51/148 Programación Básica Junio 2019

Page 53: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 1.e: Escriba un programa que reciba las coordenadas Cartesianas(x, y) de un punto y las convierta a coordenadas Polares (r, θ), donde:

r =√x2 + y2 y θ = arctan(y/x),

y que convierta a grados el valor de θ. Para realizar este ejercicio se debeconsiderar lo siguiente:

Se requiere la biblioteca math.h para utilizar funciones matemáticas.Usar la función atan2 en vez de atan.Para compilar el comando es gcc programa.c -o programa -lm

Entrada:

Ingrese las coordenadas Cartesianas (x,y): 12 12

Salida:

Las coordenadas Polares son (16.971,45.000)

52/148 Programación Básica Junio 2019

Page 54: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

#include <stdio.h>#include <math.h>

#define PI 3.14159

int main(void){

float x, y, r, theta;

printf("Ingrese las coordenadas Cartesianas (x,y): ");scanf(" %f %f", &x, &y);

r = sqrt(x*x + y*y);theta = atan2(y,x)*180.0/ PI;

printf("Las coordenadas Polares son ( %.3f, %.3f)\n", r, theta);return 0;

}

Programa 14: Solución del Ejercicio 1.e

53/148 Programación Básica Junio 2019

Page 55: Proceso de Admisión 2019 - CINVESTAV

Estructuras y sentencias de control

Las estructuras de control permiten modificar el flujo de ejecuciónde las instrucciones de un programa. Existen tres tipos de estructurasde control:

1. Secuenciales – ejecución sucesiva de dos o más operaciones

2. Selectivas – se realiza una u otra operación dependiendo deuna condición

3. Iterativas – repetición de una operación mientras se no cumplauna condición

54/148 Programación Básica Junio 2019

Page 56: Proceso de Admisión 2019 - CINVESTAV

Estructuras selectivas: if-elseSe toma una decisión referente a la acción a ejecutar en un pro-grama, basándose en el resultado lógico (verdadero o falso) de unaexpresión:

if (expresión)

sentencia1;

else

sentencia2;

donde la cláusula else es opcional.

Se derivan tres casos:

1. Si expresión es VERDADERO, entonces ejecutar sentencia12. Si expresión es FALSO, entonces ejecutar sentencia23. Si expresión es FALSO y else se ha omitido, entonces ig-

norar sentencia1

55/148 Programación Básica Junio 2019

Page 57: Proceso de Admisión 2019 - CINVESTAV

Estructuras selectivas: if-else

Es posible anidar las sentencias if-else, esto es, escribir una se-cuencia if-else dentro de otra secuencia if-else:

if (expresión1)if (expresión2)

sentencia1;else

sentencia2;

expr1 expr2 sent1 sent2

F F no noF V no noV F no siV V si no

if (expresión1){

if (expresión2)sentencia1;

}else

sentencia2;

expr1 expr2 sent1 sent2

F F no siF V no siV F no noV V si no

56/148 Programación Básica Junio 2019

Page 58: Proceso de Admisión 2019 - CINVESTAV

Estructuras selectivas: if-else#include <stdio.h>

int main(void){

float a, b, c, menor;

printf("Introduce tres numeros a, b y c: ");scanf(" %f %f %f", &a, &b, &c);

if (a < b)if (a < c)

menor = a;else

menor = c;else

if (b < c)menor = b;

elsemenor = c;

printf("El menor es %f\n", menor);return 0;

}

Programa 15: Menor de tres números

57/148 Programación Básica Junio 2019

Page 59: Proceso de Admisión 2019 - CINVESTAV

Estructuras selectivas: else if

La construcción else if es utilizada para es-cribir programas con múltiples opciones de de-cisión

Las expresiones son evaluadas en orden; sicualquiera de ellas es verdadera, la sentenciaasociada se ejecuta y esto termina toda la ca-dena de opciones

El último else es para indicar ‘ninguna de lasanteriores se satisfizo’

if (expresión1)sentencia1;

else if (expresión2)sentencia2;

else if (expresión3)sentencia3;

.

.

.else

sentenciaN;

58/148 Programación Básica Junio 2019

Page 60: Proceso de Admisión 2019 - CINVESTAV

Estructuras selectivas: else if#include <stdio.h>

int main(void){

char ar[20];int cc;float pu;

printf("Nombre del articulo: ");scanf(" %s", ar);printf("Cantidad comprada: ");scanf(" %d", &cc);printf("Precio unitario: ");scanf(" %f", &pu);

printf("\n\n %20s\t %10s\t %10s\t %10s\t %10s\n","Articulo","Cantidad","P.U."," %","Total");

printf(" %20s\t %10d\t %10.2f", ar , cc, pu);

if (cc > 100)printf("\t %9d % %\t %10.2f\n\n", 40, cc*pu *0.6);

else if (cc >= 25)printf("\t %9d % %\t %10.2f\n\n", 20, cc*pu *0.8);

else if (cc >= 10)printf("\t %9d % %\t %10.2f\n\n", 10, cc*pu *0.9);

elseprintf("\t %10s\t %10.2f\n\n", "--", cc*pu);

return 0;}

Programa 16: Cantidad a pagar en función de la cantidad comprada

59/148 Programación Básica Junio 2019

Page 61: Proceso de Admisión 2019 - CINVESTAV

Estructuras selectivas: switch

La sentencia switch trata con múltiples op-ciones para probar si una expresión coincidecon alguno de los valores constantes enteros

Cada case está etiquetado con uno o másvalores enteros contantes o expresiones cons-tantes

El default es opcional; si se omitió y nin-guno de los casos coincide, ninguna acción seejecuta

Después que el código de un case se realizó,se debe indicar una acción explícita de escapecon break o return

switch (expresion) {case const-expr1:

setencia1;case const-expr2:

setencia2;...default:

setenciaN;}

60/148 Programación Básica Junio 2019

Page 62: Proceso de Admisión 2019 - CINVESTAV

Estructuras selectivas: switch#include <stdio.h>

int main(void){char letra;printf("Introduzca una letra: ");scanf(" %c",&letra);

switch(letra ){case ’a’ | ’A’:

printf("La letra %c es vocal\n",letra);break;

case ’e’ | ’E’:printf("La letra %c es vocal\n",letra);break;

case ’i’ | ’I’:printf("La letra %c es vocal\n",letra);break;

case ’o’ | ’O’:printf("La letra %c es vocal\n",letra);break;

case ’u’ | ’U’:printf("La letra %c es vocal\n",letra);break;

default:printf("La letra %c es consonante\n",letra );break;

}return 0;

}

Programa 17: Determina si una letra es vocal o consonante

61/148 Programación Básica Junio 2019

Page 63: Proceso de Admisión 2019 - CINVESTAV

Estructuras iterativas: for

La sentencia for permite definir ciclos controlados por contador:

for (inicialización; condición; progresión)

sentencia;

inicialización define el estado inicial de un contadorcondición es una expresión Booleana que define un criterio pararealizar las repeticiones; si es VERDADERA, ejecuta la sentencia,se evalúa la expresión en progresión, y vuelve a evaluarse lacondición; si es FALSA, finalizan las repeticiones y continua conla siguiente sentencia del programaprogresión es una expresión se utiliza para modificar el valor delcontador en forma incremental o decremental

62/148 Programación Básica Junio 2019

Page 64: Proceso de Admisión 2019 - CINVESTAV

Estructuras iterativas: for

En el siguiente ejemplo se imprimen los números del 1 al 100. Lite-ralmente dice: desde n igual a 1, mientras n sea menor o igual que100, con incrementos de 1, imprime el valor de n:

int n; // contador

for (n = 1; n <= 100; n++)

printf("%3d\n", n);

63/148 Programación Básica Junio 2019

Page 65: Proceso de Admisión 2019 - CINVESTAV

Estructuras iterativas: while

La sentencia while se ejecutará mientras el valor de una condiciónsea verdadera:

while (condición)

sentencia;

condición puede ser una expresión relacional o lógica. Si lacondición es VERDADERA, se ejecuta la sentencia y se vuelve aevaluar la condición; si es FALSA, la sentencia no se ejecuta y elprograma continua

La condición se evalúa primero, de modo que la sentencia

puede nunca ejecutarse si la condición es FALSA

Se debe incluir algún elemento que altere el valor de condición,proporcionando la salida del ciclo

64/148 Programación Básica Junio 2019

Page 66: Proceso de Admisión 2019 - CINVESTAV

Estructuras iterativas: while

En el siguiente ejemplo se imprimen los números del 1 al 100. Li-teralmente dice: mientras n sea menor o igual que 100, imprime elvalor de n e incrementa en 1 el valor de n:

int n = 1; // contador

while (n <= 100) {

printf("%3d\n", n);

n++;

}

65/148 Programación Básica Junio 2019

Page 67: Proceso de Admisión 2019 - CINVESTAV

Estructuras iterativas: do

La sentencia do es similar al while excepto que la condición seevalúa al final del ciclo y no al inicio, lo que obliga a que se ejecutela sentencia por lo menos una vez:

do

sentencia;

while (condición);

Se debe incluir algún elemento que altere el valor de condición

para proporcionar eventualmente la salida del ciclo

66/148 Programación Básica Junio 2019

Page 68: Proceso de Admisión 2019 - CINVESTAV

Estructuras iterativas: do

En el siguiente ejemplo se imprimen los números del 1 al 100. Li-teralmente dice: imprime el valor de n e incrementa su valor en 1

mientras n sea menor o igual que 100:

int n = 1; // contador

do {

printf("%3d\n", n);

n++;

}

while(n<=100);

67/148 Programación Básica Junio 2019

Page 69: Proceso de Admisión 2019 - CINVESTAV

Ciclos anidados

Con las sentencias for, while y do se pueden formar ciclos anidados.Un ciclo interno se ejecutará totalmente cada vez que se ejecute elciclo que lo contiene:

while(condición) {

while(condición) {sentencia(s);

}sentencia(s);

}

do {sentencia(s);

do {sentencia(s);

}while(condición);

}while(condición);

for (init;cond;incr) {

for (init;cond;incr) {sentencia(s);

}sentencia(s);

}

68/148 Programación Básica Junio 2019

Page 70: Proceso de Admisión 2019 - CINVESTAV

Ciclos anidados

#include <stdio.h>

int main(void){

int i, j;

for(i=1; i<=10; i++) {for(j=1; j<=5; j++) {

printf(" %d\t", (i*j));}printf("\n");

}return 0;

}Programa 18: Tabla de multiplicar del 1 al 5

69/148 Programación Básica Junio 2019

Page 71: Proceso de Admisión 2019 - CINVESTAV

Sentencia break

La sentencia break provee una salida prematura de las estructuras iterativas for,while y do. En ciclos anidados, un break causa que el ciclo más interno termineinmediatamente y se ejecuta la siguiente línea después del bloque. Se usa casisiempre con una sentencia if-else dentro del ciclo.

70/148 Programación Básica Junio 2019

Page 72: Proceso de Admisión 2019 - CINVESTAV

Sentencia break

#include <stdio.h>

int main(void) {int i=1;float num , suma = 0.0;do {

printf("Ingresa n %d: ",i);scanf(" %f",&num);i++;if (num < 0)

break;suma += num;

}while(i <=10);printf("Suma = %.3f\n",suma);return 0;

}Programa 19: Ejemplo del uso de la sentencia break

71/148 Programación Básica Junio 2019

Page 73: Proceso de Admisión 2019 - CINVESTAV

Sentencia continue

La sentencia continue, estando dentro de las estructuras iterativas while, do yfor, pasa el control para que se ejecute la siguiente iteración, ignorando todas lassentencias dentro del ciclo que se encuentran después de la llamada al continue.Se usa casi siempre con una sentencia if-else dentro del ciclo.

72/148 Programación Básica Junio 2019

Page 74: Proceso de Admisión 2019 - CINVESTAV

Sentencia continue

#include <stdio.h>

int main(){

int i;float num , suma = 0.0;

for(i=1; i <= 10; ++i){printf("Ingresa n %d: ",i);scanf(" %f", &num);if (num < 0)

continue;suma += num;

}printf("Suma = %.3f\n", suma);return 0;

}Programa 20: Ejemplo del uso de la sentencia continue73/148 Programación Básica Junio 2019

Page 75: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 2.a: Escribe un programa que reciba un carácter desde el teclado yque determine si el carácter es una letra mayúscula, una letra minúscula, undígito o un símbolo especial.Para realizar este ejercicio, se debe tomar en cuenta que los valores ASCIIde todos los caracteres caen en el rango 0 a 255. Existen diferentes rangospreasignados para diferentes tipos de caracteres, los cuales son:

Letras mayúsculas: 65 a 90Letras minúsculas: 97 a 122Dígitos: 48 a 57Símbolos especiales: 0 a 47, 58 a 64, 91 a 96, 123 a 255

Entrada:

Ingresa un carácter: A

Salida:

El carácter A es una letra mayúscula

74/148 Programación Básica Junio 2019

Page 76: Proceso de Admisión 2019 - CINVESTAV

Ejercicios#include <stdio.h>

int main(void){

char ch;

printf("Ingresa un caracter: ");scanf(" %c", &ch);

if (ch >= 0 && ch <= 255){if (ch >= 65 && ch <= 90)

printf("El caracter %c es una letra mayuscula\n", ch);else if (ch >= 97 && ch <= 122)

printf("El caracter %c es una letra minuscula\n", ch);else if (ch >= 48 && ch <= 57)

printf("El caracter %c es un digito\n", ch);else

printf("El caracter %c es un simbolo especial\n", ch);}else

printf("Caracter no registrado\n");

return 0;}

Programa 21: Solución del Ejercicio 2.a

75/148 Programación Básica Junio 2019

Page 77: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 2.b: Si la suma de cubos de cada dígito de un número con tresdígitos es igual al número mismo, entonces el número es llamado númerode Armstrong, por ejemplo, 153 = 13 + 53 + 33. Escribir un programaque calcule los números de Armstrong entre 1 y 500.

Salida:

Los números de Armstrong en el rango [1,500] son:1153370371407

76/148 Programación Básica Junio 2019

Page 78: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

#include <stdio.h>#include <math.h>

int main(void){

int num , n, d1, d2, d3;

printf("Los numeros de Armstrong en el rango [1 ,500] son:\n");for (num = 1; num <= 500; num++){

n = num;d3 = pow(n % 10 ,3);n = n / 10;d2 = pow(n % 10 ,3);n = n / 10;d1 = pow(n % 10 ,3);if (d1 + d2 + d3 == num)

printf(" %d\n",num);}

return 0;}

Programa 22: Solución del Ejercicio 2.b

77/148 Programación Básica Junio 2019

Page 79: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 2.c: El logaritmo natural puede aproximarse mediante la serie:

x− 1

x+

1

2

(x− 1

x

)2

+1

3

(x− 1

x

)3

+1

4

(x− 1

x

)4

+ . . .

Si x es un número entero positivo ingresado por teclado, escriba un programaque calcule la suma de los primeros 100 términos de esta serie. Si x es menoro igual que cero se debe mandar el mensaje ‘logaritmo indefinido’.Para realizar este ejercicio se debe considerar lo siguiente:

Se requiere la biblioteca math.h para utilizar funciones matemáticas.Para compilar el comando es gcc programa.c -o programa -lm

Entrada:

Ingrese el valor de x: 21

Salida:

log(21) = 3.0432369709

78/148 Programación Básica Junio 2019

Page 80: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

#include <stdio.h>#include <math.h>

int main(){

int x, i;float term , result;

printf("Ingresa el valor de x: ");scanf(" %d",&x);

if (x<=0)printf("Logaritmo no definido .\n");

else{

result = 0;for(i=1;i <=100;i++){

term = (1.0/i)*pow((( float)x -1.0)/( float)x,i);result = result+term;

}printf("log( %d) = %10.10f\n",x,result );

}return 0;

}

Programa 23: Solución del Ejercicio 2.c

79/148 Programación Básica Junio 2019

Page 81: Proceso de Admisión 2019 - CINVESTAV

EjerciciosEjercicio 2.d: Un conjunto de puntos son colineales si poseen la misma pendiente entre cada parde puntos. La pendiente de una recta dados dos puntos (x1, y1) y (x2, y2) se calcula como:

m =|y2 − y1||x2 − x1|

,

donde el símbolo de doble barra | · | denota el valor absoluto de la diferencia. A partir del valorde la pendiente, el ángulo de inclinación de la recta es:

θ =180

π· arctan(m),

donde θ está dado en grados. Entonces, dados tres puntos (x1, y1), (x2, y2) y (x3, y3),escribir un programa para verificar si todos los tres puntos caen sobre una línea recta, así comoel ángulo de inclinación de la recta.Para realizar este ejercicio se debe considerar lo siguiente:

Se requiere la biblioteca math.h para utilizar la función atan.Para compilar el comando es gcc programa.c -o programa -lmSe requiere la biblioteca stdlib.h para utilizar la función abs.

Entrada:

Ingresa coordenadas x1 y y1 del primer punto: 6 -2Ingresa coordenadas x2 y y2 del segundo punto: 2 1Ingresa coordenadas x3 y y3 del tercer punto: -2 4

Salida:

Los puntos son colineales y el angulo es 36.87 grados

80/148 Programación Básica Junio 2019

Page 82: Proceso de Admisión 2019 - CINVESTAV

Ejercicios#include <stdio.h>#include <math.h>#include <stdlib.h>#define PI 3.14159265

int main(){

int x1, y1, x2, y2, x3, y3;float s1 , s2 , s3, ang;

printf("\nIngresa coordenadas x1 y y1 del primer punto: ");scanf(" %d %d",&x1 ,&y1);printf("\nIngresa coordenadas x2 y y2 del segundo punto: ");scanf(" %d %d",&x2 ,&y2);printf("\nIngresa coordenadas x1 y y1 del tercer punto: ");scanf(" %d %d",&x3 ,&y3);

if (x1==x2 && x2==x3)printf("\nLos puntos son colineales\n");

else if (x1!=x2 && x2!=x3 && x3!=x1) {s1 = (float) abs(y2-y1)/( float) abs(x2-x1);s2 = (float) abs(y3-y2)/( float) abs(x3-x2);s3 = (float) abs(y3-y1)/( float) abs(x3-x1);if (s1==s2 && s2==s3) {

ang = atan(s1 )*180/ PI;printf("\nLos puntos son colineales y el angulo es %5.2f grados\n",ang);

}else

printf("\nLos puntos no son colineales\n");}else

printf("\nLos puntos no son colineales\n");return 0;

}

Programa 24: Solución del Ejercicio 2.d81/148 Programación Básica Junio 2019

Page 83: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 2.e: Escriba un programa que imprima las 24 horas del díacon sufijos adecuados como A.M., P.M., Mediodía, y Medianoche.Salida:

12 Medianoche1 A.M.2 A.M....12 Mediodía1 P.M.2 P.M....10 P.M.11 P.M.

82/148 Programación Básica Junio 2019

Page 84: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

#include <stdio.h>

int main(void){

int hora;

for (hora = 0; hora <= 23; hora ++){

if (hora == 0){

printf("12 Medianoche\n");continue;

}

if (hora < 12)printf(" %d A.M.\n", hora);

if (hora == 12)printf("12 Mediodia\n");

if (hora > 12)printf(" %d P.M.\n", hora %12);

}

return 0;}

Programa 25: Solución del Ejercicio 2.e

83/148 Programación Básica Junio 2019

Page 85: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 2.f: El factorial de un entero positivo n se define comoel producto de todos los números enteros positivos desde 1 hastan. Por ejemplo: 4! = 1× 2× 3× 4 = 24. Por definición, el factorialde 0 es la unidad. Escriba un programa que calcule el factorial deun número n menor o igual que 20 que se introduzca por teclado.

Entrada:

Ingresa un número entero: 12

Salida:

12! = 479001600

84/148 Programación Básica Junio 2019

Page 86: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

#include <stdio.h>

int main(void){

int num , i = 1;unsigned long int fact = 1;

printf("Ingresa un numero entero: ");scanf(" %d", &num);if (num <0 || num >20){

printf("Error: el numero debe ser en el rango [0 ,20]\n");}else if (num == 0){

printf(" %d! = %lu\n", num , fact);}else{

while (i <= num){

fact = fact*i;i++;

}printf(" %d! = %lu\n", num , fact);

}

return 0;}

Programa 26: Solución del Ejercicio 2.f

85/148 Programación Básica Junio 2019

Page 87: Proceso de Admisión 2019 - CINVESTAV

Estructuras de datos estáticas

Estructuras de datos – colección de datos caracterizados por suorganización y las operaciones que se definen sobre ella:

1. Estructuras de datos estáticas: el tamaño en memoria es-tá predefinido y no puede modificarse durante la ejecución delprograma

2. Estructuras de datos dinámicas: no tienen limitaciones pre-definidas en el tamaño de memoria ocupada

86/148 Programación Básica Junio 2019

Page 88: Proceso de Admisión 2019 - CINVESTAV

Estructuras de datos estáticas

87/148 Programación Básica Junio 2019

Page 89: Proceso de Admisión 2019 - CINVESTAV

Arreglos

Arreglos (arrays) – representan el concepto matemático de vectory matriz; es una secuencia de posiciones que tiene las siguientescaracterísticas:

Ordenado: el enésimo elemento puede ser identificado

Homogéneo: contiene datos del mismo tipo

Selección de posiciones mediante índices

Unidimensionales y multidimensionales

88/148 Programación Básica Junio 2019

Page 90: Proceso de Admisión 2019 - CINVESTAV

Arreglos unidimensionales

Arreglo unidimensional o vector consta de n elementos, cadauno tiene una posición específica designado por un índice:

datos[0], datos[1], . . . , datos[i], . . . , datos[n-1]

Los índices son enteros consecutivos y comienzan en 0.

En cada posición del vector se almacena un valor:

Un vector llamado X con ocho elementos

89/148 Programación Básica Junio 2019

Page 91: Proceso de Admisión 2019 - CINVESTAV

Arreglos unidimensionales

Declaración de un arreglo unidimensional:

tipo_C identificador[tamaño];

donde

• tipo_C indica el tipo de los elementos del arreglo• identificador es el nombre del arreglo• tamaño es una constante que indica el número de elementos

Por ejemplo:

int lista[100];

char nombre[40];

se crean dos arreglos, el primero llamado lista con 100 elementos(del 0 al 99) de tipo int, y el segundo llamado nombre con 40elementos (del 0 al 39) de tipo char

90/148 Programación Básica Junio 2019

Page 92: Proceso de Admisión 2019 - CINVESTAV

Arreglos unidimensionales

#include <stdio.h>#define TAM 10

int main(void){

int a[TAM], n = 0;

do{printf("a[ %d] = ", n);scanf(" %d", &a[n]);n++;

}while (n < TAM);return 0;

}Programa 27: Creación y rellenado de un vector

91/148 Programación Básica Junio 2019

Page 93: Proceso de Admisión 2019 - CINVESTAV

Arreglos multidimensionales

Se pueden definir arreglos de varias dimensiones:

• Bidimensional: dos dimensiones (matrices)• Multidimensional: tres o más dimensiones (hipermatrices)

Declaración de un arreglo multidimensional:

tipo_C identificador[tam1][tam2]...[tamN];

donde

• tipo_C indica el tipo de los elementos del arreglo• identificador es el nombre del arreglo• tam1, tam2, . . . , tamN son constantes que indican el número

de elementos en cada dimensión

92/148 Programación Básica Junio 2019

Page 94: Proceso de Admisión 2019 - CINVESTAV

Arreglos multidimensionales

Por ejemplo:

char array2d[3][4];int array3d[3][3][3];

se declaran dos arreglos multidimensionales, el primero llamado array2d de dosdimensiones con 12 elementos (tres filas y cuatro columnas) todos de tipo char

(izquierda), el segundo llamado array3d de tres dimensiones con 27 elementostodos de tipo int (derecha)

93/148 Programación Básica Junio 2019

Page 95: Proceso de Admisión 2019 - CINVESTAV

Arreglos multidimensionales

Para acceder a un elemento del arreglo, se hace mediante el nom-bre del arreglo seguido de uno o más subíndices dependiendo delas dimensiones del mismo, cada uno de ellos encerrados entrecorchetes ‘[ ]’

Por ejemplo, A[1] accede a la segunda posición del vector A, oB[1][2] accede al elemento ubicado en la segunda fila y terceracolumna de la matriz B

Un subíndice puede ser una constante o una variable

94/148 Programación Básica Junio 2019

Page 96: Proceso de Admisión 2019 - CINVESTAV

Arreglos multidimensionales

Se pueden crear arreglos con valores preestablecidos desde su decla-ración:

int a[5] = {1,2,3,4,5};

int b[2][3] = {1,2,3,4,5,6};

se crean dos arreglos, el primero llamado a es un vector con cincoelementos, mientras que el segundo es una matriz llamada b con seiselementos. Debido a que los arreglos son almacenados por filas, elarreglo b está dispuesto de la siguiente manera:

b =

[1 2 3

4 5 6

]

95/148 Programación Básica Junio 2019

Page 97: Proceso de Admisión 2019 - CINVESTAV

Arreglos multidimensionales#include <stdio.h>#define FILAS 3#define COLS 3

int main(void){

float t[FILAS][COLS];int f, c;

for(f=0; f<FILAS; f++){

printf("\nDatos para la fila %d\n",f);for(c=0; c<COLS; c++)

scanf(" %f", &t[f][c]);}return 0;

}Programa 28: Creación y rellenado de una matriz

96/148 Programación Básica Junio 2019

Page 98: Proceso de Admisión 2019 - CINVESTAV

Cadenas de caracteres

Cadena de caracteres – arreglo unidimensional en el cual todossus elementos son de tipo char:

char nombre[40];

declara un arreglo llamado nombre con longitud máxima de 40caracteres

En la longitud máxima se considera un carácter nulo ‘\0’, con elcual C finaliza todas las cadenas

Si se desea introducir una cadena de hasta 40 caracteres, se debedeclarar el arreglo considerando el carácter nulo (n+ 1):

char nombre[41];

97/148 Programación Básica Junio 2019

Page 99: Proceso de Admisión 2019 - CINVESTAV

Cadenas de caracteres

Una cadena puede ser inicializada asignándole un literal:

char cadena[] = "abcde";

declara una cadena con seis elementos (cadena[0] a cadena[5]),donde el sexto elemento es el carácter nulo

Se pueden inicializar arreglos de cadenas de caracteres:

char lista[100][60];

lo cual crea un arreglo llamado lista con 100 filas y cada una deellas es una cadena de caracteres de longitud máxima de 60

98/148 Programación Básica Junio 2019

Page 100: Proceso de Admisión 2019 - CINVESTAV

Cadenas de caracteres

#include <stdio.h>

int main(void){

char saludo [] = "Hola ";char nombre [10];

printf("Introduce tu nombre: ");scanf(" %s",nombre );printf(" %s %s\n",saludo ,nombre );return 0;

}Programa 29: Declaración de una cadena de caracteres

99/148 Programación Básica Junio 2019

Page 101: Proceso de Admisión 2019 - CINVESTAV

Cadenas de caracteres: gets y puts

Para introducir cadenas de caracteres que incluyan espacios, seutiliza la función gets definida en la biblioteca stdio.h

• Se pueden introducir todos los caracteres del teclado, excep-to el carácter de nueva línea ‘\n’, que es automáticamentereemplazado por el carácter nulo ‘\0’, con el cual C finalizatodas las cadenas

• La función gets devuelve un puntero al valor leído. Un valornulo indica un error o una condición de fin de archivo (EOF,end of file)

Recomendación: llamar la función fflush(stdin) (Windows,stdlib.h) o fpurge(stdin) (Mac Os, stdio.h) después de unalectura con scanf o getchar, y antes de una lectura con gets

100/148 Programación Básica Junio 2019

Page 102: Proceso de Admisión 2019 - CINVESTAV

Cadenas de caracteres: gets y putsLa función puts escribe una cadena al monitor, y reemplaza elcarácter nulo de terminación de la cadena por el carácter de nuevalínea ‘\n’

La función puts retorna un valor positivo si se ejecuta satisfacto-riamente, en caso contrario retorna el valor EOF

#include <stdio.h>

int main(void){

char saludo [] = "Hola ";char nombre [50], *pc;

printf("Introduce tu nombre completo: ");pc = gets(nombre );printf(" %s",saludo );puts(pc);return 0;

}

Programa 30: Uso de las funciones gets y puts

101/148 Programación Básica Junio 2019

Page 103: Proceso de Admisión 2019 - CINVESTAV

Estructuras

Una estructura es un tipo de datos que se puede manipular de lamisma forma que otros tipos predefinidos

Representa una colección de datos de diferentes tipos, lógicamenterelacionados

En la definición se especifican los (campos) y sus tipos:

struct tipo_estructura

{

/* Declaración de los campos */

};

donde tipo_estructura es el identificador de la estructura

Los campos de una estructura son almacenados en el mismo ordenen que son declarados

102/148 Programación Básica Junio 2019

Page 104: Proceso de Admisión 2019 - CINVESTAV

Estructuras

Por ejemplo, se crea un nuevo tipo estructura ficha

struct ficha

{

char nombre[40];

char dirección[80];

int edad;

};

Después de definir una estructura, se pueden declarar variables deeste tipo:

struct ficha persona1, persona2;

donde las variables persona1 y persona2 constan de los camposnombre, dirección y edad

103/148 Programación Básica Junio 2019

Page 105: Proceso de Admisión 2019 - CINVESTAV

EstructurasLas declaraciones de las variables persona1 y persona2 tambiénse pueden realizar de la siguiente manera:

struct ficha

{

char nombre[40];

char dirección[80];

int edad;

} persona1, persona2;

Para referirse a un campo específico de la estructura:

persona1.nombre

persona2.dirección

Cuando los elementos de un arreglo son de tipo estructura se tieneun arreglo de estructuras

104/148 Programación Básica Junio 2019

Page 106: Proceso de Admisión 2019 - CINVESTAV

EstructurasPara declarar un campo como una estructura, es necesario haberdeclarado previamente ese tipo de estructura, por ejemplo:

struct fecha{

int día, mes, año;};struct ficha{

char nombre[40];char dirección[40];int edad;fecha fecha_nacimiento;

};struct ficha persona;

105/148 Programación Básica Junio 2019

Page 107: Proceso de Admisión 2019 - CINVESTAV

Estructuras#include <stdio.h>#define NA 10

int main(void){

struct ficha {char nombre [60];float nota;

} alumnos[NA];int n = 0, i;float aprobados = 0, reprobados = 0;

while(n < NA) {printf("Nombre: ");gets(alumnos[n]. nombre );printf("Nota: ");scanf(" %f",&alumnos[n++]. nota);fpurge(stdin ); // fflush(stdin) en Windows

}printf("Nombre\t\tNota\n");for(i=0;i<NA;i++){

if (alumnos[i].nota > 5)aprobados ++;

elsereprobados ++;

}printf("Aprobados: %.2g\n" ,100* aprobados/NA);printf("Reprobados: %.2g\n" ,100* reprobados/NA);return 0;

}

Programa 31: Arreglo de estructuras

106/148 Programación Básica Junio 2019

Page 108: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 3.a: En matemáticas, un número primo es un número natural mayor que 1 que tieneúnicamente dos divisores distintos: él mismo y la unidad. La criba de Eratóstenes es un algoritmopara encontrar todos los números primos menores que un número natural N :

Paso 1: Llenar un arreglo con números enteros desde 1 hasta N .Paso 2: Comenzar con el segundo elemento del arreglo, colocar en cero todos susmúltiplos.Paso 3: Proceder hacia el siguiente elemento del arreglo que no sea cero y colocar encero todos sus múltiplos.Paso 4: Repetir el Paso 3 hasta que se han colocado en cero todos los múltiplos de loselementos que no sean cero.Paso 5: Al final del Paso 4, todos los elementos que no sean cero que quedaron en elarreglo serán los números primos.

Implementar el algoritmo de la criba de Eratóstenes para encontrar los números primos entre1 y un límite superior N .

Entrada:

Introduce el límite superior: 50

Salida:

Los números primos entre 1 y 50 son:1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

107/148 Programación Básica Junio 2019

Page 109: Proceso de Admisión 2019 - CINVESTAV

Ejercicios#include <stdio.h>#define N 10000

int main(void){

int num[N], i, j, k, step , M;printf("Introduce el limite superior: ");scanf(" %d",&M);

for (i=0;i<=M-1;i++)num[i] = i+1;

for(i=1;i<=M-1;i++){

if(num[i]!=0){

k = num[i]*2 -1;step = num[i];for(j=k;j<=M-1;j=j+step)

num[j] = 0;}

}

printf("Los sumeros primos entre 1 y %d son:\n",M);for (i=0;i<=M-1;i++){

if(num[i]!=0)printf(" %d\t",num[i]);

}printf("\n");return 0;

}

Programa 32: Solución del Ejercicio 3.a

108/148 Programación Básica Junio 2019

Page 110: Proceso de Admisión 2019 - CINVESTAV

EjerciciosEjercicio 3.b: Un número de tarjeta de crédito es usualmente un número de 16-dígitos. Usandocomo ejemplo el número 4567 1234 5678 9129, éste será válido si satisface la siguiente regla:

Paso 1: Comenzando con el dígito “más hacia la derecha menos uno”, multiplicar por doscada dígito en posición par:

4 5 6 7 1 2 3 4 5 6 7 8 9 1 2 9

8 12 2 6 10 14 18 4

Paso 2: Restar 9 de cualquier dígito del Paso 1 mayor que 10, de modo que se tiene:

8 12 2 6 10 14 18 4

8 3 2 6 1 5 9 4

Paso 3: Sumar todos los dígitos del Paso 2 para obtener 38Paso 4: Sumar todos los otros dígitos que no se modificaron (5, 7, 2, 4, 6, 8, 1, 9) paraobtener 42.Paso 5: Sumar 38 y 42 para obtener 80. Debido a que 80 es divisible por 10, la tarjeta decrédito es válida.

Escriba un programa que reciba el número de una tarjeta de crédito como una cadena decaracteres y que verifique usando la regla antes mencionada si es válida o no. El programa debemandar un mensaje de error si se introduce un carácter que no corresponda a un dígito.

Entrada:

Ingrese un número de tarjeta de crédito de 16 dígitos:4567123456789129

Salida:

La tarjeta de crédito es válida

109/148 Programación Básica Junio 2019

Page 111: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

#include <stdio.h>#define WRONG 0#define CORRECT 1

int main(void){

char str [17];int input , i, digit , sum , multiple;

input = CORRECT;sum = 0;

printf("Ingrese un numero de tarjeta de credito de 16 digitos: \n");scanf(" %s",str);

for(i=15;i>=0;i--){

if(str[i] < 48 || str[i] > 57){

input = WRONG;break;

}else{

digit = str[i] - 48;

// Continua en la siguiente diapositiva

110/148 Programación Básica Junio 2019

Page 112: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

if(i %2 == 0){

multiple = digit *2;if(multiple >= 10)

digit = multiple - 9;else

digit = multiple;}sum = sum + digit;

}}if(input == WRONG)

printf("La tarjeta de credito solo debe contener digitos\n");else{

if(sum %10 == 0)printf("La tarjeta de credito es valida\n");

elseprintf("La tarjeta de credito no es valida\n");

}return 0;

}

Programa 33: Solución del Ejercicio 3.b

111/148 Programación Básica Junio 2019

Page 113: Proceso de Admisión 2019 - CINVESTAV

EjerciciosEjercicio 3.c: Dada una matriz bidimensional de tamañoM×N , escriba un programa que visitetodos sus elementos con un camino en forma de espiral comenzando en la casilla (0, 0), comose muestra en la siguiente figura:

Entrada:

Ingresa el tamano MxN de la matriz: 5 4Introduce 20 elementos en la matriz:1 2 3 4 14 15 16 5 13 20 17 6 12 19 18 7 11 10 9 8

Salida:

La matriz de tamaño 5x4 es:1 2 3 4

14 15 16 513 20 17 612 19 18 711 10 9 8

La visita en forma espiral es:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

112/148 Programación Básica Junio 2019

Page 114: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

#include <stdio.h>#define MAX_ROWS 20#define MAX_COLS 20

int main(){

int arr[MAX_ROWS ][ MAX_COLS ];int i, j, N, M, toprow , bottomrow , leftcol , rightcol;

printf("Ingresa el tamano MxN de la matriz: ");scanf(" %d %d", &N, &M);

printf("Introduce %d elementos en la matriz: ", N*M);for(i=0; i<N; i++){for(j=0;j<M;j++)

scanf(" %d", &arr[i][j]);}

printf("La matriz de tamano %dx %d es:\n", N,M);for(i=0; i<N; i++){printf("\n");for(j=0;j<M;j++)

printf(" %d\t", arr[i][j]);}

printf("\nLa visita en forma espiral es:\n");

// Continua en la siguiente diapositiva

113/148 Programación Básica Junio 2019

Page 115: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

toprow = 0;bottomrow = N-1;leftcol = 0;rightcol = M-1;

while(toprow <= bottomrow && leftcol <= rightcol){

for(i=leftcol;i<= rightcol;i++)printf(" %d ",arr[toprow ][i]);

toprow ++;

for(i=toprow;i<= bottomrow;i++)printf(" %d ",arr[i][ rightcol ]);

rightcol --;

for(i=rightcol;i>= leftcol;i--)printf(" %d ",arr[bottomrow ][i]);

bottomrow --;

for(i=bottomrow;i>= toprow;i--)printf(" %d ",arr[i][ leftcol ]);

leftcol ++;}printf("\n\n");return 0;

}

Programa 34: Solución del Ejercicio 3.c

114/148 Programación Básica Junio 2019

Page 116: Proceso de Admisión 2019 - CINVESTAV

Punteros

Un puntero es una variable que contiene la dirección de memoriade un dato o de otra variable que contiene el dato

• Apunta al espacio físico donde está el dato o la variable

Se puede apuntar a un objeto de cualquier tipo

Los punteros se utilizan para:

• Crear y manipular estructuras de datos• Asignar memoria dinámicamente• Proveer el paso por referencia en las llamadas a funciones

115/148 Programación Básica Junio 2019

Page 117: Proceso de Admisión 2019 - CINVESTAV

Punteros

Declaración de un puntero:

tipo_C *var_puntero;

donde

• tipo_C especifica el tipo de objeto apuntado• ‘*’ es el operador de indirección que significa ‘apunta a’• var_puntero es el nombre de la variable puntero

El operador de dirección-de, representado por el carácter &, de-vuelve como resultado la dirección de su operando

El operador de indirección * toma su operando como una direccióny devuelve su contenido

116/148 Programación Básica Junio 2019

Page 118: Proceso de Admisión 2019 - CINVESTAV

Punteros

Por ejemplo:

int a = 10;

int *p;

p = &a;

printf("En la direccion %X está el dato %d\n", p, *p);

indica que el apuntador ‘p’ está apuntando a la dirección de la va-riable ‘a’ y se imprime algo como:

En la dirección E3BF4B18 está el dato 10

117/148 Programación Básica Junio 2019

Page 119: Proceso de Admisión 2019 - CINVESTAV

Operaciones con punteros

Un puntero puede asignarse a otro puntero, por ejemplo:

int a = 10, *p, *q;

p = &a;

q = p;

printf("En la direccion %X está el dato %d\n", q, *q);

se indica que la dirección que contiene ‘p’ se asigna a ‘q’, y se imprimealgo como:

En la dirección E6FD5B18 está el dato 10

118/148 Programación Básica Junio 2019

Page 120: Proceso de Admisión 2019 - CINVESTAV

Operaciones con punteros

Se pueden realizar operaciones aritméticas con punteros, por ejemplo:

b = *pa + 1, a la variable que está apuntando pa se le suma1 y el resultado se asigna a b

b = *(pa + 1), el siguiente entero al entero apuntado por pase asigna a b

*pb = 0, a la variable que está apuntando pb se le asigna cero*pb += 2, a la variable que está apuntando pb se le suman dosunidades(*pb)--, a la variable que está apuntando pb decrementa enuna unidad. Sin paréntesis, se decrementaría pb y no la variablea la que está apuntando

119/148 Programación Básica Junio 2019

Page 121: Proceso de Admisión 2019 - CINVESTAV

Operaciones con punteros

#include <stdio.h>#define FILAS 10#define COLS 60

int main(void){

int n, i=0;char *fin; /* Valor devuelto por gets */char lista[FILAS][COLS];

puts("Para finalizar pulse Ctrl+Z"); /* Ctrl+D en Unix */do{

printf("\nNombre completo: ");fin = gets(lista[i++]);

}while(fin != NULL && i < FILAS);

if(i < FILAS) i--; /* Elimina la ultima entrada Ctrl+Z */

/* Escribir datos en pantalla */printf("\n\n");for(n = 0; n < i; n++)

printf(" %s \n", lista[n]);

return 0;}

Programa 35: Se puede comparar un puntero con un valor nulo (NULL) paraque en el caso verdadero se detenga el proceso de inserción de cadenasmediante un ciclo

120/148 Programación Básica Junio 2019

Page 122: Proceso de Admisión 2019 - CINVESTAV

Punteros y arreglos

#include <stdio.h>

int main(void) {static int lista[]={24,30,15,45};int i;

for (i=0; i<4; i++)printf("%d ", lista[i]);

return 0;}

#include <stdio.h>

int main(void) {static int lista[]={24,30,15,45};int i;

for (i=0; i<4; i++)printf("%d ", *(lista+i));

return 0;}

Los dos programas son funcionalmente idénticos: imprimen en pantalla los valoresalmacenados en un arreglo. La diferencia entre ambos radica en cómo se recorreel arreglo. En el caso de la izquierda, se accede a cada elemento del arreglomediante el incremento de un índice, mientras que en el caso de la derecha, seaccede a cada elemento del arreglo mediante el incremento de un apuntador.Esto quiere decir que lista es la dirección del comienzo del arreglo.

121/148 Programación Básica Junio 2019

Page 123: Proceso de Admisión 2019 - CINVESTAV

Punteros y arreglos

La forma de declarar un puntero a una cadena de caracteres es

char *cadena;

Por ejemplo:

char *nombre = "Javier Hernandez";

printf("%s", nombre);

se asigna a nombre la dirección de comienzo de la cadena de caracte-res especificada. El compilador añade al final de la cadena el carácternulo, para detectar en operaciones posteriores el final de la misma

122/148 Programación Básica Junio 2019

Page 124: Proceso de Admisión 2019 - CINVESTAV

Punteros y arreglos#include <stdio.h>

int largo(char *);

int main(void){

static char *cadena = "hola , mundo";

printf(" %d \n", largo(cadena ));

return 0;}

/* Funcion que devuelve el largo de la cadena */int largo(char *str){

char *p = str;while (*p != ’\0’)

p++;return ((int)(p-str));

}

Programa 36: Determina el largo de una cadena con puntero

El ciclo formado por la sentencia while realiza las siguientes operaciones:1. Toma el carácter contenido en la dirección dada por p2. Verifica si es un carácter nulo. Si es así, el ciclo termina3. Si no es un carácter nulo, pasa a la siguiente dirección y regresa al Punto 1

Al final, la diferencia p-str provee la longitud de la cadena, es decir, la cantidadde direcciones que recorrió desde la primera dirección

123/148 Programación Básica Junio 2019

Page 125: Proceso de Admisión 2019 - CINVESTAV

Punteros y arreglos#include <stdio.h>

void copiar(char *, char *);

int main(void){

char cadena1 [81], cadena2 [81];

printf("Introduce una cadena: ");gets(cadena1 );

copiar(cadena2 ,cadena1 );printf("La cadena copiada es %s\n",cadena2 );

return 0;}

void copiar(char *p, char *q){

while ((*p++ = *q++) != ’\0’);}

Programa 37: Copia una cadena de caracteres en otra

El ciclo formado por la sentencia while realiza las siguientes operaciones:1. Toma el carácter contenido en la dirección dada por q y lo copia en la

dirección dada por p2. Verifica si el carácter de p es el carácter nulo. Si es así termina el ciclo3. Si p no es un carácter nulo, pasa a apuntar a la siguiente dirección y lo

mismo sucede con q. El proceso se repite desde el Punto 1

124/148 Programación Básica Junio 2019

Page 126: Proceso de Admisión 2019 - CINVESTAV

FuncionesUna función es una colección independiente de declaraciones ysentencias, generalmente enfocadas a realizar una tarea específica

Todo programa en C consta de al menos una función, la funciónmain, que es de donde comienza la ejecución del programa

Pueden haber otras funciones cuya finalidad es descomponer elproblema general en subproblemas más fáciles de resolver

Cuando se llama a una función, el control se pasa a la misma para su ejecución;y cuando finaliza, el control es devuelto a la función que la llamó para continuarcon la ejecución a partir de la sentencia que efectuó la llamada

125/148 Programación Básica Junio 2019

Page 127: Proceso de Admisión 2019 - CINVESTAV

Definición de una funciónLa definición de una función consta de la cabecera de la función ydel cuerpo de la función:

clase tipo identificador(tipo id1, . . . , tipo idN)

{

/* cuerpo de la función */

declaraciones;

sentencias;

}

donde

clase define el ámbito de la función, puede ser static (visi-ble solamente en el archivo fuente en el cual está definida) oextern (visible para todos los archivos fuente que componen elprograma). Por defecto la función es extern

126/148 Programación Básica Junio 2019

Page 128: Proceso de Admisión 2019 - CINVESTAV

Definición de una función

tipo indica el tipo de valor devuelto por la función. Por defecto,el tipo es int. Una función no puede retornar un arreglo ofunción, aunque si puede retornar un puntero a un arreglo o auna funciónidentificador es el nombre de la función. Si el nombre vaprecedido por el operador de indirección (*), el valor devueltopor la función es un punteroparámetros_formales componen la lista de argumentos de lafunción, es decir, el conjunto de variables con sus tipos sepa-rados por comas y encerrados entre paréntesis. Si no se pasanargumentos a la función, la lista de parámetros formales puedeser sustituida por la palabra clave void

127/148 Programación Básica Junio 2019

Page 129: Proceso de Admisión 2019 - CINVESTAV

Definición de una función

El cuerpo de una función esta formado por las sentencias queejecuta la función

Pueden contener declaraciones de variables utilizadas en dichassentencias, las cuales son, por defecto, locales en la función

La sentencia return devuelve un valor del tipo especificado en lacabecera de la función, retornando de esta manera el control a lafunción que hizo la llamada:

return (expresión);

Si en la sentencia return no se especifica una expresión, lafunción no devuelve un valor

128/148 Programación Básica Junio 2019

Page 130: Proceso de Admisión 2019 - CINVESTAV

Definición de una función

La declaración de una función, denominada también función pro-totipo, permite conocer el nombre, el tipo del resultado, el tipo delos parámetros formales y opcionalmente sus nombres

No define el cuerpo de la función

Una función prototipo tiene la misma sintaxis que la definición deuna función, excepto que ésta termina con un punto y coma

Una función no puede ser llamada si previamente no está definida

En caso de que una función haya sido definida antes del bloquede la función main, entonces no es necesario declarar su funciónprototipo

129/148 Programación Básica Junio 2019

Page 131: Proceso de Admisión 2019 - CINVESTAV

Definición de una función#include <stdio.h>

/* Función prototipo */float suma(float, float);

int main(void){float a, b, c;

printf("Introduce a y b: ");scanf("%f %f", &a, &b);

/* Llamada a la función */c = suma(a, b);

printf("%.2f+%.2f=%.2f\n", a, b, c);

return 0;}

/* Definición de la función */float suma(float a, float b){

return a+b;}

#include <stdio.h>

/* Definición de la función */float suma(float a, float b){

return a+b;}

int main(void){float a, b, c;

printf("Introduce a y b: ");scanf("%f %f", &a, &b);

/* Llamada a la función */c = suma(a, b);

printf("%.2f+%.2f=%.2f\n", a, b, c);

return 0;}

130/148 Programación Básica Junio 2019

Page 132: Proceso de Admisión 2019 - CINVESTAV

Paso de parámetrosHay dos formas de pasar los parámetros actuales a sus correspondientesparámetros formales:

1. Paso de parámetros por valor: los valores actuales de los paráme-tros se copian automáticamente en sus correspondientes parámetrosformales, de modo que al regresar el control a la función que la llamó,los parámetros conservan sus valores originales. Pueden ser transferi-dos constantes, variables y expresiones.

2. Paso de parámetros por referencia: los parámetros transferidosa la función no son valores sino las direcciones de las variables quecontienen esos valores, de manera que los parámetros actuales puedensufrir cambios al regresar el control a la función que la llamó. Estoes útil si se desea devolver más de un parámetro al mismo tiempo.Pueden ser transferidos variables de cualquier tipo de datos, así comoarreglos y funciones

131/148 Programación Básica Junio 2019

Page 133: Proceso de Admisión 2019 - CINVESTAV

Paso de parámetros

Paso de parámetros por referencia:

clase tipo identificador(tipo *id1, tipo id2, . . . , tipo *idN){

/* cuerpo de la función */declaraciones;sentencias;

}

donde los parámetros formales pasados por referencia van precedidos deloperador de indirección (*)Se utiliza el operador dirección-de (&) antes del nombre de la variablepara indicar que se transfiere la dirección del parámetro actual a sucorrespondiente parámetro formal, el cual tiene que ser un punteroPara pasar la dirección de un arreglo, no es necesario el operador & antesde su nombre, ya que el nombre del arreglo es un puntero a dicho arreglo

132/148 Programación Básica Junio 2019

Page 134: Proceso de Admisión 2019 - CINVESTAV

Paso de parámetros#include <stdio.h>

/* Función prototipo */float suma(float, float);

int main(void){float a, b, c;

printf("Introduce a y b: ");scanf("%f %f", &a, &b);

/* Paso de parámetros por valor */c = suma(a, b);

printf("%.2f+%.2f=%.2f\n", a, b, c);

return 0;}

/* Definición de la función */float suma(float a, float b){

return a+b;}

#include <stdio.h>

/* Función prototipo */void suma(float, float, float *);

int main(void){float a, b, c;

printf("Introduce a y b: ");scanf("%f %f", &a, &b);

/* Llamada a la función */suma(a, b, &c);

printf("%.2f+%.2f=%.2f\n", a, b, c);

return 0;}

/* Definición de la función */void suma(float a, float b, float *c){

*c = a+b;}

133/148 Programación Básica Junio 2019

Page 135: Proceso de Admisión 2019 - CINVESTAV

Paso de parámetros#include <stdio.h>#define FILAS 5#define COLS 5

void LlenaMatriz(int[FILAS][COLS ]);

int main(void){

int matriz[FILAS][COLS] = {};

LlenaMatriz(matriz );

for (int i=0; i<FILAS; i++){printf("\n");for (int j=0; j<COLS; j++){

printf(" %d\t",matriz[i][j]);}

}return 0;

}

void LlenaMatriz(int mat[FILAS][COLS ]){

for (int f=0; f<FILAS; f++)for (int c=0; c<COLS; c++)

mat[f][c] = f*c;}

Programa 38: Para pasar todos los elementos de un arreglo a una función, sepone en la lista de parámetros actuales el nombre del arreglo, que es ladirección de comienzo del arreglo, y en la lista de parámetros formales elnombre del arreglo seguido de sus dimensiones

134/148 Programación Básica Junio 2019

Page 136: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 4.a: Dado un arreglo con n números, [x0, x1, . . . , xn−1], se pueden calcular lossiguientes estadísticos:

Media aritmética: x̄ = 1n

n−1∑i=0

xi

Desviación estándar: s =

√1

n−1

n−1∑i=0

(xi − x̄)2

Máximo y mínimo: valores más grande y más pequeño en el arreglo.

Escriba un programa que calcule éstos estadísticos, introduciendo por teclado el tamaño N delarreglo y sus respectivos elementos, pueden ser enteros o reales. Se deben llamar funcionespara calcular cada estadístico.

Entrada:

Ingresa el tamaño del arreglo: 5Ingresa 5 números:1.1 1.2 0.9 1.0 1.23

Salida:

Media = 1.086Desv. Est. = 0.138Máximo = 1.230Mínimo = 0.900

135/148 Programación Básica Junio 2019

Page 137: Proceso de Admisión 2019 - CINVESTAV

Ejercicios#include <stdio.h>#include <math.h>#define NUM 10000

float media(float[NUM], int);float desvest(float[NUM], float , int);float max(float[NUM], int);float min(float[NUM], int);

int main(void){

float mean , std , mx , mn;float arr[NUM ]={};int i,N;

printf("Ingresa el tamano del arreglo: ");scanf(" %d",&N);

printf("Ingresa %d numeros :\n", N);for (i=0;i<N;i++)

scanf(" %f", &arr[i]);

mean = media(arr , N);std = desvest(arr , mean , N);mx = max(arr , N);mn = min(arr , N);

printf("Media = %5.3f\n", mean);printf("Desv. Est. = %5.3f\n",std);printf("Maximo = %5.3f\n",mx);printf("Minimo = %5.3f\n",mn);

return 0;}

// Continua en la siguiente diapositiva

136/148 Programación Básica Junio 2019

Page 138: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

float media(float vec[NUM], int n) {float s = 0;for (int i=0; i<n; i++)

s = s + vec[i];return s/n;

}

float desvest(float vec[NUM], float m, int n) {float s = 0;for (int i=0; i<n; i++)

s = s + (vec[i]-m)*(vec[i]-m);return sqrt(s/(n -1));

}

float max(float vec[NUM], int n) {float mx = vec [0];for (int i=1; i<n; i++)

mx = (vec[i] > mx) ? vec[i] : mx;return mx;

}

float min(float vec[NUM], int n) {float mn = vec [0];for (int i=1; i<n; i++)

mn = (vec[i] < mn) ? vec[i] : mn;return mn;

}

Programa 39: Solución del Ejercicio 4.a

137/148 Programación Básica Junio 2019

Page 139: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 4.b: Escriba un programa que ordene las fechas de nacimiento de alumnos almacenadosen un arreglo de estructuras. El ordenamiento deberá hacerse desde la fecha más reciente hastala menos reciente.

Entrada:

Ingresa el número de alumnos: 4Nombre: Ramon ValdezDía/Mes/Año: 2 9 1923------------------Nombre: Florinda MezaDía/Mes/Año: 8 2 1949------------------Nombre: Roberto GomezDía/Mes/Año: 21 2 1929------------------Nombre: Edgar VivarDía/Mes/Año: 28 12 1948

Salida:

Florinda Meza 8/2/1949Edgar Vivar 28/12/1948Roberto Gomez 21/2/1929Ramon Valdez 2/9/1923

138/148 Programación Básica Junio 2019

Page 140: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

#include <stdio.h>#define MAX 50

struct employee{

char name [60];int day;int month;int year;

};

int compare(struct employee ,struct employee );

int main(void) {struct employee e[MAX];int i,j,N;printf("Ingresa el numero de alumnos: ");scanf(" %d", &N);fpurge(stdin );for(i=0;i<N;i++) {

printf("Nombre: ");gets(e[i].name);printf("Dia/Mes/Anyo: ");scanf(" %d %d %d", &e[i].day , &e[i].month , &e[i].year);fpurge(stdin );printf("------------------\n");

}

// Continua en la siguiente diapositiva

139/148 Programación Básica Junio 2019

Page 141: Proceso de Admisión 2019 - CINVESTAV

Ejerciciosfor(i=0;i<N;i++) {

for(j=i+1;j<N;j++) {if (compare(e[i],e[j])==1) {

struct employee t = e[i];e[i] = e[j];e[j] = t;

}}

}for (i=0;i<N;i++)

printf(" %s %d/ %d/ %d\n",e[i].name ,e[i].day ,e[i].month ,e[i].year);return 0;

}int compare(struct employee e1, struct employee e2) {

if (e1.year < e2.year)return 1;

else if (e1.year > e2.year)return 0;

else {if (e1.month < e2.month)

return 1;else if (e1.month > e2.month)

return 0;else {

if (e1.day < e2.day)return 1;

else if (e1.day > e2.day)return 0;

elsereturn 0;

}}

}

Programa 40: Solución del Ejercicio 4.b

140/148 Programación Básica Junio 2019

Page 142: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 4.c: Escriba un programa en el que se ingresen por teclado cadenas de caracteres yse almacenen en un arreglo hasta que se introduzca un valor nulo (Ctrl+Z o Ctrl+D). Despuésimprimir en pantalla todas las cadenas invertidas.

Entrada:

En un lugar de la Mancha,de cuyo nombre no quiero acordarme,no ha mucho tiempo que vivia un hidalgode los de lanza en astillero,adarga antigua,rocin flaco y galgo corredor.

Salida:

,ahcnaM al ed ragul nu nE,emradroca oreiuq on erbmon oyuc edogladih nu aiviv euq opmeit ohcum ah on,orellitsa ne aznal ed sol ed,augitna agrada.roderroc oglag y ocalf nicor

141/148 Programación Básica Junio 2019

Page 143: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

#include <stdio.h>#define FILAS 100#define COLS 100

void reversa(char *);int largo(char *);

int main(void){

int n, i=0, num[FILAS] = {0};char *fin; /* Valor devuelto por gets */char lista[FILAS][COLS];

puts("Ingresa lineas de texto");puts("Para finalizar pulsa Ctrl+Z"); /* Ctrl+D en Unix */do{

fin = gets(lista[i++]);}while(fin != NULL && i < FILAS);

if(i < FILAS) i--; /* Elimina la ultima entrada Ctrl+Z */

for(n = 0; n < i; n++)reversa(lista[n]);

return 0;}

// Continua en la siguiente diapositiva

142/148 Programación Básica Junio 2019

Page 144: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

void reversa(char *str){int i, n;n = largo(str);for (i=n-1; i>=0; i--)

printf(" %c",str[i]);printf("\n");

}

int largo(char *str){char *p = str;while (*p++);return ((int)(p-str -1));

}

Programa 41: Solución del Ejercicio 4.c

143/148 Programación Básica Junio 2019

Page 145: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Ejercicio 4.d: En criptografía, el cifrado por desplazamiento es una de las téc-nicas de cifrado más simples y más usadas. Es un tipo de cifrado por sustituciónen el que una letra en el texto original es reemplazada por otra letra que seencuentra un número fijo de posiciones más adelante en el alfabeto. Por ejem-plo, con un desplazamiento de 3, la ‘A’ sería sustituida por la ‘D’ (situada 3lugares a la derecha de la ‘A’), la ‘B’ sería reemplazada por la ‘E’, etc. Parael descifrado del texto se realiza el proceso inverso, es decir, la letra cifrada sesustituye por otra letra que se encuentra un número fijo de posiciones conocidomás atrás en el alfabeto.Escriba un programa en el que se ingresen por teclado cadenas de caracteresy se almacenen en un arreglo hasta que se introduzca un valor nulo (Ctrl+Zo Ctrl+D). Después, dado un número de desplazamientos, implementa unafunción que haga el cifrado de estas cadenas y se muestre en pantalla, y pos-teriormente que otra función realice el descifrado y se muestre en pantalla.

144/148 Programación Básica Junio 2019

Page 146: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

Entrada:

Introduce el valor del desplazamiento: 3Mensaje original------------------Este es un mensaje cifrado conla tecnica de Cesar

Salida:

Mensaje cifrado------------------Hvwh#hv#xq#phqvdmh#fliudgr#frqod#whfqlfd#gh#Fhvdu------------------Mensaje descifrado------------------Este es un mensaje cifrado conla tecnica de Cesar

145/148 Programación Básica Junio 2019

Page 147: Proceso de Admisión 2019 - CINVESTAV

Ejercicios#include <stdio.h>#define FILAS 100#define COLS 100

void cifrar(char *,int);void decifrar(char *,int);

int main(void){

int x, n, i=0, num[FILAS] = {0};char *fin; /* Valor devuelto por gets */char lista[FILAS][COLS];

printf("Introduce el valor del desplazamiento: ");scanf(" %d",&x);fpurge(stdin );

puts("Mensaje original");puts("------------------");do{

fin = gets(lista[i++]);}while(fin != NULL && i < FILAS);

if(i < FILAS) i--; /* Elimina la ultima entrada Ctrl+Z */

puts("------------------");puts("Mensaje cifrado");puts("------------------");for(n = 0; n < i; n++){

cifrar(lista[n], x);printf(" %s\n",lista[n]);

}

// Continua en la siguiente diapositiva

146/148 Programación Básica Junio 2019

Page 148: Proceso de Admisión 2019 - CINVESTAV

Ejercicios

puts("------------------");puts("Mensaje descifrado");puts("------------------");for(n = 0; n < i; n++){

decifrar(lista[n], x);printf(" %s\n",lista[n]);

}

return 0;}

void cifrar(char *frase , int numero){

int i=0;while(frase[i]){

frase[i]=frase[i]+ numero;i++;

}}

void decifrar(char *frase , int numero){

int i=0;while(frase[i]){

frase[i]=frase[i]-numero;i++;

}}

Programa 42: Solución del Ejercicio 4.d

147/148 Programación Básica Junio 2019

Page 149: Proceso de Admisión 2019 - CINVESTAV

Bibliografía

I B. W. Kernighan & D. M. Ritchie. The C ProgrammingLanguage. 2nd Edition. Prentice Hall, 1988.

I K. N. King. C Programming: A Modern Approach. 2nd Edition.W. W. Norton & Company, 2008.

I Greg Perry. Absolute Beginner’s Guide To C. 2nd Edition. SamsPublishing, 1994.

I Stephen Prata. C Primer Plus. 5th Edition. Sams, 2004.

I Peter V. Linden. Expert C Programming: Deep C Secrets.Prentice Hall, 1994.

I Francisco Javier Ceballos. Enciclopedia del Lenguaje C.Alfaomega, 1997.

148/148 Programación Básica Junio 2019