-" Si esto le parece japonés adivine que dice acá: あなたのお母さんは私のガールフレンドです =D "

Ejercicio 10 (de entrega) : Multiplicación de matrices

| sábado, 28 de agosto de 2010
Aquí dejo el segundo ejercicio que hay que entregar el lunes para poder rendir el parcial.
Muy interesante, mas divertido y práctico que el otro.
Me costó bastante la lógica para poder multiplicar las matrices. Me gustaría saber si hay alguna manera mas eficiente de hacer lo mismo.


/*
* Universidad Nacional de San Juan
* Facultad de Ciencias Exactas Físicas y naturales
* Programación Procedural año 2010
* Iván Neira Reg. 13583
*
* Práctico 1
* Ejercicio 10:
* Dada una matriz cuadrada A de dimesión 7 codificar un programa que permita:
* a) Calcular la traza de la martriz A (Suma de los elementos de la diagonal
* principal).
* b) Dado un escalar e , generar una matriz R resultante del producto escalar
* e*A . Mostrar la matriz R.
* c) Realizar el producto de las matrices A y R y mostrar la matriz resultante.
*/

#include<stdio.h>

#define K 7

void mostrar(int a[][K])
{
int i,j;

for(i=0;i<K;i++)
{
for(j=0;j<K;j++)
{
printf("%d ",a[i][j]);

}
printf("\n");
}

}


void main(void)
{
int i,j,e,k=0,l=0,A[K][K],R[K][K],M[K][K], acumulador=0;

//Ingreso del arreglo

for(i=0;i<K;i++)
{
for(j=0;j<K;j++)
{
printf("\nIngrese valor de la fila %d columna %d\n",i+1,j+1);
scanf("%d",&A[i][j]);
fflush(stdin);
}

}

//muestra arreglo A

mostrar(A);

//Calcula y muestra la traza

for(i=0;i<K;i++)

acumulador+=A[i][i];

printf("\nLa traza resultante de la matriz A es %d\n", acumulador);

//Realiza el producto escalar por un número e ingresado

printf("\nIngrese un número para calcular el producto escalar\n");
scanf("%d",&e);
fflush(stdin);

for(i=0;i<K;i++)
{
for(j=0;j<K;j++)
{
R[i][j]=e*A[i][j];
}
}

//Muestra la matriz resultante del producto escalar R
printf("\nLa matriz resultante R es:\n");

mostrar(R);

acumulador=0;


printf("\nLa matriz resultante de la multipicación de A y R\n");

for(i=0;i<K;i++)
{
l=0;
for(j=0;j<K;j++)
{
acumulador=0;

for(k=0;k<K;k++) acumulador+= A[k][j]*R[i][k];

M[i][l]=acumulador;
l++;
}
}

mostrar(M);

getchar();
}

Opinen, Saludos!

Pasar valores de arreglos bidimensionales a funciones en c

|
Mientras estoy haciendo el ejercicio 10 (con mi teclado y mouse inalámbrico nuevo =D ) me doy cuenta que uso muchas veces la misma sintaxis para mostrar el arreglo. Entonces se me vino la cabeza de hacer una función para poder mostrarla y no secarme la mente en el intento, pero ¿Cómo se pasa el valor de un arreglo bidimensional a una función?

Es sencillo: no se pasa.

Lo que se pasa es la dirección.

Entonces, si tenemos un arreglo simple de 1 dimensión y queremos pasar el valor a una función simplemente se indica el nombre sin los corchetes. por ej:


#include<stdio.h>
#define K 4 //la constante modificable

//void porque no quiero que me devuelva nada a main()
//Atencion a como se pone el corchete vacío para recibir la direccion

void muestra(int a[])
{
int i;
for(i=0;i<K;i++) printf("%d ",a[i]);
}

main()
{
int i,A[K];
for(i=0;i<K;i++)
{
scanf("%d",&A[i]);
fflush(stdin);
}

//Fijate como va sin corchetes ni nada
//y en la funcion se pone distinto al recibirlo
muestra(A);
}


