Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: S4ms3pi0l__ en 17 Octubre 2017, 03:14 am



Título: No puedo sumar las parcelas, sólo el total de naranjas y mandarinas [C]
Publicado por: S4ms3pi0l__ en 17 Octubre 2017, 03:14 am
He hecho este programa en C, pero no puedo sumar las parcelas, sólo el total de naranjas y mandarinas. Espero que podaís ayudarme. Lo que quiero es, de 'n' parcelas, imprimir el total de cada una. Aquí mi programa:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc, char *argv[]) {
  5. int n, i, j, a=0, b=0, parcela[50];
  6. do{
  7. printf("Ingrese la cantidad de parcelas: ");
  8. scanf("%d",&n);
  9. }while(n<=0);
  10. system("cls");
  11. for(i=1;i<=n;i++){
  12. printf("\nParcela #%d ",i);
  13. do{
  14. printf("\nIngrese la cantidad de naranjas: ");
  15. scanf("%d",&parcela[i]);
  16. }while(parcela[i]<=0);
  17. do{
  18. printf("Ingrese la cantidad de mandarinas: ");
  19. scanf("%d",&parcela[j]);
  20. }while(parcela[j]<=0);
  21. a=a+parcela[i];
  22. b=b+parcela[j];
  23. parcela[n]=parcela[i]+parcela[j];
  24. }
  25. printf("\nTotal produccion naranjas: %d ",a);
  26. printf("\nTotal produccion mandarinas: %d ",b);
  27. for(i=1;i<=n;i++){
  28. printf("\nParcela #%d: %d ",i, parcela[n]);
  29. }
  30. return 0;
  31. }
  32.  


· Los títulos deben ser descriptivos
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: no puedo sumar las parcelas, sólo el total de naranjas y mandarinas [C]
Publicado por: engel lex en 17 Octubre 2017, 03:35 am
donde modificas j? veo que lo usas como indicador de parcelas de mandarinas... pero siempre lo sobreescribes luego con las siguientes naranjas (i) no es preferible que uses una matriz bidimensional donde

siendo x el numero de parcela
Código:
matriz[x][0]; <-naranjas
matriz[x][1]; <-mandarinas


Título: Re: No puedo sumar las parcelas, sólo el total de naranjas y mandarinas [C]
Publicado por: S4ms3pi0l__ en 17 Octubre 2017, 03:53 am
Ese era mí problema; me ha servido de mucha ayuda tu consejo, te lo agradezco mucho. Aquí dejo el código con el problema resuelto:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc, char *argv[]) {
  5. int n, x, i, a=0, b=0, parcela[50][50];
  6. do{
  7. printf("Ingrese la cantidad de parcelas: ");
  8. scanf("%d",&n);
  9. }while(n<=0);
  10. system("cls");
  11. for(i=1;i<=n;i++){
  12. printf("\nParcela #%d ",i);
  13. do{
  14. printf("\nIngrese la cantidad de naranjas: ");
  15. scanf("%d",&parcela[i][1]);
  16. }while(parcela[i][1]<=0);
  17. do{
  18. printf("Ingrese la cantidad de mandarinas: ");
  19. scanf("%d",&parcela[i][2]);
  20. }while(parcela[i][2]<=0);
  21. a+=parcela[i][1];
  22. b+=parcela[i][2];
  23. parcela[i][x]=parcela[i][1]+parcela[i][2];
  24. }
  25. printf("\nTotal produccion naranjas: %d ",a);
  26. printf("\nTotal produccion mandarinas: %d ",b);
  27. for(i=1;i<=n;i++){
  28. printf("\nParcela #%d: %d ",i, parcela[i][x]);
  29. }
  30. return 0;
  31. }
  32.  


Título: Re: No puedo sumar las parcelas, sólo el total de naranjas y mandarinas [C]
Publicado por: engel lex en 17 Octubre 2017, 04:04 am
no requieres 50 en tu segunda dimensión... y por otro lado... los indices empiezan en 0

puedes parecer una tontería pero a medida que crece el programa el tamaño afecta... allí necesitas declarar un array (si 50 es tu maximo) de 50*2*4 bytes (4 es la cantidad de bytes de int) es decir, meros 400Bytes... sin embargo declaras 50*50*4 siendo esto 10KBytes... estando 2 ordenes de magnitud sobre lo que necesitas... en este caso es irrelevante... pero facilmente se te puede escapar de las manos...

