viernes, 16 de mayo de 2025

03.- Programación I - Apuntadores y Memoria

La siguiente publicación es sobre el uso de apuntadores, la misma contiene tres (3) programas. Copie y ejecute el primer programa, posteriormente compare los programas 2 y 3. El nro. 2 se elaboró sin el uso de apuntadores. El nro. 3 es el mismo programa con el uso de apuntadores



/* Programa Nro 1 muestra el uso del ampersen & y el * con el

manejo de Punteros

Elaborado por Carlos Ferrer*/


#include<iostream>

using namespace std;


main()

{

    int valor=14;

    int *apuntador;


cout <<"    *************** Manejo de memoria *******************                       Pag 1 de 5"<<endl<<endl;

cout <<"    El ampersand (&) es un operador de C++ y es comunmente"<<endl; 

cout <<"    utilizado. Este operador nos permite obtener la direccion"<<endl; 

cout <<"    de memoria de una variable cualquiera y es justo esto"<<endl; 

cout <<"    (la direccion en memoria) es lo que utilizan los programas"<<endl; 

cout <<"    para almacenar los datos o sea los valores asignados a las"<<endl;  

cout <<"    variables"<<endl<<endl; 

cout <<"    Veamos un ejemplo:"<<endl;

cout <<"    Declaremos una variable entera y asignemosle el numero 14=>"<<endl<<endl;

cout <<"                 int valor=14"<<endl<<endl;

cout <<"    Ahora procedamos a imprimir en pantalla la posicion de"<<endl;

cout <<"    memoria, para esto usamos:"<<endl<<endl;

cout <<"                 cout<<&valor;"<<endl<<endl;

cout <<"    El resultado es el siguiente:"<<endl<<endl;

cout<<"                 "<<&valor<<endl<<endl;

cout <<"    En consecuencia en la posicion de memoria "<<&valor<<endl;

cout <<"    es donde esta guardado el numero 14 "<<endl<<endl;

cout <<"    . . . ";

system ("pause");

system ("cls");


cout <<"    *************** Apuntadores *******************                             Pag 2 de 5"<<endl<<endl;

cout <<"    El asterisco (*) es el operador por excelencia"<<endl; 

cout <<"    de los punteros. Su utilidad radica en que si"<<endl; 

cout <<"    el valor de dicho apuntador corresponde a una"<<endl; 

cout <<"    direccion de memoria, el asterisco nos permite"<<endl; 

cout <<"    acceder al valor almacenado alli."<<endl<<endl; 

cout <<"    Viendolo desde otro enfoque, un apuntador permite"<<endl; 

cout <<"    extraer el valor almacenado en una direccion de memoria."<<endl<<endl;

cout <<"    IMPORTANTE: Los apuntadores deben ser del mismo tipo"<<endl; 

cout <<"    que el dato que se desea apuntar."<<endl<<endl; 


cout <<"    Veamos un ejemplo:"<<endl;

cout <<"    Declaremos un apuntador del tipo entero=>"<<endl<<endl;

cout <<"                 int *apuntador"<<endl<<endl;

cout <<"    Ahora hagamos que el apuntador contenga una"<<endl;

cout <<"    posicion de memoria, para esto usaremos el & =>"<<endl<<endl;

cout <<"                 apuntador=&valor"<<endl<<endl;

cout <<"    . . . ";

system ("pause");

system ("cls");

cout <<"    Si imprimimos la variable apuntador                                         Pag 3 de 5"<<endl<<endl; 

cout <<"    cout <<apuntador;"<<endl<<endl; 

cout <<"    que dato esperas que aparezca en pantalla:"<<endl<<endl;

cout <<"    a) La posicion de memoria que donde esta el numero 14 "<<endl; 

cout <<"    b) El numero 14 "<<endl<<endl; 


cout <<"    . . . ";

system ("pause");

system ("cls");


cout <<"    *************** RESPUESTA *******************                               Pag 4 de 5"<<endl<<endl;

cout <<"    Si imprimimos la variable apuntador"<<endl<<endl; 

cout <<"    cout <<apuntador;"<<endl<<endl; 

cout <<"    que dato esperas que aparezca en pantalla:"<<endl<<endl;

cout <<"    Opcion A=>"<<endl<<endl;

apuntador=&valor;

cout <<"    La posicion de memoria que donde esta el numero 14 "<<endl<<endl;

cout <<"                    "<<apuntador<<endl<<endl;  

cout <<"    . . . ";

system ("pause");

system ("cls"); 

cout <<"    Si queremos imprimir el valor de la posicion de memoria                     Pag 5 de 5"<<endl;  

cout <<"    corresponde usar el operador *"<<endl<<endl;  

cout <<"    para imprimir el dato de la posicion de memoria debemos"<<endl;

cout <<"    cambiar => cout <<apuntador;"<<endl; 

cout <<"        por => cout <<*apuntador;"<<endl<<endl; 

cout <<"            El resultado sera = "<<*apuntador<<endl<<endl; 


cout <<"                EXITO!!!!"<<endl<<endl;  

system ("pause");

}

--------------------------------------------------------------------

Programa Nro2

/*Este programa contabiliza la cantidad de letras A dentro de 

una cadena de caracteres sin el uso de punteros*/

#include<iostream>

using namespace std;

string texto;

main()

{

int i;

int contador=0;

cout <<"ingrese la cadena de caracteres"<<endl;

getline(cin, texto);

for (i=0;i<=29;i=i+1)

         {

if(texto[i]=='A' or texto[i]=='a')

            {

    contador=contador+1;

            }

                }


cout <<"Tu cadena de caracteres tiene la cantidad de "<<contador<< " letras A"<<endl;

system("pause");

}

-------------------------------------------------------------------

Programa Nro3

/*Este programa contabiliza la cantidad de letras A dentro de 

una cadena de caracteres usando punteros*/


#include<iostream>

using namespace std;

string texto;

main()

{

int contador;

char *puntero;

cout <<"ingrese la cadena de caracteres (1 palabra)"<<endl;

getline(cin, texto);

puntero=&texto[0];

while(*puntero)

{

if(*puntero=='A' or *puntero=='a')

         {

contador=contador+1;

        }

puntero=puntero+1;

}

cout <<"Tu cadena de caracteres tiene la cantidad de "<<contador<< " letras A"<<endl;

system("pause");

}

-------------------------------------------------------------------

Programa Nro4

Otro ejemplo veamos un programa que le envía dos arreglos a una función y este le retorna el valor máximo y mínimo contenido en cada arreglo (usando punteros).


#include<iostream>

using namespace std;


void funcion_unica (double aux1[],double aux2[],int aux1_largo,int aux2_largo,double *a1_min,double *a1_max,double *a2_min,double *a2_max)

{

double aux1_max,aux1_min,aux2_max,aux2_min;

int i;

aux1_max=aux1[0];

aux2_max=aux2[0];

aux1_min=aux1[0];

aux2_min=aux2[0];

for (i=1;i<aux1_largo;i=i+1)

{

if(aux1[i]>aux1_max)

{

aux1_max=aux1[i];

}

if(aux1[i]<aux1_min)

{

aux1_min=aux1[i];

}

*a1_min=aux1_min;

*a1_max=aux1_max;

}

for (i=1;i<aux2_largo;i=i+1)

{

if(aux2[i]>aux2_max)

{

aux2_max=aux2[i];

}

if(aux2[i]<aux2_min)

{

aux2_min=aux2[i];

}

}

*a2_min=aux2_min;

*a2_max=aux2_max;

}

main()

{

double a1[]={12,13,14,15,1,2,1,6,7,8,9,0,12};

double a2[]={1,-23,3.2,4,5,6,7,8,9,12,12,1,0,34,23};

double min_a1,max_a1,min_a2,max_a2;

    int largo_a1, largo_a2;

     largo_a1=sizeof(a1)/sizeof(a1[0]);

largo_a2=sizeof(a2)/sizeof(a2[0]);

funcion_unica(a1,a2,largo_a1,largo_a2,&min_a1,&max_a1,&min_a2,&max_a2);

cout<<min_a1<<endl;

cout<<max_a1<<endl;

cout<<min_a2<<endl;

cout<<max_a2<<endl;


}

jueves, 15 de mayo de 2025

03.- Programación I - Funciones

Una función en C++ es un fragmento de código que se puede llamar desde cualquier punto de un programa principal (main). En C++ podemos diferenciar entre dos tipos de funciones:

  • Aquellas que no tienen retorno void  (Vacias).
  • Aquellas que retornan un tipo de dato (como int, double o cualquier otro),

IMPORTANTE: NO SOBREUTILICE LAS FUNCIONES, EL USO DE LAS MISMAS SE JUSTIFICA SI DENTRO DE LOS PROGRAMAS HAY PROCEDIMIENTOS QUE SE REPITEN MULTIPLES VECES.

ORGANIZAR UN PROGRAMA CON EL USO DE LAS FUNCIONES  PUEDE SER UNA COSTUMBRE INAPROPIADA.


Ejemplo de función tipo void:



#include <iostream>
using namespace std;

void sumaDosEnteros (int entero1, int entero2) 
{
    int resultado = 0;
    resultado = entero1 + entero2;
  cout <<endl<<"Si sumamos "<<entero1<<" + "<<entero2<< " obtenemos el numero = "<<resultado<<endl<<endl;
     system("pause");
     return; 
}
int main() 
{
 int numero[3]={0};
 int i;
 cout<<"Bienvenidos al programa que suma 2 numeros usando funciones con void"<<endl;
 cout<<"Elaborado por Carlos Ferrer"<<endl;

 for(i=1;i<=2;i=i+1)
     {
     cout <<endl<<"Ingrese numero "<<i<<" = ";
     cin >>numero[i];
     }

 sumaDosEnteros(numero[1],numero[2]);
 return 0;
}

Veamos el mismo programa usando función de retorno:

#include <iostream>
using namespace std;

int sumaDosEnteros (int entero1, int entero2) 
    {
     int resultado = 0;
     resultado = entero1 + entero2;
     return resultado; 
    }

main() 
{
 int numero[3]={0};
 int i;
 cout<<"Bienvenidos al programa que suma 2 numeros usando funciones de retorno de dato"<<endl;
 cout<<"Elaborado por Carlos Ferrer"<<endl;

 for(i=1;i<=2;i=i+1)
     {
     cout <<endl<<"Ingrese numero "<<i<<" = ";
     cin >>numero[i];
     }
cout <<endl<<"Si sumamos "<<numero[1]<<" + "<<numero[2]<< " obtenemos el numero = "<<sumaDosEnteros(numero[1],numero[2])<<endl<<endl;
 system("pause");
 }

Como vemos, las funciones las hemos situado antes de la función main. Alternativamente, podemos situar el cuerpo de las funciones después de la función main. Veamos nuevamente los dos programas haciendo ese ajuste de posición (Colocando la función al final).

 

Ejemplo de función tipo void - colocando la función al final (Noten la doble declaración):


#include <iostream>
using namespace std;

int main() 
{
 int numero[3]={0};
 int i;
 void sumaDosEnteros (int entero1, int entero2); //PRIMERA DECLARACIÓN

 cout<<"Bienvenidos al programa que suma 2 numeros usando funciones con void"<<endl;
 cout<<"Elaborado por Carlos Ferrer"<<endl;

  for(i=1;i<=2;i=i+1)
 {
 cout <<endl<<"Ingrese numero "<<i<<" = ";
 cin >>numero[i];
 }

sumaDosEnteros(numero[1],numero[2]); 
return 0;

}

void sumaDosEnteros (int entero1, int entero2) //2da DECLARACION Y DESARROLLO
{
 int resultado = 0;
 resultado = entero1 + entero2;
cout <<endl<<"Si sumamos "<<entero1<<" + "<<entero2<< " obtenemos el numero = "<<resultado<<endl<<endl;

 system("pause");
 return; 
}

Veamos el mismo programa usando función de retorno - colocando la función al final (Noten nuevamente la doble declaración):


#include <iostream>
using namespace std;

int main() 

{

 int numero[3]={0};
 int i;
 int sumaDosEnteros (int entero1, int entero2);  //1ra DECLARACIÓN

 cout<<"Bienvenidos al programa que suma 2 numeros usando funciones de retorno de dato"<<endl;
 cout<<"Elaborado por Carlos Ferrer"<<endl;

 for(i=1;i<=2;i=i+1)
 {
 cout <<endl<<"Ingrese numero "<<i<<" = ";
 cin >>numero[i];
 }

 cout <<endl<<"Si sumamos "<<numero[1]<<" + "<<numero[2]<< " obtenemos el numero = "<<sumaDosEnteros(numero[1],numero[2])<<endl<<endl;
 system("pause");

 return 0;

}

int sumaDosEnteros (int entero1, int entero2) //2da DECLARACIÓN Y DESARROLLO
{
 int resultado = 0;
 resultado = entero1 + entero2;
 return resultado; 
}

Por último, les dejo un programa sencillo, con el cual un profesor de primaria calcula la nota promedio de sus alumnos - máximo 20 alumnos, que pueden cursar hasta un máximo de 10 materias distintas. El ejemplo usa una función de retorno de datos. En este caso especifico se le envía un arreglo a la función, y la función recibe el arreglo sin importar la cantidad de elementos que son enviados.

#include <iostream>
using namespace std;

main() 
{

    float notas[11];
    string nombre[21]={""};
    string opcion="s";
    int n, i, j=1;
    float notas_finales[21]={0};
    float promedio(float valores[], int cantidad); 

   cout<<"Elaborado por Carlos Ferrer"<<endl;

    while ((opcion== "s" or opcion == "S") and j<20)
    {
        cout<<"Escriba el apellido del alumno nro "<<j<<" (Max 20)= ";
        cin>> nombre[j];
n=0;
while(n<1 or n>10)
{
cout<<"Cuantas notas tiene "<<nombre[j]<<" (Max 10)= ";
    cin>> n;
}

       for (i = 0; i < n; i=i+1) 
      {
         notas[i]=-1;
         while(notas[i]<0 or notas[i]>20)
{
cout<<"  Nota "<< i + 1<<" (Rango 0-20)= ";
                cin>> notas[i];
                }
      }
        notas_finales[j]=promedio(notas, n);
        cout<<"El promedio de "<<nombre[j]<<" es: "<< notas_finales[j]<<endl;

        cout<<"Desea calcular mas promedios (S=continuar)? ";
        cin>> opcion;
        j=j+1;
       system ("cls");

    }
    i=1;
    cout <<endl<<"RESUMEN"<<endl;
    while (nombre[i] != "" and i<21)
    {
    cout<<"El alumno "<<nombre[i]<<" tiene un promedio de = "<<notas_finales[i]<<endl;
    i=i+1;
   }

}



float promedio (float valores[], int cantidad) 

{

    int i;
    float suma = 0.0;     /*El ciclo for cuenta el número de notas que desea promediar*/

    for (i = 0; i < cantidad; i=i+1)

    {
    suma=suma+valores[i];
    }

    suma=suma/cantidad;
    return suma;

}

IMPORTANTE: Para retornar mas de un datos desde una función se puede utilizar datos de memoria con la técnica de los apuntadores.

Éxitos !!!!

miércoles, 7 de mayo de 2025

02.- Programación I - Parcial Nro. 2 (Solución del Profesor)

  



Solución

/* Programa parcial Nro. 2 - Modelo 3
cátedra: programación I
Profesor: Carlos Ferrer
Semestre (2025-II)
Rev. mayo 2025
*/

#include <iostream>
#include <windows.h>
#include <locale.h>
#include <conio.h>
#include <time.h>
using namespace std;

main()
{
char opcion;
int aux,i,j=0;
float numero;
string frase;
string palabras[100];

setlocale(LC_ALL,"spanish");

// Aplicamos técnica del Kbit / getch

cout <<"ingrese opción según instrucciones ";
repetir:
if (kbhit!=0)
{
opcion=getch();
if (opcion=='N' or opcion=='n')
{
goto Aleatorio1;
}
if (opcion=='$')
{
goto Aleatorio2;
}
}
Beep(250,250);
goto repetir;

//Generamos un numero aleatorio entre -33 y 35

Aleatorio1:
system ("cls");
srand(time(NULL));
aux= -33 + rand()%89;


//Validamos si el numero aleatorio es impar, lo imprimimos y nos salimos del programa

if (aux%2!=0)
{
cout <<"Numero aleatorio impar entre -33 y 35 = ";
cout <<aux<<endl<<endl;
return 0;
}
//Si el numero es par ingresamos la frase

cout <<"El numero aleatorio fue par = "<<aux<<endl<<endl;
nuevamente:
cout <<"Ingrese frase de mínimo cuatro (4) palabras = "<<endl;
getline (cin,frase);

//Validamos si la frase tiene mínimo 4 palabras

for (i=0;i<=frase.size()-1;i=i+1)
{
if(frase[i]==' ')
{
j=j+1;
}
}


if (j<3)
{
j=0;
cout <<"La frase debe ser de 4 palabras!!!";
Beep(250,250);
Sleep (1000);
system ("cls");
goto nuevamente;
}

//Separamos las palabras de la frase en un arreglo string (Palabra por palabra)
j=1;
for (i=0;i<=frase.size()-1;i=i+1)
{
if(frase[i]!=' ')
{
palabras[j]=palabras[j]+frase[i];
}
else 
{
j=j+1;
}
}


//imprimimos las palabras del arreglo en sentido inverso y nos salimos del programa

j=1;

cout <<endl<<"La frase con las letras de cada palabra invertida es:"<<endl;
while (palabras[j].size()>0)
{
for(i=palabras[j].size()-1;i>=0;i=i-1)
{
cout <<palabras[j][i];
}
j=j+1;
cout<<" ";
}
cout <<endl;
return 0;

//Creamos los 10 números aleatorios y los imprimimos en pantalla

Aleatorio2:
system ("cls");
cout <<"Numeros aleatorios :";
srand(time(NULL));
for(i=1;i<=10;i=i+1)
{
aux= -5 + rand()%41;
numero=aux;
numero=numero/10;
cout <<numero;
if (i<=9)
{
cout <<" / ";
}
Beep(500,500);
}
}

domingo, 27 de abril de 2025

02.- Programación I - Regla de Cramer (Sistema de tres ecuaciones con tres incognitas)

PROGRAMA 


/* Programa para resolver sistemas de 3 ecuaciones 

   con 3 incógnitas aplicando el método de Cramer

   elaborado por Carlos Ferrer

   rev 26 de abril de 2025

*/


#include <iostream>

#include <locale.h>


using namespace std;


main()

