Noticias:

Todo apunta a que la libertad y la democracia van a reinar en Cuba ahora que Batista ha sido exiliado.

Menú Principal

Curso de iniciación en programación C

Iniciado por Thylzos, 23 de Junio de 2008, 09:26

0 Miembros y 1 Visitante están viendo este tema.

Ray

Voy a tardar un poco en hacer eses que no tengo tiempo ni ahora ni en las proximas semanas. :\

Thylzos

Soluciones del 5º capítulo

Citar1- Has un programa que le pida dos números al usuario, y le muestre su suma, su división y el resto de la división.

Aquí hay un posible código (tampoco puede variar mucho, eso depende de cada uno):

#include <stdio.h>

int main (void) {
int 1_numero, 2_numero;
printf ("Ponga dos números: ");
scanf ("%d", &1_numero);
scanf ("%d", &2_numero);
printf ("\nSu suma: %d \nSu división: %d\nY su resto: %d", 1_numero+2_numero, 1_numero/2_numero, 1_numero%2_numero);
}


Citar2- Has un programa que le pida una letra al usuario y le diga a éste entre qué otras dos se encuentra.

Ahora voy a hacerlo almacenando el valor de las operaciones en otras variables, en vez de printear directamente el resultado de una operación que está en la lista de parámetros.

#include <stdio.h>

int main (void) {
char letra, anterior, posterior;
printf ("Escriba una letra: ")
scanf ("%c", &letra);
anterior =letra +1;
posterior = letra -1;
printf ("Se encuentra entre %c y %c", anterior, posterior);
}


CitarEl reto

Has un programa que le pida un número al usuario, para luego mostrarlo en octal, hexadecimal, su representación en el códgio ASCII, su cuadrado y su doble.

#include <stdio.h>

int main (void) {
int numero;
printf ("Escriba un número: ");
scanf ("%d", &numero);
printf ("Su representación en octal: %o\nSu representación en hexadecimal: %x\nSu carácter en el código ASCII: %c\nSu cuadrado: %d\nSu doble: %d", numero, numero, numero, numero*numero, numero*2);
}

Gracias freyi *.*


Cita de: Gambit en 26 de Enero de 2010, 10:25
Follar cansa. Comprad una xbox 360, nunca le duele la cabeza, no discute, no hay que entenderla, la puedes compartir con tus amigos...

NightWalker|Kodama

joder, mola tela, yo he dao C, llegue hasta los vectores, pero..... eso si no se practica se olvida, y yo no me acuerdo de casi nada printf("juas juas juas") XDDDD, vamos ni pajo, asi que este tuto me viene que ni al pelo, encima este año hago el FP de programacion pura y dura, asi que en cuanto lo tengais en pdf ya sabeis, a mi me vais a alegrar ^^

Saludos y gracias por el trabajaso.


Sir Kodama, Venido de TvPando ^^

:ni:

Genki

yo estoy empezando ahora... voy por el 3... pero no he entendido muy bien lo de... ';'

Sorry but you are not allowed to view spoiler contents.

Faerindel

El ; indica el final de cada sentencia. Es el error de sintaxis que más jode la marrana hasta que te acostumbras y lo pones automáticamente.

Der Metzgermeister

#45
Cita de: Faerindel en 02 de Agosto de 2008, 16:20
El ; indica el final de cada sentencia. Es el error de sintaxis que más jode la marrana hasta que te acostumbras y lo pones automáticamente.

Y lo dice alguien que, según él, no lo sufre porque usa FreePascal



RED ZERSTEIMGETMER

"Suche gut gebauten Achtzehn bis Dreissigjährigen zum Schlachten. Der Metzgermeister"

Sorry but you are not allowed to view spoiler contents.

Faerindel

Cita de: Der Metzgermeister en 02 de Agosto de 2008, 22:32
Cita de: Faerindel en 02 de Agosto de 2008, 16:20
El ; indica el final de cada sentencia. Es el error de sintaxis que más jode la marrana hasta que te acostumbras y lo pones automáticamente.

Y lo dice alguien que, según él, no lo sufre porque usa FreePascal
Er... FP también tiene los ; y nunca he dicho que no los tuviese, mendrugo.

Maik

y xml tambien.