con hacer

Código:
int parcela[50][2];

parcela[0][0] = 4;
parcela[0][1] = 2;

a demás de ser más eficiente lo hace más legible y comprensible


Título: Re: No puedo sumar las parcelas, sólo el total de naranjas y mandarinas [C]
Publicado por: Gallu en 18 Octubre 2017, 22:23 pm
Hola, se me ocurrió mejorar el código de S4ms3pi0l  con punteros en lugar de arrays, echarle un ojo por favor, tengo pensado implementarlo también con estructuras de datos y listas enlazadas,  lo hago por aprender y practicar básicamente.


Se veis alguna cosa que pueda mejorar os agradezco cualquier comentario.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int preguntarNaranjas();
  5. int preguntarMandarinas();
  6. int preguntarParcelas();
  7. void printResumen(int ** parcela, int numeroParcelas);
  8. int ** initParcelaPointer(int numeroParcelas);
  9.  
  10. int main(int argc, char *argv[]) {
  11.  
  12. int parcelas = preguntarParcelas();
  13.  
  14. int **parcelaPointer = initParcelaPointer(parcelas);
  15.  
  16. int i;
  17. int * temp;
  18.  
  19. for(i = 0 ; i < parcelas ; i++){
  20. printf("\nParcela #%d ",i);
  21.  
  22. int mandarinas = preguntarMandarinas();
  23.  
  24. int naranjas = preguntarNaranjas();
  25.  
  26. temp = (int*) parcelaPointer[i];
  27.  
  28. *temp = mandarinas;
  29.  
  30. temp++;
  31.  
  32. *temp = naranjas;
  33. }
  34.  
  35. printResumen(parcelaPointer, parcelas);
  36.  
  37. return 0;
  38. }
  39.  
  40. int ** initParcelaPointer(int numeroParcelas){
  41. int **parcelaPointer;
  42.  
  43. parcelaPointer = (int **) malloc(sizeof(int *) * numeroParcelas);
  44.  
  45. int i;
  46.  
  47. for(i = 0 ; i < numeroParcelas ; i++){
  48. parcelaPointer[i] = (int *) malloc(sizeof(int *) * 2);
  49. }
  50.  
  51. return parcelaPointer;
  52. }
  53.  
  54. void printResumen(int ** parcela, int numeroParcelas){
  55. int totalNaranjas = 0;
  56. int totalMandarinas = 0;
  57. int totalProduccionParcela = 0;
  58.  
  59. int i;
  60. for(i = 0 ; i < numeroParcelas ; i++){
  61. totalProduccionParcela = 0;
  62.  
  63. totalMandarinas += *parcela[i];
  64. totalProduccionParcela += *parcela[i];
  65.  
  66. parcela[i]++;
  67.  
  68. totalNaranjas += *parcela[i];
  69. totalProduccionParcela += *parcela[i];
  70.  
  71. printf("\nParcela #%d: Produccion: %d ",i, totalProduccionParcela);
  72. }
  73.  
  74. printf("\nTotal produccion naranjas: %d ",totalNaranjas);
  75. printf("\nTotal produccion mandarinas: %d ",totalMandarinas);
  76. }
  77.  
  78. int preguntarParcelas(){
  79. int numeroParcelas;
  80.  
  81. do{
  82. printf("Ingrese la cantidad de parcelas: ");
  83. scanf("%d",&numeroParcelas);
  84. }while(numeroParcelas<=0);
  85.  
  86. return numeroParcelas;
  87. }
  88.  
  89. int preguntarNaranjas(){
  90. int numeroNaranjas;
  91.  
  92. do{
  93. printf("\nIngrese la cantidad de naranjas: ");
  94. scanf("%d",&numeroNaranjas);
  95.  
  96. }while(numeroNaranjas <= 0);
  97.  
  98. return numeroNaranjas;
  99. }
  100.  
  101. int preguntarMandarinas(){
  102. int numeroMandarinas;
  103.  
  104. do{
  105. printf("\nIngrese la cantidad de mandarinas: ");
  106. scanf("%d",&numeroMandarinas);
  107. }while(numeroMandarinas <= 0);
  108.  
  109. return numeroMandarinas;
  110. }
  111.  


Título: Re: No puedo sumar las parcelas, sólo el total de naranjas y mandarinas [C]
Publicado por: Gallu en 20 Octubre 2017, 22:49 pm
Hola,  lo comentado, el mismo código pero con  linked list y estructuras de datos.

