turbo c

Upload: alejandro-huarachi-tito

Post on 05-Nov-2015

12 views

Category:

Documents


0 download

DESCRIPTION

Turbo c

TRANSCRIPT

Turbo C++

Turbo C++

Luis Arias Hidalgo

IDAT

SEPARATA TURBO C

1.- Ubicacin del Turbo C.-

2.- Uso del Turbo C

3.- Teclas de Funcion:

4.- Estructura de un Programa en C++.-

5.- Tipos de datos

6.- Libreras y funciones . -

sentencia PRINTF.-

Sentencia SCANF.-

CLRSCR()

GETCH()

7.- Algunas diferencias entre compiladores.

8.- Operadores Aritmticos, de Asignacin, relacionales y Lgicos

9.- constantes

10.- Sentencias Condicionales .-

if

doble if

switch

11.- Bucles .

Sentencia FOR (PARA HASTA)

Sentencia WHILE y DO WHILE (HACER MIENTRAS)

1.- Ubicacin del Turbo C.- El archivo que ejecuta el Turbo C se llama TC.EXE esta dentro de la carpeta BIN y esta carpeta esta dentro de la carpeta TC que a la vez se encuentra a la unidad C:

Ademas debemos de tener en cuenta que debe haber una carpeta llamada TMP que debe encontrase tambien en la unidad C:

El lenguaje C se conoce como un lenguaje compilado. Existen dos tipos de lenguaje: interpretados y compilados. Los interpretados son aquellos que necesitan del cdigo fuente para funcionar (P.ej: Basic). Los compilados convierten el cdigo fuente en un fichero objeto y ste en un fichero ejecutable. Este es el caso del lenguaje C.Es un lenguaje estructurado, ya que permite crear procedimientos en bloques dentro de otros procedimientos. Hay que destacar que el C es un lenguaje portable, ya que permite utilizar el mismo cdigo en diferentes equipos y sistemas informticos: el lenguaje es independiente de la arquitectura de cualquier mquina en particular.Por ltimo solo queda decir que el C es un lenguaje relativamente pequeo; se puede describir en poco espacio y aprender rpidamente.

2.- Uso del Turbo C

Cuando hacemos doble clic en el archivo TC.EXE o accedemos a un acceso directo nos saldr esta pantalla que es en la cual vamos a poder programar.

3.- Teclas de Funcion:1.- Para maximizar la pantalla se presiona la tecla ALT+Enter

2.- Para acceder a cualquiera de las opciones del menu se presiona la tecla ALT + la letra que esta de color amarillo.

Ejemplo: Si queremos ir a la opcin FILE presionamos ALT + F

Nota: El mouse no se emplea mucho en este programa.

3.- ABRIR UN ARCHIVO.- presionamos la tecla ALT + F luego escogemos la opcin

OPEN Por ejemplo aqu se ha puesto la unidad C y en la parte inferior saldr los archivos que estan dentro de C.

4.- NUEVO ARCHIVO.- se presiona la tecla ALT + F luego se escoge NEW

5.- GRABAR UN ARCHIVO.-

Se presiona la tecla ALT + F luego se escoge la opcin Save y se pone la ruta donde se va a grabar por ejemplo aqu se va a grabar en la unidad A en una carpeta llamada carpeta y el archivo se va a llamar EJER1.C

Nota: Los archivo solo pueden tener como mximo 8 caracteres para su nombre y la extensin debe ser .C

6.- CERRAR UNA VENTANA.- Se presiona la tecla ALT + F3

7.- PARA EJECUTAR UN PROGRAMA .- Se presiona la tecla CTRL. + F9

8.- SALIR.- Se presiona la tecla ALT + X

4.- Estructura de un Programa en C++.-

Todo programa en C consta de una o ms funciones, una de las cuales se llama main. El programa comienza en la funcin main, desde la cual es posible llamar a otras funciones. Para poder llamar a esas funciones primero se debe llamar a la librera que posee dichas funciones.

En C

Inclusin de Libreras

Declaracin de Variables

void main( ) {

Bloque

}

En Pseudocodigo

Entorno

Declaracin de Variables

Inicio

Bloque

fin

En otras palabras todo lo que programaremos ser dentro del main()

MUY IMPORTANTE: Toda instruccin lleva punto y coma(;) Al final.

