Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γειά σας παιδιά

θα ήθελα την βοήθεια σας!

 

Θέλω να υλοποιήσω ένα πρόγραμμα χρησιμοποιώντας ουρές.

Αρχικά η ουρά θα είναι άδεια.

Έχω φτάσει σε αυτό το σημείο όμως μου crashαρει.

 

 

>
#include <stdio.h>
#include <stdlib.h>
#define M 40
#define N 30

struct farmako{
      char drastiki_ousia[20];
      char onoma[20];
      char fdate;
};

typedef struct doxeio{
      struct farmako mymed[M];
      int size;
      int rear;
      struct doxeio *next;
}apothiki[N],*p_apothiki;


void MakeEmpty(p_apothiki*);

int main(){
      int choice=0;
      farmako x,*p_x;
      p_apothiki theQueue;
      MakeEmpty(&theQueue);
      do{
            printf(" 1.Eisagwgi farmakou stin apothiki \n");
            printf(" 2.Exagwgi farmakou apo tin apothiki \n");
            printf(" 3.Exodos \n");
            printf("\n");
            scanf("%d",&choice);
            if (choice == 1){
               printf("Dwste th drastiki ousia: \n");
               scanf(" %c", x.drastiki_ousia);
               printf("to onoma: \n");
               scanf(" %c", x.onoma);
               printf("kai tin hmeromhnia lhxhs tou farmakou pou thelete na eisagetai (i hmeromhnia tha einai tis morfis -HHMMEEEE-):\n");
               scanf(" %8s", &x.fdate);
               
               
               
               
                                  
            }
      } while (choice !=3 );
      system("PAUSE");
}                    


void MakeEmpty(p_apothiki* theQueue ){
    struct doxeio *head;
    head=(struct doxeio *)malloc(sizeof(struct doxeio));
    head->next=NULL;
    (*theQueue)->rear = 0;
}

 

 

 

Αν μπορούσατε να με βοηθήσετε λιγάκι.

Ευχαριστώ πολύ.

Δημοσ.

Γειά σας παιδιά

θα ήθελα την βοήθεια σας!

 

Θέλω να υλοποιήσω ένα πρόγραμμα χρησιμοποιώντας ουρές.

Αρχικά η ουρά θα είναι άδεια.

Έχω φτάσει σε αυτό το σημείο όμως μου crashαρει.

 

 

>
int main(){
      p_apothiki theQueue;
      MakeEmpty(&theQueue);
}                    


void MakeEmpty(p_apothiki* theQueue ){
    struct doxeio *head;
    head=(struct doxeio *)malloc(sizeof(struct doxeio));
    head->next=NULL;
    (*theQueue)->rear = 0;
}

 

Αν μπορούσατε να με βοηθήσετε λιγάκι.

Ευχαριστώ πολύ.

 

Όταν θέτεις τιμή 0 στο πεδίο rear, που δείχνει η theQueue ?

Δημοσ.

Όταν θέτεις τιμή 0 στο πεδίο rear, που δείχνει η theQueue ?

 

στο συγκεκριμενο κώδικα είναι στο κενό

 

αυτό θα χρειάζεται

>(head->rear)=((*theQueue)->rear )= 0;

 

 

Σε ευχαριστώ για αυτή σου την παρατήρηση.

Όμως μήπως έχεις εντοπίσει κάποιο άλλο πρόβλημα στα print;Γιατί εκεί που crashάρει.Δεν μπορώ να καταλάβω τι έχω γράψει λάθος.

Δημοσ.

Γειά σας παιδιά

θα ήθελα την βοήθεια σας!

 

Θέλω να υλοποιήσω ένα πρόγραμμα χρησιμοποιώντας ουρές.

Αρχικά η ουρά θα είναι άδεια.

Έχω φτάσει σε αυτό το σημείο όμως μου crashαρει.

 

 

 

>
#include <stdio.h>
#include <stdlib.h>
#define M 40
#define N 30

struct farmako{
      char drastiki_ousia[20];
      char onoma[20];
      char fdate;
};

typedef struct doxeio{
      struct farmako mymed[M];
      int size;
      int rear;
      struct doxeio *next;
}apothiki[N],*p_apothiki;


