Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: Crod1k en Febrero 11, 2013, 06:24:03 pm

Título: Curso de C
Publicado por: Crod1k en Febrero 11, 2013, 06:24:03 pm
Citar
Hola, hoy quisiera comenzar a eseñarles a los principiantes como yo. El riquisimo y super funcional lenguaje de programacion C. Aclaro que no soy muy bueno explicando pero hare todo lo posible para que entiendan de momento pueden mandarme mensaje y pedir ayuda en la comunidad. Recuerden que para aprender a correr a que primero saber caminar. Otra cosa no tengo un guia de estudio asi que intentare ir hacer lo mas neseciten para que aprendar a leer y programar, sin mas nada que decir Comenzemos.

Citar
PD. Para todo aquel que quiera cooperar con esta guia que no pretende ser un manual si no una guia de referencia Mandarme un MP
0. Conceptos básicos sobre programación

      Un programa es un conjunto de órdenes para un ordenador.

      Estas órdenes se le deben dar en un cierto lenguaje, que el ordenador sea capaz de
      comprender.

      El problema es que los lenguajes que realmente entienden los ordenadores resultan difíciles
      para nosotros, porque son muy distintos de los que nosotros empleamos habitualmente para
      hablar. Escribir programas en el lenguaje que utiliza internamente el ordenador (llamado
      “lenguaje máquina” o “código máquina”) es un trabajo duro, tanto a la hora de crear el
      programa como (especialmente) en el momento de corregir algún fallo o mejorar lo que se
      hizo.

      Por eso, en la práctica se emplean lenguajes más parecidos al lenguaje humano, llamados
      “lenguajes de alto nivel”. Normalmente, estos son muy parecidos al idioma inglés, aunque
      siguen unas reglas mucho más estrictas.






Título: Re:Curso de C
Publicado por: Crod1k en Febrero 11, 2013, 07:47:35 pm
0.1. Lenguajes de alto nivel y de bajo nivel.

      Vamos a ver en primer lugar algún ejemplo de lenguaje de alto nivel, para después comparar
      con lenguajes de bajo nivel, que son los más cercanos al ordenador.

      Uno de los lenguajes de alto nivel más sencillos es el lenguaje BASIC. En este lenguaje, escribir
      el texto Hola en pantalla, sería tan sencillo como usar la orden


     
Código: [Seleccionar]
PRINT "Hola"
Otros lenguajes, como Pascal, nos obligan a ser algo más estrictos, pero a cambio hacen más
fácil descubrir errores:


Código: [Seleccionar]
    program Saludo;
begin
write('Hola');
end.

El equivalente en lenguaje C resulta algo más difícil de leer, por motivos que iremos
comentando un poco más adelante:


Código: [Seleccionar]
#include <stdio.h>
int main()
{
printf("Hola");
}

Los lenguajes de bajo nivel son más cercanos al ordenador que a los lenguajes humanos. Eso
hace que sean más difíciles de aprender y también que los fallos sean más difíciles de descubrir
y corregir, a cambio de que podemos optimizar al máximo la velocidad (si sabemos cómo), e
incluso llegar a un nivel de control del ordenador que a veces no se puede alcanzar con otros
lenguajes. Por ejemplo, escribir Hola en lenguaje ensamblador de un ordenador equipado con
el sistema operativo MsDos y con un procesador de la familia Intel x86 sería algo como


Código: [Seleccionar]
dosseg
.model small
.stack 100h

.data
hello_message db 'Hola',0dh,0ah,'$'

.code
main proc
          mov  ax,@data
          mov  ds,ax

          mov  ah,9
          mov  dx,offset hello_message
          int     21h

          mov  ax,4C00h
          int     21h

main  endp
end    main

Resulta bastante más difícil de seguir. Pero eso todavía no es lo que el ordenador entiende,
aunque tiene una equivalencia casi directa. Lo que el ordenador realmente es capaz de
comprender son secuencias de ceros y unos. Por ejemplo, las órdenes “mov ds, ax” y “mov ah, 9”
(en cuyo significado no vamos a entrar) se convertirían a lo siguiente:


Código: [Seleccionar]
1000 0011 1101 1000 1011 0100 0000 1001
(Nota: los colores de los ejemplos anteriores son una ayuda que nos dan algunos entornos de
programación, para que nos sea más fácil descubrir errores).
Título: Re:Curso de C
Publicado por: XXBMZXX en Febrero 12, 2013, 08:30:28 pm
muy bien explicado gracias!! espero que sigas con el curso!!
Título: Re:Curso de C
Publicado por: Crod1k en Febrero 13, 2013, 02:26:10 am
0.2. Ensambladores, compiladores e intérpretes

Está claro entonces que las órdenes que nosotros hemos escrito (lo que se conoce como
“programa fuente”) deben convertirse a lo que el ordenador comprende (obteniendo el
“programa ejecutable”).

Si elegimos un lenguaje de bajo nivel, como el ensamblador (en inglés Assembly, abreviado
como Asm), la traducción es sencilla, y de hacer esa traducción se encargan unas herramientas
llamadas ensambladores (en inglés Assembler).

Cuando el lenguaje que hemos empleado es de alto nivel, la traducción es más complicada, y a
veces implicará también recopilar varios fuentes distintos o incluir posibilidades que se
encuentran en bibliotecas que no hemos preparado nosotros. Las herramientas encargadas de
todo esto son los compiladores.

El programa ejecutable obtenido con el compilador o el ensamblador se podría hacer funcionar
en otro ordenador similar al que habíamos utilizado para crearlo, sin necesidad de que ese otro
ordenador tenga instalado el compilador o el ensamblador.

Por ejemplo, en el caso de Windows (y de MsDos), y del programa que nos saluda en lenguaje
Pascal, tendríamos un fichero fuente llamado SALUDO.PAS. Este fichero no serviría de nada en
un ordenador que no tuviera un compilador de Pascal. En cambio, después de compilarlo
obtendríamos un fichero SALUDO.EXE, capaz de funcionar en cualquier otro ordenador que
tuviera el mismo sistema operativo, aunque no tenga un compilador de Pascal instalado.

Un intérprete es una herramienta parecida a un compilador, con la diferencia de que en los
intérpretes no se crea ningún “programa ejecutable” capaz de funcionar “por sí solo”, de modo
que si queremos distribuir nuestro programa a alguien, deberemos entregarle el programa
fuente y también el intérprete que es capaz de entenderlo, o no le servirá de nada. Cuando
ponemos el programa en funcionamiento, el intérprete de encarga de convertir el programa en
lenguaje de alto nivel a código máquina, orden por orden, justo en el momento en que hay que
procesar cada una de las órdenes.

Para algunos lenguajes, es frecuente encontrar compiladores pero no suele existir intérpretes.
Es el caso del lenguaje C, de Pascal y de C++, por ejemplo. En cambio, para otros lenguajes, lo
habitual es trabajar con intérpretes y no con compiladores, como ocurre con Python, Ruby y
PHP.

Además, hoy en día existe algo que parece intermedio entre un compilador y un intérprete:
Existen lenguajes que no se compilan para obtener un ejecutable para un ordenador concreto,
sino un ejecutable “genérico”, que es capaz de funcionar en distintos tipos de ordenadores, a
condición de que en ese ordenador exista una “máquina virtual” capaz de entender esos
ejecutables genéricos.

 Esta es la idea que se aplica en Java: los fuentes son ficheros de texto,
con extensión “.java”, que se compilan a ficheros “.class”. Estos ficheros “.class” se podrían
llevar a cualquier ordenador que tenga instalada una “máquina virtual Java” (las hay para la
mayoría de sistemas operativos). Esta misma idea se sigue en el lenguaje C#, que se apoya en
una máquina virtual llamada “Dot Net Framework” (algo así como “armazón punto net”).
Título: Re:Curso de C
Publicado por: Crod1k en Febrero 14, 2013, 12:31:13 am
0.3. Pseudocódigo

A pesar de que los lenguajes de alto nivel se acercan al lenguaje natural, que nosotros
empleamos, es habitual no usar ningún lenguaje de programación concreto cuando queremos
plantear los pasos necesarios para resolver un problema, sino emplear un lenguaje de
programación ficticio, no tan estricto, muchas veces escrito incluso en español. Este lenguaje
recibe el nombre de pseudocódigo.

Esa secuencia de pasos para resolver un problema es lo que se conoce como algoritmo
(realmente hay alguna condición más, por ejemplo, debe ser un número finito de pasos). Por
tanto, un programa de ordenador es un algoritmo expresado en un lenguaje de programación.
Por ejemplo, un algoritmo que controlase los pagos que se realizan en una tienda con tarjeta de
crédito, escrito en pseudocódigo, podría ser:

