Está en la página 1de 51

TEMA 7 ELEMENTOS DEL LENGUAJE C INTRODUCCIN Bsicamente, C est compuesto por los siguientes elementos: Constantes Identificadores Palabras

ras reservadas Comentarios Operadores Una caracterstica importante del lenguaje C es que todos los elementos anteriormente enumerados distinguen entre maysculas y minsculas. Constantes: Las constantes que se pueden usar en C se clasifican en: enteras reales de carcter Enteras: Son nmeros sin parte fraccionaria. Pueden expresarse en: decimal octal hexadecimal Una constante octal debe comenzar con un 0. 016 ! 16 octal !14 decimal Una constante hexadecimal debe comenzar por un 0 seguida de una x o una X. 0xA3 ! A3 hexadecimal ! 163 decimal 0XA3 0xa3 Las constantes enteras se pueden considerar positivas a menos que vayan seguidas de un menos () 153 decimal 063 octal 1

0xA hexadecimal Reales: Tambin se denominan de coma flotante. ste sera el formato general de una constante real: [parte entera][.parte fraccionaria][exponente de 10] Cualquiera de las tres partes es opcional. El exponente de 10 tiene el siguiente formato: {E|e} exponente Ej: 13.21 81e8 21.37E1 .39E7 0.320001 3.9 32e2 de carcter: Pueden ser de dos tipos: simples: formada por un solo carcter. Se encierran entre comillas simples Ej: `a' `A' Los caracteres ASCII no imprimibles se definen mediante la barra invertida (\) CDIGO ASCII 7 8 9 10 11 12 13 34 39 92 CARCTER BARRA \a \b \t \n \v \f \r \ \' \\ SIGNIFICADO Alarma (Beep) Retroceso (BS) Tabulador Horizontal (HT) Nueva Lnea (LF) Tabulador Vertical (VT) Nueva Pgina (FF) Retorno Comillas Dobles Comillas Simples Barra Invertida