void MakeEmpty(p_apothiki*);

int main(){
      int choice=0;
      farmako x,*p_x;
      p_apothiki theQueue;
      MakeEmpty(&theQueue);
      do{
            printf(" 1.Eisagwgi farmakou stin apothiki \n");
            printf(" 2.Exagwgi farmakou apo tin apothiki \n");
            printf(" 3.Exodos \n");
            printf("\n");
            scanf("%d",&choice);
            if (choice == 1){
               printf("Dwste th drastiki ousia: \n");
               scanf(" %c", x.drastiki_ousia);
               printf("to onoma: \n");
               scanf(" %c", x.onoma);
               printf("kai tin hmeromhnia lhxhs tou farmakou pou thelete na eisagetai (i hmeromhnia tha einai tis morfis -HHMMEEEE-):\n");
               scanf(" %8s", &x.fdate);





            }
      } while (choice !=3 );
      system("PAUSE");
}                    


void MakeEmpty(p_apothiki* theQueue ){
    struct doxeio *head;
    head=(struct doxeio *)malloc(sizeof(struct doxeio));
    head->next=NULL;
    (*theQueue)->rear = 0;
}

 

 

 

Αν μπορούσατε να με βοηθήσετε λιγάκι.

Ευχαριστώ πολύ.

 

Βασικά, γιατί τα έχεις κάνει τόσο πολύπλοκα τα definitions σου; Που να βγάλεις άκρη έτσι;

 

Τέσπα, ένα που βλέπω που έχει σίγουρα πρόβλημα είναι πως στην MakeEmpty() περνάς την διεύθυνση ενός δείκτη theQueue (δηλαδή δείκτη σε δείκτη) και πάς και κάνεις (*theQueue)->rear χωρίς να έχεις κάνει malloc/calloc πρώτα το (*theQueue).

 

Δημοσ.

Βασικά, γιατί τα έχεις κάνει τόσο πολύπλοκα τα definitions σου; Που να βγάλεις άκρη έτσι;

 

Τέσπα, ένα που βλέπω που έχει σίγουρα πρόβλημα είναι πως στην MakeEmpty() περνάς την διεύθυνση ενός δείκτη theQueue (δηλαδή δείκτη σε δείκτη) και πάς και κάνεις (*theQueue)->rear χωρίς να έχεις κάνει malloc/calloc πρώτα το (*theQueue).

 

 

Θα μπορούσες μήπως να μου δώσεις μία πιο εύκολη λύση;

Δημοσ.

 

 

 

Θα μπορούσες μήπως να μου δώσεις μία πιο εύκολη λύση;

 

Πιο εύκολη λύση σε ποιο πράγμα ακριβώς; Τα definitions που χρησιμοποιείς (π.χ. pointer & array hiding μέσα σε typedef) προϋποθέτουν γνώσεις C άνω του μετρίου για να μπορέσεις να τα διαχειριστείς στη συνέχεια.

 

Βασικά, από τον κώδικα που δίνεις δεν έχω την παραμικρή τι προσπαθείς να κάνεις. Π.χ. ποιος είναι ο λόγος ύπαρξης του pointer & array hiding μέσα στο typedef του struct doxeio?

Δημοσ.

Η άσκηση είναι αυτή:

 

Κάθε φαρμακαποθήκη έχει Ν ειδικούς αποθηκευτικούς χώρους,έναν για κάθε διαφορετική κατηγορία φαρμάκων(όπου Ν=30).Για κάθε κατηγορία φαρμάκων υπάρχουν 3 διαφορετικοί προμηθευτές,οι οποίοι προμηθεύουν την φαρμακαποθήκη φαρμάκα με διαφορετικές δραστικές ουσίες και με διαφορετικά ονόματα.Τα φάρμακα τοποθετούνται στους ειδικούς χώρους ανά δραστική ουσία και προμηθευτή.Εως σήμερα η φαρμακαποθήκη αριθμεί 30 διαφορετικές δραστικές ουσίες(10 από κάθε προμηθευτή).Κάθε ουρά φαρμάκων είναι αριθμημένη με αριθμούς απο 1 έως Μ(όπου Μ=40).Αρχικα όλες οι ουρές φαρμάκων ειναι άδειες.

