Академический Документы
Профессиональный Документы
Культура Документы
UNSA - 2012
Agenda
Array
Variable - Puede tener como mximo un valor. Cada variable es referenciada por un nombre. Arreglo - Representa un conjunto de valores (caracteres, enteros, reales, etc.) donde todos comparten el mismo nombre.
Tipos de arreglos: Los arreglos se clasifican segn el nmero dimensiones que almacenan.
Array (arreglos unidimensionales - 1D), un subndice Matriz (arreglos bidimensionales - 2D), dos subndices Multidimensional (tres - 3D- o mas dimensiones), 3 o mas subndices
Array unidimensional
Generalizacin del concepto de variable
23
Array unidimensional
Grupo de localidades consecutivas de memoria relacionadas por el hecho que tienen el mismo nombre y tipo. Esto implica que cada celda tenga exactamente el mismo tamao. Cada localidad (o grupo de localidades) almacena un elemento del array.
Nombre del array
int arreglo_notas 12
Tipo de cada elemento
15
12
18
11
14
Array unidimensional
Cada elemento del array es accedido mediante el nombre del array y un subndice que representa la posicin numrica (entero no negativo) de dicho elemento dentro del array.
Ejemplo:
int A[12]: char cdn[8]; float b[100];
El valor del subndice o posicin numrica de un elemento dentro del array debe ser un entero y puede expresarse como:
Constante entera o valor literal (por ejemplo 3) Variable entera (por ejemplo x) Expresin entera (por ejemplo x + y 1)
El valor del subndice puede variar de 0 a n-1, donde n es el nmero de elementos del array.
En general, para tener acceso al i-simo elemento del array se escribe nombre_array[i-1].
Primer elemento: altura_personas[0]=1.39 Segundo elemento: altura_personas[1]=1.57 Tercer elemento: altura_personas[2]=1.56 ... Sexto y ltimo elemento: altura_personas[5]=1.66
Note que cada elemento de un vector puede usarse como una variable cualquiera.
Inicializar con valores constantes P.e. inicializar los elementos de un vector de N elementos enteros en cero.
#define N 100 //Declaracin del vector y del subndice int vector[N], i;
Inicializar usando variables P.e. inicializar los elementos de un vector de 10 elementos enteros con valores del 1 al 10.
int v1[10], i;
// Declaracin del vector y del subndice for (i = 0; i < 10; i++)
v1[i] = i + 1;
// Inicializacin de cada
// elemento del vector
Inicializar mediante lectura P.e. inicializar los elementos de un vector de 30 elementos de tipo carcter con valores introducidos por el usuario
char frase[30]; // Declaracin del vector int indice; // Declaracin del subndice char car; cout<<Introduzca una frase\n; for (indice = 0; indice < 30; indice++) { cin>>car; frase[indice] = car; }
Inicializacin de un Array
Existen varias formas de predefinir los valores que puede contener un vector:
int a[8] = {0}; a[0]=a[1]=a[2]=a[3]=a[4]=a[5]=a[6]=a[7]=0 float n[5] = {0.25, 0.50, 0.75, 1.00, 1.25}; n[0]=0.25 n[1]=0.50 n[2]=0.75 n[3]=1.00 n[4]=1.25 char cdn[8] = {S, I, , a, l, l, i, ,}; cdn[0]=S cdn[1]=I cdn[2]= cdn[3]=a cdn[4]=l cdn[5]=l cdn[6]=I cdn[7]=,
Ejercicio
i, total = 0;
for (i = 0; i < 8; i++)
total += a[i];
cout<<la suma de los elementos es: <<total; }
Array multidimensional
Las matrices (arreglos de dos dimensiones) son un caso particular de los arreglos multidimensionales.
tipo_dato nombre[dim1][dim2]
Grupo de localidades consecutivas de memoria relacionadas por el hecho que tienen el mismo nombre y tipo (matrices de enteros, matrices de reales, matrices de caracteres, etc.). Cada localidad (o grupo de localidades) representa un elemento de la matriz. Cada elemento de la matriz es accedido mediante el nombre de la matriz y dos subndices (fila, columna), uno que representa la posicin numrica (entero no negativo) de dicho elemento dentro de una fila y el otro que representa la posicin numrica (entero no negativo) de dicho elemento dentro de una columna.
nombre_matriz[fila][columna]
M3x4: Matriz de tres (3) filas y cuatro (4) columnas cuyo nombre es M
matrix
Cada elemento de la matriz es accedido mediante el nombre de la matriz y la posicin numrica de dicho elemento dentro de la matriz (subndices).
nombre_matriz[fila][columna]
P.e.
matrix
matrix[0][0]=16 matrix[0][1]=21 matrix[0][2]=8 matrix[0][3]=3 matrix[1][0]=-3 matrix[1][1]=11 matrix[1][2]=0 matrix[1][3]=5 matrix[2][0]=13 matrix[2][1]=7 matrix[2][2]=-64 matrix[2][3]=19
Ejercicios
Matriz simtrica
void main() { int matriz[3][3]; int fil, col, ok; cout<<ingreso de datos:; for(fil =0; fil<3; fil++) for(col =0; col<3; col++) cin>>matriz[fil][col]; ok = 1; for(fil =0; fil<3; fil++) for(col =0; col<3; col++) if(matriz[fil][col] != matriz[col][fil]) ok = 0; if(ok) cout<<Si es simtrica; else cout<<No es simtrica; }
Ejercicios
void main() { int matriz[3][3], sumafila; int sumaDiag; inr fil, col; cout<<ingreso de datos:; for(fil =0; fil<3; fil++) for(col =0; col<3; col++) cin>>matriz[fil][col]; //Suma de filas for (fil =0; fil<3; fil++){ sumafila = 0; for(col =0; col<3; col++) sumafila+= matriz[fil][col]; cout<<Suma de fila <<fil <<sumafila; }
Cadenas de caracteres
Generalmente hablamos, que un string es una secuencia de caracteres. P.e.: hello, high school, H2O. Las operaciones que son tipicamente deseables en las cadenas de caracteres son:
Concatenacin: high+school=highschool Comparaciones: high<school // alfabeticamente Encontrar/recuperar/modificar/eliminar/insertar subcadenas en una cadena determinada.
Cadenas de caracteres en C
24
En C, una cadena de caracteres puede ser definida como un array de caracteres o un puntero a caracteres
Un array de caracteres, tal como char str[ ]=high; Un puntero a caracteres, tal como char *p = high;
En un arreglo de caracteres, el ultimo elemento del arreglo debe ser igual a \0, el mismo que representa el final de la cadena. P.e., el arreglo str[] es realmente de longitud 5:
str[0]=h str[1]=i str[2]=g str[3]=h str[4]=\0
Si de declara como char str[4]={h,i,g,h}; entonces str es un arreglo de caracteres pero no una cadena. En char *p=high; el sistema ubica 5 espacios de memoria del tamao de un caracter, y almacena high en los primeros 4, y \0 en el 5to lugar.
CS 103
Cadenas de caracteres en C
Declaracin:
char nombre[dim];
Cadenas de caracteres
Acceso
P.e.
Funciones gets()
Lee una cadena de caracteres formada por varias palabras separadas por espacios en blanco. Es un puntero a la cadena de caracteres, reemplaza el \n por \0. Normalmente trabaja junto con el printf();
Ejercicio
Ejercicio
Escribir un programa en C que lea una secuencia de caracteres ASCII y escriba una secuencia de caracteres codificados. Si el carcter es una letra o dgito, ser reemplazado por el siguiente carcter en el conjunto de caracteres, excepto Z que ser reemplazado por A, z por a y 9 por 0. Por tanto, 1 se transforma en 2, C en D, p en q, etc. Cualquier carcter que no sea letra o dgito ser reemplazado por un punto (.). #define MAXCAR 80 void main() { char linea[MAXCAR]; int cont; gets(linea); for (cont=0; linea[cont]!=\0; cont++) if(((linea[cont]>=0) && (linea[cont]<9))|| ((linea[cont]>=A) && (linea[cont]<Z))|| ((linea[cont]>=a) && (linea[cont]<z)) putchar(linea[cont] + 1); else if (linea[cont]==9) putchar(0); else if (linea[cont]==Z) putchar(A); else if (linea[cont]==z) putchar(a); else putchar(.) }
strcat(cadena1, cadena2) Aade la cadena2 a la cadena1. strchr(cadena, car) Devuelve un puntero a la primera ocurrencia de car en cadena. strcmp(cadena1, cadena2) Compara cadena1 con cadena2 y de vuelve un valor: <0, =0, >0.
Ejercicio
void main() { char esp[3][6]={ayer,casa,hola}; char ing[3][10]={yesterday,house, hi}; char palabra[10]; printf(Ingrese palabra: ); gets(palabra); for(int i=0;i<3;i++) if(strcmp(palabra,esp[i])==0) cout<<esp[i]<<traducido <<ing[i]; }
strcpy(cadena1, cadena2) Copia cadena2 en cadena1. strcspn(cadena1, cadena2) Devuelve el nmero de caracteres ledos de la cadena1 hasta que halla alguno de los caracteres de cadena2. strtok(cadena1, cadena2) Rompe cadena1 en segmentos o tkens, esto depende de la secuencia de caracteres de cadena2 (delimitadores).
Ejercicios
#include <iostream.h> #include <string.h> int main() { char s1[13]="Hola a todos"; char s2[5]="abcd"; cout<<"s1= <<s1<<endl; cout<<"s2= <<s2<<endl; cout<<"strcspn(s1,s2)=<<strcspn(s1,s2) <<endl; return 0; }
Ejercicios
#include <iostream.h> #include <string.h> int main() { char s1[49]="Esto es un ejemplo para usar la funcion strtok()"; char s2[4] = \n\t"; char *ptr; cout<<"s1 = "<<s1<<endl; ptr=strtok(s1,s2); // Primera llamada => // Primer token cout<<ptr<<endl; while((ptr=strtok(NULL,s2))!=NULL ) //posteriores //llamadas cout<<ptr<<endl; return 0;
}
Ejercicios
void main() { char cadena[20]; int num; cout<<ingrese numero: ; cin>>num; itoa(num,cadena,2); cout<<cadena; }
Los programas de C++ usan el cin y el operador de extraccin para realizar operaciones de entrada. Para programas mas complejos se utilizar las funciones miembro de entrada como:
getline: Captura una lnea de texto. gcount: Extrae el nmero de caracteres ingresados. get: Captura carcter por carcter. peek: Lee caracteres hasta un carcter especfico.
Ejercicios
#include <iostream.h> void main() { char text[64]; cout<<Digite una lnea de texto y pulse Enter: ; cin.getline(text,sizeof(text)); cout<<Usted digito: <<text<< que tiene <<cin.gcount<<caracteres; }
Ejercicios
#include <iostream.h> #include <ctype.h> void main(void) { char letra; cout<<"Digite una S o una N: "; do{ letra = cin.get(); letra = toupper(letra); }while((letra != 'S') && (letra != 'N')); cout<<endl<<"Usted digito: <<letra<<endl; }
Ejercicios
Si la entrada es:
Ejemplo
void main(void) { char letra, cadena[128]; int i=0, done=0; cout<<"Digite una cadena que termine en un carcter numerico"; do{ letra=cin.peek(); if(!isdigit(letra)) cadena[i++]=cin.get(); else done=1; }while((!done) && (i<sizeof(cadena))); cadena[i]=NULL; cout<<"Cadena digitada: <<cadena<<endl; }
C++ tiene una libreria <string> Cuando requieras utilizarla en tus programas debes de colocar : #include <string> En esta libreria se define e implementa la clase string Es conveniente su uso y facil de procesar las cadenas de caracteres en C.
Declaracin de strings
43
Las siguientes instrucciones son equivalentes En ellas se declara x como un objeto de tipo string, al cual se le asigna la cadena high school :
u puede ser
Un
objeto string, o Un cadena al estilo C (un array de caracteres o un puntero a caracteres), Una cadena en comillas dobles.
Ejercicio
46
string x=high; char y[]=school; char z[]={w,a,s,\0}; char *p=good; string s=x+y+ +z+ very+ +p+!; cout<<s=<<s<<endl; cout<<s=+s<<endl;
es equivalente a
x=x+y;
donde y puede ser un objeto string, una variable al estilo de C, una variable char o una cadena en comillas dobles.
Para comparar dos strings x y y utilizar los operadores: ==, !=, <, <=, >, >= La comparacin es alfabtica La respuesta de cada comparacin es: true o false La comparacin funciona siempre y cuando al menos X o Y sea un objeto string. La otra cadena puede ser un objeto string, una variable de cadena tipo C, o una cadena entre comillas dobles.
Ejercicio
49
string x= high; char y[]= school; char *p = good; if (x<y) cout<<x<y<<endl; If (x<tree) cout<<x<tree<,endl; If (low!=x) cout<<low != x<<endl; if (p>x) cout<<p>x<<endl; else cout<<p<=x<<endl;
El operador de ndice []
50
Si x es un objeto string, y se quiere obtener el valor de la k-simo caracter de la cadena, usamos tambien: x[k];
string x= high; char c=x[0]; // c es h c=x[1]; // c es i c=x[2]; // c es g
Esta caracteristicas hace que los objetos string sean igual que los arreglos de chars.
Para obtener la longitus de un objeto string x, invocaremos al mtodo length() o al mtodo size():
int len=x.length( ); --o-int len=x.size( );
Si x es un objeto string, y queremos obtener a subcadena que empieza en la posicin pos y tiene len caracteres (donde pos y len son de tipo int), escribimos:
string y = x.substr(pos,len);
El valor por defecto para len es x.length( ) El valor por defecto para pos es 0
string y = x.substr(pos);//x[pos..end-1]
Suponga que x es un objeto string, y y es otra cadena que sera insertada en la posicin pos de la cadena x Para insertar y, hacemos:
x.insert(pos,y);
El argumento y puede ser: un objeto string, una variable cadena al estilo C, o una cadena en comillas dobles.
Dado x un objeto string, y supongamos que deseamos reemplazar los caracteres de x que se encuentran en el rango [pos,pos+len) por una cadena y. Para esto, escribimos:
x.replace(pos,len,y);
El argumento y puede ser: un objeto string, una variable cadena al estilo C, o una cadena en comillas dobles.
Suponga x un objeto string, y que desea eliminar los caracteres en el rango [pos,pos+len) en x. Para esto escribimos:
x.erase(pos,len);
El valor por defecto para pos es 0 Para eliminar todo la cadena x: x.clear( );
Este mtodo retorna el indice donde empieza la ocurrencia de ms a la izquierda de y en x, si no hay ocurrencias de y en x, devuelve la longitud de x. Para que la bsqueda empiece en la posicin pos, hacer:
int startLoc = x.find(y, pos);
En todas las versiones de find y rfind, el argumento y puede ser un objeto string, una variable cadena al estilo C, una cadena en comillas dobles, una variable de tipo char, o un caracter en comillas simples.
Ejercicios
58
string x=FROM:ayoussef@gwu.edu; int colonPos=x.find(:); string prefix=x.substr(0,colonPos); //=FROM string suffix = x. substr(colonPos+1); cout<<-This message is from <<suffix<<endl;
Ejercicio
59
este codigo lee lneas de cadenas desde un archivo y las agrega a un objeto string llamado body. Esto lo hace hasta que encuentra una lnea igual a ##########
#include <fstream> ifstream in(inputFileName.txt); string body; char line[1000]; while(in.getline(line,1000)){ string lineString(line); if (lineString != "##########") body += lineString +'\n; else break; // exits the while loop }
CS 103
void main (){ string x; cin>>x; int k = 0; while(k<x.size() &&(x[k]==' ' || x[k]=='\t' || x[k]=='\n')) k++; x.erase(0,k); int s=x.size(); while(s>0 &&(x[s-1]==' ' || x[s-1]=='\t' || x[s-1]=='\n')) s--; x.erase(s); }
Funciones de la Librera C
Strcpy
+= (assign+concat operator) = =, !=, <, >, <=, >= .find( ) method .rfind( ) method .size( ) or .length( ) methods