Putos scripts del counter xD.

Faerindel

Por cierto, Thylzos, hijoputa, actualiza esto que sólo es copypaste.

Thylzos

Sí, es que estoy un poco vago últimamente :P.

6- Punteros

Antes de empezar, quiero hacer una aclaración. Los que no sepan mucho de programación y hayan seguido el hilo, habrán notado que hay usuarios experimentados que hablan con respeto (incluso con temor) de este tema. Yo siempre dije que los punteros no tienen término medio, o te pueden parecer el invento de un sádico que quería ver sufrir a los programadores o la mejor utilidad de la programación (exagerando en ambos casos, claro). Soy de los que opinan lo segundo, y para que ustedes también puedan disfrutar de ellos, os propongo que vayáis por este tema como si cruzaseis un paraíso construido sobre arenas movedizas, maravillándose por el paisaje pero sin dejar de mirar por donde pisan. Y sin más dilaciones, me presento como guía y les digo: "pasen sólo por donde lo hago yo, habrá cosas muy hermosas que no veremos nada más entrar en le paraíso, pero a las que poco a poco nos iremos acercando."

6.1- Definiciones

-Memoria principal: Es la RAM (supongo que todos saben lo que es), donde se cargan todos los programas que ejecutamos, incluyendo sus variables, constantes y demás datos. Está organizada por segmentos dividos en unidades más pequeñas aún, con los punteros trabajaremos en estas unidades.

-Puntero: Variable que almacena direcciones de memoria con las que se va a trabajar durante la ejecución del programa.

6.2- Qué hacen los punteros.

Ya hemos pasado la entrada de nuestro recorrido y estamos listos para sumergirnos en lo más básico de la programación con punteros, empecemos con los conceptos teóricos.

Como ya sabemos, los punteros son variables que tienen una dirección de memoria de un dato x con el que vamos a trabajar, ¿por qué se complican la vida con punteros pudiendo trabajar con datos directamente?, yo también me lo pregunte cuando comenzaba, y es que hay ocasiones en que es más cómodo (lo veremos cuando aprendamos a hacer nuestra propias funciones) y otras en las que simplemente es imprescindible (con fichero no nos queda otra), por motivos que no puedo explicar en un solo tutorial. Ahora bien, entonces tenemos un puntero y cuando operamos con él es importante saber que (excepto que indiquemos lo contrario) no se afecta al puntero, sino que a los datos de la dirección de memoria que almacene, espero que se entienda porque no se me ocurre otra forma de explicarlo (soy un guía un tanto penoso).

Los punteros son tan importantes que incluso tienen "sus propios operadores" (no es una afirmación del TODO cierta, pero dejémoslo así), y con ellos nos valeremos para declararlos, tratarlos, operar con ellos, etc. Como creo que esto ya no se puede extender mucho más, pasemos a la práctica y los mejor del recorrido.

6.2 - Declaración e inicialización de punteros.

Y por fin a llegado el momento esperado y temido a la vez, el ki de la cuestión.

Para comenzar, nada mejor que un ejemplo recién cocido:

#include <stdio.h>

int main void{
int anyo_actual;
int *puntero_anyo_actual;
printf ("¿Qué año es?");
scanf ("%d", anyo_actual);
puntero_anyo_actual = &anyo_actual;
puntero_anyo_actual ++;
printf ("Ha pasado un año!!!!", anyo actual);
}


Como habrán visto, no hay muchas cosas nuevas, ya que el identificador & lo vimos el temas pasado y sabemos que hace referencia a la dirección de memoria de la variable que antecede. Sin embargo, también saltan a la vista cosas nuevas, así que vayamos despacio y con clama.

Citarint *puntero_anyo_actual;

Primera "cosa" extraña. Aquí es dónde declaramos el puntero, para eso anteponemos el signo * que sirve para advertirle al compilador que esa variable será un puntero.

Citarpuntero_anyo_actual = &anyo_actual;

Quizá muchos lo hayan adivinado (qué orgulloso me sentiría), aquí inicializamos el puntero, dándole como valor la dirección de memoria de la variable anyo_actual, por eso utilizamos el operador &.

Citar*puntero_anyo_actual ++;
printf ("Ha pasado un año!!!!", anyo actual);