Καλείστε να υλοποιήσετε ένα πρόγραμμα χρησιμοποιώντας ουρές,κατάλληλους αλγορίθμους αναζήτησης και ταξινόμησης,έτσι ώστε ο κάθε υπάλληλος της φαρμακαποθήκης να μπορεί να τοποθετεί τα φάρμακα στις ουρές με τέτοιον τρόπο έτσι ώστε να μπορεί να επιλέγει προς πώληση πάντα τα φάρμακα με πρόσφατη ημερομηνία λήξης.

 

Και αυτή που πόσταρα πιο πάνω ειναι η αρχή,πιστεύω

Δημοσ.

Ολίγον μπλεγμένο θα έλεγα.

 

Καταρχήν οι ουρές είναι Fisrt In First Out (FIFO) δομές, που σημαίνει πως βάζοντας με enqueue τα φάρμακα στην αρχή της ουράς κατά τις παραλαβές τους, τα τραβας με dequeue από το τέλος της ουράς με την σειρά που μπήκαν. Δηλαδή τα παλαιότερα πρώτα. Η απαίτηση της εκφώνησης για τα πιο πρόσφατα πρώτα, παραπέμπει σε στοίβες (και οχι σε ουρές) οι οποίες είναι Last In First Out (LIFO) δομές.

 

Επίσης, ούτε οι ουρές ούτε οι στοίβες επιτρέπουν αναζήτηση, ούτε ταξινόμηση που λέει η εκφώνηση.

 

Έπειτα, χάνω την μπάλα με τους ειδικούς χώρους, τις δραστικές ουσίες, κλπ.

 

Αν έχω καταλάβει καλά, θέλεις 40 (M) ουρές, με το κάθε node της καθεμιάς τους να αντιστοιχεί σε ένα φάρμακο. Έχεις επίσης μια αποθήκη ή πολλές; Στην αρχή γράφει κάθε αποθήκη (έχει Ν χώρους, κλπ), αλλά πιο κάτω γράφει η αποθήκη (αριθμεί 30 ουσίες κλπ).

 