Cuando se abre una llave ({) quiere decir que se van a ejecutar una serie de sentencias hasta cuando se cierre la llave(})

Las palabras reservadas se escriben tal como son es decir no es lo mismo escribir main() que MAIN() o que Main() son sensibles a las maysculas y minsculas. Casi todas las palabras se escriben en minsculas.

No olvidar que las funciones siempre devuelven un valor si en caso queremos que no devuelva nada se escribe la palabra reservada VOID o simplemente no se pone nada

Si el teclado no esta configurado debemos configurarlo en el panel de control, teclado, idiomas y escogemos espaol-Per5.- Tipos de datos

En 'C' existen bsicamente cuatro tipos de datos, aunque como se ver despus, podremos definir nuestros propios tipos de datos a partir de estos cuatro. A continuacin se detalla su nombre, el tamao que ocupa en memoria

TIPO

Tamao

char

1 byte

int

2 bytes

float

4 bytes

double

8 bytes

Ejemplo:

int num1=4,num2,num3=6;//Aqu se declara 3 variables de tipo int y la variable num1 y num3 se le esta dando un valor.

char nombre[30];//Aqu se declara una variable de tipo char en la cual se podra guardar una cadena de 30 caracteres

char sexo;//Se podra guardar un caracter

float suel;//Se podra guerdar un entero con decimales6.- Libreras y funciones . - Llamadas tambin ficheros de cabecera son archivos a los cuales se les debe hacer referencia antes de empezar a programar ya que estas contendrn las diferentes funciones que utilizaremos al programar estos archivos tienen extensin H.

Para declarar una librera es de la siguiente forma:

# include iostream.hEn este ejemplo s esta llamando a la librera iostream.h. Tambin se puede poner en ves de las comillas los signos < y > es decir #include

Principales libreras con sus principales Funciones:stdio.h

printf Escribe en la pantallaSintaxis: printf(formato, arg1,...);scanf Lee datos del teclado Sintaxis: scanf(formato, arg1,...);puts Escribe una cadena y salto de lnea.Sintaxis: puts(cadena);gets Lee una cadenaSintaxis: gets(cadena); y otras mas

conio.h

clrscr Borra la pantalla.Sintaxis: clrscr( );gotoxy Cambia la posicin del cursor a las coordenadas indicadas. Sintaxis: gotoxy(columna , fila);textcolor Selecciona el color de texto (0 - 15) Sintaxis: textcolor(2);

string.h

strlen Calcula la longitud de una cadena.Sintaxis: longitud=strlen(cadena);strcpy Copia el contenido de una cadena sobre otra.Sintaxis: strcpy(copia , original);strcat Concatena dos cadenas.Sintaxis: strcat(cadena1 , cadena2);strcmp Compara el contenido de dos cadenas. Si cadena1 < cadena2 retorna un nmero negativo. Si cadena1 > cadena2, un numero positivo, y si cadena1 es igual que cadena2 retorna 0 ( o NULL ).

Sintaxis: valor=strcmp(cadena1 , cadena2);MUY IMPORTANTE: en este caso vamos a utilizar funciones como PRINTF, SCANF y para eso se debe hacer referencia a la librera que contiene dichas funciones en este caso (STDIO.H), tambien utilizaremos funciones como GETCH y CLRSCR y estas estan contenidas por la librera CONIO.H.

No olvidar que todo es con minusculas

Sentencia PRINTF.-

La rutina printf permite la aparicin de valores numricos, caracteres y cadenas de texto por pantalla.

La sentencia printf maneja los sgtes caracteres especiales que se conocen como secuencia de escape.

A continuacin vemos una tabla de las ms significativas:

\nsalto de lnea

\ttabulacin horizontal

\\contrabarra

\fsalto de pgina

\'apstrofe

\"comillas dobles

\0fin de una cadena de caracteres

Ejemplo: printf("Arriba\n \"Peru\" \tcaracho");//el resultado seria:

Arriba

Peru

Caracho

Sentencia SCANF.-

Esta sentencia permite leer un dato desde el teclado

Para lo cual se necesita algunos modificadores que debemos de tomar en cuenta.

%cUn nico carcter tipo Char

%dUn entero tipo int

%fUn nmero float , double

%sUna cadena de caracteres tipo char

%ldUn Entero largo

%lfUn Float/Double largo

