Menú principal

Escuela de C/C++

Publicado por cazador.asesino, Enero 12, 2009, 05:04:06 PM

Tema anterior - Siguiente tema

cazador.asesino

ESCUELA DE C/C++ - 04

ESTRUCTURAS DE CONTROL  WHILE – DO WHILE

WHILE: "Mientras la condición cumpla, hacer: " , Evalúa una condición y si esta cumple, realiza la acción para luego volver a realizar la comprobación y así sucesivamente.

a=0;
while(a<5)
{
   a=a+1;
}

DO WHILE: "Hacer Mientras cumpla la condición" Realiza la acción una vez y de allí procede a verificar una condición, en caso sea verdadera el ciclo prosigue.

int b=0;
do{
b=b+1;
}while(b<5);

Observen el siguiente programa:


#include <stdio.h>

int main()
{
    int a=0;
    while(a<5)
    {
        a=a+1;
        printf("%d",a);
    }

    int b=0;

    do{
        b=b+1;
        printf("%d",b);
    }while(b<5);
}


Al compilar y ejecutar no notaran ninguna diferencia entre el while y do do-while en los resultados, pero en:


#include <stdio.h>

int main()
{
    printf("WHILE:\n");
    int a=5;
    while(a<5)
    {
        a=a+1;
        printf("%d",a);
    }

    printf("\nDO WHILE:\n");
    int b=5;

    do{
        b=b+1;
        printf("%d",b);
    }while(b<5);
}



Al compilar y ejecutar este código, Se observa que el printf dentro del DO – WHILE imprimió un resultado, esto se debe a que el Do-While realiza el proceso por lo menos una vez antes de la comprobación de la condición; Esta es la diferencia entre el While y Do-While.

(Lo vuelvo a colocar porque el anterior se borro :( )
--->   142857   <---

cazador.asesino

ESCUELA DE C/C++ - 05

PROGRAMANDO 01

Ahora que conocemos el manejo de las instrucciones if, if-else, switch, while, do-while y for, mostraré una idea de cómo hacer una aplicación sencilla que halle el factorial de un número ingresado.

1.- Empezamos por:


int main()
{
    //Declaración de variables
    int n,i,f;

    //Inicialización de variables
    n=1;
    i=0;
    f=1;

    //Lectura del número
    printf("Ingrese n: ");
    scanf("%d",&n);

    //Cálculo del factorial
    while(i<n)
    {
        i=i+1;
        f=f*i;
    }

    //Presentación del resultado
    printf("Factorial = %d",f);
}


2.- Vemos que se puede "validar" el ingreso del número para que no acepte negativos, esta validación será realizada con un do-while


int main()
{
    //Declaración de variables
    int n,i,f;

    //Inicialización de variables
    n=1;
    i=0;
    f=1;

    //Lectura del número
    do{
        printf("Ingrese n: ");
        scanf("%d",&n);
    }while(n<0);

    //Cálculo del factorial
    while(i<n)
    {
        i=i+1;
        f=f*i;
    }

    //Presentación del resultado
    printf("Factorial = %d",f);
}


3.- Podemos hacer que el programa no finalice y en vez de ello que nos pregunte si deseamos volver a calcular el factorial de otro número.


#include <stdio.h>

int main()
{
    //Declaración de variables
    int n,i,f;
    char resp;

    do{
        //Inicialización de variables
        n=1;
        i=0;
        f=1;

        //Lectura del número
        do{
            printf("Ingrese n: ");
            scanf("%d",&n);
        }while(n<0);

        //Cálculo del factorial
        while(i<n)
        {
            i=i+1;
            f=f*i;
        }

        //Presentación del resultado
        printf("Factorial = %d",f);
        printf("\n=============================");

        printf("\nDesea continuar? : ");
        fflush( stdin ); //Limpia el buffer del teclado (Utilizado para evitar errores al leer caracteres con el scanf)
        scanf("%c",&resp);
        printf("=============================\n");


    }while(resp=='s'||resp=='S');
}



4.- Esta fue una idea de cómo se va mejorando un programa a través de su programación.

Obs: Solo funciona hasta n=17 debido al tamaño límite de los int

Utilizo el fflush para limpiar el buffer de teclado(stdin), esto se realiza cada vez que use scanf para leer caracteres..

Más sobre el fflush

Más sobre el Buffer de teclado

// Seguiría Funciones, Procedimientos y luego arreglos unidimensionales, matrices, etc (menos mal que tenía una copia xD)

--->   142857   <---

makubex

F U N C I O N E S    Y    P R O C E D I M I E N T O S
Cuando existen partes de código que se repíten muchas veces a lo largo de un programa podemos recurrir a las funciones y los procedimientos.

Función: Es una fórmula o una serie de pasos del cual esperamos un resultado, por ejemplo: A = 5*2, el resultado para A es 10 y la función fue multiplicar 5 por 2.

Procedimiento: Es una serie de pasos establecidos en un orden específico, por ejemplo: El procedimiento para encender un carro: 1. Incerte la llave, 2. Gire la llave. La diferencia con una función es que no es necesario saber cual fue el resultado de la operación, simplemente necesitamos saber que se ejecutaron los pasos.

MUY IMPORTANTE
C y C++ no contienen palabras reservadas para diferenciar a un procedimiento de una función, a diferenca de otros lenguajes como pascal o basic, en nuestro casó sabremos si es función o no si el código devuelve un valor.

Veamos un pequeño ejemplo


#include <stdio.h>

//DECLARAMOS LAS FUNCIONES
void soy_procedimiento();
int soy_funcion();

int main (){
  int a;
  printf("ESTE MENSAJE SALE DE LA FUNCION main \n");
  soy_procedimiento(); //Aqui se manda a llamar a la función
  a = soy_funcion();
  if (a == 1)
     printf("La funcion devolvio: 1");
  return 0;
}

void soy_procedimiento(){
  printf("ESTE MENSAJE SE ENTREGA DESDE UN PROCEDIMIENTO\n");
  //Una funcion de tipo void no requiere return...
}

int soy_funcion(){
  printf("MENSAJE ENTREGADO EXITOSAMENTE DESDE UNA FUNCION\n");
  return 1;
  //Si una funcion no es de tipo void necesita una instruccion return que devuelva un valor del tipo especificado, en este caso un entero.
}



Finalmente notemos algunas cosas:
1. La declaración de una función debe ir en el area de declaraciones.
2. El desarrollo de la función puede ir inmediatamente despues de su declaración o despues del main sin importar el orden.
3. las funciones se declaran fuera del bloque principal del programa.

Aun debemos aclarar algunos aspectos como PARAMETROS DE UNA FUNCIÓN (Por valor o por referencia), Alcance de variables (Globales o locales), Polimorfismo (sólo en C++), Recursividad y otras yerbas ;)....