Cualquier comentario es bienvenido.

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6.  typedef struct{
  7. int naranjas;
  8. int mandarinas;
  9. }type_parcela;
  10.  
  11. typedef struct{  
  12. type_parcela * val;
  13. void * next;
  14. }node;
  15.  
  16. int preguntarNaranjas();
  17. int preguntarMandarinas();
  18. int preguntarParcelas();
  19. void printResumen(node * produccion);
  20. type_parcela * crearParcela(int naranjas, int mandarinas);
  21. void push(node * head, type_parcela * val) ;
  22. void producir(node *produccion);
  23.  
  24.  
  25.  
  26.  
  27. int main(int argc, char *argv[]) {
  28.  
  29. int numeroParcelas = preguntarParcelas();
  30.  
  31. int i;  
  32. node *produccionTotal = (node *) malloc(sizeof(node*));
  33.  
  34. for(i = 0 ; i < numeroParcelas ; i++){
  35. producir(produccionTotal);
  36. }
  37.  
  38. printResumen(produccionTotal);
  39.  
  40. return 0;
  41. }
  42.  
  43. void producir(node *produccion){
  44.  
  45. int mandarinas = preguntarMandarinas();
  46.  
  47. int naranjas = preguntarNaranjas();  
  48.  
  49. push(produccion, crearParcela(naranjas, mandarinas));
  50. }
  51.  
  52.  
  53. void push(node * head, type_parcela * val) {
  54.    node * current = head;
  55.  
  56.    while (current->next != NULL) {
  57.        current = current->next;
  58.    }
  59.  
  60. if(!current->val){
  61. //el elemento actual no tiene un valor asignado
  62. current->val = val;
  63. return ;
  64. }
  65.  
  66.    /* now we can add a new variable */
  67.    current->next = malloc(sizeof(node*));
  68.    ((node*)current->next)->val = val;
  69.    ((node*)current->next)->next = NULL;
  70. }
  71.  
  72.  
  73.  
  74. type_parcela * crearParcela(int naranjas, int mandarinas){
  75.  
  76. type_parcela * parce = (type_parcela *) malloc(sizeof(type_parcela*));
  77.  
  78. parce->naranjas = naranjas;
  79. parce->mandarinas = mandarinas;
  80.  
  81. return parce;
  82. }
  83.  
  84.  
  85. void printResumen(node * produccion){
  86. int totalNaranjas = 0;
  87. int totalMandarinas = 0;
  88. int totalProduccionParcela = 0;
  89.  
  90. int i = 0;
  91.  
  92. node * current = produccion;
  93.  
  94.    while (current) {
  95. totalNaranjas += current->val->naranjas;
  96. totalMandarinas += current->val->mandarinas;
  97. totalProduccionParcela = current->val->naranjas + current->val->mandarinas;
  98.  
  99. printf("\nParcela #%d: Produccion: %d ",i, totalProduccionParcela);
  100. i++;
  101.  
  102.        current = current->next;
  103.    }
  104.  
  105.  
  106. printf("\nTotal produccion naranjas: %d ",totalNaranjas);
  107. printf("\nTotal produccion mandarinas: %d ",totalMandarinas);
  108. }
  109.  
  110.  
  111.  
  112.  
  113. int preguntarParcelas(){
  114. int numeroParcelas;
  115.  
  116. do{
  117. printf("Ingrese la cantidad de parcelas: ");
  118. scanf("%d",&numeroParcelas);
  119. }while(numeroParcelas<=0);
  120.  
  121. return numeroParcelas;
  122. }
  123.  
  124. int preguntarNaranjas(){
  125. int numeroNaranjas;
  126.  
  127. do{
  128. printf("\nIngrese la cantidad de naranjas: ");
  129. scanf("%d",&numeroNaranjas);
  130.  
  131. }while(numeroNaranjas <= 0);
  132.  
  133. return numeroNaranjas;
  134. }
  135.  
  136. int preguntarMandarinas(){
  137. int numeroMandarinas;
  138.  
  139. do{
  140. printf("\nIngrese la cantidad de mandarinas: ");
  141. scanf("%d",&numeroMandarinas);
  142. }while(numeroMandarinas <= 0);
  143.  
  144. return numeroMandarinas;
  145. }
  146.  
  147.