Αναζήτηση σε πίνακα με στοιχεία struct - κόλλημα

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
kate_tk
Δημοσιεύσεις: 3
Εγγραφή: 01 Φεβ 2018 21:54

Αναζήτηση σε πίνακα με στοιχεία struct - κόλλημα

Δημοσίευση από kate_tk » 01 Φεβ 2018 22:28

Καλησπέρα! Έχω φτιάξει ένα πρόγραμμα σε C το οποίο περιέχει δεδομένα σε μορφή πίνακα του οποίου κάθε στοιχείο είναι struct.
Το πρόγραμμα αυτό ανάλογα με μια μεταβλητή string που εισάγω από το πληκτρολόγιο, ''ψάχνει'' το στοιχείο-struct του πίνακα και κάνει κάποιες πράξεις με τα αντίστοιχα δεδομένα του struct.

Έχω προσπαθήσει να κάνω όλα τα παραπάνω και έφτασα στο σημείο να μη μου βγάζει errors ο compiler.
Αλλά όταν πάω να το τρέξω και συγκεκριμένα όταν εισάγω τη μεταβλητή float (quantity) π.χ. 2.0 από το πληκτρολόγιο και πατάω enter κολλάει...
Θα μπορούσε κάποιος να με βοηθήσει να ξεκολλήσω από αυτό το σημείο; Δεν έχω εμπειρία στον προγραμματισμό και θα εκτιμούσα οποιαδήποτε βοήθεια σχετικά.


# include <stdio.h>
# include <string.h>

# define STRING_SIZE 30
# define SIZE 4


struct mold_data {

char mold_type[STRING_SIZE];
char box_type[STRING_SIZE];
float box_capacity;
};

struct mold_data array[SIZE];


main()

{ int i;
float quantity;
float num_of_boxes;
char mold_inserted[STRING_SIZE];

strcpy(array[0].mold_type,"jb12");
strcpy(array[0].box_type,"No1");
array[0].box_capacity=12.0;

strcpy(array[1].mold_type, "dts10");
strcpy(array[1].box_type,"No3");
array[1].box_capacity=5.0;

strcpy(array[2].mold_type,"jto185");
strcpy(array[2].box_type,"No6");
array[2].box_capacity=1.0;

strcpy(array[3].mold_type,"500grl");
strcpy(array[3].box_type,"No2");
array[3].box_capacity=24.0;

printf("Type mold type");
scanf("%s",mold_inserted);
printf("Type ordered quantity");
scanf("%f",quantity);

for(i=0; i<4; i++)
{ if (strcmp(mold_inserted,array.mold_type)==0)

{
num_of_boxes=quantity/array.box_capacity;
printf("%f" "%s",num_of_boxes,array.box_type);

}

else

printf("Moldtype inserted does not exist");

}

}

Θα εκτιμούσα πολύ οποιαδήποτε βοήθεια!

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Re: Αναζήτηση σε πίνακα με στοιχεία struct - κόλλημα

Δημοσίευση από gvre » 01 Φεβ 2018 22:48

Κώδικας: Επιλογή όλων

scanf("%f",quantity); -> scanf("%f",&quantity); 

Κώδικας: Επιλογή όλων

array.mold_type -> array[i].mold_type
Επίσης, τα quantity και num_of_boxes υποθέτω ότι δε χρειάζεται να είναι float, αλλά int.

Υ.Γ. Ψάξε να βρεις πώς μπορείς να ενεργοποιήσεις τα warnings στον compiler που χρησιμοποιείς και κάνε το. Θα σε βοηθήσει αρκετά.

kate_tk
Δημοσιεύσεις: 3
Εγγραφή: 01 Φεβ 2018 21:54

Re: Αναζήτηση σε πίνακα με στοιχεία struct - κόλλημα

Δημοσίευση από kate_tk » 08 Φεβ 2018 21:05

Ευχαριστώ πολύ για την απάντηση!Τώρα έτρεξε όπως ήθελα.
Θα ήθελα να ρωτήσω κάτι ακόμη...
1) Υπάρχει πιο μαζεμένος τρόπος να γράψω τα στοιχεία του πίνακα-struct?

