Post on 22-Jul-2022
Proceso de Admisión 2019
Curso de Programación Básica
Dr. Wilfrido Gómez Flores
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
Introducción
Características generales del lenguaje C
2/148 Programación Básica Junio 2019
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Estructuras de datos estáticas
87/148 Programación Básica Junio 2019
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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