No puedo sumar las parcelas, sólo el total de naranjas y mandarinas [C]

Iniciado por S4ms3pi0l__, 17 Octubre 2017, 03:14 AM

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

S4ms3pi0l__

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:


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
int n, i, j, a=0, b=0, parcela[50];
do{
printf("Ingrese la cantidad de parcelas: ");
scanf("%d",&n);
}while(n<=0);
system("cls");
for(i=1;i<=n;i++){
printf("\nParcela #%d ",i);
do{
printf("\nIngrese la cantidad de naranjas: ");
scanf("%d",&parcela[i]);
}while(parcela[i]<=0);
do{
printf("Ingrese la cantidad de mandarinas: ");
scanf("%d",&parcela[j]);
}while(parcela[j]<=0);
a=a+parcela[i];
b=b+parcela[j];
parcela[n]=parcela[i]+parcela[j];
}
printf("\nTotal produccion naranjas: %d ",a);
printf("\nTotal produccion mandarinas: %d ",b);
for(i=1;i<=n;i++){
printf("\nParcela #%d: %d ",i, parcela[n]);
}
return 0;
}



· Los títulos deben ser descriptivos
>aquí las reglas del foro
-Engel Lex

engel lex

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
matriz[x][0]; <-naranjas
matriz[x][1]; <-mandarinas

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

S4ms3pi0l__

#2
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:


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
int n, x, i, a=0, b=0, parcela[50][50];
do{
printf("Ingrese la cantidad de parcelas: ");
scanf("%d",&n);
}while(n<=0);
system("cls");
for(i=1;i<=n;i++){
printf("\nParcela #%d ",i);
do{
printf("\nIngrese la cantidad de naranjas: ");
scanf("%d",&parcela[i][1]);
}while(parcela[i][1]<=0);
do{
printf("Ingrese la cantidad de mandarinas: ");
scanf("%d",&parcela[i][2]);
}while(parcela[i][2]<=0);
a+=parcela[i][1];
b+=parcela[i][2];
parcela[i][x]=parcela[i][1]+parcela[i][2];
}
printf("\nTotal produccion naranjas: %d ",a);
printf("\nTotal produccion mandarinas: %d ",b);
for(i=1;i<=n;i++){
printf("\nParcela #%d: %d ",i, parcela[i][x]);
}
return 0;
}

engel lex

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

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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Gallu

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.


#include <stdio.h>
#include <stdlib.h>

int preguntarNaranjas();
int preguntarMandarinas();
int preguntarParcelas();
void printResumen(int ** parcela, int numeroParcelas);
int ** initParcelaPointer(int numeroParcelas);

int main(int argc, char *argv[]) {

int parcelas = preguntarParcelas();

int **parcelaPointer = initParcelaPointer(parcelas);

int i;
int * temp;

for(i = 0 ; i < parcelas ; i++){
printf("\nParcela #%d ",i);

int mandarinas = preguntarMandarinas();

int naranjas = preguntarNaranjas();

temp = (int*) parcelaPointer[i];

*temp = mandarinas;

temp++;

*temp = naranjas;
}

printResumen(parcelaPointer, parcelas);

return 0;
}

int ** initParcelaPointer(int numeroParcelas){
int **parcelaPointer;

parcelaPointer = (int **) malloc(sizeof(int *) * numeroParcelas);

int i;

for(i = 0 ; i < numeroParcelas ; i++){
parcelaPointer[i] = (int *) malloc(sizeof(int *) * 2);
}

return parcelaPointer;
}

void printResumen(int ** parcela, int numeroParcelas){
int totalNaranjas = 0;
int totalMandarinas = 0;
int totalProduccionParcela = 0;

int i;
for(i = 0 ; i < numeroParcelas ; i++){
totalProduccionParcela = 0;

totalMandarinas += *parcela[i];
totalProduccionParcela += *parcela[i];

parcela[i]++;

totalNaranjas += *parcela[i];
totalProduccionParcela += *parcela[i];

printf("\nParcela #%d: Produccion: %d ",i, totalProduccionParcela);
}

printf("\nTotal produccion naranjas: %d ",totalNaranjas);
printf("\nTotal produccion mandarinas: %d ",totalMandarinas);
}

