Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: 6TUNX4T en 2 Mayo 2014, 04:36 AM

Título: programacion c basico
Publicado por: 6TUNX4T en 2 Mayo 2014, 04:36 AM
INTRODUCCION

El lenguaje C es un lenguaje de programación de propósito general, es uno de los más rápidos y potentes que existen. El lenguaje C ha demostrado ser un lenguaje extremadamente eficaz, hasta como para crear sistemas operativos, como Linux que fue creado en este lenguaje.
Este lenguaje tiene ciertas caracteristicas, unas de ellas son:
Es un lenguaje Compilado
A diferencia de otros lenguajes, que son lenguajes interpretados, los cuales necesitan del código fuente para funcionar (por ejemplo Basic), C es un lenguaje compilado esto quiere decir que convierte el código fuente en un fichero objeto, éste es enlazado con las librerías necesarias dando lugar a un fichero ejecutable.
Es un lenguaje de Nivel medio
Esto quiere decir que combina elementos de lenguaje de alto nivel con la funcionalidad del lenguaje ensamblador, o sea que trabaja a un nivel cercano al computador, sin embargo, nos ofrece posibilidades de construir estructuras de datos equivalentes a los que manejan los lenguajes de alto nivel.
Es un lenguaje Estructurado
Esto quiere decir que permite crear procedimientos en bloques dentro de otros procedimientos.
Es un lenguaje Portable
Este lenguaje permite utilizar el mismo código en diferentes equipos y sistemas informáticos, o sea que es independiente de la arquitectura de cualquier máquina.
Es un lenguaje relativamente pequeño
Este es un lenguaje económico en cuanto a expresiones se refiere, se puede describir en poco espacio y es fácil y rápido de aprender.
Tiene abundancia de Operadores y Tipos de Datos
Este lenguaje practicamente posee un operador para cada una de las posibles operaciones en código de máquina.
Pero al igual que otros lenguajes, el C tiene sus desventajas:
-Carece de instrucciones entrada/salida.
-Carece de instrucciones de manejo de cadena de caracteres.
-La precedencia de los operadores dificultan la comprensión de algunas expresiones.

Todo programa en C, se compone de una o más funciones. La función que se ejecuta de primero es una función llamada main(), esta función es la más importante de todo programa y es la que nunca debe faltar. A esta función no se le puede cambiar el nombre.
A su vez toda función del programa debe devolver un valor al programa, este valor se indica con la palabra reservada "return". Ciertas veces no queremos que la función devuelva ningún valor para estos casos simplemente le indicamos "return 0" o escribimos la palabra reservada "void" antes del nombre de la función.

Comentarios
Un buen programa debe contener buenos comentarios. Asi si lo retomamos en el futuro no tendremos que descifrar lo que hicimos en el pasado. Es una buena costumbre del programador comentarear sus programas.
Un buen comentario es aquel que ni ofende el conocimiento del programador, ni tampoco deja implicito lo que se esta haciendo.
Para poner un comentario basta con encerrar el texto entre los signos /* [comentario] */.
Ejemplo.
main()
{
/*este es un comentario*/
}

TIPOS DE DATOS

Cuando usamos un programa es muy importante manejar datos. En C podemos almacenar los datos en variables. El contenido de las variables se puede ver o cambiar en cualquier momento. Estas variables pueden ser de distintos tipos dependiendo del tipo de dato que queramos guardar en ellas. No es lo mismo guardar un nombre que un número. Hay que recordar también que la memoria del ordenador es limitada, así que cuando guardamos un dato, debemos usar sólo la memoria necesaria

Identificadores
Son nombres dados a constantes, variables y funciones. El identificador esta formado por una secuencia de una o más letras, dígitos y el caracter de subrayado. El primer caracter de un identificador siempre debe ser una letra o el caracter de subrayado, en estos identificadores (nombres de variables) se debe tener gran cuidado, ya que el C hace diferencia entre mayúsculas y minúsculas.
Por ejemplo, Max, max y MAX son tres identificadores diferentes.

Constantes
Las constantes son un valor que una vez fijado por el compilador, no cambia durante la ejecución del programa. El C indica al programa que se trata de una constante usando la directiva #define.
Por ejemplo.
#define pi 3.1416
Esta linea define a la variable pi como una constante con el valor 3.1416, este valor de las constantes puede ser un numero o bien una cadena de caracteres.