Ας πούμε πως έχεις μια. Είναι λοιπόν χωρισμένη σε 30 (Ν) ας πούμε δωμάτια? Εδώ χάνω τελείως την μπάλα! Λέει πως το κάθε δωμάτιο δέχεται διαφορετική κατηγορία φαραμάκων, άρα έχουμε 30 κατηγορίες φαρμάκων, σωστά; Μετά λέει πως για κάθε κατηγορία υπάρχουν 3 προμηθευτές... δηλαδή π.χ. την κατηγορία ας πούμε 1 μπορεί να την προμηθεύουν 3 διαφορετικοί προμηθευτές; Ή ο κάθε προμηθετής προμηθεύει διακριτές κατηγορίς (π.χ. ο προμηθευτής Α προμηθεύει τις κατηγορίες 0 έως και 9, ο Β τις κατηγορίες 10 έως και 19 και ο Γ τις κατηφορίες 20 έως και 29;

 

Επίσης, ποια η σχέση των δραστικών ουσιών και των ονομάτων με τις κατηγορίες;

 

 

 

Sorry για τα ... γαλλικά, αλλά αυτό δεν είναι εκφώνηση εργασίας, ούτε τεφτέρι για τον μπακάλη δεν είναι :lol:

 

 

Δημοσ.

Όχι οκ!΄Εχεις απόλυτο δίκιο...

Αρχικά μας είπε να χρησιμοποιήσουμε τις δομές που έχω χρησιμοποιήσει και εγώ. Άρα αρχικά τις δομές τις έχω.Ακόμα μας έδωσε σαν βοήθεια,την οποία αν θέλουμε χρησιμοποιούμε,να τοποθετήσουμε 3 δείκτες οι οποίοι θα χωριζουν ουσιαστικά την ουρά σε 3 μέρη: για τον προμηθευτήΑ,τον προμηθευτήΒ και τον προμηθευτήΓ.Την θεωρώ κάπως άχρηστη σαν βοήθεια. Αυτά! Δεν ξέρω αν σε βοήθησα λιγάκι.

Δημοσ.

Όχι οκ!΄Εχεις απόλυτο δίκιο...

Αρχικά μας είπε να χρησιμοποιήσουμε τις δομές που έχω χρησιμοποιήσει και εγώ. Άρα αρχικά τις δομές τις έχω.Ακόμα μας έδωσε σαν βοήθεια,την οποία αν θέλουμε χρησιμοποιούμε,να τοποθετήσουμε 3 δείκτες οι οποίοι θα χωριζουν ουσιαστικά την ουρά σε 3 μέρη: για τον προμηθευτήΑ,τον προμηθευτήΒ και τον προμηθευτήΓ.Την θεωρώ κάπως άχρηστη σαν βοήθεια. Αυτά! Δεν ξέρω αν σε βοήθησα λιγάκι.

 

Δυστυχώς εξακολουθώ να μη καταλαβαίνω την εσωτερική δομή που πρέπει να έχουν οι οντότητες που περιγράφει η εκφώνηση, καθώς και τις μεταξύ τους σχέσεις.

 

Αυτό που θα βοηθούσε χωρίς να χρειάζεται να γράφουμε πολλά ποστς θα ήταν ένα σχεδιάγραμμα που θα απεικονίζει την διαμόρφωση της αποθήκης σε ένα τυπικό παράδειγμα (π.χ. όταν περιέχει αυτά που περιγράφει η εκφώνηση).

Δημοσ.

Ναι, αλλά η εκφώνηση μιλάει για σκέτες ουρές. Εννοώ δεν ξέρω τι έχουν διδαχθεί και τι όχι, διότι οι ουρές προτεραιότητας δεν έχουν στάνταρ υλοποίηση (μπορούν να υλοποιηθούν εσωτερικά από arrays μέχρι δέντρα).

 

Αν ο όρος "ουρά" που χρησιμοποιεί η εκφώνηση είναι ελαστικός ως προς την υλοποιησή του, τότε αν ερμηνεύω σωστά την εκφώνηση (που μάλλον δεν :lol:) τότε νομίζω αρκεί απλή deque. Με μπερεδεύει επίσης η αναφορά της εκφώνησης για χρήση αλγόριθμων ταξινόμησης. Υποτίθεται πως χρησιμοποιούμε ουρές επειδή η ζητούμενη ταξινόμηση των στοιχείων της είναι fixed, δηλαδή FIFO. Αν θέλουμε να είναι και FIFO και LIFO τότε η πρώτη μας σκέψη είναι η deque. Αν θέλουμε μόνο LIFO η 1η σκέψη είναι stack.

 

Γενικώς, από την συγκεκριμένη εκφώνηση εγώ δεν μπορώ να βγάλω άκρη.

Δημοσ.

Αυτό που έχω σκεφτεί εγώ είναι στη συνάρτηση εισαγωγής μετά την εισαγωγή του στοιχείου στη τελευταία κενή θέση θα κάνει μία φθήνουσα ταξινόμηση. 'Οπως είπε πιο πάνω και ο Directx.

 

Τέλος πάντων.Ευχαριστώ πολύ!

Δημοσ.

Αυτό που έχω σκεφτεί εγώ είναι στη συνάρτηση εισαγωγής μετά την εισαγωγή του στοιχείου στη τελευταία κενή θέση θα κάνει μία φθήνουσα ταξινόμηση. 'Οπως είπε πιο πάνω και ο Directx.

 

Τέλος πάντων.Ευχαριστώ πολύ!

 

Αν δεν ξεκαθαριστούν οι οντότητες και οι μεταξύ τους σχέσεις, μάλλον θα σπαταλήσεις τσάμπα χρόνο.

 

Για παράδειγμα, λες θα κάνεις "φθίνουσα ταξινόμηση"... οκ, αλλά αν εννοείς βάση ημερομηνίας, τοτε η συνάρτηση εισαγωγής μιας κλασικής ουράς τοποθετεί εξ' ορισμού το κάθε νέο στοιχείο ταξινομημένο. Οπότε θα το τοποθετήσεις ταξινομημένο και μετά θα ξανα-κάνεις αχρείαστη ταξινομηση σε όλα τα στοιχεία για να καταλήξεις στο ίδιο αποτέλεσμα που είχες μετά την απλή εισαγωγή του στοιχείου;

Δημοσ.

Όπως το βλέπω εγώ, τέτοιες ερωτήσεις εξ ορισμού δεν μπορούν να απαντηθούν σε ένα forum.

 

Προφανώς το τι θέλει ο συγκεκριμένος, ή και ο εκάστοτε, καθηγητής το έχει πει ήδη στην τάξη και έχει δώσει και παραδείγματα για τα επιμέρους tasks. Μπορεί η ορολογία του να διαφέρει από τα standards, μπορεί και όχι. Το σίγουρο είναι πως το τι θέλει το έχει δείξει στην τάξη.

 

Από ό,τι εγώ καταλαβαίνω, η συγκεκριμένη εργασία αφορά διαχείριση δεικτών και μνήμης μαζί με δομές δεδομένων αλλά και εφαρμογή "αληθινών" πραγμάτων σε κώδικα. Δεν θέλει τόσο πολύ να δει υλοποίηση δομών όσο χρήση δεικτών και γενικού σχεδιασμό δομών για να καλυφθούν συγκεκριμένες ανάγκες και μία μοντελοποίηση.

 

Θα μπορούσε κανείς να το κάνει και με λίστα που να έχει μία τροποποιημένη getNode συνάρτηση έτσι ώστε να παίρνει πάντα πίσω ο χρήστης αυτό που πρέπει.

 

Το πρόβλημα όμως που υπάρχει είναι πως ερωτήσεις σαν και αυτή που έγινε στο 5το post και που αφορούν τέτοιες περιπτώσεις σαν και αυτή, δεν μπορούν να απαντηθούν.

 

Θα μπορούσε ίσως να απαντηθεί το 1το, που νομίζω ότι απαντήθηκε (ή όχι; ).

 

 

 

Σε περίπτωση που δεν απαντήθηκε, τότε για να μην crashάρει ο κώδικας του 1του post θα πρέπει να είναι ως εξής:

 

>

#include <stdio.h>
#include <stdlib.h>
#define M 40
#define N 30

struct farmako {
   char drastiki_ousia[20];
   char onoma[20];
   char fdate;
};

typedef struct doxeio {
   struct farmako mymed[M];
   int size;
   int rear;
   struct doxeio *next;
} apothiki[N], *p_apothiki;


void MakeEmpty(p_apothiki*);

int main() {
   int choice = 0;
   struct farmako x, *p_x;
   p_apothiki theQueue = (p_apothiki) malloc(sizeof(struct doxeio));
   MakeEmpty(&theQueue);
   do {
       printf(" 1.Eisagwgi farmakou stin apothiki \n");
       printf(" 2.Exagwgi farmakou apo tin apothiki \n");
       printf(" 3.Exodos \n");
       printf("\n");
       scanf("%d", &choice);
       if (choice == 1)
       {
           printf("Dwste th drastiki ousia: \n");
           scanf(" %c", x.drastiki_ousia);
           printf("to onoma: \n");
           scanf(" %c", x.onoma);
           printf("kai tin hmeromhnia lhxhs tou farmakou pou thelete na "
                   "eisagetai (i hmeromhnia tha einai tis "
                   "morfis -HHMMEEEE-):\n");
           scanf(" %8s", &x.fdate);
       }
   } while (choice != 3);
   system("PAUSE");
}

void MakeEmpty(p_apothiki* theQueue) {
   struct doxeio *head;
   head = (struct doxeio *) malloc(sizeof (struct doxeio));
   head->next = NULL;
   (*theQueue)->rear = 0;
}

 

Όμως!!! Ο κώδικας όπως ήταν στο 1το post ΔΕΝ έκανε compile. Οπότε, πως ξέρεις ότι crashάρει εκεί που έλεγες;

 

Σε εμένα έτρεξε με gcc 4.2.1

 

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...