Είχα δοκιμάσει αυτό: mold_data array[0] = {"jetb12","No1",12.0};
mold_data array[1] = {"dts10","No3",5.0};
mold_data array[2] = {"jto185","No6",1.0};
mold_data array[3] = {"500grl","No2",24.0};

αλλά μου έβγαζε αρκετά errors και δεν ήξερα πως να το φτιάξω. Ψάχνοντας στο google κατέληξα στην προηγούμενη μορφή (που αν και άκομψη έτρεχε οκ!)

2) Επειδή θέλω να περάσω πολλά στοιχεία στον πίνακα (περίπου 500 ας πούμε) πως θα μπορούσα να έχω τον πίνακα μέσα σε κάποιο άλλο αρχείο του Project και να τα βλέπει η main?

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Re: Αναζήτηση σε πίνακα με στοιχεία struct - κόλλημα

Δημοσίευση από gvre » 09 Φεβ 2018 12:54

1. Υπάρχει και μπορείς να τον δεις στο https://stackoverflow.com/a/1705166
2. Μπορείς να αποθηκεύσεις τα δεδομένα σε ένα αρχείο απλού κειμένου (.txt), να το διαβάζεις από τη main() και να περνάς τις τιμές σε κάθε στοιχείο τού array, με τον τρόπο που θα δεις από την προηγούμενη απάντηση (stackoverflow link).

kate_tk
Δημοσιεύσεις: 3
Εγγραφή: 01 Φεβ 2018 21:54

Re: Αναζήτηση σε πίνακα με στοιχεία struct - κόλλημα

Δημοσίευση από kate_tk » 22 Φεβ 2018 21:29

Ευχαριστώ και πάλι για τη βοήθεια! ήταν πολύ ουσιαστική! Μετά από αρκετό κόπο κ ψάξιμο κατάφερα να φτιάξω την ανάγνωση από αρχείο αλλά μου κολλάει στην αντιστοίχιση :
array.box_capacity==result [2] επειδή το πρώτο στοιχείο είναι integer (ISO C++ forbids comparison between pointer and integer [-fpermissive] )

Μπορεί να βοηθήσει κάποιος ? Βασικά δοκίμασα να κάνω την πράξη num_of_boxes=quantity/array.box_capacity και χωρίς να κάνω την αντιστοίχιση (δηλ γράφοντας num_of_boxes=quantity/result [2]) αλλά και πάλι έβγαζε error..


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

#define STRING_SIZE 10
#define LINESIZE 128
#define SIZE 8

struct mold_data {

char mold_type[STRING_SIZE];
char box_type[STRING_SIZE];
int box_capacity;
};

struct mold_data array[SIZE];

int main (){

int nob;
float quantity;
float num_of_boxes;
char mold_inserted[STRING_SIZE];


FILE *myfile = fopen ("Mold_data_for_all_clients.txt", "r" );
int i=0;
int j=0;
int k=0;
int l=0;
char *result[4][3];
char line[LINESIZE];
char *value;

for(i=0; i<=3; i++){
for(j=0;j<=2;j++){
result[j] = NULL;
}
}
i=0;

printf("Type mold type");
scanf("%s",mold_inserted);
printf("Type ordered quantity");
scanf("%f",&quantity);

// loop through each entry in "Mold_data_for_all_clients" file //
while(fgets(line, sizeof(line), myfile)){
//load mold name
value = strtok(line, ", ");
result[0] = strdup(value);
array.mold_type==result[0];
/*printf("mold_name: %s\n", value); */

//load box type
value = strtok(NULL, ", ");
result[1] = strdup(value);
array.box_type==result[i][1];
/*printf("box_type: %s\n", value); */

// load box capacity
value = strtok(NULL, ", ");
result[i] [2] = strdup(value);
array[i].box_capacity==result[i] [2];
/*printf("box_capacity: %s\n", value); */

if (strcmp(mold_inserted,result[i][0])==0)

{
num_of_boxes=quantity/array[i].box_capacity;
nob=ceil(num_of_boxes);

printf("\n %d " "%s",nob,result[i][1]); }
break;

//go to next line
i++;
}


fclose(myfile);
return 0;
}


///////////Αρχείο txt ////////
jb12, No1, 13
jto185, No2, 10
500grl, No3, 24
effer, No2, 8
1801, No1, 6
120B, No3, 18
tripl, No4, 2
etb460, No5, 5

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης