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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ayuda con estructuras
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda con estructuras  (Leído 5,092 veces)
chechopineda

Desconectado Desconectado

Mensajes: 8



Ver Perfil
ayuda con estructuras
« en: 11 Agosto 2010, 22:58 pm »

Hola amigos, tengo un pequeño problema, tengo como proyecto hacer una base de datos de calificaciones de alumnos, lo estoy haciendo con estructuras y uso listas enlazadas para las notas, el proceso de ingresar el nombre del alumno, el codigo, las notas y sacar promedio me va rebien, el problema es el siguiente, ademas de eso tengo que ordenar los promedios ascendente y descendente, bueno esto tambien lo hago pero por lo mismo que lo ordena de esa manera los datos pierden integridad, ademas tengo que ordenar por nombre y pues se me esta haciendo bastante dificil esta ultima parte.
El programa hace mas o menos esto
Juan                          90
Carlos                       60
Luis                           85
Cuando lo ordena queda asi
Juan                         60
carlos                       85
luis                           90
Dejo codigo a ver quien de ustedes me ilumina un poco!!
Saludetes..

Código
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <string>
  4. using namespace std;
  5. #include <windows.h>
  6. #define c 40
  7. #define MAX 30
  8.  
  9.  
  10. struct notas {
  11. float nota1;
  12. float nota2;
  13. float nota3;
  14. float promedio;
  15. };
  16.  
  17. struct alumno
  18. {
  19. char nombre[c];
  20. notas nota;
  21. int numcuenta;
  22. alumno();
  23. void mostrar();
  24. void comparar(int);
  25. void ordenar_cadenas();
  26.  
  27. };
  28.  
  29. alumno::alumno()
  30. {
  31. nota.nota3=0;
  32. }
  33. void alumno::ordenar_cadenas()
  34. { alumno a[c];
  35.  
  36. int total=2;
  37. char temp[100];
  38.   int i, j;
  39.  
  40.   for(i=0; i < total-1; i++)
  41.   {
  42.  for(j=i+1; j < total; j++)
  43.  if(strcmp(a[i].nombre, a[j].nombre) > 0)
  44.  {
  45. // Copia en variable temporal datos actuales
  46. strcpy(temp, a[i].nombre);
  47.  
  48. // Intercambia informacion
  49. strcpy(a[i].nombre, a[j].nombre);
  50.  
  51. strcpy(a[j].nombre, temp);
  52.  }
  53.   }
  54.   for(i=0;i<total;i++)
  55. {
  56. cout<<a[i].nombre<<endl;
  57. }
  58.  
  59.  
  60. }
  61.  
  62. void alumno::comparar(int cod)
  63. {
  64. if(cod!=numcuenta)
  65. {
  66. cout<<"\tContacto no existe"<<endl;
  67. cout<<"\tEjecute el programa de nuevo"<<endl;
  68.  
  69. }
  70.  
  71.  
  72.  
  73. }
  74.  
  75.  
  76. void alumno::mostrar()
  77. {
  78. cout<<endl;
  79. cout<<"Num Cuenta \t"<<"Nombre\t"<<"Notas"<<"Promedio"<<endl;
  80. cout<<numcuenta<<"\t\t"<<nombre<<"\t\t"<<nota.nota1<<" "<<nota.nota2<<" "<<nota.nota3<<"\t"<<fixed<<setprecision(2)<<nota.promedio<<endl;
  81. }
  82.  
  83.  
  84.  
  85.  
  86. int main()
  87. {
  88.  
  89. char resp;
  90. int cantidad, accion,cod, i;
  91. alumno a[c];
  92. alumno* ptr;
  93. do{
  94. system("CLS");
  95. system("COLOR 97");
  96. cout<<"PROGRAMA BASE DATOS TEMPORAL CALIFICACIONES"<<endl;
  97. cout<<"QUE ACCION DESEA REALIZAR"<<endl;
  98. cout<<"1.Consulta\n2. Ingreso Datos\n3. Actualizacion Datos\n4. Ordenar por Promedio Ascendete\n5. Ordenar por Promedio Descendente\n6. Ordenar nombre\n8. Salir"<<endl;
  99. cin>>accion;
  100. while( accion <1 || accion >8 )
  101. {
  102. system("CLS");
  103. cout << "\n\tIngrese accion correcta\n\tElija entre 1 y 5: ";
  104. cout<<"QUE ACCION DESEA REALIZAR"<<endl;
  105. cout<<"1.Consulta\n2. Ingreso Datos\n3. Actualizacion Datos\n4. Ordenar por Promedio Ascendete\n5. Ordenar por Promedio Descendente\n6.Ordenar por Nombres\n8. Salir"<<endl;
  106. cin >> accion;
  107. }
  108. switch(accion)
  109. {
  110.  
  111. case 1:
  112. cout<<"Contactos"<<endl;
  113. if(a[0].nota.nota3!=0)
  114. {
  115. for (ptr=a; ptr->nota.nota3;ptr++)
  116. {
  117. ptr->mostrar();
  118. }
  119. }
  120. else
  121. cout<<"NO EXISTEN DATOS"<<endl;
  122.  
  123. break;//sale del case
  124. case 2:
  125. cout<<"Numero de contactos que desea ingresar ";
  126. cin>>cantidad;
  127. for(i=0;i<cantidad;i++)
  128. {
  129. cout<<"Numero de Cuenta";cin>>a[i].numcuenta;
  130. cout<<"\nNombre ";fflush(stdin); gets(a[i].nombre);
  131. cout<<"Nota 1 ";cin>>a[i].nota.nota1;
  132. while(a[i].nota.nota1<0||a[i].nota.nota1>100)
  133. {
  134. cout<<"Error!!\nIngrese Calificacion entre 0 y 100"<<endl;
  135. cout<<"Nota 1 ";cin>>a[i].nota.nota1;
  136. }
  137. cout<<"Nota 2 ";cin>>a[i].nota.nota2;
  138. while(a[i].nota.nota2<0||a[i].nota.nota2>100)
  139. {
  140. cout<<"Error!!\nIngrese Calificacion entre 0 y 100"<<endl;
  141. cout<<"Nota 3 ";cin>>a[i].nota.nota3;
  142. }
  143. cout<<"Nota 3 ";cin>>a[i].nota.nota3;
  144.  
  145. while(a[i].nota.nota3<0||a[i].nota.nota3>100)
  146. {
  147. cout<<"Error!!\nIngrese Calificacion entre 0 y 100"<<endl;
  148. cout<<"Nota 3 ";cin>>a[i].nota.nota3;
  149. }
  150. a[i].nota.promedio=(a[i].nota.nota1+a[i].nota.nota2+a[i].nota.nota3)/3;
  151. cout<<"Promedio"<<fixed<<setprecision(2)<<a[i].nota.promedio;
  152.  
  153.  
  154. }
  155. cout<<"\n\tINGRESO EXITOSO"<<endl;
  156. break;
  157. case 3:
  158. if(a[0].nota.nota3!=0)
  159. {
  160. cout<<"Lista de contactos"<<endl;
  161. for (ptr=a; ptr->nota.nota3;ptr++)
  162. {
  163. ptr->mostrar();
  164. }
  165. cout<<"\n\n\tElija contacto a modificar"<<endl;
  166. cout<<"\n\n\tIngrese codigo del contacto que desea modificar ";cin>>cod;
  167.  
  168. ptr->comparar(cod);
  169.  
  170.  
  171. for (ptr=a; ptr->numcuenta;ptr++)
  172. {
  173. if(ptr->numcuenta==cod)
  174. {
  175. cout<<"Modifique Su contacto"<<endl;
  176. cout<<"Codigo"<<cod<<endl;
  177. cout<<"Nombre "; cin>>ptr->nombre;
  178. cout<<"Nota 1 ";cin>>ptr->nota.nota1;
  179. while(ptr->nota.nota1<0||ptr->nota.nota1>100)
  180. {
  181. cout<<"Error!!\nIngrese Calificacion entre 0 y 100"<<endl;
  182. cout<<"Nota 1 ";cin>>ptr->nota.nota1;
  183. }
  184. cout<<"Nota 2 ";cin>>ptr->nota.nota2;
  185. while(ptr->nota.nota2<0||ptr->nota.nota2>100)
  186. {
  187. cout<<"Error!!\nIngrese Calificacion entre 0 y 100"<<endl;
  188. cout<<"Nota 2 ";cin>>ptr->nota.nota2;
  189. }
  190. cout<<"Nota 3 ";cin>>ptr->nota.nota3;
  191. while(ptr->nota.nota3<0||ptr->nota.nota3>100)
  192. {
  193. cout<<"Error!!\nIngrese Calificacion entre 0 y 100"<<endl;
  194. cout<<"Nota 3 ";cin>>ptr->nota.nota3;
  195. }
  196.  
  197. a[i].nota.promedio=(a[i].nota.nota1+a[i].nota.nota2+a[i].nota.nota3)/3;
  198. cout<<"\nCONTACTO MODIFICADO"<<endl;
  199. ptr->mostrar();
  200. }//fin if
  201.  
  202. }//fin for
  203.  
  204.  
  205. }
  206. else
  207. cout<<"NO EXISTEN DATOS"<<endl;
  208.  
  209.  
  210. break;
  211. case 4:
  212. if(a[0].nota.nota3!=0)
  213. {
  214.  
  215. int j,temp,temp2,temp3,temp4,temp5;
  216. //compara las posiciones
  217. for (ptr=a; ptr->nota.nota3;ptr++)
  218. {
  219. ptr->mostrar();
  220. }
  221. for(i=1;i<cantidad;i++)//ayuda a recorrer el vector
  222. {
  223. for(j=0;j<cantidad-1;j++)//compara elementos del vector por posiciones y busca la posicion anterior, por el -1
  224. {
  225. if(a[j].nota.promedio>a[j+1].nota.promedio)//Compara la primera posicion con la siguiente
  226. {
  227. //a[i].numcuenta=a[i].numcuenta;
  228. temp=a[j].nota.promedio; //variable auxiliar que almacena la primera posicion
  229. a[j].nota.promedio=a[j+1].nota.promedio;
  230. a[j+1].nota.promedio=temp;
  231. }
  232. }
  233. }
  234.  
  235. for (ptr=a; ptr->nota.nota3;ptr++)
  236. {
  237. ptr->mostrar();
  238. }
  239. }
  240. else
  241. cout<<"NO EXISTEN DATOS"<<endl;
  242.  
  243. break;
  244. case 5:
  245. if(a[0].nota.nota3!=0)
  246. {
  247.  
  248. int j,temp;
  249. //compara las posiciones
  250. for(i=0;i<cantidad;i++)
  251. {
  252. cout<<a[i].nota.promedio<<endl;
  253. }
  254. for(i=1;i<cantidad;i++)//ayuda a recorrer el vector
  255. {
  256. for(j=0;j<cantidad-1;j++)//compara elementos del vector por posiciones y busca la posicion anterior, por el -1
  257. {
  258. if(a[j].nota.promedio<a[j+1].nota.promedio)//Compara la primera posicion con la siguiente
  259. {
  260. temp=a[j].nota.promedio; //variable auxiliar que almacena la primera posicion
  261. a[j].nota.promedio=a[j+1].nota.promedio;
  262. a[j+1].nota.promedio=temp;
  263. }
  264. }
  265. }
  266. cout<<"Vector ordenado"<<endl;//muestra las posiciones ordenadas
  267. for(i=0;i<cantidad;i++)
  268. {
  269. cout<<a[i].nota.promedio<<endl;
  270. }
  271. }
  272. else
  273. cout<<"NO EXISTEN DATOS"<<endl;
  274.  
  275. break;
  276. case 6:
  277.  
  278. for (ptr=a; ptr->nota.nota3;ptr++)
  279. {
  280. ptr->ordenar_cadenas();
  281. }
  282.  
  283.  
  284.  
  285.  
  286. break;
  287. case 8:
  288. system("PAUSE");
  289. cout<<"Adios"<<endl;
  290. return 0;
  291. break;
  292.  
  293. }
  294. cout<<"\n\n\tIR AL MENU PRINCIPAL [S/N]"<<endl;
  295. cin>>resp;
  296. }while(resp=='s' || resp=='S');
  297. return 0;
  298. }


« Última modificación: 12 Agosto 2010, 13:19 pm por Littlehorse » En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: ayuda con estructuras
« Respuesta #1 en: 12 Agosto 2010, 03:16 am »

crea un struct que almacene esas estructuras, asi moverias el conjunto completo y no se perderia integridad y unos consejos.

1) No uses '#include <windows.h>', no estas usando nada que lo requiera, ademas quita la portabilidad al codigo.
2) No uses 'system("Pause")' ya que quita portabilidad al codigo.
3) Si no me equivoco este codigo no necesita '#include <iomanip>'


Edito: Tambien puedes hacer el uso de la programacion orientada a objetos para crear una clase llamada Alumno en la cual sus miembros almacenen las calificaciones, crear un array de objetos Alumno e ingresar en un array de int el orden despues de organizarlos.


« Última modificación: 12 Agosto 2010, 03:25 am por Lord R.N.A. » En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: ayuda con estructuras
« Respuesta #2 en: 12 Agosto 2010, 04:38 am »

Ni usar gets(), ni usar todo el espacio de nombres std.
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ayuda con estructuras
« Respuesta #3 en: 12 Agosto 2010, 11:13 am »

Vale la pena aclarar que estas estructuras que estas usando solo se diferencian de las clases por tener sus miembros por defecto publicos.

