elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Que puede estar fallando? (C)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Que puede estar fallando? (C)  (Leído 4,835 veces)
Saberuneko


Desconectado Desconectado

Mensajes: 2.194



Ver Perfil WWW
Que puede estar fallando? (C)
« en: 9 Marzo 2011, 17:24 pm »

Llevo pegándome con este varias horas, pero no consigo que funcione.

Enunciado: Se desea elaborar una encuesta con objeto de hacer un estudio sobre el consumo de tabaco. Para ello se solicita un programa que deberá permitir la recogida de datos sobre una muestra de 1000 personas fumadoras. La recogida de datos se realizará sobre un vector (DATOS) de 1000 elementos. Cada elemento recogerá la siguiente información:

Codigo
Cigarrillos Diarios
Marca

El programa deberá permitir:
1.- Recogida de datos
2.- Media de cigarrillos fumados por persona y dia
3.- Visualización del consumo por marcas
4.- Marca con mayor índice de fumadores
5.- Fin

Opcion 1: Se llamara a un procedimiento que permitirá la carga del vector (esta opción no terminará hasta que se completen los datos de todo el vector.

Opcion 2: Se llamará a una función que retornará dicha media

Opcion 3: Para la realización de esta opción se dispondrá de un vector de estructuras que contendrá la siguiente información:

Marca
Numero cigarrillos

Este vector se supone ya cargado con el campo Marca. El campo numero_cigarrillos está a cero, se completará por programa en esta opción. Para ello una vez que se hayan recogido los datos de la encuesta se recorrerá el vector datos enviando "cada registro" a un procedimiento que buscará la casilla correspondiente en el vector marcas para incrementar el campo Numero cigarrillos (se supone que estan incluidas todas las marcas)

Con el vector marcas ya actualizado se procederá a la visualización

Opción 4: Función que retornará dicha estructura para su posterior visualización.

Esto es lo que tengo hecho, pero no funciona.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define N 5 /*Tras pruebas, 1000*/
  6. #define M 5 /*Cantidad de marcas, no definida en enunciado, 5 por poner varias*/
  7. #define L 20 /*Longitud de cadena*/
  8.  
  9. typedef struct
  10. {
  11.   int cod;
  12.   int cig;
  13.   char marca;
  14. } encuesta;
  15.  
  16. typedef struct
  17. {
  18.   char marca2[L];
  19.   int numero_cig;
  20. } vector;
  21.  
  22. void menu();
  23. void intro(encuesta* dat);
  24. float media(encuesta* dat);
  25. void cons_marca(encuesta* dat, vector* mar);
  26. void mejor_marca(vector* mar);
  27. int posicionar(char data[], char mar[]);
  28.  
  29. /*Modulo Principal*/
  30.  
  31. void main()
  32. {
  33.   encuesta datos[N];
  34.   vector marcas[M]= /*Viene pre-cargado segun el enunciado*/
  35.   {{"Malboro",0},
  36.   {"Lucky",0},
  37.   {"Strike",0},
  38.   {"Camel",0},
  39.   {"Otra",0}};
  40.  
  41.   int op;
  42.   float mid;
  43.  
  44.   system("cls");
  45.   menu();
  46.   scanf("%d",&op);
  47.   while(op!=5)
  48.   {
  49.   switch(op)
  50.      {
  51.         case 1:
  52.         intro(datos);
  53.            break;
  54.         case 2:
  55.         mid=media(datos);
  56.            printf("\nMedia: %f",mid);
  57.            break;
  58.         case 3:
  59.         cons_marca(datos,marcas);
  60.            break;
  61.         case 4:
  62.         mejor_marca(marcas);
  63.            break;
  64.         case 5:
  65.         printf("\nSaliendo de la aplicacion...");
  66.            getchar();
  67.         default:
  68.         printf("\nOpcion erronea");
  69.      }
  70.  
  71.      system("cls");
  72.      menu();
  73.      scanf("%d",&op);
  74.   }
  75. }
  76.  
  77. /*0.- Menu*/
  78. void menu()
  79. {
  80.   system("cls");
  81.   printf("\nMENU:\n--\n");
  82.   printf("1.- Recogida de datos\n");
  83.   printf("2.- Media de Cigarrillos\n");
  84.   printf("3.- Consumo por Marcas\n");
  85.   printf("4.- Marca con Mayor Consumo\n");
  86.   printf("5.- Fin\n");
  87.   printf("Seleccione una opcion... ");
  88. }
  89.  
  90. /*1.- Recogida de datos*/
  91. void intro(encuesta* dat)
  92. {
  93.   int cont;
  94.  
  95.   system("cls");
  96.   for(cont=0;cont<N;cont++)
  97.   {
  98.      dat[cont].cod=cont; /*Cod Numerico automatico segun introduccion*/
  99.      printf("Cigarrillos Diarios: ");
  100.      scanf("%d",&dat[cont].cig);
  101.      printf("\nMarca: ");
  102.      scanf("%s",dat[cont].marca);
  103.   }
  104. }
  105.  
  106. /*2.- Media de cigarrillos fumados por persona y dia*/
  107. float media(encuesta* dat)
  108. {
  109.   int cont;
  110.   float mid=0;
  111.  
  112.   system("cls");
  113.   for(cont=0;cont<N;cont++)
  114.   {
  115.   mid=mid+dat[cont].cig;
  116.   }
  117.   mid=mid/N;
  118.   return mid;
  119. }
  120.  
  121. /*3.- Visualizacion del consumo por marcas*/
  122. void cons_marca(encuesta* dat, vector* mar)
  123. {
  124.   int cont,pos;
  125.   for(cont=0;cont<N;cont++)
  126.   {
  127.   pos=posicionar(&dat[cont].marca,mar);
  128.   mar[pos].numero_cig=mar[pos].numero_cig+dat[cont].cig;
  129.   }
  130.   system("cls");
  131.   printf("Consumo por marcas:\n--\n");
  132.   for(cont=0;cont<N;cont++)
  133.   {
  134.   printf("%s: %d\n",dat[cont].marca,mar[pos].numero_cig);
  135.   }
  136. }
  137.  
  138. /*4.- Marca con mayor indice de fumadores*/
  139. void mejor_marca(vector* mar)
  140. {
  141.   int cont,max=0,pos;
  142.   for(cont=0;cont<N;cont++)
  143.   system("cls");
  144.   {
  145.   if(mar[cont].numero_cig>max)
  146.      {
  147.       max=mar[cont].numero_cig;
  148.        pos=cont;
  149.      }
  150.   }
  151.   printf("Mejor Marca: %s", mar[pos].marca2);
  152. }
  153.  
  154. /*3.1- Localizacion de la posicion correcta para incrementar el valor de dat[].cig*/
  155. int posicionar(char data[], char mar[])
  156. {
  157.   int cont=0,pos,found=0;
  158.   while((cont<M)||(!found))
  159.   {
  160.   if(strcmp(data,mar)==0);
  161.      {
  162.       pos=cont;
  163.        found=1;
  164.      }
  165.       cont++;
  166.   }
  167.   return pos;
  168. }

A ver si me podéis echar una mano... todavía programo bastante mal y me queda mucho por aprender...

Un saludo y gracias por adelantado.


En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Que puede estar fallando? (C)
« Respuesta #1 en: 9 Marzo 2011, 18:12 pm »

Mira los avisos del compilador:

algo.c: En la función ‘intro’:
algo.c:102:7: aviso: el formato ‘%s’ espera el tipo ‘char *’, pero el argumento 2 es de tipo ‘int’
algo.c: En la función ‘cons_marca’:
algo.c:127:5: aviso: se pasa el argumento 2 de ‘posicionar’ desde un tipo de puntero incompatible
algo.c:27:5: nota: se esperaba ‘char *’ pero el argumento es de tipo ‘struct vector *’
algo.c:134:5: aviso: el formato ‘%s’ espera el tipo ‘char *’, pero el argumento 2 es de tipo ‘int’


Las llamadas a system son algo tirando a mala costumbre, tu código por ejemplo no compila se puede usar en linux debido a que cls no es un comando de sistema de linux.

No te vendría mal compilar con avisos (en gcc o mingw -Wall -pedantic)

Por otro lado, no se exactamente si es lo que pretendes, pero
Código
  1. char marca

Con eso guardas sólo un caracter, si quieres guardar una cadena, creo que ya sabes qué toca


« Última modificación: 9 Marzo 2011, 18:28 pm por Akai » En línea

Saberuneko


Desconectado Desconectado

Mensajes: 2.194



Ver Perfil WWW
Re: Que puede estar fallando? (C)
« Respuesta #2 en: 9 Marzo 2011, 22:42 pm »

Mira los avisos del compilador:

algo.c: En la función ‘intro’:
algo.c:102:7: aviso: el formato ‘%s’ espera el tipo ‘char *’, pero el argumento 2 es de tipo ‘int’
algo.c: En la función ‘cons_marca’:
algo.c:127:5: aviso: se pasa el argumento 2 de ‘posicionar’ desde un tipo de puntero incompatible
algo.c:27:5: nota: se esperaba ‘char *’ pero el argumento es de tipo ‘struct vector *’
algo.c:134:5: aviso: el formato ‘%s’ espera el tipo ‘char *’, pero el argumento 2 es de tipo ‘int’

No te vendría mal compilar con avisos (en gcc o mingw -Wall -pedantic)

En clase estoy forzado a usar el Borland, una versión del año de la pera... La mitad de los avisos son erróneos o están referidos a líneas equivocadas. A ver si con estos lo acabo arreglando.

Citar
Las llamadas a system son algo tirando a mala costumbre, tu código por ejemplo no compila se puede usar en linux debido a que cls no es un comando de sistema de linux.

Bueno, nuestra profesora nos orienta hacia windows, es por eso que lo hice así. Sé que system da problemas de portabilidad, gracias por el aviso de todos modos. ^^ (Hay un equivalente para limpiar pantalla?)

Citar
Por otro lado, no se exactamente si es lo que pretendes, pero
Código
  1. char marca

Con eso guardas sólo un caracter, si quieres guardar una cadena, creo que ya sabes qué toca

Whops! Ahora lo veo... vaya fallo mas gordo.

Muchas Gracias por la ayuda, le echo un vistazo mañana a ver si consigo que funcione. ^^
En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Que puede estar fallando? (C)
« Respuesta #3 en: 9 Marzo 2011, 23:05 pm »

el equivalente para limpiar la pantalla portable, si no me equivoco, es fflush(stdout)  Otra opción puede ser imprimir de golpe unos 20 o 30 saltos de linea xD. Quizá alguien quiera añadir algo sobre el tema.

El problema con system es que haces una llamada concreta al sistema, entonces, pongamos que "cls" existiese en ambos sistemas, no seria un problema, pero el equivalente de cls en el estándar POSIX es clear, por tanto, ya no puedes hacer una llamada cls en un SO que utilice el estándar POSIX.

Sobre lo del borland... en clase usa lo que tengas, en casa, prueba otros compiladores xD
En línea

Saberuneko


Desconectado Desconectado

Mensajes: 2.194



Ver Perfil WWW
Re: Que puede estar fallando? (C)
« Respuesta #4 en: 10 Marzo 2011, 09:35 am »

El fflush es un comando prohibido en mi clase, considerado como una de las peores costumbres. O_o
(La profesora ni siquiera nos había dicho su utilidad)
Ahora no sé qué hacer para limpiar la pantalla... :-\ :-\

En casa, iba a probar con eclipse, pero no me funciona. Así que tiré también de Borland. :-( :-(
En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Que puede estar fallando? (C)
« Respuesta #5 en: 10 Marzo 2011, 09:58 am »

El fflush es un comando prohibido en mi clase, considerado como una de las peores costumbres. O_o
(La profesora ni siquiera nos había dicho su utilidad)
Ahora no sé qué hacer para limpiar la pantalla... :-\ :-\

fflush ES una mala costumbre sobre streams de ENTRADA vease STDIN ya que tiene un comportamiento indeterminado (puede ir bien, puede fallar, puede explotar), sobre STDOUT, o streams/ficheros de salida NO tiene problema.

EDIT: Para limpiar la pantalla, sigue usando system("cls") en tu entorno de clase, simplemente te quise hacer notar los problemas que puede dar cuando portes tu código a otros sitios.

EDIT2: empiezo a tener dudas de que fflush limpie la pantalla. (Consultando referencia) En efecto, lo que hace es volcar cualquier dato en el buffer al fichero, así que si te quedase algo en el buffer, precisamente no te va a limpiar la pantalla.

"Solución":
Código
  1. printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

Eso en principio, "limpia" la pantalla. Al fin y al cabo, cuando en Linux haces un "clear" parece ser que hace esto. o al menos si subes con el scroll hacia arriba en el shell, se muestra lo que supuestamente acabas de limpiar
« Última modificación: 10 Marzo 2011, 10:09 am por Akai » En línea

4rkn63l

Desconectado Desconectado

Mensajes: 199



Ver Perfil
Re: Que puede estar fallando? (C)
« Respuesta #6 en: 10 Marzo 2011, 10:10 am »

A ver...

Si usas funciones propias del sistema, te quedas sin portabilidad.  :-\

Si usas fflush(stdout) propio del lenguaje aun siendo estandar, la profe te pone cero y te manda a imprimir 1000000 veces en pantalla "No usare fflush(stdout)".  :xD

La verdad no se por que hoy en dia siguen haciendo uso de ese tipo de compiladores tipo Borland o turbo C, usando gotoxy(), conio.h y compañia limitada.

En mi opinion en linux la mejor opcion es Geany+gcc y para windows Dev-C++.
En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Que puede estar fallando? (C)
« Respuesta #7 en: 10 Marzo 2011, 10:21 am »


Si usas fflush(stdout) propio del lenguaje aun siendo estandar, la profe te pone cero y te manda a imprimir 1000000 veces en pantalla "No usare fflush(stdout)".  :xD

Cual es el problema con fflush y un stream de salida?
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
no entiendo este error en asm con gcc, que puede estar mal?
Programación C/C++
Belial & Grimoire 2 3,340 Último mensaje 17 Mayo 2010, 11:33 am
por Foxy Rider
que me puede estar saliendo mal a la hora de hacer injection sql
Nivel Web
RedZer 9 5,119 Último mensaje 28 Diciembre 2010, 04:06 am
por Darioxhcx
Temita que puede estar bien. « 1 2 »
Hacking Wireless
miguelez 12 7,445 Último mensaje 6 Septiembre 2012, 23:50 pm
por miguelez
El inverter puede estar fallándome?
Hardware
ccrunch 1 1,807 Último mensaje 31 Octubre 2013, 00:55 am
por simorg
Tu móvil o tableta puede estar manchado de sangre
Noticias
wolfbcn 0 1,616 Último mensaje 12 Junio 2014, 14:37 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines