Problema con un ejercicio

Iniciado por gabyricardo92, 10 Julio 2013, 14:12 PM

0 Miembros y 1 Visitante están viendo este tema.

gabyricardo92

Buenos dias gente! Estoy tratando de determinar un problema que tengo puntualmente con el punto B, A continuación dejo mi código

#include <stdio.h>
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define CE 3+1
#define CM 12+1
#define CL 12+1

void inicio(char[][CL],int[]);
void proceso(int[],float[],float[],float[][CE],float*);
void Asterico(char);
void ordenar(int[],char[][CL],float[]);
void puntoa(int[],char[][CL],float[]);
void puntob(float []);
void puntod(float[][CE],char vnom[][CL]);
int UsuContra();
int Menu();

int main () {
UsuContra();
Menu();
}

void Asterisco(char asterisco[])
{
int i=0;
fflush(stdin);
do
{
asterisco[i] = (unsigned char)getch();
if(asterisco[i]!=8)
{
printf("*");
i++;
}
else if(i>0)
{
printf("%s, %s, %s", (char) 8, (char) 32, (char) 8);
i--;
}
fflush(stdin);
}while(asterisco[i-1]!=13);
asterisco[i-1] = 0;
}


int UsuContra() {
const char USUARIO[] ="123";
const char PASSWORD[] ="123";
const int intentos =3;
int i,j=3;
char usuario[100];
char clave[100]; 

for (i=0;i<intentos;i++) {
j--;
printf("Introduzca nombre de usuario\n");
scanf("%s", &usuario);
if (strcmp(USUARIO, usuario) != 0) {
printf("\tSu nombre de usuario es incorrecto. Intentos restantes %d\n", j );
continue;
}
printf("Ingrese su clave por favor");
Asterisco(clave);
if (strcmp(PASSWORD, clave) != 0) {
printf("\tSu clave es invalida. Intentos restantes %d\n", j);
continue;
}
printf("\t== Usuario y clave correctos, accediento al programa ==\n");
break;

}
if (i==intentos){
printf("\nSupero el numero de intentos, el programa se cerrara\t");
system("pause");
exit(0);
}

}
void inicio(char vnom[][CL],int vle[])
{
int  i;
printf("Bienvenido a la carga de datos. Se redujo de 60 docentes a 4 para que sea mas sencilla su evaluacion.\n" );
printf("Primero, ingrese el legajo y la categoria a donde pertenece cada docente.\n");
for(i=1;i<CE;i++)
{
printf("Ingrese legajo:\n");
fflush(stdin);
scanf("%d",&vle[i]);
printf("Ingrese categoria a donde pertenece\n:");fflush(stdin);gets(vnom[i]);

}

}
void proceso(int vleg[],float vsa[],float vsm[],float mme[][CE],float*total)
{
float vh  = 0.0;
int   mes = 0;
int   leg = 0;
int   ch  = 0;
float s;
int   i;
     int vcmeses[12];
printf("ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n");
printf("Procedamos al segundo lote de informacion.\n" );
printf("Teniendo en cuenta los docentes registrados en la base de datos.\n");
printf("ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹\n");
do {
printf("Ingrese Legajo:\n");
fflush(stdin);
scanf("%d",&leg);
}while(leg<=0);
while(leg != 0)
{
printf("Ingrese mes de registro:");
fflush(stdin);
scanf("%d",&mes);
printf("Ingrese la cantidad de horas trabajadas");
fflush(stdin);
scanf("%d",&ch);
printf("Ingrese valor de la hora");
fflush(stdin);
scanf("%f",&vh);
i=1;
while(i<CE&&leg!=vleg[i])i++;
if(i<=CE)
{
s=vh*ch;
vsa[i]+=s;
vsm[i]=vsm[i]+s;
mme[mes][i]+=s;
(*total)+=s;
}
if (i<CM){
vcmeses[i]+=s;
}
printf("Ingrese legajo o 0 para finalizar la carga");
fflush(stdin);
scanf("%d",&leg);
}
}

void puntoa(int vle[],char vnom[][CL],float vsa[])
{
int i;
system("cls");
printf("\nPUNTO A");
printf("\n=======\n");
for(i=1;i<CE;i++)printf("\t Legajo: %d, Categoria: %s, Sueldo anual del docente %5.2f\n",vle[i],vnom[i],vsa[i]);
getch();
}

void puntob(float vcmeses[]) {
int i;
system("cls");
printf("\nPUNTO B");
printf("\n=======\n");
for(i=1;i<CM;i++) printf("\t Numero del mes : %8d Cantidad de sueldo pagado %15.2f\n",i,vcmeses[i]);
getch();
}

void puntod(float mme[][CE],char vnom[][CL]) {

system("cls");
int pos,i,f,c;
float max;
printf("\nPUNTO D Maximo sueldo pagado cada mes.");
printf("\n=======\n");
for(f=1;f<CM;f++)
       {
max = -999;
for(c=1;c<CE;c++)
if(mme[f][c] > max)
{
max = mme[f][c];
pos = c;
}
printf("\nMES:%8d Sueldo maximo pagado:%15.2fs y lo percibio un docente de la categoria numero %s\n",f,max,vnom[pos]);
}
}

int Menu () {
int   vle [CE]={0};
char  vnom[CE][CL];
float vsa [CE]={0.0};
float vsm [CM]={0.0};
float mme [CM][CE]={{0.0}};
float total = 0.0;
int opcion,validador=0;
do {
printf("ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n");
printf("\t== Bienvenido al Menu del Programa ==\n");
printf("\t== Escoja la opcion deseada para continuar ==\n");
printf("\t== Primero es necesario que cargue los datos ==\n");
printf("\t0) Cargar datos\n");
printf("\t1) Punto A\n");
printf("\t2) Punto B\n");
printf("\t3) Punto D\n");
printf("\t3) Punto H\n");
printf("\t5) Salir del programa\n\n");
printf("ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹\n");
scanf("%d", &opcion);


switch (opcion) {

case 0:
validador=validador+1;
if(validador>=2){
system("cls");
printf("Datos ya cargados. No puede volver a realizar la operacion\n");
}
else {
printf("Accediendo a la carga de datos");
system("cls");
inicio(vnom,vle);
proceso(vle,vsa,vsm,mme,&total);

}
break;
case 1:
if(validador==0) {
system("cls");
printf("ERROR. Primero debe cargar los datos.\n");
}
else {
printf("\t == Calculando sueldo anual de cada profesor == \n");
puntoa(vle,vnom,vsa);
system("cls");
}
break;
case 2:
if(validador==0) {
system("cls");
printf("ERROR. Primero debe cargar los datos.\n");
}
else {

printf("\t == Calculando total de sueldos pagados por cada mes == \n");
puntob(vsm);
system("cls");
}
break;
case 3:
if(validador==0) {
system("cls");
printf("ERROR. Primero debe cargar los datos.\n");
}
else {
printf("\t == Calculando maximo sueldo pagado cada mes == \n");
puntod(mme,vnom);
}
break;
case 4:
if(validador==0) {
system("cls");
printf("ERROR. Primero debe cargar los datos.\n");
}
else {

printf("\t == Imprimiendo los datos solicitados ordenados de menor a mayor == \n");
}
break;
case 5:
printf("\t ==Saliendo del programa == \n");
exit(0);
default:
printf("\tLa opcion %d ingresada no es valida. Vuelva a intentarlo\n", opcion);
}
}while(opcion!=10);
Menu();
}


Les puntualizo las dos partes donde creo que esta el problema:
void puntob(float vcmeses[]) {
int i;
system("cls");
printf("\nPUNTO B");
printf("\n=======\n");
for(i=1;i<CM;i++) printf("\t Numero del mes : %8d Cantidad de sueldo pagado %15.2f\n",i,vcmeses[i]);
getch();
}


