ejercicios punteros

14
Las librerías estándar de C y C++ (las que se #incluyen < entre símbolos menor-que y mayor-que >) definen en conjunto cientos de funciones, estructuras, tipos, etc. y corremos el riesgo de que tengan el mismo nombre de alguna de nuestras propias funciones o variables, y eso puede provocar errores difíciles de detectar y/o corregir, es el mismo problema que se tiene que resolver en proyectos grandes en que hay varios programas, y que tienen que prestarle atención quienes quieren hacer sus propias librerías, era un problema que se venía arrastrando desde C (sin mas mas); pero C++ ha resuelto el problema de raíz. La solución establecida en C++ son los namespace (namespace = espacio de nombres), por ejemplo si queremos que una variable x y una función f estén en el namespace mate hacemos así: namespace mate { int x, y; float f(int a) { // ... } } Entonces, el siguiente programador que quiera usar la variable x que está en el namespace mate debería hacer esto: mate::x = mate::f(5); Pero se cansaría de escribir “mate::” a cada rato... entonces podría hacer esto: using namespace mate; x = f(5); double y = 3.5; Lo bueno es que su variable y no tiene nada que ver con la que esta en el namespace mate Es exactamente lo mismo que using namespace std, los C++ han puesto todo lo estándar en el namespace std, así que

Upload: daniel-sebastian

Post on 11-Apr-2015

21 views

Category:

Documents


14 download

TRANSCRIPT

Page 1: ejercicios punteros

Las librerías estándar de C y C++ (las que se #incluyen < entre símbolos menor-que y mayor-que >) definen en conjunto cientos de funciones, estructuras, tipos, etc. y corremos el riesgo de que tengan el mismo nombre de alguna de nuestras propias funciones o variables, y eso puede provocar errores difíciles de detectar y/o corregir, es el mismo problema que se tiene que resolver en proyectos grandes en que hay varios programas, y que tienen que prestarle atención quienes quieren hacer sus propias librerías, era un problema que se venía arrastrando desde C (sin mas mas); pero C++ ha resuelto el problema de raíz.

La solución establecida en C++ son los namespace (namespace = espacio de nombres), por ejemplo si queremos que una variable x y una función f estén en el namespace mate hacemos así:

namespace mate { int x, y; float f(int a) { // ... }}

Entonces, el siguiente programador que quiera usar la variable x que está en el namespace mate debería hacer esto: mate::x = mate::f(5);

Pero se cansaría de escribir “mate::” a cada rato... entonces podría hacer esto:

using namespace mate;

x = f(5);double y = 3.5;

Lo bueno es que su variable y no tiene nada que ver con la que esta en el namespace mate

Es exactamente lo mismo que using namespace std, los C++ han puesto todo lo estándar en el namespace std, así que puedes elegir entre using namespace std al principio de tus programas o poner std:: a cada rato.

¿Ventajas? Puedes tener una variable llamada cin, vector, max, sin, string, o cualquiera que se use en una librería estándar, sin ningún problema; esto tiene más importancia si nos damos cuenta de que para evitar nombres repetidos NO hay que memorizar los cientos de nombres usados por las librerías estándar de C++. Por eso preferimos #include <cosita> y no #include <cosita.h>, porque los que no llevan .h están en el namespace std.

#include <iostream>using namespace std;

int cuenta_vocales(char *);

Page 2: ejercicios punteros

int main(){   char cadena[80];   cout << "Introduce cadena: ";   cin.getline(cadena, 80);      //en la llamada a la funcion se le envía el array de caracteres   cout << "Numero de vocales: " << cuenta_vocales(cadena) << endl;   system("pause");}

int cuenta_vocales(char *s) //s contiene la direccion de inicio del array de caracteres{ int cont=0; while(*s) //mientras no llegue al nulo {     switch(toupper(*s)) //toupper pasa el carácter a mayúsculas para hacer la comprobación.      {                          //el carácter original no se modifica.       case 'A': case 'E':       case 'I':       case 'O':       case 'U':  cont++;     }     s++;  }  return cont;}

/*

Realizar un programa  que me permita cargar y mostrar un vector de 10 enteros utilizando punteros.Se debe mostrar también la dirección de memoria de cada elemento del vector.

*/#include <stdio.h>#include <conio.h>

void main(){

int *vdir[10],vect[10];

for(int i=0;i<10;i++){

printf("\nINGRESE Nº:");scanf("%d",&vect[i]);

                vdir[i] = &vect[i];

}

Page 3: ejercicios punteros

for(i=0;i<10;i++)printf("\nDireccion %d, Valor %d ",vdir[i],vect[i]);

getch();}

/*********** EJERCICIO ANTERIOR MEJORADO **************************/

/*

Realizar un programa  que me permita cargar y mostrar un vector de 10 enteros utilizando punteros. Se debe mostrar también la dirección de memoria de cada elemento del vector.

*/ #include <stdio.h> #include <conio.h>

void main() {    int *vdir,vect[10];

   vdir = vect;// vdir = &vect[0];

   for(int i=0;i<10;i++)    {       printf("\nINGRESE Nº:");       scanf("%d",&vect[i]);// scanf("%d",vdir); vdir++

   }

   for(i=0;i<10;i++)       printf("\nDireccion %x, Valor %d ",vdir++,vect[i]);    getch(); }

/*

Realizar un programa que por medio de un menú de opciones y trabajando con

un vector de 10 números reales me permita:a- Cargar el vector b- Ordenar el vectorc- Mostrar el contenido y la dirección de memoria de cada elemento del vector d- Salir*/#include <conio.h>#include <stdio.h>#include <ctype.h>

void main(){

int *vdir[10],vect[10],i,j,flag=0,auxi,*aux;        char op;

do{

Page 4: ejercicios punteros

                clrscr();printf("\nA- Cargar vector\nB- Ordenar vector\nC-

Mostrar\nD- Salir");printf("\nIng. opción:");op = tolower(getche());

switch(op){

case 'a':flag = 1;for(i=0;i<10;i++)

                                {printf("\nIng.Número:");scanf("%d",&vect[i]);vdir[i] = &vect[i];

}break;

case 'b':if(flag==0){

                                printf("\nDebe cargar datos primero");

}else{

for(i=0;i<9;i++)for(j=i+1;j<10;j++){

if(vect[i]>vect[j])                                                        {

    aux = vdir[i];

      vdir[i] = vdir[j];

vdir[j] = aux;                                                       

auxi = vect[i];

vect[i] = vect[j];

vect[j] = auxi;                                                        }

}printf("\nVector ordenado");

}

getch();break;

case 'c':if(flag==0){

                                printf("\nDebe cargar datos primero");

}else{

Page 5: ejercicios punteros

for(i=0;i<10;i++)printf("\nDireccion %d

del valor %d",vdir[i],vect[i]);

}                                getch();

break;case 'd':

break;default:

printf(" <--- Opción incorrecta");                                getch();

}}while(op != 'd');

}

/************** ANTERIOR EJERCICIO CON UN PAR DE TOQs ********************/

/*

   Realizar un programa que por medio de un menú de opciones y trabajando con    un vector de 10 números reales me permita: a-   Cargar el vector b-   Ordenar el vector c-   Mostrar el contenido y la dirección de memoria de cada elemento del vector d-   Salir */ #include <conio.h> #include <stdio.h> #include <ctype.h>

void main() {

   int *vdir,vect[10],i,j,flag=0,auxi;         char op;

   do    {     clrscr();       printf("\nA- Cargar vector\nB- Ordenar vector\nC- Mostrar\nD- Salir");       printf("\nIng. opción:");       op = tolower(getche());

      switch(op)       {          case 'a':

    flag = 1;        vdir = vect;

            for(i=0;i<10;i++)                 {               printf("\nIng.Número:");

scanf("%d",&vect[i]);                        printf("La dirección del número %d es %d",vect[i],&vect[i]);

Page 6: ejercicios punteros

            }             break;          case 'b':             if(flag==0)             {             printf("\nDebe cargar datos primero");             }             else             {                for(i=0;i<9;i++)                   for(j=i+1;j<10;j++)                   {                      if(vect[i]>vect[j])                     {                     

auxi = vect[i];                         vect[i] = vect[j];

vect[j] = auxi;                      

                     }

                  }                printf("\nVector ordenado");             }                          getch();             break;          case 'c':             if(flag==0)             {             printf("\nDebe cargar datos primero");             }             else             {                vdir = vect;               for(i=0;i<10;i++)                   printf("\nDireccion %d del valor %d",vdir++,vect[i]);              }             getch();             break;          case 'd':             break;          default:             printf(" <--- Opción incorrecta");                                 getch();

      }    }while(op != 'd'); }

/*

Cargar el nombre y sueldo de los 10 empleados de una fábrica.El nombre de la persona debe quedar guardado con la inicial enmayúsculas y el resto de las letras en minúsculas.Mostrar los datos ordenados por sueldo.

Page 7: ejercicios punteros

*/

#include <stdio.h>#include <conio.h>#include <string.h>#include <ctype.h>

#define TAM 2

void main(){

char nombre[TAM][25],auxs[50],*puntero;float sueldo[TAM],auxf;

       

clrscr();

for(int i=0;i<TAM;i++){

printf("NOMBRE:");fflush(stdin);gets(auxs);

                strcpy(auxs,strlwr(auxs));// convierte cadena a minuscula STRLWR

puntero = auxs;                auxs[0] = toupper(*puntero);             

strcpy(nombre[i],auxs);

printf("SUELDO:");                scanf("%f",&sueldo[i]);

}

for(i=0;i<TAM-1;i++)for(int j = i+1;j<TAM;j++)

if(sueldo[i]>sueldo[j]){

auxf = sueldo[i];sueldo[i] = sueldo[j];sueldo[j] = auxf;

strcpy(auxs,nombre[i]);strcpy(nombre[i],nombre[j]);strcpy(nombre[j],auxs);

                        }

for(i=0;i<TAM;i++)printf("\nNombre: %s  sueldo:

%.2f",nombre[i],sueldo[i]);

getch();}

/*Cargar el Apellido , nombres y fecha de nacimiento de un máximo de 10 personas,el usuario puede terminar el ingreso cuando lo desee. Todas las iniciales de cada

Page 8: ejercicios punteros

uno de los nombres deben quedar en mayúsculas.Mostrar los datos ingresados ordenados por edad.*/

#include <stdio.h>#include <conio.h>#include <string.h>#include <ctype.h>

#define TAM 4

void main(){

char apellido[TAM][25],nombre[TAM][25],auxs[50],*puntero;int dia[TAM],mes[TAM],anio[TAM],cant,auxi;

        char continuar = 's';

for(int i = 0;i<TAM,continuar == 's';i++){

clrscr();printf("NOMBRE:");fflush(stdin);gets(auxs);strcpy(auxs,strlwr(auxs));// Paso la cadena a minuscula

con la función strlwrpuntero = auxs;auxs[0] = toupper(*puntero);

               strcpy(nombre[i],auxs);

printf("APELLIDO:");fflush(stdin);gets(auxs);strcpy(auxs,strlwr(auxs));puntero = auxs;auxs[0] = toupper(*puntero);

                strcpy(apellido[i],auxs);

printf("FECHA DE NACIEMIENTO:  /  /    ");gotoxy(22,3);scanf("%d",&dia[i]);gotoxy(25,3);scanf("%d",&mes[i]);gotoxy(28,3);scanf("%d",&anio[i]);

if(i != TAM - 1)printf("\nCapacidad para seguir almacenando %d

registros mas... ¿ Desea continuar s/n ? ",TAM - i - 1);continuar = getche();

                cant = i + 1;}       if(cant == 1)

        {printf("\n\nNOMBRE %s APELLIDO %s FECHA NACIMIENTO

%d/%d/%d",nombre[0],apellido[0],dia[0],mes[0],anio[0]);}else

        {for(i=0;i<cant-1;i++){ for(int j=i+1;j<cant;j++)

{ if(anio[i]>anio[j])// USAR ESTRUCTURAS MEJOR

Page 9: ejercicios punteros

{strcpy(auxs,nombre[i]);strcpy(nombre[i],nombre[j]);strcpy(nombre[j],auxs);

strcpy(auxs,apellido[i]);strcpy(apellido[i],apellido[j]);strcpy(apellido[j],auxs);

auxi = dia[i];dia[i] = dia[j];dia[j] = auxi;

auxi = mes[i];mes[i] = mes[j];mes[j] = auxi;

auxi = anio[i];anio[i] = anio[j];anio[j] = auxi;

}if(anio[i] == anio[j] && mes[i]>mes[j]){

                                strcpy(auxs,nombre[i]);strcpy(nombre[i],nombre[j]);strcpy(nombre[j],auxs);

strcpy(auxs,apellido[i]);strcpy(apellido[i],apellido[j]);strcpy(apellido[j],auxs);

auxi = dia[i];dia[i] = dia[j];dia[j] = auxi;

auxi = mes[i];mes[i] = mes[j];mes[j] = auxi;

auxi = anio[i];anio[i] = anio[j];anio[j] = auxi;

}if(anio[i] == anio[j] && mes[i]==mes[j]

&& dia[i]>dia[j]){

                                strcpy(auxs,nombre[i]);strcpy(nombre[i],nombre[j]);strcpy(nombre[j],auxs);

strcpy(auxs,apellido[i]);strcpy(apellido[i],apellido[j]);strcpy(apellido[j],auxs);

auxi = dia[i];dia[i] = dia[j];dia[j] = auxi;

auxi = mes[i];

Page 10: ejercicios punteros

mes[i] = mes[j];mes[j] = auxi;

auxi = anio[i];anio[i] = anio[j];anio[j] = auxi;

}

                                }

                }                               

for(i=0;i<cant;i++)printf("\nNOMBRE %s APELLIDO %s FECHA

NACIMIENTO %d/%d/%d",nombre[i],apellido[i],dia[i],mes[i],anio[i]);

        }getch();

}

/*************** ANTERIOR EJERCICIO USANDO STRUCTURAS ***************************/

/*Cargar el Apellido , nombres y fecha de nacimiento de un máximo de 10 personas,el usuario puede terminar el ingreso cuando lo desee. Todas las iniciales de cadauno de los nombres deben quedar en mayúsculas.Mostrar los datos ingresados ordenados por edad.*/

#include <stdio.h>#include <conio.h>#include <string.h>#include <ctype.h>

#define TAM 4

struct fecha{

int dia, mes, anio;};struct dato{

char apellido[25],nombre[25];struct fecha fnacim;

};

void main(){

char auxs[50],*puntero,continuar = 's';int i,cant;struct dato registros[TAM],auxst;

for(i = 0;i<TAM,continuar == 's';i++){

clrscr();printf("NOMBRE:");fflush(stdin);gets(auxs);

Page 11: ejercicios punteros

strcpy(auxs,strlwr(auxs));// Paso la cadena a minuscula con la función strlwr

puntero = auxs;auxs[0] = toupper(*puntero);

               strcpy(registros[i].nombre,auxs);

printf("APELLIDO:");fflush(stdin);gets(auxs);strcpy(auxs,strlwr(auxs));puntero = auxs;auxs[0] = toupper(*puntero);

                strcpy(registros[i].apellido,auxs);

printf("FECHA DE NACIEMIENTO:  /  /    ");gotoxy(22,3);scanf("%d",&registros[i].fnacim.dia);gotoxy(25,3);scanf("%d",&registros[i].fnacim.mes);gotoxy(28,3);scanf("%d",&registros[i].fnacim.anio);

if(i != TAM - 1)printf("\nCapacidad para seguir almacenando %d

registros mas... ¿ Desea continuar s/n ? ",TAM - i - 1);continuar = getche();

                cant = i + 1;}       if(cant == 1)

        {printf("\n\nNOMBRE %s APELLIDO %s FECHA NACIMIENTO

%d/%d/%d",registros[0].nombre,registros[0].apellido,registros[0].fnacim.dia,registros[0].fnacim.mes,registros[0].fnacim.anio);

}else

        {for(i=0;i<cant-1;i++){ for(int j=i+1;j<cant;j++)

{if(registros[i].fnacim.anio>registros[j].fnacim.anio)

{auxst = registros[i];registros[i] = registros[j];

                                        registros[j] = auxst;}if(registros[i].fnacim.anio ==

registros[j].fnacim.anio && registros[i].fnacim.mes>registros[j].fnacim.mes)

{auxst = registros[i];registros[i] = registros[j];registros[j] = auxst;

}if(registros[i].fnacim.anio ==

registros[j].fnacim.anio && registros[i].fnacim.mes == registros[j].fnacim.mes && registros[i].fnacim.dia>registros[i].fnacim.dia)

{auxst = registros[i];registros[i] = registros[j];registros[j] = auxst;

}

Page 12: ejercicios punteros

                                }

                }                clrscr();                                printf("\n\nNOMBRE____________APELLIDO___________FECHA NACIMIENTO");

for(i=0;i<cant;i++){     gotoxy(1,i+8);printf("%s",registros[i].nombre);     gotoxy(19,i+8);printf("%s",registros[i].apellido);    

gotoxy(38,i+8);printf("%d/%d/%d",registros[i].fnacim.dia,registros[i].fnacim.mes,registros[i].fnacim.anio);                }

}              

      getch();

}