Tanto para imprimir como para leer un dato se debe usar los modificadores que son los arriba mencionados.

NOTA IMPORTANTE : Para leer un dato nmerico siempre debemos anteponer el & antes de la variable asi como tambin si la variable es tipo char para solo un carcter.

Si la variable es de tipo char para varios caracteres no se pone el &

Para visualizar o imprimir no se pone & en ningun tipo de variables

Ejemplo PrintfTurbo C

1.- Visualizar "Hola Mundo"printf("hola Mundo");

2.- Visualizar "Hola "printf("hola \nMundo");

"Mundo"

3.- Visualizar "El sueldo de ana es 150"printf("El sueldo de %s es %d",nom,suel);

Tomando en cuenta que nom="ana" y

suel = 150

Ejemplo ScanfTurbo C

1.- Leer una variable de tipo int xscanf("%d",&x);

2.- Leer las sgtes. variables

int a;scanf("%d",&a);

float b;scanf("%f",&b);

char catscanf("%c",&cat);

char nom[10]scanf("%s",nom);

int long num;scanf("%ld",&num);

float long num;scanf("%lf",&num);

CLRSCR() .- Esta funcin nos permite limpiar la pantalla en el caso de Turbo C es necesario poner esta funcin ya que sin ella saldran datos anteriormente ingresados.

GETCH() .- Esta Funcin permite retener la pantalla hasta que se presione alguna tecla.

Esta funcin es esencial en Turbo C ya que el compilador ejecuta linea por linea de una manera tan rapida que el resultado se muestra por pantalla e inmediatamente termina el programa.

Es por eso que se debe retener la pantalla antes de terminar el programa.

Para GETCH y CLRSCR() se necesita la librera CONIO.H7.- Algunas diferencias entre compiladores.

La programacin en turbo C es la misma a la de Borland C habiendo algunas de las siguientes diferencias:

8.- Operadores Aritmticos, de Asignacin, relacionales y Lgicos

Operadores Aritmticos .-Existen dos tipos de operadores aritmticos:Los binarios:

+Suma

-Resta

*Multiplicacin

/Divisin

%Mdulo (resto)

Ejemplo

z = b + c;

z va a ser igual a b mas c

z = b % c;

z va a ser igual a b mod de c

y los unarios:

++Incremento (suma 1)

- -Decremento (resta 1)

Ejemplo:

a++;

aqu la variable a se esta incrementando en 1 es lo mismo que decir a = a + 1,lo ,mismo sucede para decrementar una variable seria a--; aqu la variable a se esta disminuyendo en 1 que es lo mismo que decir a= a 1;

Operadores de Asignacin .-

=Asignacin simple

+=Suma

-=Resta

*=Multiplicacin

/=Divisin

%=Mdulo (resto)

Con estos operadores se pueden escribir, de forma ms breve, expresiones del tipo:

n=n+3 se puede escribir n+=3

k=k*(x-2) lo podemos sustituir por k*=x-2

x =x/3 se puede escribir x/=3

Operadores relacionales .-

Los operadores relacionales se utilizan para comparar el contenido de dos variables.En C existen seis operadores relacionales bsicos:

>Mayor que

=Mayor o igual que

n2 && n1>n3){

mayor = n1;

}

if(n2>n1 && n2>n3){

mayor = n2;

}

if(n3>n1 && n3>n1){

mayor = n3;

}

printf("El mayor es %d",mayor);

getch();

}

NOTA: && siginifica Y y || significa o.

DOBLE IFTambien se puede aplicar el doble IF

Ejemplo:

a=10,b=20;

ma=(a>b)?a:b;//aqu se esta preguntando si a es mayor que b en la variable ma se guarda la variable a si no se guarda la variable b.

Sentencia SWITCH (EN CASO)

switch (variable){

case contenido_variable1:

sentencias;

break;

case contenido_variable2:

sentencias;

break;

default:

sentencias;

}

Cada case puede incluir una o ms sentencias sin necesidad de ir entre llaves, ya que se ejecutan todas hasta que se encuentra la sentencia BREAK la variable evaluada slo puede ser de tipo entero o caracter. default ejecutar las sentencias que incluya, en caso de que la opcin escogida no exista.

Ejemplo1: Ingrese un nmero del 1 al 7 y visualize que da es.

#include stdio.h