Ahora lo interesante, en la primera línea estamos aumentando en uno los datos de la dirección de memoria a la que apunta el puntero, porque, como recordaremos, los cuando operamos con un puntero, en realidad lo hacemos con los datos de la dirección de memoria que almacena. Esto es importante, así que reléelo las veces que haga falta.

En la segunda línea, se printea el contenido de la variable anyo_actual, y al hacerlo comprobaremos que es un año mayor, ya que hemos aumentado su valor en uno desde su puntero en la línea anterior.

Bien, acabo de explicar lo básico con respecto a los puntero, adentrémonos un poco más en el paraíso.

6.4- Utilización de punteros.

Muchos se preguntaran, ¿por qué para declarar el puntero usó *, para inicializarlo no y luego para operar con el puntero sí?, no es que esté borracho o lo esté haciendo al azar, todo tiene una explicación lógica y a fin de entenderlo mejor, veamos cada una de las utilizaciones más comunes de las punteros (con sus repectivos operdadores):

- *Puntero: Aquí (es decir, poniendo delante de la variable el carácter *) estamos diciendo que trabajaremos con el contenido de la dirección que almacena el puntero, se utiliza está expresión para operar con los datos de la variable a la que apunta, generalmente.

- &Puntero:  Aquí para trabajar con la dirección en la cual se encuentra el puntero, no es de las más usadas.

- Puntero: Ahora lo que haremos es trabajar con los datos del puntero, es decir, la dirección de memoria de la variable a la que apunta. Por lo general se utiliza para inicializar y para la programación a un nivel bajo que no frecuentaremos y que consiste en trabajar con la memoria principal en bruto, por lo general con ayuda del lenguaje ASM.

- sizeof (puntero): Aunque no lo parezca sizeof() no es una función es un operador que nos indica el tamaño del contenido de una variable, es muy utilizado con los punteros.

Así que repasemos, con los punteros contamos con tres operadores básicos *, & y sizeof. Usando * nos referimos al contenido de la variable que apunta nuestro puntero, con & a la dirección de memoria en que está ubicado el puntero y con sizeof() el tamaño del puntero o el de la variable que almacena. Sin ninguno de todos estos, estaremos trabajando con la dirección de memoria que almacena el puntero.

Señores, el recorrido por el paraíso ha concluido por hoy, pero prometo que en otros capítulos seguiremos profundizando más y entrando en las zonas de  interés.

6.5- Ejercicios

1- Realiza un programa que genere dos punteros y tres variables int, luego pida dos números al usuario, almecene cada uno en una variable int y le disigne a cada puntero una de esas variables, depués que se sumen desde los punteros y se almacenen en el int restante para luego printearla.

2- V o F

a) Con *puntero estamos trabajando con la dirección donde está el puntero.

b) Con *puntero estamos trabajando con la dirección de la variable que almacena el puntero.

c) Con &puntero nos encontramos trabajando con el valor de la variable a la que apunta el puntero.

d) Con puntero estamos trabajando con la dirección de memoria que almacena el puntero.

El reto

Quizá sea un poco difícil, pero le regalaré un sugus al novel que lo consiga. Haz un programa que genere una variable y un puntero, y luego ve modificándolo para que sin en ningún momento inicializar el puntero con la variable y sólo operando desde la dirección del puntero consigas que este apunte a la variable. Para los que no me hayan entendido (que deben de ser muchos), sin darle al ùntero el valor de la dirección donde está la variable, conseguir que éste apunte a ella (no, no es imposible).

Gracias freyi *.*


Cita de: Gambit en 26 de Enero de 2010, 10:25
Follar cansa. Comprad una xbox 360, nunca le duele la cabeza, no discute, no hay que entenderla, la puedes compartir con tus amigos...

Últimos mensajes

El hilo con el increíble título mutante de jug0n
[Ayer a las 21:29]


Adivina la película de jug0n
[Ayer a las 21:28]


Gran Guía de los Usuarios de 106 de Orestes
[Ayer a las 15:15]


Felicidades de Paradox
[29 de Abril de 2024, 12:40]


¿Qué manga estás leyendo? de M.Rajoy
[26 de Abril de 2024, 11:54]