Tipos de Datos
Tipo Int
En una variable de este tipo se almacenan números enteros (sin decimales). El rango de valores que admite es -32767 a 32767. Cuando definimos una variable lo que estamos haciendo es decirle al compilador que nos reserve una zona de la memoria para almacenar datos de tipo int. Hay que decirle al compilador que queremos crear una variable y hay que indicarle de qué tipo. Si esta declaración se hace antes del main(), esto indica que la variable será una variable global, o sea que se usará en todo el main() y en el resto de funciones. Mientras que si se declara dentro del main(), esto indica que la variable será una variable local, o sea, sólo para la función main().
Por ejemplo.
int valor;
main()...
Esta expresión declara una variable global de nombre "valor" y de tipo entero.
main()
{
float valor;
}
Esta expresión declara una variable local de nombre "valor" y de tipo float (coma flotante)

Tipo Char
Las variables de tipo char sirven para almacenar caracteres. Los caracteres se almacenan en realidad como números del 0 al 255. Los 128 primeros (0 a 127) son el ASCII estándar. El resto es el ASCII extendido y depende del idioma y del ordenador.
Para declarar una variable char solo escribimos: "char nombre;" y listo, ya existe una variable "nombre" que almacenará datos de tipo caracter.

Tipo Float
En este tipo de variable podemos almacenar números decimales, no sólo enteros como en los anteriores. El rango de posibles valores es del 3.4 E-38 al 3.4 E+38.
Para declarar un float, de forma similar, escribimos: "float prom;" y con esto hemos declarado una variable de nombre "prom" que tendrá un dato de tipo float o coma flotante.

Tipo double
En las variables tipo double se almacenan números reales, estos tiene el rango de 1.79769 E-308 a 1.79769 E+308.
Al igual que las anteriores para declararla escribimos: "double num;" y tenemos una variable de nombre "num" que aceptará datos tipo double.

Modificador Unsigned
Este modificador (que significa sin signo) modifica el rango de valores que puede contener una variable. Sólo admite valores positivos.
Este modificador se usa así: "unsigned int total;" esto declara un variable de nombre "total", de tipo entero positivo.
                                     
INTRODUCIR E IMPRIMIR DATOS

Es usual que en un programa el usuario introduzca datos por el teclado. Para ello contamos con varias posibilidades: Usar las funciones de la biblioteca estándar es la más usual de éstas, aunque no es la mejor es la más fácil de aprender y es la que nosotros utilizaremos.
scanf
Al utilizar la palabra scanf, nosotros podemos hacer que el usuario

introduzca datos por el teclado.
El uso de scanf es de la siguiente manera: "scanf("%i", &num);" esta última expresión indica al programa que se debe solicitar un número entero (%i, es una especificación de formato y esto lo puedes ver en la sección de operadores y manipuladores), luego se indica el nombre de la variable en la que se va a guardar el dato, éste (el nombre) precedido por el signo &, que indica al programa la dirección de ésta variable.

printf
El uso de printf, es similar al de scanf, lo que scanf hace para leer una variable, printf lo hace para imprimirla. De esta manera podemos imprimir en pantalla, ya sea un mensaje o el valor contenido en una variable. La sintaxis de printf es así: "printf("%d", num);" esta sentencia lo que hace es imprimir el valor de la variable num en el lugar donde aparece el "%d".
El printf nos sirve también para mandar a imprimir en pantalla un mensaje así: "printf("Bienvenidos al mundo de C")" esto impirmirá en pantalla:
Bienvenidos al mundo de C
Nota: Para hacer uso de estas funciones, es necesario incluir la directiva o archivo de cabecera stdio.h, esto se hace de la siguiente manera: "#include ", así queda incluida éste archivo y se podrá proceder con el programa.

Ahora haremos uso de lo que hemos aprendido para hacer un programa.
# include stdio.h
main()
{
int x;
printf("Bienvenidos al mundo de C\n");
printf("Introduzca un valor entero ");
scanf("%i", &x);
printf("\nEl valor que introdujo fue %i",x);
return 0;
}
Ahora explicaremos lo que hace:
Primero se declara una variable de tipo entero y de nombre x. Después se manda a imprimir en pantalla el mensaje "Bienvenidos al mundo de C", el "\n" que sigue es para dar un salto de línea en el programa, si no lo pusieramos el siguiente mensaje aparecería pegado al anterior.
Luego se imprime "Introduzca un valor entero", para que el usuario pueda introducir un valor por medio del teclado y se manda a guardar este valor a la variable antes declarada.
Despues se imprime un mensaje y el valor de la variable.
Como pueden ver, no es tan difícil.
La expresión "return 0" es una instrucción. Como verán, toda función debe retornar un valor, como no queremos que nuestra función main devuelva nada, entonces le decimos que retorne 0.

La salida del programa anterior sería:
Bienvenidos al mundo de C
Introduzca un valor entero 25 (por ejemplo 25)


El valor que introdujo fue 25

getch y getche
Si lo que queremos es que el usuario introduzca un caracter por el teclado usamos las funciones getch y getche. Estas esperan a que el usuario introduzca un carácter por el teclado. La diferencia entre getche y getch es que la primera saca por pantalla la tecla que hemos pulsado y la segunda no.
Por ejemplo.
# include stdio.h
int main()
{
char letra;
printf( "Introduzca una letra: " );
letra = getche();
printf( "\nLa letra que introdujo es: %c", letra );
return 0;
}

La salida del programa anterior sería:
Introduzca una letra:N
La letra que introdujo es: N

Ahora hagamos el mismo programa con getch():
# include stdio.h
int main()
{
char letra;
printf( "Introduzca una letra: " );
letra = getch();
printf( "\nLa letra que introdujo es: %c", letra );
return 0;
}

La salida del programa anterior sería:
Introduzca una letra:
La letra que introdujo es: N

Se debe tener en cuenta, aunque no se haga en estos ejemplos, que el archivo de cabecera stdio.h debe estar entre los signos <>, de lo contrario se produciría un error en el programa.


OPERADORES (MANIPULADORES)

Los operadores son símbolos que indican como son manipulados los datos. Estos operadores se pueden clasificar en: aritméticos, lógicos, relacionales, de asignación, de manejo de bits y otros.

Operadores de Asignación
Estos operadores son los que nos sirven para darle (asignarle) un valor a una variable. Este valor lo podemos teclear manualmente o bien puede ser el valor de otra variable.
Por ejemplo.
x=5; /*Esto mete un valor directamente*/
x=a; /*Esto asigna el valor de otra variable*/

Operadores Aritméticos
Los operadores aritméticos son aquellos que sirven para realizar operaciones tales como suma, resta, división y multiplicación. Con ellos podemos calcular el resto o módulo de una división entera, o bien podemos incrementar o disminuir el valor de las variables.
Por ejemplo.
# include stdio.h
main()
{
int x=7; int y; int z=2; /*Como verán es posible declarar e iniciar la variable al mismo tiempo*/
printf("El valor de x es: %i\n", x);
y=x+z;
/*Asigna el valor de una suma*/
x++; /*Incrementa el valor de x en uno*/
printf("Los valores de x, y, z son %i, %i, %i", x,y,z);
return 0;
}

La salida a este programa sería:
El valor de x es: 7
Los valores de x, y, z son 8, 9, 2

Operadores Lógicos
Estos operadores son los que nos permiten hacer comparaciones entre dos o más variables. Estos operadores son los que nos permitirán decidir en una sentencia condicional que veremos más adelante.
Por ejemplo.
x<7&&t==4; /*Esta línea devuelve 1, si x es menor que 7 "y" t es igual a 4*/

Operadores Binarios
Estos permiten ver el contenido de las variables como valores binarios. Utiles en el acceso a bits individuales en memoria, tales como la memoria de pantalla para mostrar gráficos.
Las funciones de estos operadores se describen en la tabla, y se ocupan similarmente en los programas.

Operador Sizeof Existe un operador muy utilizado que es el sizeof. Este operador nos devuelve el tamaño en bytes de una variable. De esta manera no tenemos que preocuparnos en recordar o calcular cuanto ocupa. Además el tamaño de una variable cambia de un compilador a otro, es la mejor forma de asegurarse. Se usa poniendo el nombre de la variable después de sizeof y separado de un espacio.
Por ejemplo.
int main()
{
float variable;
printf( "Tamaño de la variable: %f\n", sizeof variable );
}

Se debe tener gran cuidado al agrupar estos operadores, pues unas acciones se llevan a cabo antes que otras, esto depende del nivel de precedencia que tenga el operador. Para esto se presenta una tabla, en la que se muestra en orden descendente la prioridad de los mismos.


Operador   Operación
+   Suma dos numeros, pueden ser enteros o reales
-   Resta dos numeros, pueden ser enteros o reales
*   Multiplica dos numeros, pueden ser enteros o reales
/   División, el resultado depende de los tipos de datos
%   Módulo o resto de una división entera, los operandos tienen que ser enteros
++   Incrementa en uno la variable
--   Decrementa en uno la variable

OPERADORES LOGICOS
Operador   Operación
&&   AND, en español Y. Da como resultado el valor lógico 1, si ambos operadores son        distintos de cero
||   OR, en español O. El resultado es cero, si ambos operandos son cero
!   NOT, en español NO. El resultado es cero si el operando tiene un valor distinto de          zero

