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

Manejo de funciones

| miércoles, 8 de septiembre de 2010
Esta va dedicado a Willi, dale che! hacele un click a la publi!



/*
Ejercicio 4
Una tienda, tiene el registro del importe de las ventas mensuales del año 2009 de cada uno de sus 8
departamentos.
Realizar un programa en C, que a través de funciones permita:
a) Mostrar: el departamento que tuvo mayor importe de venta a lo largo de año (suponer único)
b) El mes en que se vendió más en el departamento número 3. (suponer único)
c) Mostrar importe promedio de venta de la tienda.
d) Mostrar el departamento que superó la venta promedio, indicando el importe total vendido a lo largo de
año.
e) Realizar un listado, ordenado en forma ascendente por importe de venta en el año, que muestre
departamento e importe de venta en el año.
*/

#include <stdio.h>
#include <ctype.h>
#define DEP 2
#define MES 3


//La carga se ingresa por esta funcion y depende de las globales DEP y MES
void carga(float venta[DEP][MES])
{
int i,j;

for(i=0;i<DEP;i++)
{
printf("\nIngrese venta del departamento %d para el mes\n", i+1);

for(j=0;j<MES;j++)
{

switch (j)
{
case 0: printf("Enero ->");
break;
case 1: printf("Febrero ->");
break;
case 2: printf("Marzo ->");
break;
case 3: printf("Abril ->");
break;
case 4: printf("Mayo ->");
break;
case 5: printf("Junio ->");
break;
case 6: printf("Julio ->");
break;
case 7: printf("Agosto ->");
break;
case 8: printf("Septiembre ->");
break;
case 9: printf("Octubre ->");
break;
case 10: printf("Noviembre ->");
break;
case 11: printf("Diciembre ->");
break;
default: printf("\nEsto no debería suceder\n");
break;
}

scanf("%f",&venta[i][j]);
fflush(stdin);
}
}
}


//Esta funcion devuelve un entero con el departamento que tuvo mas venta anual
int mayor_venta(float venta[DEP][MES])
{
float acum=0, max=-1;
int i, j, pos;

for(i=0;i<DEP;i++)
{
for(j=0;j<MES;j++)
acum+=venta[DEP][MES];

if(acum>max)
{
max=acum;
pos=i;
}

acum=0;
}

return i;

}


//Para validar el si o no escribiendo s o n con mayusculas o minusculas y dando
// error en caso de ingresar cualquier garcha.-
void validar_booleano(char &son)
{
scanf("%c",&son);
fflush(stdin);

son=tolower(son);

while((son!='s')&&(son!='n'))
{
printf("\nERROR ingrese nuevamente letra S para si y N para no\n");
scanf("%c",&son);
fflush(stdin);

son=tolower(son);
}

}

//esto es equivalente al scanf("%d",&) pero lo valida con un segundo entero como
// maximo que se ingresa en el momento de llamar la funcion
void validar_numero(int &numero, int cuanto)
{
scanf("%d",&numero);
fflush(stdin);

while(numero>cuanto)
{
printf("\nERROR ingrese nuevamente un numero menor a %d\n",cuanto);
scanf("%d",&numero);
fflush(stdin);
}
}

//Devuelve un entero con la posicion del mes que tuvo mas venta el departamento
// a la funcion debe llamarsele con el entero que representa el numero de
// departamento el cual necesitamos saber su maximo de venta mensual
int mayor_venta_mes(int depto,float venta[DEP][MES])
{
int j,pos;
float acum=0,max=-1;

for(j=0;j<MES;j++)
{
if(venta[depto][MES]>max) max=venta[depto][MES];
pos=j;
}

return pos;
}


//promedia todos los valores del arreglo, lo muestra y devuelve por return
float promedio_venta(float venta[DEP][MES])
{
int i,j,cont=0;
float acum=0,promedio;

for(i=0;i<DEP;i++)
{
for(j=0;j<MES;j++)
{
acum+=venta[i][j];
cont++;
}
}

promedio=acum/cont;

printf("\nEl promedio de ventas TOTAL es de %f\n",promedio);

return promedio;
}

//con esto se puede mostrar la matriz en cualquier momento, util para control tambien
void mostrar(float venta[DEP][MES])
{
int i,j;
for(i=0;i<DEP;i++) for(j=0;j<MES;j++) printf("\ni=%d j=%d v=%f\n",i,j,venta[i][j]);
}


//pide un promedio en float y muestra el mes que lo supera y su venta anual
void supera_promedio(float prom, float venta[DEP][MES])
{
int i,j,b=0;
float acum=0;

for(i=0;i<DEP;i++)
{
for(j=0;j<MES;j++) if (venta[i][j]>prom) b=1;

if(b==1)
{
for(j=0;j<MES;j++) acum+=venta[i][j];

printf("El depto %d tuvo meses con mas venta que el promedio con %f anual",i+1,acum);
}
b=0;
acum=0;
}

}



