Está en la página 1de 15

Lenguajes 1

2016/08/23

Punteros
1.

#include <stdio.h>
#include <stdlib.h>
void cambiar ( int *x, int *y);
main ()
{
int a, b;
a = 3;
b = 5;
printf("\nAntes de cambiar....a = %d y b = %d\n", a, b);
cambiar (&a, &b);
printf("\nDespues de cambiar....a = %d y b = %d\n", a, b);
printf("\n");
system("pause");
return (0);
}
void cambiar ( int *x, int *y)
{
int aux;
aux = *x;
*x = *y;
*y = aux;
return;
}

2. Dada la siguiente definicin compruebe fehacientemente la veracidad de las distintas maneras de


operar:
int a[N], suma, i, *p;
for (i=0, suma=0; i<N; ++i) // forma 1
suma += a[i];
for(i=0, suma=0; i<N; ++i) // forma 2
suma += *(a+i);
for(p=a, i=0, suma=0; i<N; ++i) // forma 3
suma += p[i];
for(p=a, suma=0; p<&a[N]; ++p) // forma 4
suma += *p;
3. Funciones que reciben vectores
#include <stdio.h>
#include <conio.h>
int mat[2][3], *pmat;
int suma ( int *matriz); //funcin que recibe la direccin de una matriz
main ()
{ int i, j;
for (i=0; i<2; i++)
for (j=0; j<3; j++)
{
printf ("\n Introduzca el valor para la fila %d columna %d\t",i+1, j+1);
scanf("%d", &mat[i][j]);
}
pmat = &mat[0][0];
for (i=0; i<2; i++)
for (j=0; j<3; j++)
{ printf("\n fila %d columna %d = \t%d",i+1, j+1, *(pmat + (i*3+j))); }
pmat = &mat[0][0];
printf ("\n La suma de los elementos de la matriz es %d", suma (pmat));
getch ();
return 0;
}
int suma ( int *matriz)

Lenguajes 1
{

2016/08/23

int i, j, resultado, *recorro;


recorro = matriz;
for (i=0, resultado =0; i<2; i++)
for (j=0; j<3; j++)
resultado += *(recorro + (i*3+j));
return resultado; }

4. Se tiene la cadena Curso de C, y otra cadena Programacin en transformela en la cadena Curso


de Programacin en C. Usar gets y puts.
5. Escribir un programa en C que almacene una matriz de mxn, pase esta matriz a una funcin, que
sume, independientemente, los elementos positivos y negativos en dos variables pasadas por
referencia desde el programa o funcin principal. Utilizar funciones y aritmtica de punteros para el
desplazamiento.
6.

#include <stdio.h>
#include <stdlib.h>
int j, k;
int *punt;
main ()
{
j=1;
k=2;
punt = &k;
printf("\n");
printf("j tiene el valor %d y esta alojado en %p \n", j, &j);
printf("k tiene el valor %d y esta alojado en %p \n", j, punt);
printf("punt tiene el valor %p esta alojado en %p \n", punt, &punt);
printf("el valore entero que apunta punt es %d \n", *punt);
printf("\n");
system("pause");
return (0);
}

7.