Citar
Leer banda magnética de la tarjeta
Conectar con central de cobros
   Si hay conexión y la tarjeta es correcta:
          Pedir código PIN
             Si el PIN es correcto
                         Comprobar saldo_existente
                     Si saldo_existente > importe_compra
                            Aceptar la venta
                         Descontar importe del saldo.
                     Fin Si
           Fin Si
   Fin Si
Título: Re:Curso de C
Publicado por: Crod1k en Febrero 15, 2013, 02:23:48 am
1. Toma de contacto con C

Dentro de los lenguajes de programación, C es un lenguaje que tiene un cierto “prestigio”.
Esto se debe fundamentalmente a dos razones:


 ->   Es bastante “portable”: un programa bien hecho en C se podrá llevar a un ordenador
        distinto o incluso a un sistema operativo distinto (de MsDos a Windows o a Linux, por
        ejemplo) con muy pocos cambios o quizás incluso sin ningún cambio. El motivo es que
        existe un estándar: el ANSI C, que soportan casi todos los compiladores. Por eso, si
        nos ceñimos al estándar, es seguro que nuestros programas funcionarán en distintos
        sistemas; cuanto más nos separemos del estándar (en ocasiones podremos hacerlo),
        más difícil será que funcionen en otro sistema distinto.


 ->    Permite hacer “casi de todo”: podemos usar órdenes de alto nivel (muy cercanas al
        lenguaje humano), pero también de bajo nivel (más cercanas a lo que realmente
        entiende el ordenador). De hecho, podremos incluso incorporar órdenes en lenguaje
        ensamblador en medio de un programa escrito en C, aunque eso supone que ganemos
        en control de la máquina que estamos manejando, a costa de perder en portabilidad (el
        programa ya no se podrá llevar a otros ordenadores que no usen el mismo lenguaje
        ensamblador).


En su contra, el lenguaje C tiene que es más difícil de aprender que otros y que puede
resultar difícil de leer (por lo que ciertos errores pueden tardar más en encontrarse).


Los pasos que seguiremos para crear un programa en C serán:
    1. Escribir el programa en lenguaje C (fichero fuente), con cualquier editor de textos.
    2. Compilarlo con nuestro compilador. Esto creará un “fichero objeto”, ya convertido a un
         lenguaje que el ordenador es capaz de entender.
    3. Enlazarlo con otros ficheros del compilador, unas bibliotecas auxiliares que incluirán en
         nuestro programa aquellas posibilidades que hayamos empleado nosotros pero que
         realmente no sean parte del lenguaje C básico, sino ampliaciones de algún tipo. Esto dará
         lugar al fichero ejecutable, que ya podremos usar desde MsDos o el sistema operativo
         que estemos manejando, en nuestro ordenador o en cualquier otro, aunque ese otro
         ordenador no tenga el compilador que nosotros hemos utilizado.

La mayoría de los compiladores actuales permiten dar todos estos pasos desde un único
entorno, en el que escribimos nuestros programas, los compilamos, y los depuramos en caso
de que exista algún fallo.
Título: Re:Curso de C
Publicado por: Crod1k en Febrero 16, 2013, 12:31:21 am
1.1 Comencemos

La única la forma de aprender un lenguaje es escribiendo programas. El primer programa que escribiremos
sera el mismo para todos los lenguajes:


               
Citar
  imprima las palabras
                     "hola, mundo"

Este es el gran obstáculo; para librarlo tiene que tener la habilidad de crear el texto del programa de alguna manera,
compilarlo con éxito, cargarlo, ejecutarlo y descubrir a donde la fue la salida. Con  el dominio  de estos detalles mecánicos,todo los demás es relativamente fácil.
   En C, el programa para escribir  "Hola, mundo" es:


Código: [Seleccionar]
              #include <stdio.h>

                   main()
                 {
                        printf("Hola, mundo\n");
                  }

La forma de ejecutar este programa depende del sistema que se este utilizando. Como un ejemplo un especifico,
en el sistema  operativo GNU/Linux se debe crear el programa en un archivo cuyo nombre termine con ".c", como hola.c
y después compilarlo con la orden.


   
Código: [Seleccionar]
cc hola.c
Si no se ha cometido algún error, como la omisión de un carácter o escribir o escribir algo en forma incorrecta, la compilación se hara sin emitir mensaje alguno, y creara  un archivo ejecutable llamado a.out. Si se ejecuta a.out escribiendo la orden

Código: [Seleccionar]
./a.out
se escribira

Código: [Seleccionar]
Hola, mundo
En otros sistemas, las reglas serán diferentes, consúltelo con miembro de la comunidad @JAG.
Ahora algunas explicaciones del programa en si.


Un programa en C, cualquiera que sea su tamaño consta de funciones y variables. Una función contiene instrucciones que especifican las operaciones de calculo que se van a realizar, y las variables almacenan los valores utilizados durante los cálculos en memoria. Nuestro ejemplo es una función llamada "main". Normalmente se tiene la libertad de dar cualquier nombre que se desee , pero "main" es especial -- El programa comienza a ejecutarse al principio de main.
Esto significa que todo programa debe tener un main en algún sitio.
Por lo común "main" llamara a otras funciones que ayuden a realizar su trabajo, algunas que ustedes ya escribieron, y otras de bibliotecas escritas previamente. La linea primera del programa.


Código: [Seleccionar]
#include <stdio.h>
Indica al compilador que debe incluir información acerca de la biblioteca estándar de entrada/salida; esta linea aparece
al principio de muchos archivos fuente de C.


Un método para comunicar datos entre las funciones es que la función que llama proporciona una lista de valores,
llamados argumentos, a la función que esta invocando. Los paréntesis que están después del nombre de la función encierran a la lista de argumentos. En este ejemplo, "main" esta definido para ser una función que no espera argumentos, lo cual esta indicado por la lista vacía ( ).


Código: [Seleccionar]
#include <stdio.h>                        /* incluye información acerca de la biblioteca estándar */

main()                                         /* define una función llamada main
                                                     que no recibe valores de argumentos*/

{                                                  /* la instrucciones de main están encerradas entre llaves */

printf("Hola, mundo\n");  /* main llama a la función de la biblioteca <stdio.h> printf
                                                       para escribir esta secuencia de caracteres; \n representa
                                                       caracter  de nueva linea */

}                                                   /* cierre de la funcion main */



Las instrucciones de una función están encerradas entre { }. La función main solo contiene una instrucción,

Código: [Seleccionar]
printf("Hola, mundo\n");
Una función se invoca al nombrarla, seguida de una lista de argumentos encerrados entre paréntesis ( ), de esta manera
se esta llamando a la función printf() con el argumento "Hola, mundo\n". printf es una función de biblioteca que escribe la
salida, en este caso la cadena de caracteres que se encuentran entre comillas.
A una secuencia de caracteres entre comillas como, "Hola, mundo\n" se le conoce como String o cadena de caracteres.
Por el momento nuestro único uso de caracteres sera como argumentos para printf y otras funciones.

La secuencia \n en la cadena representa el carácter de nueva linea en la notación de C, y hace avanzar la impresion al margen izquierdo de la siguiente linea. Si se omite el \n (un experimento que vale la pena xD )
, encontrara que no hay avance de linea después de la impresion. Se debe utilizar \n para incluir un caracter de nueva linea en el argumento de printf; si se intenta algo como


Código: [Seleccionar]
printf("Hola, mundo
");

El compilador de C producirá un mensaje de error.

printf nunca proporciona una nueva linea automaticamente, de manera que se pueden utilizar varias llamadas para construir una linea de salida en etapas. Nuestro primer programa tambien pudo haber sido escrito de la siguiente manera

Código: [Seleccionar]
#include <stdio.h>

main()
{
        printf("Hola, ");
        printf("mundo");
        printf("\n");
}


Produciendo una salida idéntica .
   Noten que \n representa un solo carácter. Una secuencia de escape como \n proporciona
un mecanismo general y extensible para representar caracteres invisibles o difíciles de entender. En otros que C
proporciona estan:


\t  ->   para tabulacion
\b ->   para retroceso
\"  ->   para doble comillas
\'   ->   para comillas simple
\\   ->   para barra invertida


Ejercicio 1-1. Ejecute un programa que muestre su nombre y experimente con la omisión de partes del          programa, para ver que mensaje de error se obtiene