void proceso(int vleg[],float vsa[],float vsm[],float mme[][CE],float*total)
{
float vh  = 0.0;
int   mes = 0;
int   leg = 0;
int   ch  = 0;
float s;
int   i;
     int vcmeses[12];
printf("ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n");
printf("Procedamos al segundo lote de informacion.\n" );
printf("Teniendo en cuenta los docentes registrados en la base de datos.\n");
printf("ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹\n");
do {
printf("Ingrese Legajo:\n");
fflush(stdin);
scanf("%d",&leg);
}while(leg<=0);
while(leg != 0)
{
printf("Ingrese mes de registro:");
fflush(stdin);
scanf("%d",&mes);
printf("Ingrese la cantidad de horas trabajadas");
fflush(stdin);
scanf("%d",&ch);
printf("Ingrese valor de la hora");
fflush(stdin);
scanf("%f",&vh);
i=1;
while(i<CE&&leg!=vleg[i])i++;
if(i<=CE)
{
s=vh*ch;
vsa[i]+=s;
vsm[i]=vsm[i]+s;
mme[mes][i]+=s;
(*total)+=s;
}
if (i<CM){
vcmeses[i]+=s;
}


El problema que estoy teniendo es que por ejemplo yo pongo a un profesor en el mes 4, y sin embargo el programa a la hora de darme el resultado me lo da en el mes 3 como maximo, no me aparece el resto de los meses, agradeceria de todo corazon a quien pudiera ayudarme a encontrar la solucion, muchisimas gracias


eferion

Para empezar tu código es horrible, no lo tomes a mal, o bueno mejor si. Aparte no tiene sentido que plantes mil líneas de código porque sí... tienes que hacer tú la labor de investigación, aislar el problema e intentar solucionarlo. Si aún así te atascas entonces es cuando vienes aquí y plasmas la zona problemática comentando hasta dónde has llegado.

Llegar a un foro y decir... no me funciona mi programa... ahí os lo dejo... es lo que he dicho otras veces, ese tipo de trabajos cuestan dinero.

Si quieres que el código sea un poco más legible edita tu mensaje y la etiqueta que engloba el código modifícala para que quede tal que [ code = c ] pero sin espacios.

Después estaría genial que tabulases el texto para poder seguir un poco la traza de forma visual sin dejarse la vista.

Tener funciones cuyo nombre no dice nada como puntoa, puntob, puntoc es de las peores decisiones que puedes tomar a la hora de programar... ese nombre no aporta nada y tener que recordar después de unas semanas lo que hacía esa función puede significar recorrer un tortuoso camino.

No uses fflush( stdin ) no es portable y puede dar muuuchos problemas, hay otras formas más elegantes y usables de limpiar el buffer de entrada... por ejemplo ( no digo que tengas que usar esta, ni que sea la mejor, ni la única )

fseek( stdin, 0, SEEK_END );

Al fin y al cabo el buffer de entrada tiene la misma estructura en memoria que un archivo.

Más cosas, el primer elemento de un array es siempre el que tiene índice 0, por lo que las líneas


for(i=1;i<CE;i++)printf("\t Legajo: %d, Categoria: %s, Sueldo anual del docente %5.2f\n",vle[i],vnom[i],vsa[i]);

for(i=1;i<CM;i++) printf("\t Numero del mes : %8d Cantidad de sueldo pagado %15.2f\n",i,vcmeses[i]);

for(f=1;f<CM;f++)
{
  max = -999;
  for(c=1;c<CE;c++)
  {
    if(mme[f][c] > max)
    // ...


Están necesariamente mal ( y puede que haya más ).

Ah si, y aprende a usar el depurador... un programador que no sabe depurar un programa es como un arquitecto que no sabe diseñar planos.

gabyricardo92

#2
Eh, me mataste T_T jajaja, te pido disculpas, es que hace horas que estoy con esto y trate de hacerlo lo mejor que pude, soy un novato en programación, crei que a lo mejor si planteaba el codigo puntual donde estaba el problema alguien podria notarlo, y intente de muchas formas solucionarlo antes de recurrir al foro. Y no es que todo el programa no me funciona, funciona bien hasta el punto que marque, por las dudas inclui el codigo entero si era necesario Voy a tener en cuenta tus consejos, Gracias!

gabyricardo92

Me bajaste el autoestima Eferion :( sentite mal, JAJAJAJA no mentira, aprecio la sinceridad, voy a tratar de mejorar en base a lo que me dijiste

eferion

No te lo he dicho enfadado ni mucho menos.

Lo cierto es que hablar en un foro es algo frío y es difícil transmitir sentimientos o sensaciones.

También tienes que pensar que el foro puede parecer una solución fácil a tus problemas... pero si tu intención es dedicarte a esto en el futuro deberías plantearte el uso del foro como ultimísima opción después de sudar tinta intentando arreglarlo tu ( aunque ello incluya aprender a usar el depurador... cosa que te vendrá genial en el futuro ).

Es muy fácil acostumbrarse a que alguien te resuelva los problemas... pero con eso no aprendes a solucionarlos y llegara un momento en el que no haya nadie para resolverlos ( será cuando te paguen por hacer programas ). Si llega ese momento te prometo que sí que vas a saber lo que es sudar tinta :D

gabyricardo92

Si, tenes razón, me caiste re bien jajaj, es esa la realidad. Mejor voy a tratar de buscar las cosas por mi mismo y en ultimo recurso vengo aca. Gracias y un abrazo!

eferion

Me alegro de haber sido útil :)

Un saludo.