Saludos...
#apt-get moo
         (__)
         (oo)
   /------\/
  / |    ||  
*  /\---/\
    ~~   ~~  
...."Have you mooed today?"...

Software Libre para una Sociedad Libre

cazador.asesino

#243
ESCUELA DE C/C++ - 06

PROCEDIMIENTOS Y FUNCIONES

Algunos conceptos importantes:

Funciones: Son subprogramas que retornan un valor, por ejemplo: Una función que calcule la suma de dos números y nos devuelva un entero.

Procedimientos:
Son subprogramas que realiza una acción sin devolver un tipo de dato específico; por ejemplo: Un procedimiento que ordena un arreglo de vectores o sitúa el cursor en una coordenada determinada.

Recursividad:
Se llama así a la situación en la que una función se llama a si misma una y otra vez, como se verá con ejemplos (Calculo de la sucesión de Fibonacci)

Argumentos: Se llama así a los valores de ingreso de una función.

Valor Semilla:
Valores iniciales es una recursión, por ejemplo en la sucesión de Fibonacci el valor de 1 es el valor semilla. (1, 1, 2, 3, 5...)

Sintaxis:


Tipo_dato nombre_de_función (argumentos);

int main ()
{
...
}
Tipo_dato nombre_de_función (argumentos)
{
 //Función
}


Ejemplo 01: Función que calcula la suma de dos números ingresados:


#include <stdlib.h>
#include <iostream.h>

float suma(float a,float b);

int main()
{
   float num1=3.2,num2=1.5,sum;

   sum=suma(num1,num2); //los argumentos son sum1 y sum2

   cout<<num1<<" + "<<num2<<" = "<<sum<<endl;

   system("pause");
   return 0;
}

float suma(float a,float b)
{
   float s;
   s= a+b;
   return s;
}


Ejemplo 02: Uso de un procedimiento para implementar un menú de opciones

// Aplicación que muestra el uso de un menú

