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

fuction help


derasto

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

Δημοσ.

Γεια σας παιδες,δινετε ο παρακατω κωδικας απο μια συναρτηση πινακα-ουρα που κανει μετακινηση των στοιχειων του πινακα αν εχει η ουρα εχει μια κενη θεση.Υπαρχει καποιος αλλος τροπος να γραφτει η συναρτηση??

Ευχαριστω!!!

>void frag (void)
{
int i;
printf("\n");
for (i=head;i<=back;i++)
{
array[i-head+1]=array[i];
printf("%d ",array[i]);
}
printf("\n");
for (i=head;i<=back;i++)
{
array[i-head+1]=array[i];
printf("Position : %d --> %d\n",i-head+1,i);
}
back=back-head+1;
head=1;
}

Δημοσ.

Ναι απο ασκηση εργαστηριου ειναι.Θα ηθελα να μην ποσταρω τον υπολοιπο κωδικα(για να μην παει ολοσ ο κοπος χαμενος),απλα ο καθηγητης ειπε δεν του αρεσε κ θελει αλλιως(ΕΛΕΟΣ).Δεν μπορω να σκεφτω καποιον αλλο τροπο να γινετε σωστα η μετακινηση των στοιχειων.Καμια ιδεα?

Δημοσ.

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

Δημοσ.

Οριστε ολοσ ο κωδικας.Δεν θα συμφωνησω μαζι σου bxenos στο αν γινονται λαθος στην τυχη κλπ.κλπ,το προγραμμα λειτουργει μια χαρα.Εχεςι να μ προτεινεις κατι να δουλευει καλλυτερα,πιο εξυπνα?

>
#include <stdio.h>
#include <stdlib.h>
#define N 10
int dequeue(void);
void enqueue(int);
void frag(void);
int array [N],head=0,back=0,check;
main ()
{
int sel,num,counten=0,countde=0;
printf("PRESS 1 TO ADD NUMBER IN QUEUE (ENQUEUE)\n");
printf("PRESS 2 TO TAKE A NUMBER FROM QUEUE (DEQUEUE)\n");
printf("PRESS 3 TO END\n\n");
do
{
do
{
printf ("\n\tENTER YOUR CHOICE: ");
scanf ("%d",&sel);
}
while (sel>3 || sel <1);
switch (sel)
{
case 1:
{
printf ("\n\tGIVE ME THE NUMBER FOR QUEUE: ");
scanf ("%d",&num);
enqueue(num);
if (check==0)
{
printf ("\n\tNUMBER %d ENTERED IN QUEUE SUCCESSFULLY\n\n",num);
counten++;
}
else
{
printf ("\tSTACK IS FULL!!!");
}
}
break;

case 2:
{
num=dequeue();
if (check==0)
{
printf ("\n\tDEQUEUE NUMBER: %d FROM QUEUE SUCCESFULLY\n\n",num);
countde ++;
}
else
printf ("\n\tQUEUE IS EMPTY!!!\n\n");
break;
}
}
}
while (sel!=3);
printf ("\n\tNUMBERS ENQUEUE'S SUCCESFULLY : %d\n",counten);
printf ("\tNUMBERS DEQUEUE'S SUCCESFULLY : %d\n",countde);
system ("pause");
}
void enqueue(int x)
{
if (head==0)
head=1;
if (back<N)
{
back++;
array[back]=x;
check=0;
}
else
{
if (head==1)
check=1;
else
{
frag();
enqueue(x);
}
}
}
int dequeue(void)
{
int x;
if (head>0)
{
x=array[head];
head++;
check=0;
if(head>back)
head=back=0;
return x;
}
else
check=1;
}
void frag (void)
{
int i;
printf("\n");
for (i=head;i<=back;i++)
{
array[i-head+1]=array[i];
printf("%d ",array[i]);
}
printf("\n");
for (i=head;i<=back;i++)
{
array[i-head+1]=array[i];
printf("Position : %d --> %d\n",i-head+1,i);
}
back=back-head+1;
head=1;
}

Δημοσ.

Δεν θα μπω στον κόπο να διαβάσω unindented code. Αλλά μήπως έχει πρόβλημα με τις global μεταβλητές; Σου είπε τι δεν του άρεσε;

Δημοσ.

void frag (void)

{

int i;

//έχεις global μεταβλητες δηλαδή μεταβλητές ορατές σε όλο το πρόγραμμα

//χωρις λόγο άρα μη δομημενο κωδικα

 

printf("\n");

for (i=head;i<=back;i++)

{

array[i-head+1]=array;

εδω βαζεις τιμές με καποιο βρογχο

printf("%d ",array);

}

printf("\n");

for (i=head;i<=back;i++)

{

array[i-head+1]=array;//εδω ξαναβαζεις τιμες (υπερβάλον ζηλος;)

printf("Position : %d --> %d\n",i-head+1,i);

}

back=back-head+1;

head=1;

//πιστευεις οτι θα έπρεπε να μας λένε κάτι τα ονοματα head,back με τον τρόπο που τα χρησιμοποιεις;

}

μόλις προλάβω να δω τον κώδικα που έγραψες θα σου πω προτάσεις.

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

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

Δημοσ.

Χρησιμοποιω global μεταβλητες (head,back,check) γιατι θα χρησιμοποιηθουν σε πολλα μερη του κωδικα οχι απλα σε μια σιναρτηση για να δηλωσω τιν μεταβλητη μονο στην συναρτηση.Αυτη δεν ειναι καλλιτερο σε περιπτωση που η μεταβλητη global θα πρεπει να εχει απο προεπιλογη καποια τιμη?Aν δηλωνα τις μεταβλητες local ισως να επρεπε να αλλαξω τα ονοματα για να μην εχω προβλημα με την δηλωση των συναρτησεων(ετσι φενετε σε ολο το προγραμμα τι κανουν οι μεταβλ).Οσο για τα head k back εχεισ δικιο,δυσκολο να καταλαβεις τον κωδικα.

Δημοσ.

Για τις global μεταβλητές θα κάνεις το εξείς:

>
#define N 10
struct myqueue_tag {
         int head,tail;
         int queue[N];
};

typedef struct myqueue_tag myqueue; //ονομασια με σκετο myqueue αντί για struct myqueue_tag

int enqueue(myqueue *q,int data);//επιστρεφει 1 αν πετυχε, 0 αν γεμισε η λιστα
int dequeue(myqueue *q,int *data);//επιστρεφει 1 αν πετυχε (και ο αριθμος 
                            //της λιστας θα αποθηκευτει στο *data), ή 0 η λίστα είναι άδεια
void init(myqueue *q){//μηδενισε ολές τις μεταβλητες της λιστας
       memset(q,0,sizeof(*q));
}

int main(void){

         myqueue q;//έγινε local δομή (που περιέχει και τις μεταβλητες)
                       //αν επιπλεον των μεταβλητών περιειχε και τις συναρτησεις, θα 
                       //μιλάγαμε για C++
         init(&q);

         while(1){
                    printf("μπλα μπλα...");
                    switch(getch()){
                             case '0':
                                       break;
                             case '1':
                                     .....
                                     ... enqueue(&q,...)...
                                    break;
                           ...
                    }
         getchar();
}

Δημοσ.

λοιπον ο κωδικας σου οπως ειπε και καποιος αλλος πιο πανω ειναι γτπ:lol: ειδικα τα head και back πεφτουν απο το πουθενα:cry:. λοιπον ακου τι θα κανεις

η συναρτηση σου θα παιρνει τον πινακα ως παραμετρο και θα σου γυρναει εναν pointer προς δυναμικο πινακα στον οποιο θα εχεις αντιγραψει μονο τα στοιχεια του αρχικου πινακα και οχι τα κενα. ειναι πολυ ασυμφορο να μετακινεις ολα σου τα στοιχεια καθε φορα που βρησκεις κενο. φαντασου να εχεις εναν πινακα 2000000 στοιχειων;

Δημοσ.

Ρε παιδια γτ φαγωθικατε ετσι με τις μεταβλητες head kai back.Αφορουν τα στοιχεια που μπαινουν στην ουρα η head δειχνει το πρωτο στοιχειο που μπαινει στην ουρα & η back το τελευταιο.Τεσπα ευχαριστω για τις απαντισεις σας.A kai evabb αν στον καθηγητη δειξω pointers την στιγμη που δεν εχει αναφερει ποτε,παει με αφισε στο μαθημα.:P

Δημοσ.
Ρε παιδια γτ φαγωθικατε ετσι με τις μεταβλητες head kai back.Αφορουν τα στοιχεια που μπαινουν στην ουρα η head δειχνει το πρωτο στοιχειο που μπαινει στην ουρα & η back το τελευταιο.Τεσπα ευχαριστω για τις απαντισεις σας.A kai evabb αν στον καθηγητη δειξω pointers την στιγμη που δεν εχει αναφερει ποτε,παει με αφισε στο μαθημα.:P

εστω οτι δεν μπορεις δεν το κανεις με pointers το head και back δεν εχουν καμια χρησιμοτητα εφοσον χρησιμοποιεις στατικους πινακες. αυτοι αρχιζουν παντα απο 0 και τελειωνουν εκει στο Ν-1 οπου Ν το μηκος του πινακα το οποιο το εχεις προσδιορισει εσυ απο την αρχη του προγραμματος

Δημοσ.
A kai evabb αν στον καθηγητη δειξω pointers την στιγμη που δεν εχει αναφερει ποτε,παει με αφισε στο μαθημα.:P

 

Αν κάποιος μαθητής τολμίσει να μάθει κάτι απο μόνος του πρέπει τουλάχιστον να εκτελεστεί!:-D αλλιώς εμείς τι δουλειά κάνουμε;;)

Δημοσ.

Ahaha.Απλα το στυλακι του ειναι "Δεν εισαι πιο εξυπνος απο μενα".Και δυστυχως θα τον εχω 2-3 εξαμηνα ακομα.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...