void main(){

int dia;

clrscr(); printf("Introduce el da: ");scanf(%d,&dia);

switch(dia){

case 1: printf("Lunes"); break;

case 2: printf("Martes"); break;

case 3: printf("Mircoles"); break;

case 4: printf("Jueves"); break;

case 5: printf("Viernes"); break;

case 6: printf("Sbado"); break;

case 7: printf("Domingo"); break;

default : printf("El da no existe); break;

}

getch();

}

11.- Bucles .

Sentencia FOR (PARA HASTA)

FOR (Para Hasta)Su sintaxis es:

for (inicializacin;condicin;incremento o decremento){

sentencia1;

sentencia2;

}

El FOR necesita una variable que controle las vueltas que se da

Esta variable guardara el inicio, la condicin y el incremento o decremento.

Ejemplo 1:

For(i=0;i");

}while(toupper(getch())!='N');

}

13.- Funcion Random.-

random Retorna un valor aleatorio entre 0 y num-1.se necesita de la librera STDLIB.HSintaxis: valor=random(num); /* Tambin necesitamos la funcin randomize */

Ejemplo: n =random(10)+1;//Un numero aleatorio del 1 al 10

N=random(6)+1; // numero aleatorio del 1 al 6randomize Inicializa el generador de nmeros aleatorios. Deberemos llamarlo al inicio de la funcin en que utilicemos el random. Tambin deberemos utilizar el include time.h, ya que randomize hace una llamada a la funcin time, includa en este ltimo archivo.Sintaxis: randomize( );Ejemplo: Tener un vector de 10 elementos y luego llenarlo con numeros aleatorios del 1 al 10

#include "stdio.h"

#include "stdlib.h" //Para el random

#include "conio.h"

#include "time.h"//Para el randomize

#define n 10

int i,num[n]={1,2,3,4,5,6,7,8,9,10};