{


int fila,col,i,j,k,m,fin;

int ma [4][5]={0};

int aux [6][4]={0};

int delta,deltax,deltay,deltaz;

string frase;

char delt=30;


setlocale (LC_ALL,"spanish");

cout <<"Método de Cramer resolver sistemas de tres ecuaciones"<<endl;

cout <<"con tres incógnitas"<<endl<<endl;


// Leemos los coeficientes de las tres ecuaciones


for (i=1;i<=3;i=i+1)

{

for (j=1;j<=4;j=j+1)

{

if (j==1)

{

frase="el coeficiente de la variable X";

}

if (j==2)

{

frase="el coeficiente de la variable Y";

}

if (j==3)

{

frase="el coeficiente de la variable Z";

}

if (j==4)

{

frase="el valor del resultado";

}

cout <<endl<<endl<<"Ingrese "<<frase<<" de la"<<endl;

cout <<"ecuación Nro. "<<i <<"= ";

cin >>ma[i][j];

system("cls");

// Presentamos las ecuaciones en la medida que se escriben

for (m=1;m<=i;m=m+1)

{

cout <<endl;

if (m==i)

{

fin=j;

    }

else

{

fin=4;

}

for (k=1;k<=fin;k=k+1)

{

if(k==1)

{

cout <<ma[m][k]<<"x";

}

if(k==2 and ma[m][k]>0)

{

cout <<"+"<<ma[m][k]<<"y";

}

if(k==2 and ma[m][k]<0)

{

cout <<ma[m][k]<<"y";

}

if(k==3 and ma[m][k]>0)

{

cout <<"+"<<ma[m][k]<<"z";

}

if(k==3 and ma[m][k]<0)

{

cout <<ma[m][k]<<"z";

}

if(k==4)

{

cout <<"="<<ma[m][k];

}

}

}

}

}

cout <<endl<<endl;

//Imprimimos la matriz ingresada

for (fila=1;fila<=3;fila=fila+1)

{

cout <<"|";

for (col=1;col<=3;col=col+1)

    {

    cout <<ma[fila][col];

if (ma[fila][col]<0)

{

cout <<" ";

}

else

{

cout <<"  ";

}

}

    cout <<"|";

cout<<endl;

}


// Copiamos la matriz ingresada en la matriz aux

for (fila=1;fila<=3;fila=fila+1)

{

for (col=1;col<=3;col=col+1)

    {

      aux[fila][col]=ma[fila][col];

}

}


// Copiamos las dos primeras filas en las filas cuatro y cinco

for (fila=1;fila<=2;fila=fila+1)

{

for (col=1;col<=3;col=col+1)

    {

    aux[fila+3][col]=aux[fila][col];

}

}



// Calculamos delta


delta=0;

col=1;

for (fila=1;fila<=3;fila=fila+1)

{

delta=delta+ ((aux[fila][1]*aux[fila+1][2]*aux[fila+2][3])-(aux[fila][3]*aux[fila+1][2]*aux[fila+2][1]));

}



// Copiamos la matriz original en la matriz aux

for (fila=1;fila<=3;fila=fila+1)

{

for (col=1;col<=3;col=col+1)

    {

      aux[fila][col]=ma[fila][col];

}

}


//Copiamos los resultados en la primera columna


aux[1][1]=ma[1][4];

aux[2][1]=ma[2][4];

aux[3][1]=ma[3][4];


// Repetimos las dos primeras filas en las filas cuatro y cinco

for (fila=1;fila<=2;fila=fila+1)

{

for (col=1;col<=3;col=col+1)

    {

      aux[fila+3][col]=aux[fila][col];

}

}


// Calculamos delta x

deltax=0;

col=1;

for (fila=1;fila<=3;fila=fila+1)

{

deltax=deltax+ ((aux[fila][1]*aux[fila+1][2]*aux[fila+2][3])-(aux[fila][3]*aux[fila+1][2]*aux[fila+2][1]));

}



// Copiamos la matriz original en la matriz aux

for (fila=1;fila<=3;fila=fila+1)

{

for (col=1;col<=3;col=col+1)

  {

      aux[fila][col]=ma[fila][col];

}

}


//Copiamos los resultados en la segunda columna


aux[1][2]=ma[1][4];

aux[2][2]=ma[2][4];

aux[3][2]=ma[3][4];


// Repetimos las dos primeras filas en las filas cuatro y cinco

for (fila=1;fila<=2;fila=fila+1)

{

for (col=1;col<=3;col=col+1)

    {

      aux[fila+3][col]=aux[fila][col];

}

}

// Calculamos delta y

deltay=0;

col=1;

for (fila=1;fila<=3;fila=fila+1)

{

deltay=deltay+ ((aux[fila][1]*aux[fila+1][2]*aux[fila+2][3])-(aux[fila][3]*aux[fila+1][2]*aux[fila+2][1]));

}



// Copiamos la matriz original en la matriz aux

for (fila=1;fila<=3;fila=fila+1)

{

for (col=1;col<=3;col=col+1)

    {

      aux[fila][col]=ma[fila][col];

}

}


//Copiamos los resultados en la tercera columna


aux[1][3]=ma[1][4];

aux[2][3]=ma[2][4];

aux[3][3]=ma[3][4];


// Repetimos las dos primeras filas en las filas cuatro y cinco

for (fila=1;fila<=2;fila=fila+1)

{

for (col=1;col<=3;col=col+1)

    {

      aux[fila+3][col]=aux[fila][col];

}

}

// Calculamos delta z


deltaz=0;

col=1;

for (fila=1;fila<=3;fila=fila+1)

{

deltaz=deltaz+ ((aux[fila][1]*aux[fila+1][2]*aux[fila+2][3])-(aux[fila][3]*aux[fila+1][2]*aux[fila+2][1]));

}



// Presentamos resultados


cout <<endl<<delt<<"="<<delta<<endl;

cout <<delt<<"x="<<deltax<<endl;

cout <<delt<<"y="<<deltay<<endl;

cout <<delt<<"z="<<deltaz<<endl;


cout <<endl<<"El valor de la variable x="<<deltax/delta<<endl;

cout <<"El valor de la variable y="<<deltay/delta<<endl; 

cout <<"El valor de la variable z="<<deltaz/delta<<endl;

}