int preguntarParcelas(){
int numeroParcelas;

do{
printf("Ingrese la cantidad de parcelas: ");
scanf("%d",&numeroParcelas);
}while(numeroParcelas<=0);

return numeroParcelas;
}

int preguntarNaranjas(){
int numeroNaranjas;

do{
printf("\nIngrese la cantidad de naranjas: ");
scanf("%d",&numeroNaranjas);

}while(numeroNaranjas <= 0);

return numeroNaranjas;
}

int preguntarMandarinas(){
int numeroMandarinas;

do{
printf("\nIngrese la cantidad de mandarinas: ");
scanf("%d",&numeroMandarinas);
}while(numeroMandarinas <= 0);

return numeroMandarinas;
}
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

Gallu

Hola,  lo comentado, el mismo código pero con  linked list y estructuras de datos.

Cualquier comentario es bienvenido.



#include <stdio.h>
#include <stdlib.h>


  typedef struct{
int naranjas;
int mandarinas;
}type_parcela;

typedef struct{ 
type_parcela * val;
void * next;
}node;

int preguntarNaranjas();
int preguntarMandarinas();
int preguntarParcelas();
void printResumen(node * produccion);
type_parcela * crearParcela(int naranjas, int mandarinas);
void push(node * head, type_parcela * val) ;
void producir(node *produccion);




int main(int argc, char *argv[]) {

int numeroParcelas = preguntarParcelas();

int i; 
node *produccionTotal = (node *) malloc(sizeof(node*));

for(i = 0 ; i < numeroParcelas ; i++){
producir(produccionTotal);
}

printResumen(produccionTotal);

return 0;
}

void producir(node *produccion){

int mandarinas = preguntarMandarinas();

int naranjas = preguntarNaranjas(); 

push(produccion, crearParcela(naranjas, mandarinas));
}


void push(node * head, type_parcela * val) {
    node * current = head;
   
    while (current->next != NULL) {
        current = current->next;
    }

if(!current->val){
//el elemento actual no tiene un valor asignado
current->val = val;
return ;
}

    /* now we can add a new variable */
    current->next = malloc(sizeof(node*));
    ((node*)current->next)->val = val;
    ((node*)current->next)->next = NULL;
}



type_parcela * crearParcela(int naranjas, int mandarinas){

type_parcela * parce = (type_parcela *) malloc(sizeof(type_parcela*));
 
parce->naranjas = naranjas;
parce->mandarinas = mandarinas;
 
return parce;
}


void printResumen(node * produccion){
int totalNaranjas = 0;
int totalMandarinas = 0;
int totalProduccionParcela = 0;

int i = 0;

node * current = produccion;

    while (current) {
totalNaranjas += current->val->naranjas;
totalMandarinas += current->val->mandarinas;
totalProduccionParcela = current->val->naranjas + current->val->mandarinas;

printf("\nParcela #%d: Produccion: %d ",i, totalProduccionParcela);
i++;

        current = current->next;
    }
     

printf("\nTotal produccion naranjas: %d ",totalNaranjas);
printf("\nTotal produccion mandarinas: %d ",totalMandarinas);
}




int preguntarParcelas(){
int numeroParcelas;

do{
printf("Ingrese la cantidad de parcelas: ");
scanf("%d",&numeroParcelas);
}while(numeroParcelas<=0);

return numeroParcelas;
}

int preguntarNaranjas(){
int numeroNaranjas;

do{
printf("\nIngrese la cantidad de naranjas: ");
scanf("%d",&numeroNaranjas);

}while(numeroNaranjas <= 0);

return numeroNaranjas;
}

int preguntarMandarinas(){
int numeroMandarinas;

do{
printf("\nIngrese la cantidad de mandarinas: ");
scanf("%d",&numeroMandarinas);
}while(numeroMandarinas <= 0);

return numeroMandarinas;
}

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.