En cuanto al problema ordenando y siguiendo la logica que usaste podes solucionarlo copiando TODOS los datos de cada elemento, ahora simplemente intercambias el promedio pero las otras 3 notas y el nombre se quedan en el elemento en que estaban antes ... con un par de simples memcpy ya funciona bien.

Revisa ordenar_cadenas, estas usando datos no definidos y fijate que usas nota3 par acomparar y entiendo que deberias usar el promedio ...




Normalmente te diria que no usaras fflush + gets sino fgets que te permite especificar el tamaño del buffer y no lo ensucia (de esa manera no necesitas usar fflush). Aunque aca estas mezclando C++ y C ...
« Última modificación: 12 Agosto 2010, 11:17 am por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
globsharp

Desconectado Desconectado

Mensajes: 84


No me mires


Ver Perfil
Re: ayuda con estructuras
« Respuesta #4 en: 14 Agosto 2010, 18:17 pm »

Hola Leo Gutiérrez :), me ha surgido una duda leyendo tu comentario, sobre el uso del namespace std, yo siempre por comodidad suelo usarlo por defecto todo el espacio de nombres, pero quisiera saber por qué puede ser interesante no hacerlo o qué inconveniente podría tener.

Gracias :)
En línea

Duérmete
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: ayuda con estructuras
« Respuesta #5 en: 14 Agosto 2010, 19:36 pm »