Pero si el arreglo tiene mas de una dimensión hay que darle el valor de las demás dimensiones, por ejemplo:


#include<stdio.h>
#define K 4 //imaginando que trabajamos con una matriz cuadrada

//La primera dimensión no se pone, pero las demás si

void muestra(int a[][K])
{
int i,j;
for(i=0;i<K;i++) for(j=0;j<K;j++)printf("%d ",a[i][j]);
}

main()
{
int i,j,A[K][K];

for(i=0;i<K;i++)
{
for(j=0;j<K;j++)
{
scanf("%d",&A[i][j]);
fflush(stdin);
}
}

//Sigue poniéndose sin corchetes
muestra(A);
}

estem... creo que está bien, que alguien lo compile y me diga si anda.
y... asi es la cosa... Ahora sigo con el 10 a ver que pasa.

Ejercicio 6 (de entrega) , Inserción de elementos en un arreglo

| domingo, 22 de agosto de 2010
El mayor problema de éste ejercicio es que lo cambiaron al paso y la profesora de práctica nunca explicó de qué se trata el nuevo enunciado. Todos mis compañeros tienen su versión y ésta es la mía:

/*
* Universidad Nacional de San Juan
* Facultad de Ciencias Exactas Físicas y naturales
* Programación Procedural año 2010
* Iván Neira Reg. 13583
*
* Práctico 1
* Ejercicio 6:
* "Generar un arreglo de 10 componentes enteras a través de un menú de opciones que:
* a) Permita seleccionar la posición en donde se desea cargar el elemento leído.
* 1) Al principio.
* 2) Al final (a continuación de la última componente)
* 3) Intermedia, en ese caso, leer la posición y validarla (entre 1 y 8)
* (que no supere la posición de la última componente agregada)
* b) Mostrar las posiciones de las componentes libres del arreglo.
*
* Nota: Si la posición que se ingresa está ocupada, desplazar las componentes hacia la
* derecha de modo que sea posible la inseción. Emitir un mensaje cuando no sea posible
* la inserción.
*
* Disponible online en: http://ivpaste.com/v/uKK7uvOI
*/

#include <stdio.h>


int main(int argc, char** argv)
{
int arreglo[10],que,donde,posicion,i;

//Inicializacion del arreglo

for(i=0;i<10;i++)
{
arreglo[i]=-1;
}

//Comienzo del programa

//Muestra arreglo
printf("\n|");
for(i=0;i<10;i++)
{
if(arreglo[i]==-1)printf("%dLibre|",i);
else printf("%d|",arreglo[i]);
}
printf("\n");

//Comienza ingreso

printf("\nIngrese número entero a insertar, o un negativo para terminar\n-numero-");
scanf("%d",&que);
fflush(stdin);

while(que>=0)
{
//Menu
printf("\nIngrese lugar donde desea insertarlo\n1- Al principio\n2- Al final\n3- Intermedio\n4- Reintentar\n-lugar-");
scanf("%d",&donde);

switch(donde)
{
//Inserta en la primer posicion o posicion 0 (cero)
case 1:
arreglo[0]=que;
printf("\nNúmero %d insertado en la primera posición\n",que);
break;
//Inserta en la última posición o posición 9
case 2:
arreglo[9]=que;
printf("\nNúmero %d insertado en la última posición\n",que);
break;
//Inserción intermedia
case 3:
//Pregunta posicion en donde ingresar
printf("\nIngrese posición entre 1 y 8 inclusive\n-posicion-");
scanf("%d",&posicion);
fflush(stdin);
//Verifica que el rango sea correcto
while((posicion<1)||(posicion>8))
{
printf("\nFuera de rango, ingrese nuevamente\n-posicion-");
scanf("%d",&posicion);
fflush(stdin);
}
//Verifica que el lugar no este ocupado
while((arreglo[posicion]!=-1)&&(posicion<=8))
{
printf("\nPosicion %d ocupada\n",posicion);
posicion++;
}
//Agrega el elemento si hubo un espacio libre
if(posicion!=9)
{
arreglo[posicion]=que;
printf("\nNúmero %d insertado en la posición %d\n",que, posicion);
}
else printf("\nNo se pudo insertar el elemento %d, no hay lugar libre\n",que);
break;

//En caso que se equivoque el numero a insertar
case 4:

printf("\n**Reintentar**\n");
break;
//Easter Egg =)
case 99:
printf("\nPongame un 10 =)\n");
break;

}

//Muestra arreglo
printf("\n|");
for(i=0;i<10;i++)
{
if(arreglo[i]==-1)printf("%dLibre|",i);
else printf("%d|",arreglo[i]);
}
printf("\n");

//Siguiente ingreso
printf("\nIngrese número entero a insertar, o un negativo para terminar\n-numero-");
scanf("%d",&que);
fflush(stdin);


}


}


Y hay que entregarlo el Lunes a la tarde así que espero que esté bien porque no pienso modificarlo.

Saludos!

**ACTUALIZACIÓN**
El ejercicio está aprobado pero la profesora dijo que simplifiqué mucho el ejercicio... y si... me lo esperaba, me gusta mas asi, está mas práctico.

Uno mas fácil que el otro

|
Antes que nada no me quiero olvidar de poner que el highlighting del código lo hago online gracias a "online syntax highlighting for c" una herramienta online muy linda para generar directamente los coloreados en html.-

Ahora si, el ejercicio 2 del primer práctico:


/*
 * Universidad Nacional de San Juan
 * Facultad de Ciencias Exactas Físicas y naturales
 * Programación Procedural año 2010
 * Iván Neira Reg. 13583
 *
 * Práctico 1
 * Ejercicio 3:
 * "Un negocio de automotores procesa las ventas realizadas por sus 15 vendedores. Cada
 * vendedor puede vender 0 o mas autos. Por cada auto vendido se ingresa: marca del auto
 * e importe de venta.
 * Las marcas de autos están codificadas de la siguiente manera:
 * 1:Ford, 2:Fiat, 3:Renault, 4:Chevrolet, 5:Peugeot
 * Realizar un algoritmo en C que permita:
 * a) Ingresar información de las ventas realizadas por los distintos vendedores. Por cada
 * vendedor el ingreso de las ventas termina con una marca igual a cero (0).
 * b) Mostrar la cantidad total de autos de marca Fiat vendidos por cada vendedor.
 * c) Mostrar importe promedio de autos vendidos por cada marca.
 * d) Mostrar porcentaje de autos Peugeot vendidos respecto de la cantidad total de
 * unidades vendidas.
 * e) Indicar si se vendieron mas autos marca Renault que marca Chevrolet."
 */

#include <stdio.h>

#define vendedores 3

int main(int argc, char** argv)
{
int i, marca, autos[5], solo_fiat=0,auxiliar;
float importe[5],precio;

//Inicializacion de arreglos acumuladores

for(i=0;i<5;i++)
{
autos[i]=0;
importe[i]=0;
}

for(i=0;i<vendedores;i++)
{
printf("\nVendedor número %d\n",i+1);

printf("\nIngrese marca de vehículo vendido\n");
scanf("%d",&marca);
fflush(stdin);

while(marca!=0)
{
autos[marca-1]++;
printf("\nIngrese importe\n");
scanf("%f",&precio);

importe[marca-1]+=precio;

if(marca==2) solo_fiat++;

printf("\nIngrese marca de vehículo vendido\n");
scanf("%d",&marca);
fflush(stdin);
}

printf("\nEl vendedor %d vendió %d autos marca Fiat\n",i+1,solo_fiat);
solo_fiat=0;

}

printf("\n**Importe promedio de autos vendidos por cada marca**\n");
printf("\nFord: $%f",importe[0]/autos[0]);
printf("\nFiat: $%f",importe[1]/autos[1]);
printf("\nRenault: $%f",importe[2]/autos[2]);
printf("\nChevrolet: $%f",importe[3]/autos[3]);
printf("\nPeugeot: $%f",importe[4]/autos[4]);

auxiliar=autos[0]+autos[1]+autos[2]+autos[3]+autos[4];

printf("\nEl promedio de autos Peugeot vendidos es de %3.2f %%\n",(float)100*autos[4]/auxiliar);

if(autos[2]>autos[3]) printf("\nSe vendieron mas autos Renault que Chevrolet\n");


}