#include <stdio.h>
#include <stdlib.h>
int arreglo[] = {1,23,17,4,-25,100};
int *punt;
main ()
{
int i;
punt = &arreglo[0]; /* primera pasada */
/* punt = arreglo; /* segunda pasada */
printf("\n");
for (i=0; i<6; i++)
{ printf("arreglo[%d] = %d\n", i , arreglo[i]);
/* primera pasada */
printf("punt + %d = %d\n", i, *(punt+i));
/* segunda pasada */
/* printf("punt + %d = %d\n", i, *punt++);
}
printf("\n");
system("pause");
return 0;
}

/* */

Punteros
1. A partir del cdigo que de detalla a continuacin, realizar las siguientes modificaciones
#include <stdlib.h>
#include <stdio.h>
main()
{
char *cadena ="Esto es una cadena de caracteres";
}

return 0;
a. Desplazarse siguiendo las matemticas de punteros
b. Desplegar cada uno de los caracteres en forma horizontal y utilizando un bucle
while.
c. Desplegar cada uno de los caracteres en forma vertical
d. Desplegar las palabras en forma vertical
e. Agregar un men que ofrezca las 3 opciones anteriores, el men debe ofrecer una
opcin de salida del programa. Al terminar de ejecutar una opcin el programa
debe presentar el men principal.
f. Realizar los despliegues a travs de funciones

2. A partir del cdigo que de detalla a continuacin, realizar las siguientes modificaciones
#include <stdlib.h>
#include <stdio.h>
main()
{
int mat[ ] = {2, 16, -4, 29, 234, 12, 0, 3};
return 0;
}
a. Desplazarse siguiendo las matemticas de punteros
b. Desplegar los valores almacenados en la matriz y su correspondiente direccin en
memoria; un valor por fila, en dos columnas de 10 caracteres cada una. Los valores
debern ser desplegados utilizando el operador de indireccin.
c. Desplegar la suma de los nmero pares de la matriz
d. Solicitar una posicin y verificar que dicha posicin forma parte del vector, una vez
verificado solicitar un valor que reemplazar al mismo.
e. Agregar un men que ofrezca las 3 opciones anteriores, el men debe ofrecer una
opcin de salida del programa. Al terminar de ejecutar una opcin el programa
debe presentar el men principal.
f. Realizar los despliegues a travs de funciones
3. A partir del cdigo que de detalla a continuacin, realizar las siguientes
/* Figura 7.20: Uso de las notaciones de subndices y de apuntadores con arreglos */
#include <stdio.h>
#include <stdlib.h>
int main()
{
int b[] = { 10, 20, 30, 40 }; /* inicializa el arreglo b */
int *ptrB = b;
/* establece ptrB para que apunte al arreglo b */
int i;
/* contador */
int desplazamiento;
/* contador */
/* muestra el arreglo b con la notacin de subndices */
printf( "Arreglo b impreso con:\nNotacion de subindices de arreglos\n" );
for ( i = 0; i < 4; i++ ) {
printf( "b[ %d ] = %d\n", i, b[ i ] );
}
/* muestra el arreglo b mediante el uso del nombre del arreglo
y notacin apuntador/desplazamiento */
printf( "\nNotacion apuntador/desplazamiento donde\n el"
" apuntador es el nombre del arreglo\n" );
for ( desplazamiento = 0; desplazamiento < 4; desplazamiento++ ) {
printf( "*( b + %d ) = %d\n", desplazamiento, *( b + desplazamiento ) );

}
/* muestra el arreglo b mediante el uso de ptrB y notacin de subndices
de arreglos */
printf( "\nNotacion de subindices de arreglos\n" );
for ( i = 0; i < 4; i++ ) {
printf( "ptrB[ %d ] = %d\n", i, ptrB[ i ] );
}
/* muestra el arreglo b mediante el uso de ptrB y notacin de
apuntador/desplazamiento */
printf( "\nNotacin apuntador desplazamiento\n" );
for ( desplazamiento = 0; desplazamiento < 4; desplazamiento++ ) {
printf( "*( ptrB + %d ) = %d\n", desplazamiento, *( ptrB + desplazamiento ) );
}
return 0;
} /* fin de main */
a. Para cada tipo de notacin construya una funcin, luego incluya las llamadas a las
funciones de manera tal que la salida sea la misma que el programa original.
b. Elabore un men que presente como opciones los diferentes mtodos de salida. El
men debe presentar una opcin de salida.
c. Vaya al Libro de Deitel y transcriba el ejercicio de la figura 7.21
4. Para la casa: lea los captulos correspondientes a Arreglos de apuntadores y apuntadores
a funciones. Transcriba el ejercicio de 7.11 y el correspondiente a las funciones.

int *p;

int *p[10];

p es un puntero a un entero

p es un array de 10 punteros a enteros

int (*p)[10];

p es un puntero a un array de 10 enteros

int *p(void);

p es una funcin que devuelve un puntero a entero

int p(char *a);

p es una funcin que acepta un argumento que es un puntero a carcter, devuelve un


entero

int *p(char *a);

p es una funcin que acepta un argumento que es un puntero a carcter, devuelve un


puntero a entero

int (*p)(char *a);

p es un puntero a funcin que acepta un argumento que es un puntero a carcter,


devuelve un puntero a entero

int (*p(char *a))[10]; p es una funcin que acepta un argumento que es un puntero a carcter, devuelve un
puntero a un array de 10 enteros
int p(char (*a)[]);

p es un puntero a funcin que acepta un argumento que es un puntero a un array


de caracteres, devuelve un puntero a entero

int p(char *a[]);

p es un puntero a funcin que acepta un argumento que es un array de punteros a


caracteres, devuelve un puntero a entero

int *p(char a[]);

int *p(char (*a)[]);

int *p(char *a[]);

int (*p)(char (*a)[]);

p es una funcin que acepta un argumento que es un array de caracteres, devuelve un


puntero a entero

p es una funcin que acepta un argumento que es un puntero a un array de


caracteres, devuelve un puntero a entero

p es una funcin que acepta un argumento que es un puntero a un array de punteros


a caracteres, devuelve un puntero a entero

p es una funcin que acepta un argumento que es un puntero a un array de


caracteres, devuelve un puntero a entero

int *(*p)(char (*a)[]); p es un puntero a una funcin que acepta un argumento que es un puntero a un
array de punteros a caracteres, devuelve un puntero a entero

int *(*p)(char *a[]);

p es un puntero a una funcin que acepta un argumento que es un array de punteros


a caracteres, devuelve un puntero a entero

int (*p[10])(void);

p es una array de 10 punteros a funcin, cada funcin devuelve un entero

es una array de 10 punteros a funcin; cada funcin acepta un argumento que es un


int (*p[10])(char * a); ppuntero
a carcter y devuelve un entero.
p es una array de 10 punteros a funcin; cada funcin acepta un argumento que es un
int *(*p[10])(char a); carcter, y devuelve un puntero a entero.
p es una array de 10 punteros a funcin; cada funcin acepta un argumento que es un
char *(*p[10])(char * a); carcter, y devuelve un puntero a caracter.

Lenguaje de Programacin 1
1. #include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* utilizacin de puts*/
main ()
{
char color [] = "blue", carac='a';
char *colorptr = "blue";
int i;
for (i=0; i<strlen (color); i++)
{
carac = color[i];
printf ("%c ", carac);
}
printf ("\n");
puts (colorptr);
puts (color);
system ("pause");
return (0);
}
2. #include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/* uso de isdigit y atoi */
int main ()
{
char str[]="1776ad";
int anio;
if (isdigit(str[0]))
{
anio = atoi (str);
printf ("El aos que sigui a %d
fue %d.\n", anio, anio+1);
}
system ("pause");
return (0);
}

23/08/2016
{
printf("Entre una lnea de
texto....\n");
scanf (" %[^\n]", sentencia);
printf("La sentencia leda en
reversa es \n");
reversa(sentencia);
putchar('\n');
system("pause");
return (0);
}
void reversa(char *s) /* funcion
recursiva */
{
if (s[0]=='\0')
return;
else
{
reversa(&s[1]);
putchar(s[0]);
}
}
5. #include <stdio.h>
#include <stdlib.h>
#include <string.h>
main ()
{
char s1[20] = "Paraguayos ";
char s2[] = "Vencer o Morir ";
char s3[40] = ;
printf( "s1 = %s\ns2 = %s\n",
s1, s2 );
printf( "strcat( s1, s2 ) = %s\n",
strcat( s1, s2 ) );
printf( "strncat( s3, s1, 10 ) =
%s\n", strncat( s3, s1, 10 ) );

3. #include <stdio.h>
#include <stdlib.h>
int main () {
char *numflot = "234.5";
printf("La cadena (real)
""numflot"" es %f \n",
atof(numflot));
printf("La cadena (entero)
""numflot"" es %d\n", atoi(numflot));

system("pause");
return (0);

4. #include <stdio.h>
#include <stdlib.h>
void reversa(char *);
char sentencia[80];
int main ()

system("pause");
return (0);

6. #include <stdio.h>
int linea ();
main () {
int resp;
linea ();
printf ("\xDB Un Programa en
C \xDB\n");
linea ();
getch ();
return (0);
}
int linea () {
int j;
for (j=0; j<=20; j++)
printf ("\xDB");
printf ("\n");
return (0);
}

Lenguaje de Programacin 1
7. Cambie A por B de la primera ocasin
que aparece en la main ().
8. Antes de la finalizacin del programa
principal coloque la instruccin printf
(El valor de j es: %d, j);
Funciona? Por qu no?
9. Coloque la misma instruccin antes
del retorno dentro de la funcin
linea. Cuntas veces sale en
pantalla? Por qu?
10.#include <stdio.h>
int barras (int puntos);
main () {
int resp;
printf
("\nLuisa\t");
barras(15); printf
("\nMarcos\t");
barras(27);
printf
("\nAurelio\t");
barras(8);
scanf ("%d", &resp);
return(0);
}
int barras (int puntos) /* dibujas
barras horizontales*/
{
int j;
for (j=1; j<=puntos; j++)
printf ("\xCD");
printf ("\n");
return (0);
}
11.#include <stdio.h>
int doblebeep ();
main () {

char ch;
doblebeep ();
printf ("Digite un
carcter \n");
doblebeep ();
ch = getchar ();
return (0);
}

int doblebeep () {
long int k;
printf ("\x7");
for (k=0; k<=500000; k++)
;
printf ("\x7");
return (0);
}
12.Hacer un programa que lea una
secuencia de caracteres, los
almacene en un vector esttico y que
al final muestre la cantidad de
vocales haciendo diferencia entre
minsculas y maysculas, la cantidad
de consonantes, y la cantidad de
caracteres que no son ni vocales ni
consonantes. Utilizando funciones de
ctype.

23/08/2016
13.Hacer un programa que solicite base
y altura de un triangulo y calcule el
rea con una funcin.
14.Transformar la cadena VACA en la
cadena vaca.
15.#include <stdio.h>
#include <conio.h>
int mat[2][3], *pmat;
int suma ( int *matriz); //funcin que
recibe la direccin de una matriz
main () {
int i, j;
for (i=0; i<2; i++)
for (j=0; j<3; j++)
{
printf ("\n
Introduzca el valor
para la fila %d
columna %d\t",i+1,
j+1);
scanf("%d",
&mat[i][j]);
}
pmat = &mat[0][0];
for (i=0; i<2; i++)
for (j=0; j<3; j++)
{ printf("\n fila %d
columna %d =
\t%d",i+1, j+1,
*(pmat + (i*3+j))); }
/* super ojo */
pmat = &mat[0][0];
printf ("\n La suma de los
elementos de la matriz es
%d", suma (pmat));
getch ();
return 0;
}
int suma ( int *matriz)
{
int i, j, resultado, *recorro;
recorro = matriz;
for (i=0, resultado =0; i<2;
i++)
for (j=0; j<3; j++)
resultado += *(recorro
+ (i*3+j));
return resultado;
}
16.Con la sentencia printf (Los alumnos
son %2d.\n, 350), Cul ser la
diferencia si en el texto de salida en
colocamos 8 o 12 en vez del 2?
17.Para el nmero 3458.78 probar las
siguientes salidas %4.2f, %3.2f,
%2.2f, %3.1f, %10.3f
18.Desplegar los siguientes nmeros 8,
15.3 y 584.28 en un mismo formato

Lenguaje de Programacin 1
%10.2f. Coloque las banderas para
desplegar a la izquierda.
19.Crear un archivo y guardarlo como
cabecera.h; escribir lo siguiente:
/* Archivo cabecera.h */
#define MAXIMO 100.0
20.Haga un programa que incluya
#include cabecera. e imprima el
valor que representa MAXIMO.
21.Crear una float variable = 8.0 y
muestre el valor de la resta entre
MAXIMO y variable formateada con
10 dgitos aprovechables y 3 dgitos
decimales.
22.En el ejercicio anterior colocar el
guin antes del smbolo porcentaje.
Ej.: -%10.2f Qu pasa?
23.En el ejercicio anterior colocar el
guin despus del smbolo
porcentaje. Ej.: %-10.2f
24.En el ejercicio anterior colocar un
cero (0) en vez del guin. Ej.:
%010.2f
25.Probar lo mismo con el ejercicio 2.
26.Desplegar printf ("%d %c %x %o
\n", 'A', 'A', 'A', 'A'); Cul es la
explicacin?
27.Desplegar printf ("%c %c %c %c
\n", 'A', 65, 0x41, 0101); Cul es la
explicacin?
28.Desplegar printf (%d %c \n, 3393,
3393);

23/08/2016
29.Cdigos de formato para scanf: %c
lee 1 carcter; %d lee un entero
decimal, %e lee un numero en
notacin cientfica, %f lee un numero
float, %o lee un entero octal, %s lee
una cadena de caracteres, %x lee un
hexadecimal, %u lee un entero sin
signo, %l lee un entero largo.
30.Mismo programa que el anterior
utilizando una variable unsigned.
31.Cmo ser interpretada la expresin
x+++y?
32.Pruebe int x, y; for (x=0, y=0; x+y<
50; x +=2, y +=3) y desplegar la
suma, x e y.
33.Pruebe char ch; for (ch=a; ch <=
z; ch++) printf (El carcter es %c
y el ASCII es %d, ch, ch);

Cdigo Formato
%d

Un entero

%i

Un entero

%c

Una carcter

%s

Una cadena

Prototipo etiquetas de formateo

%f

Un real

%[banderas][ancho][.precisin][longitud]especificador

%ld

Entero largo

%u

Decimal sin signo

%lf

Doble posicin

%h

Entero corto

%o

Octal

%x

Hexadecimal

%e

Notacin Cientfica

%p

Puntero

Cadena de control: contiene cdigos de formato que se asocian con los tipos
de datos contenidos en las variables.

El especificador define el tipo y la interpretacin del valor del argumento correspondiente.


Especificador: Ejemplo de salida
c Carcter a
d o i entero decimal con signo 392
e notacin cientfica (mantisa/exponente) usando carcter e 3.9265e+2
E notacin cientfica (mantisa/exponente) usando carcter E 3.9265E+2
f Decimal con punto(coma) 392.65
o octal con signo 610
s cadena de caracteres ejemplo
u decimal entero sin signo 7235
x hexadecimal entero sin signo 7fa
X hexadecimal entero (Letras Capitales) 7FA
p direccin de punteros B800:0000
% A % seguido por otro carcter % desplegar un % en la stdout.

Las otras etiquetas son opcionales:


Descripcin de banderas
- Justificacin a a la izquierda dentro del ancho de campo especificado; justificacin a la derecha es la opcin por defecto. Ver el
especificador de ancho.
+ Obliga a preceder el resultado con un signo ms o el signo menos (+ o -) an con valores positivos. Por defecto, solo los nmeros
negativos son precedidos con el signo menos (-).
(space) Si no se despliega ningn signo, un espacio en blanco es insertado antes del valor.
# usado con los especificadores o, x o X preceden al valor con 0, 0x o 0X respectivamente para valores diferentes de cero. Usado
con los especificadores e, E y f, fuerza que la salida contenga un punto decimal aunque no tenga dgitos significativos siguiendo el
valor. Por defecto, si no hay dgitos no se coloca el punto decimal.

Lenguaje de Programacin 1

23/08/2016

0 completa el numero con ceros (0) en vez de espacios, cuando se utiliza un especificador de ancho.
(number) cantidad mnima de caracteres a ser desplegado. Si el valor a ser desplegado es mas corto, el resultado es llenado con
espacios en blanco. El valor no es truncado en caso que sea ms ancho. El ancho no es especificado en el formato de cadena de
caracteres, pero un argumento precedido con un valor entero modificar segn se necesite.
Descripcin de .precisin
.nmero Para especificadores enteros (d, i, o, u, x, X): la precisin denota el mnimo nmero de dgitos a ser desplegados. Si el
valor a ser desplegado es ms corto que este nmero, entonces el resultado es relleno con ceros delanteros. El valor no es truncado
aunque sea ms ancho. Una precisin de 0 significa que ningn carcter es desplegado para el valor 0.
Para los especificadores e, E y f: este es el nmero de dgitos que va a ser desplegado luego del punto decimal
Para s: es el nmero mximo de caracteres que sera desplegado. Por defecto todos los caracteres son desplegados hasta el nmero
mximos de caracteres a ser desplegados. Por defecto todos los caracteres son desplegados hasta alcanzar el carcter nulo de finalizacin.
Para el carcter c: no tiene efecto.
Cuando no se especifica valor de precisin, se toma por defecto 1. Si el punto es especificado sin ningn valor explicito de precisin, se asume 0.* La precisin no es especificada en el formato de cadena de caracteres, pero un argumento adicional de valor
entero precediendo el argumento que tiene que ser formateado.
Descripcin de longitud
h El argumento es interpretado como un entero corto o un entero corto sin signo (se aplica unicamente a especificadores de entero:
i, d, o, u, x and X).
l El argumento es interpretado como entero largo o entero largo sin signo para especificadores de entero (i, d, o, u, x and X), y
como especificadores de ancho de caracteres para los especificadores de cadena de caracteres c y s.
L El argumento es interpretado como de doble largo (se aplica unicamente a especificadores de puntero flotante: e, E, f, g and G).
Argumentos adicionales
Dependiendo de la cadena de formatos, la funcin podra esperar una secuencia de argumentos adicionales, cada uno conteniendo
un valor a ser insertado en vez de cada etiqueta % especificada en los parametros de formato, si lo hubiera. Debera haber el mismo
nmero de estos argumentos como el nmero de etiquetas % que esperan un valor.

Lenguaje de Programacin 1

23/08/2016

Miscelaneos de Punteros

int *p;
int *p[10];
int (*p)[10];
int *p(void);

int p(char *a);

int *p(char *a);

int (*p)(char *a);

int (*p(char
*a))[10];

int p(char
(*a)[]);

int p(char *a[]);

int *p(char a[]);

int *p(char
(*a)[]);

int *p(char *a[]);

int (*p)(char
(*a)[]);

p es un puntero a un entero

p es un array de 10 punteros a enteros


p es un puntero a un array de 10 enteros
p es una funcin que devuelve un puntero a entero

p es una funcin que acepta un argumento que es un puntero a


carcter, devuelve un
entero
p es una funcin que acepta un argumento que es un puntero a
carcter, devuelve un
puntero a entero

p es un puntero a funcin que acepta un argumento que es un


puntero a carcter,
devuelve un puntero a entero
p es una funcin que acepta un argumento que es un puntero a
carcter, devuelve un puntero a un array de 10 enteros
p es un puntero a funcin que acepta un argumento que es un
puntero a un array
de caracteres, devuelve un puntero a entero
p es un puntero a funcin que acepta un argumento que es un array
de punteros a
caracteres, devuelve un puntero a entero
p es una funcin que acepta un argumento que es un array de
caracteres, devuelve un puntero a entero
p es una funcin que acepta un argumento que es un puntero a un
array de
caracteres, devuelve un puntero a entero
p es una funcin que acepta un argumento que es un puntero a un
array de punteros
a caracteres, devuelve un puntero a entero

p es una funcin que acepta un argumento que es un puntero a un


array de
caracteres, devuelve un puntero a entero

Lenguaje de Programacin 1

23/08/2016

int *(*p)(char
(*a)[]);

p es un puntero a una funcin que acepta un argumento que es un


puntero a un
array de punteros a caracteres, devuelve un puntero a entero

int *(*p)(char
*a[]);

p es un puntero a una funcin que acepta un argumento que es un


array de punteros
a caracteres, devuelve un puntero a entero

int
(*p[10])(void);

p es una array de 10 punteros a funcin, cada funcin devuelve un


entero

int (*p[10])(char p es una array de 10 punteros a funcin; cada funcin acepta un


* a);
argumento que es un puntero a carcter y devuelve un entero.
int
*(*p[10])(char
a);

p es una array de 10 punteros a funcin; cada funcin acepta un


argumento que es un carcter, y devuelve un puntero a entero.

p es una array de 10 punteros a funcin; cada funcin acepta un


char *(*p[10])(char
argumento que es un carcter, y devuelve un puntero a caracter.
* a);