//****************************************************************************El main =)
int main(int argc, char *argv[])
{
int i,j,dep,mes,imp,b;
char sn;

float venta[DEP][MES],prom,acum;

carga(venta);

printf("\nDesea agregar otra venta algun mes?\nRecuerde que si desea puede quitar venta con valores negativos\nS o N->");
validar_booleano(sn);

//Mientras yo escriba S como respuesta puedo seguir acumulando valores en las ventas
while(sn=='s')
{
printf("\nIngrese numero de departamento\n");
validar_numero(dep,DEP);

printf("\nIngrese mes de venta\n");
validar_numero(mes,MES);

printf("\nIngrese monto de venta\n");
validar_numero(imp,9999);

venta[dep-1][mes-1]+=imp;

printf("\nEl monto ha sido agregado, agregar otra venta?\nS o N->");
validar_booleano(sn);
}

//tiro el printf con la funcion para no escribir al pedo
printf("\nEl departamento que tuvo mayor venta en el anio es el n %d\n",mayor_venta(venta));

printf("\nIngrese departamento para saber el mes de mayor venta\n");
//Reutilizo dep para que no quede al pedo
validar_numero(dep,DEP);

j=mayor_venta_mes(dep-1,venta);

//El switch esta reciclado de mas arriba para que muestre un mes y no un numero
// sería mas práctico hacerlo una funcion pero...
printf("\nEl departamento %d tuvo el mes ",dep);

switch (j)
{
case 0: printf("Enero");
break;
case 1: printf("Febrero");
break;
case 2: printf("Marzo");
break;
case 3: printf("Abril");
break;
case 4: printf("Mayo");
break;
case 5: printf("Junio");
break;
case 6: printf("Julio");
break;
case 7: printf("Agosto");
break;
case 8: printf("Septiembre");
break;
case 9: printf("Octubre");
break;
case 10: printf("Noviembre");
break;
case 11: printf("Diciembre");
break;
default: printf("\nEsto no debería suceder\n");
break;
}

printf(" con mas ventas\n");

prom = promedio_venta(venta);

supera_promedio(prom,venta);

printf("\nWilly hacete el e y somo' lo' mejores\n");

/*
WILFREDO FORNES: INGRESE ACA SU CODIGO FUENTE (o hay tabla)
*/

getchar();
}

Practica de funciones (ejercicio 1 practico 2)

| lunes, 6 de septiembre de 2010
Actualizando en caliente desde el gabinete de computacion!



/*

Realizar en C, un programa que incluya las siguientes funciones:
a)una funcion que lea numeros enteros y cargue un arreglo de 30 componentes
enteros positivos validando la entrada de datos. Cuando el arreglo se completa se termina la escritura
b) Una funcion que retorne los valores 0, -1 o 1 segun el arreglo antes cargado este desordenado
ordenado ascendentemente o descendentemente
c) Una funcion que devuelva el promedio de los valores de las componentes del arreglo que ocupan posiciones
pares y el promedio valores de las componentes del arreglo que ocupan posiciones impares. En el programa
principal indicar el mayor de los promedios.

*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define N 3

// validar numeros solamente enteros y practica de paso de valores por return
int validar_entero(int V)
{
scanf("%d",&V);
fflush(stdin);

while(V<0)
{
printf("\nERROR ingrese nuevamente un numero entero\n");
scanf("%d",&V);
fflush(stdin);
}

return V;
}

//para practicar traspaso por referencias
void validar_booleano(char &son)
{
scanf("%c",&son);
fflush(stdin);

son=tolower(son);

while((son!='s')&&(son!='n'))
{
printf("\nERROR ingrese nuevamente letra S para si y N para no\n");
scanf("%c",&son);
fflush(stdin);

son=tolower(son);
}

}

void carga(int A[])
{
int i=0, v;

for(i=0;i<N;i++)
{
printf("\nIngrese valor %d para arreglo de %d componentes\n",i+1,N);
A[i]=validar_entero(v);
}

}

void mostrar(int A[])
{
int i;
printf("\n");
for(i=0;i<N;i++) printf(" %d ",A[i]);
printf("\n");
}

int orden(int A[])
{
int i,j;

//comprobando ascendentemente
for(i=0;(i<N-1)&&(A[i]<=A[i+1]);i++);

//Comprobando descendentemente
for(j=N-1;(j>0)&&(A[j]<=A[j-1]);j--);

if(i==N-1) return 1;
if(j==0) return -1;

//Comprobar si esta desordenado
if((i!=N-1)&&(j!=0)) return 0;

}

float promedio(int cual, int A[])
{
int i,contador=0;
float que=0;

for(i=cual;i<N;i++)
{

que+=A[i];
contador++;
i++;
}

que=que/contador;

return que;
}

int main(int argc, char *argv[])
{
int A[N];
char c;
float PEPE;

do
{
carga(A);
printf("\nEl arreglo que usted a ingresado es el siguiente\n");
mostrar(A);
printf("\nDesea usted cambiarlo? S o N ?\nS o N->");
validar_booleano(c);
}while(c=='s');

switch(orden(A))
{
case -1: printf("\nEl arreglo esta ordenado descendentemente\n");
break;

case 0: printf("\nEl arreglo esta desordenado\n");
break;

case 1: printf("\nEl arreglo esta ordenado ascendentemente\n");
break;

default:printf("\nEsto no deberia suceder\n");
exit(-1);
getchar();
break;

}


if((promedio(0,A))>(promedio(1,A)))
{
printf("\nEs mayor el promedio de los pares con %f\n",promedio(0,A));
}
else
{
if ((promedio(0,A))<(promedio(1,A)))
{
printf("\nEs mayor el promedio de los impares con %f\n",promedio(1,A));
}
else
{
printf("\nSon iguales con promedio %f\n",promedio(0,A));
}
}

getchar();
}

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.

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.