Se pueden representar caracteres ASCII mediante su cdigo octal o hexadecimal usando el siguiente formato: `\numoctal' !'\x4', `A', `\101' `\xnumhexadecimal\'

cadena de caracteres: Son secuencias de caracteres simples encerradas entre . A las cadenas de caracteres el compilador les aade un carcter nulo, aparece despus de las cadenas y se representan `\0', y los almacena como una matriz de carcter. Ej: HOLA\0 ! `H', `O', `L', `A', `\0' ! donde \0 es el carcter de terminacin Identificadores: Son los nombre dados a variables, funciones, etiquetas u otros objetos definidos por el programador. Un identificador est formado por letras (maysculas o minsculas), nmeros y carcter de subrayado, con la condicin de que le primer carcter no sea un nmero. Ej: Precio_Venta Verdadero Precio Venta Falso 1Num Falso _123 Verdadero De un identificador, slo son significativos los primeros 32 caracteres. Palabras reservadas: Son palabras especiales que no se pueden usar para nombrar otros elementos del lenguaje. NOTA: C hace distincin entre maysculas y minsculas Ej: int, float (no se pueden usar) Comentarios: El compilador reconoce como comentario cualquier grupo de caracteres situados entre \* *\ aunque estn en diferentes lneas. Se pueden definir comentarios en una sola lnea mediante // Ej: //Esto es un comentario En este caso, no es necesario poner indicador de lnea. Operadores, expresiones, sentencias: Un operador es un smbolo que indica alguna operacin sobre uno o varios objetos del lenguaje a los que se denominan operandos. Atendiendo al nmero de operandos sobre los que acta un operador, estos se clasifican en: unitarios: cuando actan sobre un solo operando binarios: 2 operandos ternarios: 3 operandos

Atendiendo al tipo de operacin que realizan, se clasifican en: aritmticos aritmticos relacionales lgicos de tratamiento de bits especiales Los operadores, junto con los operandos, forman expresiones. En una expresin, los operandos pueden ser constantes, variables o llamadas a funciones que devuelvan valores. Una expresin se convierte en una sentencia cuando va seguida de un ;. Cuando un grupo de sentencias se encierran entre llaves, { }, forman un bloque sintcticamente equivalente a una sentencia. OPERADORES ARITMTICOS OPERADOR UNARIOS ++ + BINARIOS * / % DESCRIPCIN Cambio de signo Decremento Incremento Resta Suma Producto Divisin Resto de divisin entera

El valor devuelto por el operador de divisin (/) depende del tipo de operandos. Si stos son enteros, devuelve la parte entera del cociente. Si alguno de ellos es real, devuelve el resultado como nmero real. El operador de resto de divisin entera (%) equivale a mod Ej: X/Y siendo int x, y; el resultado es 4. X=9 Y=2 Los operadores + + y aumentan o disminuyen respectivamente en una unidad el operando sobre el que actan. Ej: C++ es lo mismo que C ! C + 1 C es lo mismo que C ! C 1 Si el operador est antes de la variable, la operacin de incremento o decremento se realiza antes de usar el valor de la variable. 4

Si el operador est despus, primero se usa el valor de la variable y despus se realiza la operacin de incremento o decremento. Los operadores relacionales se usan para expresar condiciones y describir una relacin entre dos valores. OPERADOR > < >= BINARIOS <= == != If (a==b) printf (Son iguales); Si el contenido de la variable a es igual al de b, muestra en pantalla la frase Son iguales El resultado de una expresin relacional solo puede ser verdadero o falso, lo que en C se identifica con los valores "0 y 0 respectivamente. La expresin a==b se evaluar como 0 si a y b son diferentes y como distinto de 0 si son iguales. Falta???? Actan sobre expresiones booleanas, es decir, sobre valores V o F generados por expresiones como las del caso anterior. Son los siguientes: OPERADOR ! && DESCRIPCIN NOT AND || DESCRIPCIN Mayor que Menor que Mayor o igual que Menor o igual que Igual que Diferente que

UNARIOS BINARIOS

OR

El resultado de una operacin lgica viene dado por su tabla de verdad. a F F V V Ej: X=20 x==y ! F(0) Y=4 x=y ! V b F V F V a! V V F F a&&b V F F V a||b F V V F

Z=5 x==(y*z) ! V Operadores de tratamiento de bits: C incorpora ciertas operaciones sobre bits, propias del lenguaje ensamblador, como desplazamientos o manipulacin individual de bits. Los operadores que realizan estas operaciones son los siguientes: OPERADOR DESCRIPCIN UNARIOS ~ not & and | ^ BINARIOS >> <<

or or exclusivo desplazamiento a la derecha desplazamiento a la izquierda

Los operadores and, or y not, se rigen por la misma tabla de verdad que gobierna los operadores lgicos equivalentes. La diferencia entre unos y otros consiste en que estos tres actan a nivel de bits individuales y no sobre valores completos (&&, ||, !). As, las variables a y b almacenan respectivamente los valores a ! 0xA1B2 B ! 0xF0F0 Las siguientes expresiones se evalan de la forma: a&&b ! 1(V) a||b !1 (V) !a ! 0 (F) a&b ! 0xA0B0 a|b ! 0xF1B2 ~a ! 0x5E4D Los operadores &, |, ~, 0 y not, son idnticos respectivamente a las instrucciones del lenguaje ensamblador and, or y not. Por lo tanto, el operador and (&) permite poner ciertos bits a 0 dejando el resto inalterado, y el operador not (~), cambia los bit 1 por 0 y viceversa. El operador or exclusivo (^) es idntico a ^XOR del lenguaje ensamblador. Su tabla de verdad es la siguiente: a F F V V Ej: b F V F V a^b F V V F

a ! 0xA1B2 b ! 0x1234 a^b ! 0xB386 Los operadores de desplazamiento (>>,<<) derecha, izquierda, mueven todos los bits de una variable a la derecha o al la izquierda, respectivamente, un nmero de posiciones determinado. Su formato general es: variable<<n variable>>n Ej: a=b<<4 ! almacena en a el contenido de b despus de realizar un desplazamiento de b de 4 bits a la izquierda. Al igual que en el lenguaje ensamblador, C distingue entre desplazamientos aritmticos y lgicos. El desplazamiento aritmtico lo hacen sobre datos enteros y mantienen el signo. El desplazamiento lgico se realiza sobre datos declarados como sin signo (unsigned) y simplemente aade 0s. Son de tipo int. Ej: Sea a una variable declarada como entera (con signo) que almacena el valor hexadecimal A1B2, con lo que a ! 0xA1B2 a=a<<4 produce a ! 0x1B20 a=a>>4 produce a ! 0x0A1B Operadores de asignacin: Las asignaciones se realizan mediante el operador =. El uso de este operador tiene ciertos aspectos que lo distinguen de otros lenguajes. Son los siguientes: En primer lugar, se puede emplear cualquier nmero de veces en una expresin, por ejemplo, a=b=c=3; x=3; y=x+(z=6); El operador de asignacin combina con los siguientes operadores: *, /, %, +, , <<, >>, &, \, ^, para operaciones acumulativas. Ej: m*=5 equivale a m=m*5 m+=5 equivale a m=m+5 m+=y3 equivale a m=m+y3 m=(y=5) equivale a m=m(y=5)

m>>=(2*x+1) equivale a m=m>>(2*x+1) INSTRUCCIONES DE E/S DE SALIDA: La instruccin de salida por excelencia es PRINTF. Nos permite mostrar por pantalla desde una constante, ya sea una cadena, nmero, hasta una variable de cualquier tipo. STDIO.H es la librera que contiene printf. Estndar input/output. El formato de printf es el siguiente: printf(cadena de control, lista de variables); * Se pueden omitir cosas de este formato. Ej: printf(se ha cometido un error); Si queremos mostrar el valor de una variable por pantalla, hacemos lo siguiente: printf(El valor de la variable es:%d, var); Lo que imprimira por pantalla sera, El valor de la variable es: 3 Printf(Los valores de las variables son: %d, %d, var1, var2); Los valores de las variables son: 3, 5 TIPOS DE IDENTIFICADORES %D, %I ! toda variable definida como int. Los nmeros enteros. %C ! con ella mostramos una variable de tipo char. %S ! nos permite representar una cadena de caracteres (un array de char (varias letras)). %E ! Nos permite representar coma flotante de forma exponencial. Un nmero de forma exponencial. %F ! nmero en coma flotante con notacin decimal. Un float. %U ! un nmero entero sin signo %P ! nos permite mostrar el valor de un puntero (que almacena una direccin de memoria) %LD %LI ! muestran enteros largos (long int). Si un entero tiene 2 byte, un entero largo tiene 4 byte. %LT ! representamos un double.

%2.2f 25.38261 escala (2) y precisin (2) %.2f si no me importa el nmero de parte entera que saque. Esto se llama flash CDIGOS DE CONTROL Y CONSTANTES DE BARRA \ BARRA INVERTIDA \n ! a partir de este cdigo se produce en la pantalla un salto de lnea. \n\n\n (3 saltos de lnea). La posicin es importante. Siempre tiene que estar dentro de la cadena de control. \t ! se produce una tabulacin. Cinco caracteres de desplazamiento por defecto. \t\t ( dos desplazamientos. \a ! Alerta. Cuando se pone, emite un beep, un sonido. Un aviso. \r ! para indicar un retorno de carro, que es un cdigo ASCII 13. Cuando por ejemplo, pulsa intro. Cuando se pone \n, es un \r y un salto de lnea. Si queremos que aparezca algo entrecomillado ponemos: \\ DE ENTRADA: SCANF tambin est en STDIO.H. Nos sirve para introducir datos por el teclado, cualquier tipo de variable. Su formato es: scanf(cadena de control, lista de variables); Dentro de esta cadena, lo nico que nos admite son los identificadores (%d, %i, etc), que son los mismos que en printf. p.e. scanf(%d, &variable); donde & es direccin de (variable). Si no se pone esto, no lo hace; toma variable como direccin y no lo ejecuta correctamente. scanf/%d, cadena); cadena 20 ! aqu no se pone &, por que el nombre del array de caracteres es un puntero a la posicin del array (esto es para introducirlo de golpe). Si queremos meter carcter a carcter a carcter, ponemos scanf(%d, cadena) Slo en estas situaciones es la excepcin; por regla general siempre &.

Para introducir ms de una variable en un scanf: scanf(%d %d %d %d, var1, var2, var3, var4); pero es preferible hacer varios scanf, 1 por variable. Se pueden introducir diferentes identificadores. Hay algunas veces que en el buffer del teclado se quedan 2 retornos de carro almacenados, esto implica que se salten algunas lneas. Para solucionarlo ponemos: fflush(stdin); siempre encima de scanf. Una excepcin a esto es cuando queremos leer ms de un carcter del teclado, teclas especiales (intro, sangra, etc.) Si ponemos scanf(3d, &var), estamos limitando la introduccin a tres dgitos. BUCLES WHILE: While (condicin) { sentencias; } Ejecuta las sentencias mientras se cumpla la condicin. Si la condicin es falsa, no entra en las sentencias. p.e. #include<stdio.h> void main () int a=0, b=0; { while (a<=5) { b=b+a; a++ } } ej: programa que nos permita introducir dos nmeros por teclado y nos diga cual es el mayor. 10

#include <stdio.h> void main () { int a, b; printf(Introduce un numero); scanf(%d, &a); printf(Introduce un numero); scanf(%d, &b); if (a>b) { printf(\nEl mayor es %d, a); } else { printf(\nEl mayor es %d, b); } } IF_ELSE: if (condicin) { sentencias } else { sentencias }

11

If evala la condicin; si es V ejecuta las sentencias sino, se pasa a else. Con una sola sentencia: If(x==0) { printf(HOLA); } else { printf(ADIOS); } Si tenemos varias sentencias por ejecutar: if(x==0) { a=a+1; b=b+1; printf(Suma %d, a+b); } else {

} Aqu podemos utilizar los operadores lgicos AND OR. Tambin podemos tener varios if y varios else. SWITCH: Es una condicin mltiple y comprueba el valor de la variable sucesivamente frente a una lista de variables. Su formato: switch variable { 12

case constante 1: sentencias; break; case constante 2: sentencias; break; . default: sentencias; break; } Si la variable es igual a constante 1, salta a la sentencia, hace break y pasa al final del switch. Si no coincide ninguna, salta directamente a default (valor por defecto). p.e. #include <stdio.h> void main () { char ch; printf(\n1. Comprueba la ortografa); printf(\n2. Corrige errores); . scanf(%c, ch); switch (ch) { case 1: . break; 13

case 2: . Break;

default: printf(Ninguna es valida); } } WHILE: Toda condicin que en C devuelve un 0 es falsa y cualquier otro nmero, verdadero. Ejemplo de bucle infinito que da 0, puede que nos convenga tenerlo: #include <stdio.h> void main () { int a=0, b=0; while (a) { b=b+a; a++ } printf(%d, b); } DO WHILE: do { sentencias; }while (condicin)

14

ste es prcticamente igual que while pero ste ejecuta al menos una vez, porque la condicin se ejecuta al final, al contrario que en while, que se ejecuta al principio. FOR: Es uno de los ms tiles y de los ms usados. Se utiliza mucho para arrays. for(valor inicial; condicin; incremento o decremento) { sentencias } p.e. for(a=7; a>10; a++) { sentencias } p.e. for(a=o, b=7; a<10; a++, b++) for(a=0, b=7; a<10&&b>20;a++,b++) CONTINUE: Provoca un salto en la ejecucin del bucle continuando a la siguiente iteracin. for( ; ; ) { if(condicin) {continue;} } 15

En distintas circunstancias puede haber iteraciones que no se ejecuten. GOTOXY: gotoxy (columna, fila); Normalmente se pone antes de un scanf o un printf para posicionar el cursor en un lugar determinado de la pantalla. Esto est en la librera #include<conio.h> SECUENCIAS DE ESCAPE CARCTER Campana (alerta) Retroceso Tabulador Horizontal Nueva Lnea Tabulador Vertical Nueva Pgina Retorno de carro Comillas Apstrofe Interrogacin Barra Invertida Nulo SECUENCIA DE ESCAPE \a \b \t \n \v \f \r \ \' \? \\ \0 VALOR ASCII 007 008 009 010 011 012 013 034 039 063 092 000

RESUMEN DE OPERADORES GRUPO DE PROCEDENCIA Funcin, formacin, miembro de estructura, puntero a miembro Operadores monarios Multiplicacin, divisin y resta aritmtica Suma, resta aritmtica Operadores de desplazamiento a nivel de bits Operadores racionales Operadores de igualdad y a nivel de bits 0 exclusivo a nivel de bits 0 a nivel de bits y lgica 0 lgico Operador condicional Operadores de asignacin Operador coma OPERADORES () [] . > ++ ! ~ * & sizeof */% + << >> <<= >>= == != & ^ | && || ? = += = *= /= %= &= ^= <<= >>= / ASOCIATIVIDAD Izq ! Dcha. D!I I!D I!D I!D I!D I!D I!D I!D I!D I!D I!D D!I D!I I!D

16

TIPOS DE DATOS Y REGLAS DE CONVERSIN DE DATOS TIPO DE DATO DESCRIPCIN REQUISITO DE MEMORIA int Cantidad entera 2 bytes o 1 palabra (varia de un pc a otro) Cantidad entera corta (puede contener short 2 bytes o 1 palabra menos dgitos que int) Cantidad entera larga (puede contener long 1 o 2 palabras ms dgitos que int) Cantidad entera sin signo (no negativa) (la unsigned cantidad mxima permisible es 2 bytes o 1 palabra aproximadamente el doble de int) char Carcter 1 byte Carcter con valores en el rango 128 a signed char 1 byte +127 unsigned char Carcter con valores en el rango 0 a 255 1 byte Nmero en coma flotante (un nmero que 1 palabra float contiene un punto decimal) Nmero en coma flotante de doble double precisin (+ cifras significativas y un 2 palabras exponente que puede ser mayor absoluto) Nmero en coma flotante de doble long double precisin (puede tener mayor precisin 2 o ms palabras que un double) Tipo de dato especial para funciones que No aplicable void no devuelven ningn valor Constante de enumeracin (tipo especial 2 bytes o una palabra enum de int) CARCTER C D E F G PRINTF El dato se muestra como carcter El dato se muestra como decimal El dato se muestra como coma flotante con exponente El dato se muestra como coma flotante sin exponente El dato se muestra como coma flotante usando la falta?

LA INSTRUCCIN CONTINUE Se utiliza para saltarse el resto de la pasada actual a travs de un bucle. El bucle no termina cuando se encuentra una instruccin continua, sencillamente, no se ejecutan las sentencias que se encuentren en el bucle y se salta directamente a la siguiente pasada a travs del bucle. La instruccin continua se puede incluir dentro de una instruccin while, do while o for. Su sintaxis es: continue; Ej: do{ 17

scanf(%f, &x); if(x<0){ printf(ERROR VALOR NEGATIVO DE X); continue; } }while (x>=100) for (cont=1;x>=100;cont++){ scanf(%f, &cont); if (cont>0){ printf(ERROR VALOR NEGATIVO DE X); continue;} } En cada caso no se ejecutar la parte en la que se procesa el valor actual de cont si ste es negativo, se continuar en este caso con la siguiente pasada del bucle. SCANF: Se puede utilizar para introducir cualquier combinacin de valores numricos, caracteres sueltos cadenas de caracteres. La funcin devuelve el nmero de datos que se ha conseguido introducir correctamente. Su sintaxis es: scanf(cadena de control, arg1, arg2,, argn); En la cadena de control se incluyen los grupos individuales con un grupo de caracteres por cada dato de entrada. Cada grupo de caracteres debe comenzar por el signo de porcentaje seguido de un carcter de conversin que indica el tipo de dato correspondiente. Los argumentos pueden ser variables o formaciones y sus tipos deben coincidir con los indicados por los grupos de caracteres correspondientes. Cada nombre de variable debe ser precedido por un &, sin embargo, los nombres de formaciones no deben ir con &. La cadena de caracteres introducida por el dispositivo de caracteres estndar puede tener cualquier cdigo ASCII excepto el de nueva lnea. Falta Los caracteres consecutivos que no sean de espaciado y que componen un dato definen, en conjunto, un campo. Es posible limitar el nmero de caracteres espaciados, una longitud de campo mxima para cada dato. 18

Para hacer esto, se introduce en la cadena de control un entero sin signo que indica la longitud de campo entre el % y el carcter de conversin %3d. El dato puede estar compuesto por menos caracteres de los que especifique la longitud del campo, sin embargo, el nmero de caracteres del dato real no puede exceder la longitud del campo especificado. No se leern los caracteres que se encuentren ms all de la longitud de campo especificada. Estos caracteres sobrantes pueden interpretarse de forma incorrecta como los componentes del siguiente dato. La mayora de las versiones de C permiten que ciertos caracteres de conversin, en la cadena de control, sean precedidos por un prefijo de una sola letra, que indica la longitud del argumento correspondiente, por ejemplo, l se utiliza para indicar un argumento entero largo, tanto con signo como sin signo o un argumento de doble precisin. La h se utiliza para indicar un entero corto tanto con signo como sin signo y tambin en algunas versiones, la L para tipo doble largo. #include<stdio.h> void main () { short ix, iy; long lx, ly; double dx, dy; .. scanf(%hd %ld %lf, &ix, &lx, &dx);

scanf(%3ho %7lx %15le2, &iy, &ly &dx); %hd ! indica que el primer dato ser asignado a una variable entera corta en decimal. %ld ! ser asignado a una variable larga en decimal. %3ho ! tendr una longitud mxima de campo de 3 caracteres y ser asignado a una variable entera corta octal. %7lh ! longitud mxima de 7 caracteres asignada a una variable entera larga en hexadecimal. %15le ! longitud mxima de 15 caracteres asignada a una variable de doble precisin. En la mayora de las versiones de C es posible saltarse un dato sin que le sea asignado a una determinada variable o formacin. Esto se denomina supresin de asignacin (*). char concepto [80]; int no_part;

19

float coste; scanf(%s %*d %f, concepto, &no_part, &coste); Si la cadena de control contiene varios grupos de caracteres sin estar separados por caracteres de espaciado, se debe tener cuidado con la conversin de tipo c. En estos casos falta? se interpretar como un dato ms. Para saltarse estos espacios y leer el siguiente carcter que no sea espacio, se debe utilizar el grupo de conversin %15. #include <stdio.h> void main () { char c1, c2, 3;

scanf(%c%c%c, &c1, &c2, &c3);

Cuando se encuentren dentro de la cadena de control caracteres no reconocidos, se espera que aparezcan estos en los datos de entrada. Estos caracteres de entrada se leern pero no se asignarn a ningn identificador. Si la entrada no coincide con los caracteres de la cadena de control, terminar la ejecucin de la funcin scanf. #include <stdio.h> void main () { int i; float x; .. scanf(%d a %f, &i, &x); PRINTF: Se utiliza para escribir cualquier (falta) caracteres sueltos y cadenas de caracteres. Es anloga a la funcin de entrada scanf con la diferencia de que su propsito es visualizar datos en lugar de introducirlos en el ordenador. La funcin printf se ocupa de transferir datos de la memoria del ordenador al depsito de salida estndar. Su sintaxis es: printf(cadena de control, arg1, arg2, , argn);

20

Donde cadena de control hace referencia a una cadena de caracteres que contiene informacin sobre el formato de salida. Los argumentos (arg) representan los datos de salida. stos pueden ser: constantes variables simples nombres de formaciones En contraste con scanf, los argumentos de printf no representan direcciones de memoria por lo que no estn precedidos de &. La cadena de control est compuesta por grupos de caracteres, con un grupo de caracteres por cada saldo de salida. Cada grupo de caracteres debe empezar por %. En su forma ms sencilla, un grupo de caracteres consistir en un % seguido de un carcter de conversin que indica un carcter correspondiente. Pueden incluirse varios grupos de caracteres seguidos o muchos separados. Es muy comn el uso de espacios en blanco como separadores de grupo de caracteres. #include <stdio.h> #include <math.h>> void main () { char concepto [20]; int no_part; float coste;

printf(%s %d %f, concepto, no_part, coste);

La conversin tipo f y la de tipo e se utilizan para visualizar valores en coma flotante, sin embargo, la ltima hace que se incluya en la salida el exponente, mientras que en la primera no. #include <stdio.h> #include <math.h> void main () {

21

double x=5000.0, y=0.0025; printf(%f %f %f \n\n, x, y, x*y, x/y); printf(%e %e %e %e, x, y, x*y, x/y);

En la funcin printf se utiliza la conversin de tipo s para visualizar una cadena de caracteres que acaba en el carcter nulo \0. Se pueden incluir caracteres de espaciado en la cadena de caracteres. #include <stdio.h> void main() { char lnea [20]; scanf( %[^\n], lnea); printf(%s, lnea); Se puede especificar una longitud de campo mnima anteponiendo al carcter de conversin un entero sin signo. Si el nmero de carcter del dato correspondiente es menos que la longitud de campo especificado, entonces, el dato ser precedido por los espacios en blanco necesarios para que se consiga la longitud del campo especificado. Si el nmero de caracteres del dato excede de la longitud de campo especificada, se visualizar el dato completo. #include <stdio.h> main () { int i=12345; printf(%3d %5d %8d, i, i, i); saldra: 123645 12345 12345 Tambin es posible especificar el mximo nmero de cifras decimales para un valor en coma flotante o el mximo nmero de caracteres para una cadena de caracteres. Esta especificacin e denomina precisin. La precisin es un entero sin signo que siempre es precedido por un punto decimal. Si se especifica la longitud de campo mnima, adems de la precisin como es habitual, entonces la especificacin de la precisin sigue a la especificacin de la longitud de campo. Estas dos especificaciones enteras preceden al carcter de conversin. Un nmero en coma flotante se redondear si se debe recortar para ejecutar la precisin. #include <stdio.h> 22

main () { float x=123.456; printf(%7f %7.3f %7.1f\n\n, x, x, x); printf(%12e %%12.5e %12.3e, x, x, x); } saldra: 123.456000 123.456 123.5 1.234560e+03 1.23456e+02 1.235e+02 Las expresiones de campo mnima y de precisin, se pueden aplicar a datos de tipo carcter adems de los datos numricos. Cuando se aplica a una cadena de caracteres, la longitud de campo mnima se interpreta de la misma forma que con una cantidad numrica, es decir, se aaden espacios en blanco si la cadena de caracteres es ms corta que la longitud de campo mnima especificada, por tanto, la especificacin de la longitud de campo mnima no impedir nunca que se visualice la cadena de caracteres completa. Sin embargo, la especificacin de la precisin determina el mximo nmero de caracteres que pueden ser visualizados. Si la precisin especificada es menor que el nmero total de caracteres de la cadena, no se mostrarn los caracteres sobrantes de la parte de la derecha de la cadena. Esto ocurrir an cuando la longitud de campo mnima sea mayor que la cadena de caracteres aadindose en este caso carcter en blanco a la cadena truncada. #include <stdio.h> main () { char lnea [12]; printf(%1os %15s %.5s, lnea, lnea, lnea); } La mayora de las versiones de C: permiten el uso de prefijos dentro de la cadena de control para indicar la longitud del argumento correspondiente. Los prefijos permitidos son los mismos que los prefijos utilizados con la funcin scanf. Algunos caracteres de conversin se escriben en maysculas (p.e.: X, L, G); hacen que cualquier letra de los datos de salida se presenten en maysculas en este caso Adems de la longitud de campo mnima, la precisin y el carcter de conversin, cada grupo de la cadena de control puede incluir un indicador que afecta a cmo aparecer en la salida. Algunos compiladores permiten que aparezcan 2 o ms indicadores seguidos dentro del mismo grupo de caracteres. 23

INDICADORES MS COMUNES

#include<stdio.h> void main () { int 1=123 float x=12.0, y=3.3 printf(:%6d %7.0f %10.1e:\n\n, i, x, y); printf(:%6d %7.0f %10.1e:\n\n, i, x, y); printf(:%+6d %+7.0f %+10.1e:\n\n, i, x, y); printf(:%+6d %+7.0f %+10.1e:\n\n, i, x, y); printf(:%7.0f %#7.0f %7g %#7g:\n\n, x, x, y, y); } INTRODUCCIN A LAS SENTENCIAS DE CONTROL EN C SENTENCIA IF: Es una de las sentencias de seleccin o condicional, su funcionamiento se rige por el resultado de una prueba condicional que evala si es verdadero o falso. Sintaxis: if(expresin)sentencia; Donde (expresin) puede ser vlida en C; si la expresin se evala como verdadera se ejecutar la sentencia, sino lo es, se pasa por alto la sentencia y se ejecuta la lnea de cdigo que sigue a if. 24

En C, una expresin es verdadera si se evala a cualquier valor distinto de cero; si se evala a cero es falsa. A la sentencia que sigue a if se la conoce habitualmente como el objetivo de la sentencia if. p.e. #include<stdio.h> void main () { int num; printf(\nIntroduce un nmero:); scanf(%d, &num); if(num>0) printf(El numero es positivo) if(num<0) printf(El nmero es negativo); } SENTENCIA IF_ELSE: Sintaxis: if(expresin) sentencia1; else sentencia2; Si la expresin es verdadera entonces se ejecutar el objetivo de if, y saltar a else. Si la expresin es falsa, se pasa por alto el objetivo de if y se ejecutar el objetivo de else. Nunca se ejecutarn las dos sentencias. p.e. #include<stdio.h> void main () { int num; 25

printf(\nIntroduce un nmero:); scanf(%d, &num); if(num>0) printf(El numero es positivo) else printf(El nmero es negativo); } CREACIN DE BLOQUES DE CDIGO: En C se pueden enlazar dos o ms sentencias, a esto se le llama bloque de cdigo. Para crearlo, se rodean las sentencias en el bloque con llave de apertura y cierre. Una vez hecho esto, las sentencias forman una unidad lgica que se puede utilizar en cualquier lugar donde pueda hacerlo una sentencia sencilla. Sintaxis: if (expresin){ sentencia1; sentencia2; . sentenciaN; } else{ sentencia1; sentencia2; sentenciaN; } Un bloque de cdigo presenta una unidad lgica indivisible, esto significa que bajo ninguna circunstancia se podra ejecutar una de las sentencias printf sin que se ejecuten tambin las otras. p.e. #include<stdio.h> void main () { 26

float num; int cambio; printf(\n\n1. Pies a metros \n2. Metros a pies); printf(\Elige una opcin:); scanf(%d, &cambio); if(cambio==1){ printf(\nIntroducir pies: ); scanf(%f, &num); printf(Metros: %f, num/3.28); } else{ printf(\nIntroducir metros: ); scanf(%f, &num); printf(Pies: %f, num*3.28); } } ANIDAMIENTO DE SENTENCIAS IF: Cuando una sentencia if es el objetivo de otro if o else, se dice que est anidada dentro del if ms externo. Un if anidado puede aparecer dentro de un bloque de sentencias que sean el objetivo del if ms externo. Un compilador del estndar ANSI permitir al menos hasta 15 niveles de anidamientos de if. Se pueden poner juntos varios if y else en la misma cadena o escalera if_else_if. En esta situacin, un if anidado tiene como objetivo otro if. Sintaxis: if(expresin) sentencia; else if(expresin)sentencia; else if(expresin)sentencia; ..

27

else sentencia; Las condiciones se evalan de arriba abajo, tan pronto como se encuentre una condicin verdadera se ejecuta la sentencia asociada a ella y se pasa por alto el resto de la escalera; si ninguna de las condiciones es verdadera, se ejecutar el ltimo else. INTRODUCCIN DE CARACTERES: La versin original de C defina una funcin llamada getchar() que devuelve un carcter introducido por teclado. Una vez llamada la funcin, espera a que se pulse una tecla, entonces, getchar() devuelve el valor de la tecla solicitante. La funcin getchar() est definida por el estndar ANSI y requiere del archivo de cabecera <stdio.h> p.e. #include<stdio.h> void main () { char c; c= getchar(); printf(Ud. Escribi: %c, c); } GETCH( ): Se utiliza igual que getchar() excepto que devolver su valor inmediatamente despus de haberlo introducido, sin necesidad de pulsar intro. Para la mayora de los compiladores, esta funcin requiere el archivo de cabecera <conio.h>. En C podemos comparar caracteres, igual que se comparan nmeros ya que estn asociados al cdigo ASCII y en secuencia ordenada. p.e. #include<stdio.h> #include<conio.h> void main () { char c; printf(\nIntroduce un carcter: );

28

c=getch(); printf(\nSu cdigo ASCII es %d, c); } UTILIZACIN DEL BLOQUE FOR: Se utiliza para repetir una sentencia o bloque de sentencias un nmero de veces especificado. Sintaxis: for(inicializacin; comprobacin adicional; incremento) sentencia; Inicializacin: se utiliza para un valor inicial que controla el bucle, se suele denominar como variable de control del bucle; se ejecuta una sola vez antes de que comience el bucle. Comprobacin adicional: verifica la variable de control del bucle frente a un valor objetivo cada vez que se repite el bucle. Si la comprobacin condicional es verdadera, el bucle se repite. Si es falsa, el bucle se detiene y la ejecucin del programa se reanuda en la siguiente lnea de cdigo que sigue al bucle. Esta comprobacin se lleva a cabo al principio del bucle, cada vez que el bucle se repite. Incremento: se ejecuta despus de que se haya ejecutado la sentencia o bloque de sentencias, pero antes que la comprobacin condicional. Su propsito es aumentar o disminuir el valor de control del bucle en una cierta cantidad. p.e. #include <stdio.h> main() { int num; for(num=1; num< 11; num=num+1) { printf(%d, num); } printf(Terminado); } Para repetir varias sentencias utilizaremos un bloque de cdigo como objetivo del bucle for. Ej: Producto y suma de los nmeros del 1 al 10. #include <stdio.h>

29

main() { int num, sum, prod; sum=0; prod=1; for(num=1; num< 11; num++) { sum=sum+num; prod=prod*num; } printf(Producto y suma %d %d, prod, sum); } Un bucle for se puede ejecutar de forma negativa, esto sera decremento en vez de incremento. Adems, la variable de control del bucle, se puede incrementar o decrementar en ms de uno. #include <stdio.h> main() { int num=0; for(num=0; num< 101; num=num+5) printf(%d, num); } Si la variable de control del bucle ya se ha inicializado desde fuera del bucle for, no es necesario una expresin de inicializacin. Ej: Programa que se ejecuta hasta que se introduzca una `q' #include<stdio.h> #include<conio.h> main()

30

{ int i; char c; c= `a'; for(i=0; c= `q'; i++){ printf(paso: %d\n, i); c=getch(); } } En lugar de comprobar una variable de control del bucle, la prueba condicional de este for verifica el valor de un carcter introducido por el usuario. Ej: Programa que pide un n al usuario. #include<stdio.h> main() { int i; printf(Introducir un entero: \n); scanf(%d, &i); for ( ; i ; i ){ printf(%d, i); } } Ej: Programa que se ejecuta hasta que introduzcas una `q' #include<stdio.h> #include<conio.h> main() { 31

char c; for(c= getch(); c!= `q'; c= getch()){ printf(entrada a la q); } } La razn por la que el objetivo de for puede estar vaco es porque C permite sentencias nulas; utilizando for es posible crear un bucle que no se detenga nunca, esto es, un bucle infinito. for( ; ; ) Cuando no hay expresin en la porcin condicional, el compilador asume que es verdadero, por eso, el bucle contina ejecutndose. En C, a diferencia de la mayora de los lenguajes, es perfectamente vlido alterar la variable de control del bucle desde fuera de la seccin de incremento. Ej: Programa que incrementa la i al final del bucle #include<stdio.h> main() { int i; for(i= 0; i<10 ;){ printf(%d, i); i++; } } BUCLE WHILE: El objetivo de un while es tambin un bucle de cdigo; el bucle while funciona repitiendo su objetivo mientras la expresin sea cierta. Cuando sta es falsa, el bucle se detiene. while (expresin) sentencia; El valor de la expresin se comprueba al principio del bucle, esto significa que, si la expresin es falsa al iniciarse, el bucle no se ejecutar ni una sola vez. #include<stdio.h> 32

#include<conio.h> main() { char c; c= getch(); while (c!= `q'){ c= getch(); printf(encontrada la q);} } Ej: Programa que traduce los caracteres que se escriban a un formato codificado; anadiendo un 1 a cada letra. El programa se detiene cuando se pulsa intro. #include<stdio.h> #include<conio.h> main() { char c; printf(Introduce un mensaje: \n); c= getch(); while (c!= `\n'){ printf(%c, c+1); c= getch(); } } BUCLE DO WHILE: El bucle do repite la/s sentencia/s mientras la expresin es verdadera, se detiene cuando la expresin se convierte en falsa. El bucle do es nico, ya que siempre ejecuta el cdigo de dentro del bucle al menos una vez dado que la expresin que controla el bucle se comprueba al final del mismo. do{ sentencias; }while (expresin); Ej: Pide al usuaro qu quiere hacer con dos nmeros. 33