OPERADORES DE RELACION
Operador   Operación
<   Primer operando menor que el segundo
>   Primer operando mayour que el segundo
<=   Primer operando menor o igual que el segundo
>=   Primer operando mayor o igual que el segundo
==   Primer operando igual que el segundo
!=   Primer operando distinto del segundo

OPERADORES BINARIOS
&   AND, compara los bits dos a dos, si ambos son 1 el resultado es 1
!   OR, compara los bits dos a dos, si alguno de ellos es 1, se obtien 1
^   XOR, compara los bits dos a dos, si son distintos el resultado es 1
~   Complemento, convierte los ceros a uno y los unos a cero
>>   Desplazamiento a la derecha, esto equivale a dividir por 2
<<   Desplazamiento a la izquierda, esto equivale a multiplicar por 2

OPERADORES DE ASIGNACION
=   Asignación simple
*=   Multiplicación más asignación
/=   División más asignación
%=   Módulo más asignación
+=   Suma más asignación
-=   Resta más asignación
<<=   Desplazamiento a la izquierda más asignación
>>=   Desplazamiento a la derecha más asignación
&=   Operación AND sobre bits más asignación
!=   Operación OR sobre bits más asignación
^=   Operación XOR sobre bits más asignación

NIVELES DE PRECEDENCIA

( )     [ ]
~ ! & ++ --
* / %
+ -
<< >>
< <= > >=
== !=
^
!
&&
||
= *= /= %= += -= &= ^= != <<= >>=

SENTENCIAS Y BUCLES
Hasta ahora los programas que hemos visto eran lineales. O sea que las instrucciones se ejecutaban en orden y una sola vez. Pero resulta que muchas veces no es esto lo que queremos que ocurra. Lo que nos suele interesar es que dependiendo de los valores de los datos se ejecuten unas instrucciones y no otras. O también puede que queramos repetir unas instrucciones un número determinado de veces. Para esto están las sentencia de control de flujo.

Bucles
Los bucles nos ofrecen la solución cuando queremos repetir una tarea un número determinado de veces. Supongamos que queremos escribir 100 veces la palabra Bienvenido.
Con lo que sabemos, tendríamos que escribir 100 veces la expresión "printf("Bienvenido\n");", sin embargo un ciclo for nos facilitaría en grande esta tarea.
Estos bucles pueden ser:
For (Para), While (Mientras), Do while(Hacer mientras).

El Bucle For
Este bucle nos permite hacer un número finito de tareas, cuantas veces necesitemos. La sintaxis del for es la siguiente:
for([valor inical];[condición];[incremento])
{
...sentencias
...sentencias
}

La parte del valor inicial, es el valor con el que empieza la variable contadora, o la variable que nos va a decir cuando salir.
La condición, es la que nos determinará el número de veces que se llevarán a cabo las instrucciones que siguen. Estas sentencias se realizarán mientras la condición estipulada se cumpla.
El incremento, es el numero en que vamos a incrementar la variable contadora.

El Bucle While
La sintaxis del bucle while es la siguiente:
while ( condición )
{
bloque de instrucciones a ejecutar
}

La condición de este bucle, al igual que el for, es la que indica cuantas veces se ejecutarán las instrucciones. Estas (las instrucciones) se ejecutarán mientras la condición estipulada se cumpla.

El Bucle Do While
La sintaxis de este bucle es:
do
{
instrucciones a ejecutar
} while ( condición );

En este bucle,las instrucciones se llevan a cabo al menos una vez, puesto que la condición se evalúa al final del mismo; a diferencia del while o el for, que si la condición inicial no se cumple, entonces las instrucciones no se cumplen ni una sola vez.
La condición es similar a las antes descritas.

Sentencias Condicionales
Hasta aquí hemos visto cómo podemos repetir un conjunto de instrucciones las veces que deseemos. Pero ahora vamos a ver cómo podemos controlar totalmente el flujo de un programa. Dependiendo de los valores de alguna variable se tomarán unas acciones u otras.

Sentencia if
La palabra if significa si (condicional), su sintaxis es como sigue:
if ( condición )
{
instrucciones a ejecutar
}
Cuando se cumple la condición entre paréntesis se ejecuta el bloque inmediatamente siguiente al if (instrucciones a ejecutar).
Por ejemplo.
# include stdio.h
main()
{
int x=2;
if(x==2)
printf("X es 2");
return 0;
}

El programa anterior analiza la condición de que si x es igual a dos, entonces se imprime el mensaje "X es 2".