#include <iostream.h>
#include <conio.h>

void menu();

int main()
{
   while(1) // El 1 equivale a verdadero (bucle infinito)
   {
       menu(); //Llamada al procedimiento menú
   }
}

void menu()
{
   int op;

   do{
       system("cls"); //Limpia la pantalla
       cout<<"\n\t\tMenu Principal";
       cout<<"\n\t\t==== =========";
       cout<<"\n";
       cout<<"\n\t 1.- Opcion1";
       cout<<"\n\t 2.- Opcion2";
       cout<<"\n\n\t 0.- Salir";

       cout<<"\n\n\tIngrese su opcion: ";
       cin>>op; //Lectura de la opción

       switch(op)
       {
           case 0:
                   getch();
                   exit(0); //exit finaliza el programa
                   break;
           case 1:
                   system("cls");
                   cout<<"\n\tMenu 1"<<endl;
                   getch();//Espera la lectura de un carácter
                   break;
           case 2:
                   system("cls");
                   cout<<"\n\tMenu 2"<<endl;
                   getch(); //Usado para pausar la aplicación
                   break;
           case 3: //En cada "case" se va colocando los
                   //procedimientos a llamar
                   break;
       }
   }while(op<0||op>3); //pedir opción mientras no esté en el rango
}


Ejemplo 03: Sucesión de Fibonacci de manera Recursiva

#include <iostream.h>
#include <conio.h>

int fibonacci(int n);

int main()
{
   int i;
   //Mostramos los 1ros 10 primeros elementos

   for(i=0;i<10;i++)
   {
       cout<<fibonacci(i)<<" ; ";
   }
   getch();
}

int fibonacci(int n)
{
   if(n==0 || n==1)
       return(1);
   else
       return(fibonacci(n-1)+fibonacci(n-2));
}
--->   142857   <---

makubex

BLOQUES DE CÓDIGO

Si bien este tema no va aquí es posible que algunos todavia tengan dudas de como funcionan las llaves, por ejemplo, muchos programan así:
if (a>0){
  cout<<"A ES MAYOR QUE CERO";
}

Realmente es correcto pero no es un código de lo más estético. Para que sea elegante basta con:
if (a>0)
  cout<<"A ES MAYOR QUE CERO";

Y la diferencia para los que no son observadores es que NO HAY LLAVES. Y entonces para que sirven las llaves?
Bueno las llaves definen donde empieza un bloque de código, y las más comunes son en el bloque principal del programa llamado MAIN
main{ //aqui empieza el bloque....
  //aqui va el cuerpo del programa
}//aqui termina el bloque

Ahora bien: ¿Cuando debe ser usado en otras estructuras?
La mayoría de las estructuras de control ejecutan la siguiente instrucción despues de ellas (solamente una instrucción):
for (x=0; x<5; x++)
  cout<<"Se repite 5 veces\n";

Se repite 5 veces
Se repite 5 veces
Se repite 5 veces
Se repite 5 veces
Se repite 5 veces
Si deseamos que se ejecute más de una instrucción necesitamos declarar un bloque de código:
for (x=0; x<3; x++){//INICIA BLOQUE DE CODIGO
  cout<<"Se repite 3 veces\n";
  cout<<"Esta linea tambien\n";
}//TERMINA BLOQUE DE CODIGO

Se repite 3 veces
esta linea tambien
Se repite 3 veces
esta linea tambien
Se repite 3 veces
esta linea tambien

Si omitieramos las llaves el resultado seria este
for (x=0; x<3; x++) //SIN LLAVES
  cout<<"Se repite 3 veces\n";
  cout<<"Esta linea tambien\n";

Se repite 3 veces
Se repite 3 veces
Se repite 3 veces
Esta linea tambien

¿Porque razón la ultima linea se imprimió solo una vez? Porque solo la instrucción siguiente al for forma parte del bucle, la seguna ya no queda dentro del bucle y por tanto solo se ejecuta una vez...

Otro ejemplo:
if (edad<18)
  cout<<"MENOR DE EDAD";//Solo se ejecuta esta linea
else{// inicio del bloque else
  cout <<"Lo siento aun no puedes votar\n";
  cout <<"regresa cuando tengas 18";
}// fin del bloque else


Un ejemplo final (estudiar detenidamente):

#include <iostream>
using namespace std;

int main (){
  int a, b;
  a = 1;
  b = 2;

  if (a > 0){
    if (b >0)
      cout<<"NO HAY CERO NI NEGATIVOS\n";
  }// Esta llave pertenece a la comparacion a>0
  else
    cout<<"A es igual o menor a cero\n";
  cout<<"ESTO ESTA FUERA DE TODOS LOS IFs\n";

  return 0;
}


Es un tema bastante interezante pero que muchos dejan pasar por alto y prefieren lo fácil: usar siempre llaves, sin embargo busquemos que nuestro código sea limpio y elegante...

Saludos
#apt-get moo
         (__)
         (oo)
   /------\/
  / |    ||  
*  /\---/\
    ~~   ~~  
...."Have you mooed today?"...

Software Libre para una Sociedad Libre

iliil DJMÄSTËR liili

@-@¬ nu entiendo mi mais.. aparte me da weba leer... looool


saludos.. me retiro..



cazador.asesino

ESCUELA DE C/C++ - 06b


Paso de parámetros

El proceso de envió y recepción de datos y de resultados mediante variables se denomina  pase de parámetros. El pase de parámetros puede realizar de dos maneras, pase por valor y por referencia:

Por valor: Es la manera de suministrar datos de entrada al subprograma.  Un parámetro actual pasado por valor  contiene el dato de entrada  para el subprograma,  esta variable no puede ser modificada por el subprograma  que copia su valor al parámetro formal correspondiente para poder utilizarlo. Desde el punto físico, en el paso por valor no se proporciona  la variable al programa, sino solamente su contenido, evitando así su modificación.

Ejemplo 01:


/*A pesar de que la variable "a" es modificada dentro del subprograma, fuera de el permanece igual.*/

#include <iostream.h>   // Uso de cout
#include <stdlib.h>     // Uso de system

void numeromasuno(int a);

int main()
{
    int n=5;
    numeromasuno(n);
    cout<<n;
    system("pause >nul");//Pausa sin mostrar el Texto: "Presione una tecla para continuar"
}

void numeromasuno(int a)
{
    a=a+1;
}


Ejemplo 02:

#include <iostream.h>   // Uso de cin y cout
#include <stdlib.h>     // Uso de system

int base8(int num); //Función de  conversión a base 8

int main()
{

    int num;
    cout<<"Ingrese un número: ";
    cin>>num;
    if(num>=0)
        cout<<base8(num)<<" es "<<num<<" en base 8"; //base8() llama a nuestra funcion
    else
        cout<<"Numero negativo";
    system("pause >nul");
}

int base8(int n)
{
    int i=1,num8=0;

    do{
      num8=num8 + (n%8)*i;
      i=i*10;
      n=n/8;
    }while(n>0);

    return(num8);
}


Por referencia: Es la manera  de suministrar  datos de salida o de  entrada y salida al subprograma. Un parámetro actual pasado por referencia es una variable del programa o subprograma llamante, que PUEDE CONTENER o NO datos para el subprograma llamado quien debe colocar el resultado en esa variable. Dicha variable queda a disposición del programa llamante una vez concluida la ejecución del subprograma. Desde el punto físico, en el paso por referencia   se proporciona la dirección o referencia de la variable, por  lo que el programa lo utiliza como propia, modificándolo si es necesario para depositar en ella los resultados.

Ejemplo 03:


/* Se observa que el parámetro formal cambia su valor
*/
#include <iostream.h>   // Uso de cout
#include <stdlib.h>     // Uso de system

void numeromasuno(int *a);

int main()
{
    int n=5;
    numeromasuno(&n);
    cout<<n;
    system("pause >nul");//Pausa sin mostrar el Texto: "Presione una tecla para continuar"
}

void numeromasuno(int *a)
{
    *a=*a+1;
}


Ejemplo 04:

#include <stdio.h>   // Uso de cout
#include <stdlib.h>     // Uso de system

void  Ordenar (int  *x, int *y) ;

int main( )
{
    int Num1, Num2, Num3, Temp;
    scanf("%d %d %d",&Num1,&Num2,&Num3);
   
    Ordenar(&Num1, &Num2);
    printf("\nNum1: %d Num2: %d Num3: %d", Num1, Num2, Num3);
   
    Ordenar(&Num1, &Num3);
    printf("\nNum1: %d Num2: %d Num3: %d", Num1, Num2, Num3);
   
    Ordenar(&Num2, &Num3);
    printf("\nNum1: %d Num2: %d Num3: %d", Num1, Num2, Num3);
   
    system("pause >nul");
}

void  Ordenar (int  *x, int *y)
{
    int Aux;
    if(*x > *y)
    {
        Aux = *x ;
        *x  = *y;
        *y  = Aux;
    }
}


En conclusión: La diferencia entre estos dos tipos de pasos de parámetros radica en que el paso por "valor" los parámetros formales quedan invariantes al finalizar el subprograma, mientras que el paso por "referencia" puede modificar estos valores.

Obs: Muy buena la aclaración que hace makubex sobre "Bloques de código", yo usaba las llaves siempre, para evitar confusiones a la hora de leer el codigo, ya que en algunos foros, me fallaban las tabulaciones. (A mi parecer, mejor es usar tabulaciones - al igual que en Python-)

Continua: Arreglos unidimensionales, matrices, ...
--->   142857   <---

cazador.asesino

ESCUELA DE C/C++ - 07a

VECTORES- MATRICES – ARREGLOS MULTIDIMENSIONALES

Vectores – Arreglos Unidimensionales - Arrays

Se podrían definir como un conjunto de "i" valores ordenados por índices, donde al primer elemento le corresponde el índice "0" y al último le corresponde el índice "i-1".

Por ejemplo: Un vector "N" con las notas de 5 alumnos:

N[0] : 12
N[1]: 16
N[2]: 20
N[3]: 8
N[4]: 12

N: {12, 16, 20, 8, 12}

* Declaración de variable:

Tipo_dato Vector[n]; //n es el número de elementos del vector y no debe ser una variable, sino un valor constante

* Inicialización de Arreglos:

Pueden inicializarse tanto por caracteres, como por números separados por comas
int Array[5] = {1,2,3,4,5};   //Matriz de caracteres, con 5 elementos

int Array2[5] = {1,2,3};  //Matriz de caracteres con 5 elementos, pero solo 3 declarados

Ejemplo 7.1:


/* Aplicación que muestra la creación de un vector que
   almacena los números del 1 al 5*/

#include <iostream.h>

int main()
{
    int A[5];

    //Almacenando elementos
    A[0]=1;
    A[1]=2;
    A[2]=3;
    A[3]=4;
    A[4]=5;

    //Mostrándolos
    cout<<"Elementos de A: \n";
    cout<<A[0]<<" "<<A[1]<<" "<<A[2]<<" "<<A[3]<<" "<<A[4]<<" ";
    system("pause>nul");
    return 0;
}


Ejemplo 7.2:

/* Aplicación que muestra la creación de un vector que
   almacena los números del 1 al 5, usa la sentencia for */

#include <iostream.h>

int main()
{
    int A[5],i;

    //Almacenando elementos
    for (i=0;i<5;i++)
    {
        A[i] =i+1;
    }

    //Mostrándolos
    cout<<"Elementos de A: \n";
    for(i=0;i<5;i++)
    {
        cout<<A[i]<<" ";
    }
    system("pause>nul");
    return 0;
}


Es preferible declarar los vectores utilizando la directiva #define (utilizada para declarar constantes) ya que si utilizamos la misma longitud de vector en diferentes ocasiones, sería más práctico solo cambiar el valor de la constante para no tener que cambiar todos los valores de longitudes de vectores o arreglos multidimensionales según sea el caso.

Ejemplo 7.3:


/* Declarando vectores usando la expresión #define */

#include <iostream.h>

#define x 2

int main()
{
    int A[x],B[x],i;

    for(i=0;i<2;i++)
    {
        A[i]=i;
        B[i]=1-i;
    }
    cout<<"A: ";
    for(i=0;i<2;i++)
    {
        cout<<A[i]<<" ";
    }
    cout<<endl<<"B: ";
    for(i=0;i<2;i++)
    {
        cout<<B[i]<<" ";
    }
   
    return 0;
}


Más información: Cuestión de estilos – tamaño de vectores

Continua: Matrices y arreglos multidimensionales
--->   142857   <---

jabus_666

woow k bien k hagan esto
es muy bueno
sigan asi  felicidades cazador y makubex

Fredy01_THM

Hace tiempo que no estudio estoy y lo mejor es que por fin podre recordar y aprender de esto
[gigya width="300" height="225" quality="high" src="http://hosting.gmodules.com/ig/gadgets/file/112581010116074801021/hamster.swf?" ]