#include<stdio.h> #include<conio.h> main() { int a, b; char c; printf(\n\nQuiere\n); printf(Sumar, Restar, Multiplicar o Dividir\n); do{ printf(Introduzca la primera letra: \n); c=getch(); printf(\n); }while (c!= `S' && c!= `R' && c!= `M' && c!= `D'); printf(Introduzca el primer nmero: \n); scanf(%d, &a); printf(Introduzca el segundo nmero: \n); scanf(%d, &b); if (c== `S'){ printf(%d, a+b); else if (c== `R') printf(%d, ab); else if(c== `M') printf(%d, a*b), else

34

if(c== `D') printf(%d, a/b); } } El bucle do es especialmente til cuando el programa que est esperando a que ocurra un suceso. CREACIN DE BUCLES ANIDADOS Cuando el cuerpo de un bucle contiene otro, se dice que el segundo est anidado en el primero. Cualquiera de los bucles de C puede estar anidado dentro de cualquier otro bucle. En C, el estndar ANSI especifica que los bucles pueden estar anidados hasta 15 niveles. Ej:Imprime en pantalla los nmeros del 1 al 10. for(i=0;i<10;i++){ for(j=1; j<10; j++){ printf(%d, j); } } Utiliza for para imprimir el alfabeto 3 veces, y cada vez las letras 2 veces. #include<stdio.h> #include<conio.h> main() { int i, j, k; for(i=0; i<3;i++){ for(j=0; j<26;i++){ for(k=0; k<2;i++){ printf(%c, \'+j); } }

35

} } UTILIZACIN DE BREAK PARA SALIR DE UN BUCLE Permite Salir de un bucle desde cualquier puntode su cuerpo, pasando por alto su espresin de finalizacin normal. Cuando break se encuentra dentro de un bucle, el bcle termina inmediatamente y el control del progranama continua en la sentencia que continua al bucle. Programa que imprima del 1 al 100 pero cuando llegue al 10 salte. #include<stdio.h> #include<conio.h> main() { int i; for(1=1;i<100;i++){ printf(%d, i); if(i==10){ break; } } } La sentencia breaK se utiliza en bucles en los que una condicin especial puede causar una terminacin inmediata. Todos los numeros mltiplos de 6 #include<stdio.h> #include<conio.h> main() { char c; int i; 36

for(i=1;i<10000;i++){ if(!=(i%6)){ printf(%d mas? (S/N), i); c=getch(); if(c= `N'){ break; printf(\n); } } } } BUCLE SWITCH: Es una sentencia de seleccin mltiple de C. Se utiliza para elegir un camino entre varios caminos alternativos de la ejecucin del programa y funciona asi: se compara una variable con una lista de constantes enteras o de carcter, cuando concuerda con alguna se ejecuta la secuencia de sentencias asociadas con esa constante. switch (variable){ case 1: secuencia de sentencias; break; case n: secuencia de sentencias; break; default: secuencia de sentencias; break; } Donde la secuencia de sentencias de default se ejecutan si no coincide con ninguna de las otras. Default es opcional. Si no hay coincidencias y no existe el default, no se lleva a cabo ninguna opcin. Cuando se encuentra alguna coincidencia, se ejecutan las sentencias asociadas con el `case' hasta que se 37

encuentra con un `break', o en el caso de default o en el ltimo case, hasta que se alcance el final del switch. Programa que recorre los numeros 1, 2, 3 y 4 e imprime el nombre del que se ha introducido: #include<stdio.h> main() { int i; printf(Introduce un numero del 1 al 4: \n); scanf(%d, &i); switch(1){ case 1: printf(uno); break; case 2: printf(dos); break; case 3: printf(tres); break; case 4: printf(cuatro); break; default printf(nmero desconocido); break; } } La sentencia `switch' se diferencia de `if' en que `switch' solamente puede verificar la igualdad, mientras que el `if', puede ser de cualquier tio, a dems, `switch' slo funcionar con tipos int y char. Las secuencias de sentencias asociadas con cada case no son bloques, por lo tanto, no van encerrados entre llaves. El estndar ANSI estable que se permiten, por lo menos, 257 sentencias case. No puede haber dos constantes case con valores idnticos en el mismo switch. Es posible tener un switch como parte de una secuencia de sentencias de otro switch ms externo, esto se llama switch anidado. Si las constantes case del switch ms externo y ms interno contienen valores comunes, no surgir error.

38

La sentencia switch se utiliza a menudo para procesar rdenes de men. #include<stdio.h> #include<conio.h> main() { int a, b; char c; printf(\n\nQuiere\nSumar, Restar, Multiplicar, Dividir?\n); do{ printf(Introduzca la primera letra: ); c=getch(); printf(\n); }while ((c!= `S')&&(c!= `R')&&(c!= `M')&&(c!='D')) printf(Introduzca el primer numero: ); scanf(%d, &a); printf(Introduzca el segundo numero: ); scanf(%d, &b); switch (c){ case S: printf(%d, a+b); break; case R: printf(%d, ab); break; case M: printf(%d, a*b); break; case D: if(b!=0){ printf(%d, a/b);

39

break;} } } La sentencia `break' es opcional. Cuando no existe, la ejecucin pasa al siguiente `case' y solo se detiene cuando encuentra una sentencia `break' o el final del switch. La sentencia de secuencias asociada a `case' puede estar vaca, esto permite que dos o mas `case' compartan una secuencia de sentencias comn sin duplicacin de cdigo. #include<stdio.h> #include<conio.h> main() { char c; printf(Introduce una letra: ); c=getch(); switch (c){ case a: case e: case i: case o: case u: printf(es una vocal\n); break; default: printf(Es una consonante); } } ARRAYS Y CADENAS: DECLARACION DE ARRAYS UNIDIMENSIONALES 40

En C, un array es una lista de variables del mismo tipo que se referencian por un nombre comn a una variable individual del array. Los arrays constituyen un modo adecuado de gestionar grupos de datos relacionados. Sintaxis: tipo nombre_de_variable [tamao] Tipo: es un tipo vlido de datos en C. Nombre de variable: nombre del array. Tamao: nmero de elementos del arrray. Ej: array entero de 20 elementos ! int miarray[20]; Se accede a un elemento de un array mediante un ndice utilizando el n del elemento. En C, todos los arrays empiezan por 0, esto significa, que si se quiere acceder al primer elemento de un array, se utiliza 0 para el ndice. Para acceder por ndice a un array, especificamos dentro de corchetes el nmero del ndice del elemento deseado. Por ejemplo, asignamos al primer elemento de miarray un valor 100. miarray[0]=100; C almacena los arrays unidimensionales en una posicin de memoria contigua con el primer elemento en la direccin ms baja. Ej: .. int i[5]; int j; for(j=0;j<5;j++) i[j] = j;

El array tendra este aspecto: 0 0 1 1 2 2 3 3 4 4

Se puede utilizar el valor de un elemento del array en cualquier lugar en el que se utilizarz una variable o una constante. Ej: Programa que carga el array sqrs con los cuadrados de los nmeros del 1 al 10 y despues los muestra. #include<stdio.h> main () { int sqrs[10];