Sentencia if-else
En el if, si la condición no se cumplía, entonces las instrucciones no se ejecutaban y el programa finalizaba o seguía con las siguientes instrucciones. En el if-else, (si-sino) si no se cumple la condición entonces se realizarán otras instrucciones.
Su sintaxis es la siguiente:
if ( condición )
{
bloque que se ejecuta si se cumple la condición
}
else
{
bloque que se ejecuta si no se cumple la condición
}

Por ejemplo.
int main()
{
int a;
printf( "Introduce un número " );
scanf( "%i", &a );
if ( a==8 )
{
printf ( "El número que introdujo es ocho.\n" );
}
else
{
printf ( "El número que introdujo no es ocho"\n" );
}
}

En este ejemplo se manda a solicitar un número, si el número introducido es ocho, entonces manda un mensaje positiv, mientras que si el numero no es ocho manda un mensaje negativo.

Se pueden agrupar varios if, o sea que si se cumple uno, luego se pregunta otra condición y así sucesivamente. A esto se le llama if anidados. A la vez es posible analizar más de una condición siempre y cuando estas vayan ligadas con su respectivo operador.
Por ejemplo.
int main()
{
int a;
printf( "Introduce un número " );
scanf( "%i", &a );
if ( a<10 )
{
printf ( "El número introducido era menor de 10.\n" );
}
else if ( a>10 && a<100 )
{
printf ( "El número está entre 10 y 100"\n" );
}
else if ( a>100 )
{
printf( "El número es mayor que 100\n" );
}

En este ejemplo lo que se hace es pedir un numero, se analiza una condición y si se cumple se mand un mensaje, sino, se analiza otra condición y se manda a imprimir un mensaje para cada caso.

Sentencia switch
La sentencia switch, analiza una condición y dependiendo del valor escoge entre varias opciones para realizar distintas instrucciones y si la opción no está establecida, simplemente ejecuta una opción por defecto.
La sintaxis para el switch es:
switch ( variable )
{
case opción 1:
código a ejecutar si la variable tiene el
valor de la opción 1
break;
case opción 2:
código a ejecutar si la variable tiene el
valor de la opción 2
break;
default:
código que se ejecuta si la variable tiene
un valor distinto a los anteriores
break;
}

Ahora miremos, el switch analiza el valor de "variable" luego si variable tiene el valor "opcion 1" entonces se ejecutan las instrucciones que siguen, y así sucesivamente. Es importante poner al final de cada grupo de instrucciones la palabra "break", la que indica al programa que ahí terminan las sentencias. Se pueden poner cuantas opciones se desee y al final es recomendable (aunque no exigido) que se ponga un grupo de instrucciones que se ejecuten si la variable toma un valor que no se ha definido. Esta última se pone despues de la palabra "default".

Sentencia goto
La sentencia goto (ir a) nos permite hacer un salto a la parte del programa que deseemos. En el programa podemos poner etiquetas, estas etiquetas no se ejecutan. Es como poner un nombre a una parte del programa. Estas etiquetas son las que nos sirven para indicar a la sentencia goto dónde tiene que saltar.
Por ejemplo.
int main()
{
printf( "Línea 1\n" );
goto linea3;   /* Le decimos al goto que busque la etiqueta linea3 */
printf( "Línea 2\n" );
linea3:    /* Esta es la etiqueta */
printf( "Línea 3\n" );
}

Como resultado tenemos:
Línea 1
Línea 3
O sea que el printf de la linea 2 no se ejecuta, puesto que lo saltamos con el goto.

ARREGLOS O MATRICES
Un array (arreglo) es un conjunto de variables del mismo tipo, las cuales se diferencian entre sí por su posición (ubicación). Para ilustrarlo, supongamos una tabla dividida en celdas y cada celda es una variable en particular, por supuesto que todas las celdas son del mismo tipo y pertenecen a la misma tabla.

Los arreglos se declaran así:
tipo_dato nombre_arreglo [tamaño];
El tipo de dato, puede ser uno de los definidos anteriormente.
El nombre del arreglo es cualquier identificador válido y el tamaño es el tamaño que deseamos que tenga el arreglo, este siempre debe ir entre corchetes. Los datos del arreglo empiezan a introducirse por el dato
Título: Re: programacion c basico
Publicado por: rir3760 en 2 Mayo 2014, 06:35 AM
Cuando publiques un texto tan extenso por favor indica que esperas en respuesta (simple aportación, critica constructiva, etc.).

Si ese tutorial es "tuyo" (o lo conseguiste en Internet) lo primero a comentar es: buena parte de los ejemplos se "copiaron" del Curso de C de Gorka Urrutia lo que es, siendo muy diplomáticos, políticamente incorrecto.

Un saludo