Primer ejercicio

| sábado, 21 de agosto de 2010
Como ya estoy haciendo un par de ejercicios del primer práctico de programación procedural, procedo a postearlo para que quede en acta:

/*
 * Universidad Nacional de San Juan
 * Facultad de Ciencias Exactas Físicas y naturales
 * Programación Procedural año 2010
 * Iván Neira Reg. 13583
 *
 * Práctico 1
 * Ejercicio 2:
 * "Realizar un programa en C que permita:
 * a) Ingresar por teclado números enteros positivos menores que un número ingresado
 * previamente. El ingreso finaliza cuando se lee un número negativo.
 * b) Mostrar el promedio de números válidos ingresados.
 * c) Mostrar el primer y el último valor ingresado.
 * d) Indicar si el ingreso de los mismos fué ordenado ascendentemente.
 */

#include <stdio.h>

int main(int argc, char** argv)
{
int numero_ingresado, numero_nuevo=0, primer_valor, ultimo_valor, acumulador=0,contador=0, ingreso_anterior=0, bandera=0;

printf("\nIngrese un numero entero\n");
scanf("%d",&numero_ingresado);
fflush(stdin);

printf("\nIngrese un numero entero menor a %d . Termine con numero negativo\n",numero_ingresado);
scanf("%d",&numero_nuevo);
fflush(stdin);

primer_valor=numero_nuevo;

while(numero_nuevo>=0)
{
if(numero_nuevo<ingreso_anterior) bandera=1;

if(numero_nuevo<numero_ingresado)
{
printf("\nEl numero ingresado es valido\n");
acumulador+=numero_nuevo;
contador++;

}
else printf("\n%d es mayor o igual que %d\nEl numero ingresado *NO* es valido y no se promediara\n", numero_nuevo, numero_ingresado);

ingreso_anterior=numero_nuevo;
ultimo_valor=numero_nuevo;

printf("\nIngrese un numero entero menor a %d . Termine con numero negativo\n",numero_ingresado);
scanf("%d",&numero_nuevo);
fflush(stdin);

if(numero_nuevo<=0)
printf("\nFin de ingreso\n");

}


printf("\nPromedio de numeros validos ingresados: %f\n",(float)acumulador/contador);

if(bandera==0) printf("\nEl ingreso fue ordenado ascendentemente\n");
else printf("\nEl ingreso *NO* fue ordenado ascendentemente\n");

printf("\nEl primer valor ingresado fue %d\nEl ultimo valor ingresado fue: %d\n",primer_valor,ultimo_valor);

getchar();

}


Que uso?

| viernes, 20 de agosto de 2010
En la facultad me aconsejaron usar el ordinario y rústico borland C++ versión 5 y algo. Me parece una asquerosidad y además funciona bastante mal en Windows 7 asi que por consejo de mi compañero Fede me baje el Netbeans con el compilador cgwin y me anda de primera.
Y para instalarlo es bastante sencillo y cito literalmente la página a continuación:



Descargar el soporte C/C++


Si usted no tiene NetBeans IDE 6.0, vaya a la Página de Descarga de NetBeans IDE 6.0 y descargue una versión IDE que contenga el soporte para C/C++. Si usted tiene una instalación de NetBeans IDE que no incluye el soporte para C/C++, complete los siguientes pasos para agregar el soporte para C/C++ al IDE.

  1. Si su red usa un proxy, seleccione Tools > Options desde el menú principal, seleccione Manual Proxy Settings, introduzca el HTTP y el Puerto de su proxy, y haga click en el botón OK.
  2. Seleccione Tools > Plugins desde el menú principal.
  3. En el cuadro de diálogo Plugins, haga click en la pestaña Available Plugins, y desplácese hasta la categoría C/C++.
  4. Habilite la casilla de verificación C/C++.
  5. Haga click en Install.

    El Instalador de NetBeans IDE se inicia.
  6. En el Instalador de NetBeans IDE, haga click en Next.
  7. Lea el acuerdo de licencia, luego seleccione I Accept the Terms en el botón de selección All License Agreements, y haga click en Next.
  8. Haga click en Install.
  9. Despús de completarse la instalación, seleccione Restart IDE Now o Restart IDE Later y haga click en Finish.