void listar(){

for(i=1;isig;

free(AUX);

Para visualizar la cola comprobaremos que existan elementos, esto es, que FIN sea distinto de NULL. Hecho esto asignaremos a AUX la direccin de CAB e iremos recorriendo la cola hasta que AUX sea igual a NULL.

AUX=CAB; /* Deberemos controlar que no est vaca: if (CAB==NULL) return; */

while(AUX!=NULL)

{

printf("%s",AUX->nombre);

AUX=AUX->sig;

}

Estructura grfica de una cola:

Las listas

Este tipo de estructuras se caracteriza porque los elementos estn enlazados entre s, de manera que adems de las acciones habituales de insertar, extraer y visualizar tambin podremos buscar un elemento. Para gestionar la lista utilizaremos 4 punteros.

/* Ejemplo de una lista. */

#include

#include

#include

#include

void insertar(void);

void extraer(void);

void visualizar(void);

struct lista

{

int num;

struct lista *sig;

}*CAB=NULL,*AUX=NULL,*F=NULL,*P=NULL;

main() /* Rellenar, extraer y visualizar */

{

char opc;

do

{

clrscr( );

gotoxy(30,8);

printf("1.- Insertar");

gotoxy(30,10);

printf("2.- Extraer");

gotoxy(30,12);

printf("3.- Visualizar la lista");

gotoxy(30,14);

printf("4.- Salir");

opc=getch( );

switch(opc)

{

case '1':

insertar( );

break;

case '2':

extraer( );

break;

case '3':

visualizar( );

}

}while (opc!='4');

}

/* A continuacin insertaremos el elemento que

vamos a crear en la posicin que le corresponda,

teniendo en cuenta que la lista deber quedar

ordenada de menor a mayor. El puntero P comprueba

si el campo num de un elemento es menor que el

campo num del elemento introducido. El puntero

F se quedar apuntando al elemento de la posicin

anterior al elemento que hemos insertado */

void insertar(void)

{

AUX=(struct lista *)malloc(sizeof(struct lista));

clrscr( );

printf("Introduce un nmero: ");

scanf("%d",&AUX->num);

AUX->sig=NULL;

if (CAB==NULL)

CAB=AUX;

else if (CAB->num > AUX->num)

{

AUX->sig=CAB;

CAB=AUX;

}

else

{

P=F=CAB;

while (P->num < AUX->num && P!=NULL)

{

if (P==CAB) P=P->sig;

else

{

P=P->sig;

F=F->sig;

}

}

AUX->sig=F->sig;

F->sig=AUX;

}

}

void extraer(void)

{

int var;

if (CAB==NULL) return;

clrscr( );

printf("Introduce el nmero a extraer: ");

scanf("%d",&var);

if (CAB->num==var)

{

P=CAB;

CAB=CAB->sig;

free(P);

}

else

{

P=F=CAB;

while (P->num != var && P!=NULL)

{

if (P==CAB) P=P->sig;

else

{

P=P->sig;

F=F->sig;

}

}

if (P==NULL) return;

F->sig=P->sig;

free(P);

}

}

void visualizar(void)

{

if (CAB==NULL) return;

clrscr( );

AUX=CAB;

while (AUX!=NULL)

{

printf("Nmero: %d\n",AUX->num);

AUX=AUX->sig;

}

getch( );

}

Archivo: lista.c

La estructura que utilizaremos ser:

struct lista

{

tipo variables;

struct lista *sig;

}*CAB=NULL,*AUX=NULL,*F=NULL,*P=NULL;

donde tipo variables sern las variables que guardaremos en la estructura, struct lista *sig es un puntero que apunta al elemento de tipo lista introducido a continuacin, *CAB ser donde guardaremos el primer elemento de la lista, *AUX nos servir para guardar elementos temporalmente y para recorrer la lista al visualizarla, *P para comparar los valores introducidos y ordenarlos, y *F, que apuntar al elemento anterior al ltimo introducido.

Antes de insertar un elemento, deberemos comprobar si la lista est vaca o no. Si lo est deberemos insertar el primer elemento:

if (CAB==NULL) CAB=AUX;

Si ya existiera algn elemento haremos que P y F apunten al primero de la lista. Si el elemento introducido fuera menor que el primero de la lista, haramos que el nuevo elemento pasara a ser el primero, y el que hasta ahora era el primero, pasara a ser el segundo.

if (AUX->num < CAB->num){

AUX->sig=CAB;

CAB=AUX;

}

Para extraer un elemento de la lista solicitaremos un nmero, si el nmero introducido se corresponde con el campo num de uno de los elementos, ste ser extrado de la lista. Deberemos controlar que la lista no est vaca y que el elemento con el nmero solicitado exista.

Fjate en el ejemplo, en la funcin extraer. Si CAB es igual a NULL, ser que la lista est vaca, y si P es igual a NULL al salir del while significar que no se ha encontrado ningn elemento que contenga el nmero introducido.

Para visualizar la lista comprobaremos que existan elementos, es decir, que CAB sea distinto de NULL. Hecho esto asignaremos a AUX la direccin de CAB e iremos recorriendo la lista mientras AUX sea distinto de NULL.

if (CAB==NULL) return;

AUX=CAB;

while(AUX!=NULL)

{

printf("%d",AUX->num);

AUX=AUX->sig;

}

Estructura grfica de una lista:

Aqu finaliza el tema de la gestin dinmica de memoria. Es un tema algo complejo hasta que se asimila el concepto y funcionamiento de las diferentes estructuras, pero tras conseguirlo ya no tiene ningn secreto. Si alguna vez no recuerdas su funcionamiento siempre es una buena solucin coger papel y lpiz, dibujar una pila, cola o lista grficamente y simular la introduccin de elementos, escribiendo la situacin de los punteros en cada momento.

Existen otras estructuras, como las listas doblemente enlazadas. La nica diferencia con la lista que conocemos es que en las primeras cada elemento guarda la direccin del anterior y del posterior. Sera una estructura como esta:

struct lista_doble

{

char nombre[20];

struct lista_doble *ant;

struct lista_doble *sig;

};

Su funcionamiento es muy similar al de una lista normal. Puedes intentar hacerla tu mismo.

Otras estructuras, como los rboles son ms complejas y menos utilizadas.

//Lista enlazadas Simples

#include "stdio.h"

#include "conio.h"

#include "ctype.h"

#include "stdlib.h"

struct Nodo //registro Nodo

{int dato; // dato:entero

struct Nodo *sig; // sig:Nodo

}; //fin-registro

int xdato;

struct Nodo *raiz,*nuevo,*ant,*post,*ptr; //raiz,nuevo,ant,post,ptr:Nodo

//Creacion

void Creacion_FIFO()

{clrscr();

printf("Creacion de Nodos FIFO");

raiz=NULL;

do{

printf("\nIngrese Dato:");scanf("%d",&xdato);

nuevo=(struct Nodo *)malloc(sizeof(struct Nodo *)); //crear(Nodo)

nuevo->dato=xdato;

if(raiz==NULL)

raiz=nuevo;

else

ant->sig=nuevo;

ant=nuevo;

nuevo->sig=NULL;

printf("Otro Dato [S]i o [N]o:");

}while(toupper(getch())!='N');

}

void Creacion_LIFO()

{clrscr();

printf("Creacion de Nodos LIFO");

raiz=NULL;

do{

printf("\nIngrese Dato:");scanf("%d",&xdato);

nuevo=(struct Nodo *)malloc(sizeof(struct Nodo *));

nuevo->dato=xdato;

nuevo->sig=raiz;

raiz=nuevo;

printf("Otro Dato [S]i o [N]o:");

}while(toupper(getch())!='N');

}

void Listado()

{clrscr();

printf("\nListado de los Nodos\n");

ptr=raiz;

while(ptr!=NULL)

{printf("%d\t",ptr->dato);

ptr=ptr->sig;

}

printf("\nPresione cualquier tecla para continuar...");

getch();

}

void Eliminacion()

{clrscr();

printf("\nEliminacion de un Nodo");

printf("\nIngrese Dato:");scanf("%d",&xdato);

if(raiz->dato==xdato)

{ptr=raiz;

raiz=ptr->sig;

free(ptr); //liberar(ptr)

}

else

{ptr=raiz;

while(ptr!=NULL && ptr->dato!=xdato)

{ant=ptr;

ptr=ptr->sig;

}

if(ptr->dato==xdato)

{post=ptr->sig;

ant->sig=post;

free(ptr);

}

}

}

void Insercion()

{int pos,c;

clrscr();

printf("Insercion de un Nodo en una posicion dada\n");

do{

printf("Ingrese Dato:");scanf("%d",&xdato);

printf("Ingrese posicion:");scanf("%d",&pos);

nuevo=(struct Nodo *)malloc(sizeof(struct Nodo *));

nuevo->dato=xdato;

if(pos==1)

{nuevo->sig=raiz;

raiz=nuevo;

}

else

{ptr=raiz;

c=1;

while(ptr!=NULL && pos!=c)

{c++; //c=c+1

ant=ptr;

ptr=ptr->sig;

}

if(pos==c)

{ant->sig=nuevo;

nuevo->sig=ptr;

}

}

printf("Otro Dato [S]i o [N]o:");

}while(toupper(getch())!='N');

}

void Ordenamiento()

{int aux;

clrscr();

ptr=raiz;

while(ptr->sig!=NULL)

{post=ptr->sig;

while(post!=NULL)

{if(ptr->dato > post->dato)

{aux=ptr->dato;

ptr->dato=post->dato;

post->dato=aux;

}

post=post->sig;

}

ptr=ptr->sig;

}

printf("\nDatos ordenados...");

printf("\nPresione cualquier tecla para continuar...");

getch();

}

main()

{int opcion;

do{

clrscr();

printf("Menu de Lista Enlazadas\n");

printf("-----------------------\n");

printf("1.- Creacion de FIFO\n");

printf("2.- Creacion de LIFO\n");

printf("3.- Listado\n");

printf("4.- Eliminacion\n");

printf("5.- Insercion\n");

printf("6.- Ordenamiento\n");

printf("7.- Fin de Programa\n");

printf("\nEliga opcion :");scanf("%d",&opcion);

switch(opcion)

{case 1:Creacion_FIFO();break;

case 2:Creacion_LIFO();break;

case 3:Listado();break;

case 4:Eliminacion();break;

case 5:Insercion();break;

case 6:Ordenamiento();break;

}

}while(opcion!=7);

return 0;

}

EMBED Excel.Sheet.8

- 47 -

Por Luis Arias Hidalgo

_1142258846.xlsHoja1

BORLAND CTURBO C

1La pantalla se limpia AutomaticamenteSe tiene que limpiar la pantalla con la funcin CLRSCR();

2La funcion para leer un dato es CIN>>La funcion para leer un dato es SCANF();

3La funcion Para visualizar un dato es COUT