Hola.  :)

Porque si tu usas "using namespace std" tienes todo el espacio de nombres en el ambito global.

Usando using solo tienes a tu alcance aquellos elementos que tu quieres.
« Última modificación: 14 Agosto 2010, 19:38 pm por Leo Gutiérrez. » En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
Og.


Desconectado Desconectado

Mensajes: 822


Aprendiendo de la vida


Ver Perfil
Re: ayuda con estructuras
« Respuesta #6 en: 14 Agosto 2010, 19:37 pm »

globsharp
Lee este tema.

Saludos!
En línea

|-
globsharp

Desconectado Desconectado

Mensajes: 84


No me mires


Ver Perfil
Re: ayuda con estructuras
« Respuesta #7 en: 14 Agosto 2010, 22:46 pm »

Ya entendí  :D ¡muchas gracias a los dos!
En línea

Duérmete
chechopineda

Desconectado Desconectado

Mensajes: 8



Ver Perfil
Re: ayuda con estructuras
« Respuesta #8 en: 16 Agosto 2010, 04:19 am »

gracias por los aportes, y pues lo que uso es lo que conozco.. = ) gracias por sus consejos, seguire trabajando, muy buenas ideas me han aportado
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con estructuras « 1 2 »
Programación C/C++
eltoffer 15 8,071 Último mensaje 5 Febrero 2011, 23:53 pm
por Garfield07
Ayuda en estructuras como funcion
Programación C/C++
Kensei_G 1 2,057 Último mensaje 30 Mayo 2012, 19:35 pm
por durasno
Ayuda con estructuras
Programación C/C++
elle_hack 4 3,105 Último mensaje 12 Junio 2012, 07:15 am
por elle_hack
Ayuda con matriz dinámica de estructuras
Programación C/C++
darklatios2006 4 3,157 Último mensaje 21 Marzo 2013, 19:58 pm
por amchacon
Ayuda Programa con estructuras C
Programación C/C++
piete2 1 1,847 Último mensaje 3 Diciembre 2014, 02:58 am
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines