Revistas en disco
 Fanzine Nº3 - Enero 1993
Anterior
Menú
Logotipo

Fanzine 3
ÉPOCA II. ENERO 1993

CURSO DE C. CAPITULO III

© Warlord

Bien. En el número anterior vimos algunas sentencias de entrada y salida de datos, así como la orden if-else. Veamos hoy, algunas similares.

Empecemos con la orden SWITCH. Veamos un ejemplo:

menu()
{
 char ch;
 printf("1. Para ir al menu de juegos\n");
 printf("2. Para ir al menu de utilidades\n");
 printf("1. Para ir al menu de demos\n");
 printf("Pulsa cualquier tecla"\n);
 ch=getchar();
 switch(ch){
  case '1':
    ......
    ......
    break;
  case '2':
    ......
    break;
  case '3':
    ......
    break;
  default:
    printf("entrada incorrecta\n");
 }
}

Creo que se entiende. El ordenador comprueba la variable dada (que no tiene por qué ser carácter) y comprueba si está en la lista de los "case"que hemos dado. En caso contrario hace default (no necesario). Como veis, cada "case" debe llevar un break al final que le diga que ha acabado.

Otro comando similar es el WHILE. Su estructura es:

while (condición) sentencia;

main()
{
 char ch;
 printf("dame tu nombre\n");
 while(ch!='pepe') ch=getchar();
}

Otro similar es DO/WHILE. Su estructura es:

do {
sentencia;
}while (condicion);

Veamos el ejemplo anterior con do/while:

menu()
{
 char ch;
 printf("1. Para ir al menu de juegos\n");
 printf("2. Para ir al menu de utilidades\n");
 printf("1. Para ir al menu de demos\n");
 printf("Pulsa cualquier tecla"\n);
 do{
  ch=getchar();
  switch(ch){
   case '1':
    ......
    ......
    break;
   case '2':
    ......
    break;
   case '3':
    ......
    break;
   default:
    printf("entrada incorrecta\n");
  }
 }while(ch!='1' && ch!='2' && ch!='3');
}

Podéis observar que en todos estos ejemplos hemos utilizado el comando "Break". Este simplemente fuerza a que el programa continúe en la siguiente sentencia. Una orden similar es la de "continue", aunque en vez de forzar a que continúe, lo que hace es que se salta todas las órdenes que le sigan hasta que termine la iteració. Un "poné":

Este programa sólo mostrará los números pares:

main()
{
 int x;
 for (x=0;x<100;x++){
  if (x%2) continue; /*esto es, si la  parte entera de x/2 no es cero, con
                       lo cual el número no  será par, ejecuta "continue".
                       esto hace que se salte la línea  siguiente y pase a
                       la siguiente iteración*/
  printf("%d",x);
  }
} 

En los casos de los bucles "while" y "do/while", una sentencia continue provoca que el programa salte directamente a la parte condicional y después continúe el proceso del bucle.

Una orden que creo aún no he comentado es el "goto". En todos lados te recomiendan que no lo utilices. La razón es sencilla. El C se estructuró de modo que fuera innecesario el uso de esta orden. Sin embargo, se incluyó como "reminiscencia" de otros lenguajes de su época. Así pues, nunca debe utilizarse, salvo en casos excepcionales, como puede ser para salir de un bucle.

De todos formas, su utilización es así:

x=1;
bucle:
 x++;
 if(xz100) goto bucle: 

fácil, ¿no?.


ARRAYS Y CADENAS:

Como creo sabéis, un array es simplemente un conjunto de caracteres alfanuméricos, es decir en un programa se definen así: tipo nombrevar[tamaño]. Un ejemplo concreto sería:

int ejemplo[10]

¡y siempre comienzan en el 0!, es decir, el anterior tendría 11 elementos. Es muy útil saber cuanta memoria nos va a ocupar un array de este tipo. Para hallarla se utiliza la orden:

bytes_totales=sizeof(tipo)*longitud

En el ejemplo anterior, sería:

tamaño=sizeof(int)*11

Hay que tener mucho cuidado con este tipo de estructuras. A veces, definimos un array con 10 elementos y descuidadamente podemos querer meter hasta 100. Es decir, que si por error escribiéramos:

main()
{
 int datos[10],i;
 for (i=0;i<100) datos[i]=o;
} 

Evidentemente, está mal. Y no existe datos[i] cuando i>10. Lo peor del tema es que el programa no te dará ningún tipo de error (ni al compilar ni al ejecutar, así que cuidado con lo que haces. ¿ok?.

Un caso particular son los arrays de caracteres, que se denominan "cadenas" Hay muchos comandos que actúan sobre las cadenas. Simplemente, voy a enumerar algunos:

gets(nombre del array): Lee una cadena desde el teclado

strcopy(a,b): copia el contenido de la cadena a en la b.

strcat(a,b): AÑADE b al final de a

strcmp(a,b). Comprueba las dos cadenas y devuelve 0 si son iguales. Devolverá un numero positivo si a es mayor que b o negativo en caso contrario. Pero ojo, cuando digo mayor o menor, al estar tratando con caracteres, me refiero al orden lexicográfico.

strlen(a): devuelve la longitud de la cadena a

topupper(s[i]):Devuelve el carácter guardado en la posición i pero en mayúsculas.

tolower(s[i]): Ídem pero en minúsculas.

Un caso más complicado de arrays, son los bidimensionales. Se definen así:

tipo nombre[tam1][tam2];

ejemplo:

int t,i,num[3][4];
char nombre_apellidos[20][30]; 

En el caso de que sean cadenas (ie, arrays de caracteres), podemos usar las órdenes anteriores, pero eso sí, sólo pueden manejarse líneas. Por ejemplo, podríamos hacer esto:

gets nombre_apellidos[2];

pero no:

gets nombre_apellidos[2][3];

En realidad, podemos formar arrays de la dimensión que queramos:

tipo nombre[tamaño1][tamaño2].....[tamaño n];

Los arrays se pueden inicializar, además de como vimos antes, de otras formas curiosas. Así:

int i[10]={0,1,2,3,4,5,6,7,8,9,10};
char str[5]="hola";
char str[]="hola"; 

Para finalizar por hoy, voy a recordaros algo de lo que dije en el primer capítulo sobre punteros, aunque algo ampliado.


PUNTEROS:

Os recuerdo que los operadores punteros eran 2:

& : Devuelve la dirección de memoria de la variable que le sigue. Así, si escribimos dira=&a, pone la dirección de memoria utilizada por la variable a en dira
* : Devuelve el valor de la variable situada en la dirección que sigue. Si escribimos val=*dira, pondrá la dirección de a en val.

Como ya dijimos, los punteros se definían así:

tipo *nombre variable;

Podemos asignar punteros a punteros e incluso sumar enteros a punteros, (como p1=p1+9)

Como ya hemos hablado de "arrays", también podemos crear punteros a arrays, así:

ejemplo:

char str[80],*p1;
p1=str; 

Esto pone en p1 la dirección del primer elemento de str. Así, si quisiéramos acceder a str[4], tendríamos que hacerlo mediante *(p1+4).

En el siguiente capítulo, profundizaremos mas sobre el tema. ¡hasta pronto!


Envía esta página web a un amigo:
Esta opción está desactivada temporalmente, rogamos disculpen las molestias

Volver a la página anterior

Al menú principal