Programación I

Anuncio
Clasificación de los datos
Programación I
Unidad 3
FACEyT - DEEC - Programación I - 2008
1
Arreglos: Definición
FACEyT - DEEC - Programación I - 2008
Arreglos: Características en C
El
Dato
2
estructurado
nombre del arreglo es una constante puntero que
contiene la dirección de memoria del primer elemento.
Estático
El
Homogéneo
a que es la ubicación de la dirección base en donde se
subíndice del primer elemento es siempre 0, debido
aloja el primer elemento del arreglo.
Ordenado
El
FACEyT - DEEC - Programación I - 2008
3
lenguaje C no realiza comprobación de límites.
FACEyT - DEEC - Programación I - 2008
4
1
Arreglos Unidimensionales, Vectores o Listas(1)
Arreglos
Declaración
tipo_dato nombre[tamaño];
Unidimensionales
o vectores
Ejemplo
int vec[10];
Bidimensionales
o matrices
Declaración
e inicialización
int vec[] = {10,5,6,3};
FACEyT - DEEC - Programación I - 2008
5
Arreglos Unidimensionales, Vectores o Listas (2)
FACEyT - DEEC - Programación I - 2008
6
Funciones útiles
Inicialización
Asignación de valores a cada elemento de forma explícita
Cargar
int arreglo[3];
arreglo[0]=5;
arreglo[1]=2;
arreglo[2]=4;
un arreglo
Presentar
por pantalla un arreglo
Asignación de valores mediante el uso de un ciclo repetitivo
int i, V[10];
for(i=0; i<10; i ++)
{
printf("Ingrese un elemento para el arreglo");
scanf("%d", &V[i]);
}
FACEyT - DEEC - Programación I - 2008
7
FACEyT - DEEC - Programación I - 2008
8
2
Funciones útiles: ejemplo
Ejemplo
Asignación
#include "stdio.h"
#include “vectores.h"
usuario:
1
2
3
4
5
6
7
8
9
1
2
3
5
6
7
8
9
de valor a los elementos de un arreglo unidimensional con datos ingresados por el
void cargar (int ORDEN, int V[]) //ORDENorden de arreglo y V arreglo a cargar
{
int i;
for(i=0;i<ORDEN;i++)
{
printf(“Ingrese el siguiente elemento”);
scanf(“%d”, &V[i]);
}
}
int main(int argc, char *argv[])
{
// inicio de main
int i, M, V[20], P[20], N[20], j, k;
j=0, k=0;
printf("Ingrese el orden del arreglo: ");
scanf("%d",&M);
cargar_i(M,V);
Presentación por pantalla de los elementos de un arreglo unidimensional:
void mostrar (int ORDEN, int V[])
{
int i;
for(i=0;i<ORDEN;i++)
{
printf(“Elemento %d: %d”, i, V[i]);
}
}
FACEyT - DEEC - Programación I - 2008
Práctico 4 - Ejercicio 27. Lea un arreglo de orden M.
Coloque los elementos negativos en un arreglo N y los
positivos en otro arreglo P. Imprima los resultados.
El archivo vectores.h
contiene las funciones para
cargar y mostrar un arreglo.
printf("\n\nEl arreglo ingresado es:\n\n");
mostrar_i(M,V);
printf("\n");
//CONTINUA EN DIAPOSITIVA 11
9
FACEyT - DEEC - Programación I - 2008
Ejemplo
Ejemplo
// CONTINUACION DE DIAPOSITIVA 10
// CONTINUACION DE DIAPOSITIVA 11
10
if (j >0)
for(i=0; i <M; i++)
{
if (V[i] >0)
{
P[j]= V[i];
j++;
}
else
{
N[k]= V[i];
k++;
}
}
{
printf("\n\nEl arreglo de positivos es:\n");
mostrar_i(j,P);
}
else
printf("\n\nEl arreglo no contiene elementos positivos\n\n");
if (k==0)
printf("\n\nEl arreglo no contiene elementos negativos\n\n");
else
{
printf("\n\nEl arreglo de negativos es:\n");
mostrar_i(k,N);
}
printf("\n\n");
return 0;
}
// fin de main
// CONTINUA EN DIAPOSITIVA 12
FACEyT - DEEC - Programación I - 2008
11
FACEyT - DEEC - Programación I - 2008
12
3
Ordenamiento (1)
Ordenamiento (2)
Es el proceso de organización de un conjunto de
elementos similares de información en orden creciente
o decreciente.
Método: Uno contra el resto
Para
el método de uno contra el resto es necesario emplear
dos bucles anidados, y por lo tanto dos subíndices.
Es
Consiste en tomar cada elemento del arreglo y compararlo con los demás
elementos, de acuerdo al resultado de la comparación con cada uno de los
elementos se realiza o no un intercambio.
FACEyT - DEEC - Programación I - 2008
decir:
for(i=0; i < orden – 1; i++)
{
for(j=i+1; j < orden; j++)
{
if (V[i]>V[j])
{
aux = V[i];
V[i]=V[j];
V[j]=aux;
}
}
}
13
Búsqueda (1)
Un subíndice hace referencia al elemento que se compara con el resto,
el otro subíndice se utiliza para recorrer todo el arreglo.
FACEyT - DEEC - Programación I - 2008
14
Búsqueda (2)
Búsqueda secuencial o lineal:
Puede aplicarse a conjuntos no ordenados de valores
y a conjuntos ordenados de valores.
Consiste en:
Para realizar la búsqueda se utilizan ciclos repetitivos.
Ejemplo:
for(i=0; i < TAM – 1; i++)
if (V[i]==CB)
obtener el elemento a buscar o clave de búsqueda (CB)
recorrer secuencialmente el conjunto de datos
el recorrido se detiene cuando se encuentra el
elemento buscado.
//TAM es la orden del arreglo
break;
FACEyT - DEEC - Programación I - 2008
if (i == TAM)
printf(“El elemento no está);
else
printf(“El elemento está en la posición %d”, i);
15
FACEyT - DEEC - Programación I - 2008
16
4
Arreglos Bidimensionales, Matrices o Tablas (1)
Arreglos Bidimensionales, Matrices o Tablas (2)
Inicialización
Declaración
int mat[3][5];
Declaración
e inicialización
Es decir M[0][0]=10, M[0][1]=5, M[0][2]= 6, M[1][0]=2, M[1][1]=5 y M[1][2]=9
17
Funciones útiles: ejemplo
1
2
3
4
5
6
7
8
de valor a los elementos de un arreglo bidimensional con datos ingresados por el usuario:
void cargarmatriz (int FILA, int COL, int V[][TAM])
{
int i,j;
for(i=0;i<FILA;i++)
for(j=0;j<COL;j++)
{
printf(“Ingrese el siguiente elemento”);
scanf(“%d”, &V[i][j]);
}
}
Presentación por pantalla de los elementos de un arreglo bidimensional:
void mostrarmatriz (int FILA, int COL, int V[][TAM])
{
int i,j;
printf(“Los elementos del arreglo son:\n\n”);
for(i=0;i<FILA;i++)
for(j=0;j<COL;j++)
printf(“Elemento de la fila %d columna %d es: %d”, i, j, V[i][j]);
}
FACEyT - DEEC - Programación I - 2008
FACEyT - DEEC - Programación I - 2008
18
Datos de tipo carácter (char) (1)
Asignación
1
2
3
4
5
6
7
8
9
10
Asignación de valores mediante el uso de un ciclo de repetición
int i,j, V[3][5];
for(i=0; i<3; i ++)
{
for(j=0; j<5; j ++)
{
printf("Ingrese un elemento para el arreglo");
scanf("%d", &V[i][j]);
}
}
int M[2][3] = {{10,5,6}, {2,5,9}};
FACEyT - DEEC - Programación I - 2008
Asignación de valor a cada elemento de forma explícita
int Arreglo[3][2];
Arreglo[0][0]=5;
Arreglo[0][1]=2;
Arreglo[1][0]=4;
Arreglo[1][1]=9;
Arreglo[2][0]=1;
Arreglo[2][1]=4;
tipo_dato nombre[tamaño1][tamaño2];
Ejemplo
Declaración:
Para los caracteres en C utilizamos el tipo de dato char.
char letra;
char r;
Inicialización
en la declaración
char letra='t';
Declaración
e inicialización
char letra;
letra='t';
19
FACEyT - DEEC - Programación I - 2008
20
5
Datos de tipo carácter (char) (2)
Datos de tipo carácter (char) (3)
Funciones
Funciones
para manejo de caracteres
para manejo de caracteres
Incluidas en ctype.h
Incluidas en stdio.h
Lectura desde teclado
isdigit()
scanf("%c",&letra);
letra = fgetc(stdin);
isalpha()
isalnum()
islower()
Presentación por pantalla
Verificación
isupper()
printf("%c",letra);
fputc(letra, stdout);
isascii()
Incluidas en stdlib.h
tolower()
toupper()
atoi()
Conversión
atol()
atof()
FACEyT - DEEC - Programación I - 2008
21
FACEyT - DEEC - Programación I - 2008
Datos de tipo carácter (char)(4): ejemplo
Ejemplo
/*Cargar una matriz de caracteres de orden MxN, imprimirla por pantalla, luego indicar la cantidad de vocales
encontradas en la matriz. Si no contiene vocales presentar un mensaje.*/
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include "stdio.h"
#include"matrices.h"
//
int contarvocales (int , int , char A[20][20]);
//
int main(int argc, char *argv[])
{
// inicio de main
int M,N, cantidad;
char A[20][20];
printf("Ingresar la cantidad de filas de la matriz: ");
scanf("%d",&M);
printf("Ingresar la cantidad de columnas de la matriz: ");
scanf("%d",&N);
fgetc(stdin);
cargarmatriz_c(M,N,A);
printf("\n\nLa matriz ingresada es:\n\n");
imprimirmatriz_c(M,N,A);
cantidad= contarvocales(M,N,A);
Nombre del archivo
ejemplo_matrices.c
// CONTINUA EN DIAPOSITIVA 24
FACEyT - DEEC - Programación I - 2008
23
22
Continuación de
ejemplo_matrices.c
if (cantidad)
printf("\n\n La cantidad de vocales en la matriz es: %d", cantidad);
else
printf("\n\n La matriz no contiene vocales \n");
printf("\n\n La matriz ordenada en forma descendente es :\n\n");
imprimirmatriz_c(M,N,A);
return 0;
}
// fin de main
int contarvocales (int fila, int col, char A[20][20])
{
int i,j, c=0;
for(i=0;i<fila;i++)
{
for(j=0;j<col;j++)
{
if (toupper(A[i][j])==‘A' || toupper(A[i][j])==‘E' || toupper(A[i][j])==‘I' || toupper(A[i][j])==‘O' ||
toupper[i][j])==‘U‘)
c++;
}
}
return c;
}
FACEyT - DEEC - Programación I - 2008
24
6
Ejemplo
Ejemplo
//********************************************************************
// FUNCIONES PARA MATRICES DE CARACTERES
//********************************************************************
1. void cargarmatriz_c (int fila, int col, char A[20][20])
2. {
3. int i,j;
4. for(i=0;i<fila;i++)
5.
{
6.
for(j=0;j<col;j++)
7.
{
8.
printf("Ingresar el elemento (%d,%d): ",i,j);
9.
scanf("%c",&A[i][j]);
10.
fgetc(stdin);
11.
}
12.
}
13. return;
14. }
Nombre del archivo
cabecera en donde se
encuentra la función:
matrices.h
FACEyT - DEEC - Programación I - 2008
Nombre del archivo
cabecera en donde se
encuentra la función:
matrices.h
FACEyT - DEEC - Programación I - 2008
26
Cadenas de caracteres(2): funciones
Definición
Arreglo unidimensional de caracteres, es decir sus elementos son de tipo char y el último
elemento se denomina terminador nulo (‘\0’) el indica el final de la cadena.
Incluidas en string.h
strcpy(cadenadestino, cadenaorigen);
strcmp(cad1,cad2);
strlen(cad);
strcat(cad1,cad2);
Declaración
tipo_dato nombre[tamaño];
Ejemplo
char cadenita[10];
Declaración
void imprimirmatriz_c (int fila, int col, char A[20][20])
{
int i,j;
for(i=0;i<fila;i++)
{
for(j=0;j<col;j++)
{
printf("%c ",A[i][j]);
}
printf("\n");
}
return;
}
25
Cadenas de caracteres (1)
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
e inicialización
char cadena[50] ="Esto es un ejemplo";
char prueba[]="programación I";
Inicialización
char cadena[50];
cadena = “ABC”;
//No es posible realizar esta asignación.
Para inicializar la variable luego de su declaración debemos utilizar funciones para el
manejo de cadenas de caracteres.
FACEyT - DEEC - Programación I - 2008
27
FACEyT - DEEC - Programación I - 2008
28
7
Cadenas de caracteres (3): funciones
Incluidas
Cadenas de caracteres (4): ejemplo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
en stdio.h
Lectura desde teclado
scanf(“%s”,
cadenita);
]s”, cadenita);
fgets(cadenita, 4, stdin);
scanf(“%[0-9a-zA-z
Presentación por pantalla
printf(“%s”,
cadenita);
stdout);
fputs(cadenita,
FACEyT - DEEC - Programación I - 2008
29
Cadenas de caracteres (5)
Longitud Física
Longitud Lógica
int main(int argc, char *argv[])
{
char cadena[10], cadena2[10];
int i;
printf("Ingresar una cadena de caracteres en minúsculas: ");
scanf("%s",cadena);
strcpy(cadena2,cadena);
for(i=0;cadena2[i]!='\0';i++)
{
cadena[i]= toupper(cadena2[i]);
}
printf("La cadena minuscula es: %s\n",cadena2);
printf("La cadena mayúscula es: %s\n",cadena);
return 0;
}
FACEyT - DEEC - Programación I - 2008
30
Cadenas de caracteres(6): ejemplo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FACEyT - DEEC - Programación I - 2008
#include <stdio.h>
#include <ctype.h>
#include <string.h>
31
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *C1="mita";
char cad[20]="palo";
char *C2="calesitas";
char *C3="carta";
int i;
printf("\n%5d%5d ",strlen(C1),sizeof(C1));
fputs(C1,stdout);
printf("\n%5d%5d ",strlen(C2),sizeof(C2));
fputs(C2,stdout);
strcat(cad,C1);
printf("\n%5d%5d %-20s",strlen(C1),sizeof(C1),cad);
C3="carita";
printf("\n%5d%5d %-20s",strlen(C3),sizeof(C3),C3);
printf("\n%5d%5d %-20s",strlen(C1),sizeof(C1),C1);
printf("\n\n");
return 0;
}
FACEyT - DEEC - Programación I - 2008
32
8
Ejemplo: funciones de cadena y de caracter
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <stdio.h>
#include <ctype.h>
#include <string.h>
//
int entero();
int main(int argc, char *argv[])
{
int b=0, i;
char cad[10];
printf("Ingresar la cadena: ");
scanf("%s",cad);
for(i=0; i<(strlen(cad)); i++)
{
if (isdigit(cad[i]))
b++;
}
17.
18.
19.
20.
21.
22.
if (b)
printf("\n\n La cadena contiene: %d digitos", b);
else
printf("\n\n La cadena no contiene digitos \n");
return 0;
}
Arreglo de cadenas de caracteres (1)
char nombre [cantidad_cadenas] [longitud_física_de_cada_cadena];
Ejemplo, si el arreglo se declara como:
char cad[5][10];
y contiene:
• Si colocamos:
printf("%c", cad[1][3]);
Por pantalla veremos el
carácter E (sombreado en
el ejemplo).
• Si colocamos
printf("%s", cad[2]);
Por pantalla veremos la
cadena "tio".
FACEyT - DEEC - Programación I - 2008
33
Arreglo de cadenas de caracteres (2)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Declaración:
#include <stdio.h>
int main(int argc, char *argv[])
{
char v[10][10];
int n,i;
printf("Ingrese la cantidad de cadenas:");
scanf("%d", &n);
fgetc(stdin);
printf("\nCarga de un arreglo de cadenas\n");
for (i=0; i<n; i++)
{
printf("Ingresa cadena %i", i);
fgets(v[i], 9, stdin);
}
for(i=0; i<n; i++)
{
printf("\nLa cadena %i: ", i);
fputs(v[i], stdout);
}
return 0;
}
FACEyT - DEEC - Programación I - 2008
34
Función principal
La función main posee dos argumentos que pueden enviarse a la
misma y contienen:
argc parámetro de tipo entero que contiene la cantidad de argumentos
de línea de ordenes. Contiene al menos el valor 1, ya que el nombre del
programa invocado también se cuenta como parámetro.
Carga y presentación
de un arreglo de
cadenas
de
caracteres
FACEyT - DEEC - Programación I - 2008
argv es un arreglo de punteros a cadenas de caracteres. Cada elemento
de este arreglo apunta a un argumento de la línea de comandos. Todos los
argumentos de la línea de órdenes son cadenas, cualquier número que se
emplee debe ser convertido al tipo de dato deseado en el programa que lo
emplee.
35
FACEyT - DEEC - Programación I - 2008
36
9
Función principal
Por ejemplo, si invocamos al programa prueba de la siguiente
forma:
./prueba argumentoA argumentoB argumento C
Gráficamente los valores de los argumentos de main() serían:
FACEyT - DEEC - Programación I - 2008
37
10
Descargar