Instalar y Configurar los Compiladores y las Herramientas

El paquete C/C++ de NetBeans requiere un compilador C, un compilador C++, una utilidad make, y un depurador gdb.

Windows

El paquete C/C++ de NetBeans ha sido probado con los siguientes compiladores y herramientas:

  • Cygwin 1.5.21
  • Cygwin gcc-core (compilador C) 3.4.x
  • Cygwin gcc-c++ (compilador C++) 3.4.x
  • Cygwin gdb (Depurador GNU) 6.5.50
  • Cygwin make 3.80

Si usted ya tiene los compiladores GNU Cygwin, GNU make, y el depurador gdb instalados en su sistema Windows y el path está configurado correctamente, asegurese de tener las versiones correctas. Si usted tiene las versiones correctas, entonces no hacen falta configuraciones futuras.

Para verificar las versiones de sus compiladores Cygwin y de sus herramientas:

  1. Verifique la versión de Cygwin escribiendo:

    cygcheck -c cygwin           
  2. Verifique las versiones de los compiladores, make, y gdb escribiendo:
    gcc --version g++ --version make --version gdb --version           

Para instalar los compiladores GNU, make, y el depurador gdb desde cygwin.com:

  1. Descargue el programa Cygwin setup.exe haciendo click en el ícono Install o Update Now! en el centro de la página.
  2. Ejecute el programa setup.exe. Acepte las opciones por defecto hasta llegar a la página Select Your Internet Connection. Seleccione las opciones en esta página que se ajustan mas a sus necesidades. haga click en Next.
  3. En la página Choose Download Site, seleccione una dirección que usted crea que esté relativamente cerca a usted. Haga click en Next.
  4. En la página Select Packages seleccione los paquetes (packages) para descargar. Haga click en el signo + próximo a Devel para expandir las categorías de las herramientas de desarrollo. Quizá usted quiera reajustar el tamaño de la ventana para ver mas categorías al mismo tiempo.
  5. Seleccione cada paquete que desea descargar haciendo click en la etiqueta Skip al lado de cada paquete. Como mínimo, seleccione gcc-core: el compilador C, gcc-g++: el compilador C++, gdb: el depurador GNU, y make: la versión GNU de la utilidad 'make'.
  6. Ahora agregue el directorio del Compilador a su path:

    1. Abra el Panel de Control (Inicio > Configuración > Panel de Control) y haga doble click sobre el ícono Sistema.
    2. Seleccione la pestaña Avanzado y haga click en Variables de Entorno.
    3. En el panel de las Variables de Sistema del cuadro de diálogo Variables de Entorno, seleccione la variable Path y haga click en Editar.
    4. Agregue el directorio directorio-cygwin\bin a la variable Path, y haga click en OK. Por defecto, directorio-cygwin es C:\cygwin. Los nombres de los directorios deben estar separados con punto y coma.
    5. Haga click en OK en el cuadro de diálogo Variables de Entorno y en el cuadro de diálogo Propiedades del Sistema.

y nada mas, saludos!

Hola Mundo

|
Qué tal? Mi nombre es Iván y pienso escribir en este blog lo que mas me interese academicamente. Estudio primer año de Licenciatura en Ciencias de la Computación.
El primer semestre fue bastante aburrido con pseudocódigo pero ahora que estamos mas de lleno en C me parece interesante postear mis ejercicios para tenerlos a mano y que de paso reciba alguna crítica constructiva (o no) de algún compañero o colega (o no).
Si Linus Torvalds hizo una ganzada parecida y ahora esta podrido en plata... digo, hizo un sistema operativo excelente =).

licencia

Licencia de Creative Commons
Ejercicios de programación by Iván Neira (ae) is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Based on a work at paraserlicenciado.blogspot.com.