41

int i; for (i=1; i<10; i++){ printf(%d, sqrs[1]); } } Cuando se quiere utilizar scanf para introducir un valor numrico en un elemento del array, basta con poner & delante del elemento del array. Ej: scanf(%d, &cont[9]); C no realiza ninguna comprobacin de los lmites de los arrays, esto significa que ees posible que sobrepase el lmite de un array. Por ejemplo, si se declara que un array llamado `a' tiene 5 elementos, el compilador permitir el acceso al dcimo elemento inexistente con una sentencia como a[9]; por supuesto, intentar acceder a elementos inexistentes del programa dar error en el programa. En C, no se puede asignar un array completo a otro. Ej: char a1[10], a2[10];

a2=a1 NO!! se puede hacer esto . Si se quieren copiar los valores de todos los elementos de un array en otro array se debe hacer copiando cada elemento por separado. Ej: Programa que lee la temperatura al mediodia de cada da del mes y despus informa de la media de temperatura mensual as como de los das ms fros y ms calurosos. Min 200, Max 0. #include<stdio.h> main() { int temp[31], i, min, max, med, tot; int dias; printf(Cuntos das tiene el mes?); scanf(d, &dias); for(i=0;i<dias;i++){ printf(Introducir temperatura del da %d, i+1); scanf(%d, &temp[i]);

42

} /*media*/ tot=0; for(i=0; i<dias;i++){ tot=tot+temp[i]; } med=tot/dias; printf(Temperatura media %d, med); /*mnima y mxima*/ min=200; max=0; for(i=0;i<dias;i++){ if(min>temp[i]){ min=temp[i]; } if (max>temp[i]){ max=temp[i]; } } printf(Temperatura mnima: %d, min); printf(Temperatura mxima: %d, max); } Para copiar los contenidos de un array en otro se debe copiar cada elemento explcitamente por separado. Ej: Programa que carga a1 con los nmeros del 1 al 10 y despus los copia en a2. #include<stdio.h> main()

43

{ int a[10], a2[10]; int i; for(i=1;i>11;i++){ a1[i1]=i; } for(i=1;i>11;i++){ a2[i1]=a1[i1]; } for(i=1;i>11;i++){ printf(%d, a2[i1]; } } Ej: Programa que lee una cadena y la codifica; el usuario introduce primero el mensaje que se almacena en una cadena de caracteres cuando el usuario pulsa intro y se codifica el mensaje aadiendo una a cada letra. #include<stdio.h> #include<conio.h> main() { char men[80]; int i; printf(Introducir mensaje(menos de 80 caracteres)); for(i=0;i<80;i++){ men[i]=getch(); if(men[i]== `\r'){ break; } 44

} for(i=0;men[i]!= `\r';i++){ printf(%c, men[i]+1); } } Los arrays son especialmente tiles cuando se quiere ordenar la informacin. Un mtodo de ordenar la informacin es el llamado `mtoso de la burbuja', que consiste en la comparacin repetitiva y, si es necesario, el intercambio de elementos adyacentes. Son como pequeas burbujas en un tanque de agua en el que cada burbuja busca su propio nivel. UTILIZACIN EN CADENAS El uso ms comn de un array unidimensional en C es la cadena. C no tiene incorporado un tipo de datos de cadena sino que soporta cadenas utilizando arrays unidimensionales de caracteres. Una cadena se define como un array de caracteres con un carcter de terminacin nulo (\0). El hecho de que la cadena deba terminar en un carcter nulo significa que para declarar un array de caracteres, es necesario que sea de un carcter ms que la cadena ms larga que tenga que contener para dejar sitio al carcter nulo. En una constante de cadena, el compilador pone automticamente un carcter nulo de terminacin. Para leer una cadena es necesario utilizar la funcin gets() con el archivo de cadena stdio.h. Para utilizar gets(), se le llama utilizando un array de caracteres sin ningn ndice. La funcin gets lee caracteres hasta que se pulsa intro. El retorno de carro no se almacena pero lo reemplaza por un carcter nulo que termina la cadena. Ej: Programa que lee y escribe una cadena introducida por teclado. #include<stdio.h> #include<conio.h> main() { char str[80]; int i; printf(Introduzca cadena (mximo 80 caracteres)\n); gets(str); for(i=0;str[i];i++){ printf(%c, str[i]); } 45

} Este programa utiliza el hecho de que un carcter nulo es falso, para controlar el bucle que muestra la cadena. La funcin gets no utiliza comprobacin de lmites, por eso el usuario no puede introducir ms caracteres de los que puede contener el array con el que se llama a gets. #include<stdio.h> #include<conio.h> main() { char str[80]; int i; printf(Introduzca cadena (mximo 80 caracteres)\n); gets(str); printf(str); } Dado que el primer argumento para printf es una cadena, simplemente se utiliza str, sin ningn ndice, como el primer argumento para printf. Si se quisiera mostrar una nueva lnea, se mostrara str as: printf(/%s\n, str); Este mtodso utiliza el especificador de formato %s seguido del carcter de nueva lnea y utiliza el array como segundo argumento para que concuerde con el especificador %s. La biblioteca de C suministra muchas funciones relacionadas con cadenas, las cuatro ms importantes son: strcpy(), strcmp(), strcat(), strlen(). strcpy(hacia, desde); ! Copia el contenido del `desde' en `hacia'. Los contenidos de `desde' no se cambian. Ej: Programa que copia la cadena hola en str y los muestra por pantalla. #include<stdio.h> #include<conio.h> main() {

char str[80];

46

strcpy(str, hola); printf(%s, str);

Esta funcin no realiza comprobacin de lmites, por tanto, debemos asegurarnos de que el arra receptor es lo suficientemente grande para contener lo que est copiando, incluyendo el carcter de terminacin nulo. strcat(hacia, desde); ! Aade los contenidos de ua cadena en otra, esto es, los concatena (concatenacin). Aade los contenidos de `desde' a los contenidos de `hacia'. No realiza comprobacin de lmites. Ej: #include<stdio.h> #include<conio.h> main() {

char str[80]; strcpy(str, hola); strcat(str, ah); printf(str);

Esto se muestra: hola ah strcmp(C1, C2); ! Compara dos cadenas. Devuelve 0 si las cadenas son iguales. Devuleve un valor negativo si C1 es menor que C2. Devuelve positivo si C1 es mayor que C2. Las cadenas se comparan segn el diccionario. La comparacin no se basa en la longitud de la cadena. Esta comparacin es sensible a las maysculas y minsculas, siendo estas ltimas mayores que las maysculas. Ej: Imprimira 0 Printf(%d, strcmp(uno, uno); strlen(str); ! Devuelve la longitud de la cadena de caracteres. No tiene en cuenta el carcter de terminacin nulo. Ej: Programa que pide que se introduzcan dos cadenas y hace una demostracin de las cuatro funciones de cadena con ellas. #include<stdio.h> 47

#include<string.h> main() { char str1[80], str2[80]; int i; printf(Introducir la 1 cadena: ); gets(str1); printf(Introduce la 2 cadena: ); gerts(str2); /*longitud*/ printf(%s es de %d caracteres de largo\n, str1, strlen(str1)); printf(%s es de %d caracteres de largo\n, str2, strlen(str2)); /*comparar*/ i=strcmp(str1, str2); if(!i){ printf(Las cadenas son iguales\n); } else{ if(i<o){ printf(%s es mayor que %s, str1, str2); } else{ printf(%s es mayor que %s, str2, str1); } } /*concatenar*/ if(strlen(str1)+strlen(str2)<80){

48

strcat(str1+str2); printf(%s\n, str1); /*copiar str2 en str1*/ strcpy(str1, str2) printf(%s %s\n, str1, str2); } LIBRERIAS <cpype.h> <locale.h> <math.h> <setjmp.h> <stdarg.h> <stdio.h> <stdlib.h> <string.h> <time.h> <assert.h> <errno.h> <float.h> <limits.h> <signal.h> <stddef.h> para funciones de clasificacin de caracteres. para adaptar distintas convenciones culturales funciones matematicas comunes para ejecutar sentencias goto no locales entre funciones para acceder a listas de argumentos de longitud variable para funciones de entrada y salida vlidas para asignacion de almacenamiento, clasificacion y bsqueda, y varias funciones de conversion para funciones que manipulan cadenas para manejo de la hora y fecha para definir el macro assert que es til para el diagnstico de errores lgicos en el programa para comprobar el valor almacenado en errno por ciertas funciones de librera. Al arrancar el programa el valor almacenado en errno es cero. Las funciones de librera almacenan solo valores mayores que cero en errno. se incluye para determinar varias propiedades de las representaciones de tipo real. para determinar varias propiedades de las representaciones de tipos enteros para especificar cmo maneja seales el programa cuando se ejecuta. Una seal puede informar de algn comportamiento especial dentro del programa, tal como una divisin por cero, o puede informar de algn acontecimiento asncrono fuera del programa tal como una pulsacin de una tecla de atencin interactiva del teclado. Para definir tipos y macros que son de uso general en los programas.

Un uso comn de las cadenas es para implementar una interfaz basada en rdenes. A diferencia de un men que permite que el usuario haga una eleccin, una interfaz basada en rdenes muestra un mensaje indicativo, espera que el usuario introduzca una rden y despues hace lo que le pida la orden. Muchos sistemas operativos utilizan interfaces de linea de orden. En el siguiente ejemplo vamos a utilizar la funcion de biblioteca estandar atoi(); que devuelve un entero equivalente al numero representado en su argumento de cadena. La funcin atio() utiliza el archivo de cabecera <stdlib.h>. Este programa permite que el usuario sume, reste, multiplique o divida pero sn utilizar men. En lugar de eso, utiliza una interfaz de linea de orden. 49

#include<stdio.h> #include<stdlib.h> #include<string.h> main() { char com[80], temp[80]; int i, j; for( ; ; ){ printf(\nOperacin?); gets(com); if(!strcmp(com, salir)){ break; } printf(\nIntroduce el primer numero: ); gets(temp); i=atoi(temp); printf(\nIntroduce el segundo numero: ); gets(temp); j=atoi(temp); if(!strcmp(com, sumar)){ printf(%d, i+j); } else{ if(!strcmp(com, restar)){ printf(%d, ij); }

50

else{ if(!strcmp(com, dividir){ if(j<0){ printf(%d, i/j); } else{ if(!strcmp(com, multiplicar){ printf(%d, i*j); } else{ printf(Orden desconocida); } } } } } } La razn por la que no se utiliza scanf para leer numeros es que es incompatible con gets. Podemos crear una cadena de longitud cero utilizando una sentencia strcpy(str, );. Esta clase de cadena se llama cadena nula, contiene solo un elemento, el carcter de terminacin nulo. 5 1

51

También podría gustarte