mar_kostas13 Δημοσ. 20 Οκτωβρίου 2013 Δημοσ. 20 Οκτωβρίου 2013 Στο παρακάτω πρόγραμμα έχω ένα μενού επιλογών και τρέχει σωστά όταν βάζω τιμές για το μέγεθος του πίνακα που είναι σχετικά μικρές όπως 99,101,150... αλλά για τιμές όπως 200,250 και ιδικά για 2000,50000 μέγεθος που θέλω να κάνω εγώ χρήση δεν λειτουργεί καθόλου. Βοηθήστε με σας παρακαλώ γιατί θέλω να προλάβω την προθεσμία.Υπάρχει περίπτωση να φταίει ο compiler devC/C++ που χρησιμοποιώ.? Σας ευχαριστώ εκ των προτέρων. #include<stdio.h> #include<stdlib.h> int main() { int choice,i,N,a[N]; do{//dhmiourgeia menou epilogwn printf("Parakalw epilexte mia apo tis parakatw epiloges:\n"); printf("EPILEXTE 1.gia na eisagete to megethos tou pinaka\n"); printf("EPILEXTE 2.gia gia tin ektypwsh twn stoixeiwn tou pinaka\n"); printf("EPILEXTE 3.gia na kanete anazhthsh enos arithou tis epiloghs sas ston pinaka\n"); printf("EPILEXTE 4. EXIT \n"); printf("DWSE EPILOGH APO TO MENOU: "); scanf("%d",&choice); switch(choice){ case 1: { printf("DWSE TO MEGETHOS TOU PINAKA: "); scanf("%d",&N);//o xrhsths dinei to megethos tou pinaka //topothetw tis times gia tis 2 prwtes theseis giati dn isxuei h akolouthia gia a[0],a[1] if(N>0) a[0]=0; if(N>1) a[1]=1; for(i=2;i<N;i++)//gemizw ton pinaka simfwna me tin akolouthia a=a[i-1]+(2*i); break; } case 2: { printf("Stoixeia tou pinaka:\n"); for(i=0;i<N;i++) printf(" %d ",a);//ektpwnw ta stoixeia tou pinaka break; } case 3: { int x,flag=1; printf("DWSE ARITHMO GIA ANAZHTHSH STON PINAKA: "); scanf("%d",&x);//o xrhsths epilegei enan arithmo gia anazhthsh i=0; do{ if(a==x) flag=0;//an vrehtei allazw to flag se '0' kai teliwnei h anazhthsh i++;//h thesi ston pinaka tou x einai (i-1) otan teleiwn h epanalhpsh } while(flag==1 && i<N ); if(flag==1) printf("\nO arithmos pou eisagate DEN YPARXEI\n"); else printf("\no arithmos %d vrethike stin thesi %d tou pinaka\n",x,(i-1)); break; } } printf("\n"); } while(choice != 4 );//an epilogh=4 tote exit system("PAUSE"); return 0; }
Tmark Δημοσ. 20 Οκτωβρίου 2013 Δημοσ. 20 Οκτωβρίου 2013 Αν μπορείς βάλε σε code tags το κώδικα γιατί δεν θα βγάλει άκρη κανείς με αυτή την μακαρονάδα.
albNik Δημοσ. 20 Οκτωβρίου 2013 Δημοσ. 20 Οκτωβρίου 2013 To μεγεθος του πινακα πρεπει να ειναι σταθερά, δεν μπορει να το δωσει ο χρήστης. Για δυναμική παραχώρηση μνημης καντο με δεικτη σε int*
nilosgr Δημοσ. 20 Οκτωβρίου 2013 Δημοσ. 20 Οκτωβρίου 2013 To μεγεθος του πινακα πρεπει να ειναι σταθερά, δεν μπορει να το δωσει ο χρήστης. Για δυναμική παραχώρηση μνημης καντο με δεικτη σε int* Ειναι "σωστο" το int a[N]; αρκει το Ν να εχει αρχικοποιηθει. πχ printf("DWSE TO MEGETHOS TOU PINAKA: "); scanf("%d",&N); int a[N];
albNik Δημοσ. 20 Οκτωβρίου 2013 Δημοσ. 20 Οκτωβρίου 2013 To N πρεπει να ειναι γνωστο at compile time. Εκτος αν ειναι C99 variable length array.
ZAKKWYLDE Δημοσ. 20 Οκτωβρίου 2013 Δημοσ. 20 Οκτωβρίου 2013 Ειναι "σωστο" το int a[N]; αρκει το Ν να εχει αρχικοποιηθει. πχ printf("DWSE TO MEGETHOS TOU PINAKA: "); scanf("%d",&N); int a[N]; Έχω την εντύπωση ότι εξαρτάται απο τον Compiler, νομίζω με τον C89 δεν γίνεται ενώ με τους μεταγενέστερους γίνεται. That being said, μιας και είναι άσκηση χρησιμοποίησε τη malloc για να περάσεις ωραία με dynamic memory management.
defacer Δημοσ. 20 Οκτωβρίου 2013 Δημοσ. 20 Οκτωβρίου 2013 Απλά αρχικοποιεί τον a με junk μέγεθος μιας και το N δεν έχει πάρει τη σωστή τιμή ακόμα. int main() { int choice,i,N,a[N]; // δηλαδή πόσο μεγάλος θα είναι ο a? Ενδεχομένως έχεις μπερδευτεί στο ότι η δήλωση "int a[N]" δε σημαίνει ότι ο a θα είναι πάντα τόσο μεγάλος όσο και το N, σημαίνει πως θα είναι τόσο μεγάλος όσο είναι το N τη στιγμή που εκτελείται αυτή η γραμμη. Αυτό είναι λάθος και προφανώς δεν σώζεται παρά μόνο μετατοπίζοντας τη δήλωση του a μετά την αρχικοποίηση του N, πράγμα το οποίο είναι ΟΚ εφόσον μιλάμε για VLA άρα C99. Έτσι όπως είναι ο κώδικας απλά κάνει overrun τον πίνακα, "σκοτώνει" όλο το stack (και το σωσμένο EBP από το προηγούμενο stack frame) και πυροτεχνήματα. Πάντως θα πρότεινα αντί γι' αυτό να το κάνεις απλά με malloc.
nilosgr Δημοσ. 22 Οκτωβρίου 2013 Δημοσ. 22 Οκτωβρίου 2013 Ναι παιδιά για c99 μιλάω -κακώς δεν το έγραψα-. Πάντως αν είναι για άσκηση μάλλον το Ν θα είναι από define, εκτός κι αν το λέει ρητά ότι θα γίνεται δυναμική δέσμευση του πίνακα. (λίγο νωρίς για να έχουν φτάσει στη δυναμική δέσμευση)
vagg77 Δημοσ. 26 Οκτωβρίου 2013 Δημοσ. 26 Οκτωβρίου 2013 Παιδια,ειμαι αρχαριος στη C και εχω ορισμενα προβληματα.Δεν ξερω γιατι δεν παιρνω αποτελεσματα εδω: #include <stdio.h> int main() { int a,b,max; printf("Give 2 values"); scanf("%d%d%",&a,&; if (a > max = a; else max = b; printf("max is %d\n",max); int ek1,ek2,dek1,dek2,mon1,mon2; ek1= a / 100; ek2=b / 100; dek1=(a % 100) / 10; dek2=(b % 100) / 10; mon1=(a % 100) % 10; mon2=(b % 100) % 10; printf("ekatontades 1ou arithmou %d\n",ek1); printf("ekatonrades 2ou arithmou %d\n",ek2); printf("dekades 1ou arithmou %d\n",dek1); printf("dekades 2ou arithmou %d\n",dek2); printf("monades 1ou arithmou %d\n",mon1); printf("monades 2ou aritmhou %d\n",mon2); int diaf; if (a > diaf = a - b; else diaf = b - a; printf("The difference is %d\n",diaf); int ek3,mon3,dek3; ek3= diaf / 100; dek3=(diaf % 100) / 10; mon3=(diaf % 100) %10; printf("ekatontades diaforas %d\n",ek3); printf("dekades diaforas %d\n",dek3); print("monades diaforas %d\n",mon3); system("pause"); return 0; }
Star_Light Δημοσ. 26 Οκτωβρίου 2013 Δημοσ. 26 Οκτωβρίου 2013 #include <stdio.h> int main() { int a,b,max; printf("Give 2 values"); scanf("%d%d%",&a,& ; if (a > max = a; else max = b; printf("max is %d\n",max); int ek1,ek2,dek1,dek2,mon1,mon2; ek1= a / 100; ek2=b / 100; dek1=(a % 100) / 10; dek2=(b % 100) / 10; mon1=(a % 100) % 10; mon2=(b % 100) % 10; printf("ekatontades 1ou arithmou %d\n",ek1); printf("ekatonrades 2ou arithmou %d\n",ek2); printf("dekades 1ou arithmou %d\n",dek1); printf("dekades 2ou arithmou %d\n",dek2); printf("monades 1ou arithmou %d\n",mon1); printf("monades 2ou aritmhou %d\n",mon2); int diaf; if (a > diaf = a - b; else diaf = b - a; printf("The difference is %d\n",diaf); int ek3,mon3,dek3; ek3= diaf / 100; dek3=(diaf % 100) / 10; mon3=(diaf % 100) %10; printf("ekatontades diaforas %d\n",ek3); printf("dekades diaforas %d\n",dek3); print("monades diaforas %d\n",mon3); system("pause"); return 0; } Καλυτερα να το βάζεις σε CODE tags μεσα για να ειναι πιο ευαναγνωστο οπως εκανα και εγω τωρα. Φτιαξε λιγο την scanf και το if γιατι δειχνει ενα emoticon και οχι κατι με νόημα. To προγραμμα αυτο έχει να κανει με κάποιους υπολογισμούς επομενως κάποιο θέμα θα έχεις στις εκφράσεις για να μην παιρνεις τα αποτελεσματα που θέλεις. Επισης κατι σημαντικο για να μειώσεις τις γραμμές στον κώδικα : if (a > b ) max = a; else max = b; printf("max is %d\n",max); ειναι 5 γραμμές ενω μπορει να γινει και με μια ως εξής : printf(" Max is : %d " , a > b ? a : b ); Αν a > b επεστρεψε μου το a στην αντιθετη περιπτωση επέστρεψε b. YΓ Πολυ καλή η στοιχιση σου ειδικα στα if ... else.
Star_Light Δημοσ. 26 Οκτωβρίου 2013 Δημοσ. 26 Οκτωβρίου 2013 Τι ειναι το Code Tags?? Ειναι ετικέτες εντος των οποίων βάζεις τον κωδικα σου. Η αρχη ειναι με 2 αγκύλες [] μεσα στις οποιες μπαινει το CODE και στο τελος το ιδιο απλα αυτη τη φορα μεσα στις αγκυλες το CODE ειναι ετσι -> /CODE ΔΕΝ μπορω να το γραψω αλλιως γιατι θα το πιάσει και δεν θα το δεις πχ -> εδω μπαινει ο κωδικας... Το παραπανω το έβαλα ακριβως μετα την ετικετα της αρχής και μολις τελειωσα εβαλα την ετικετα τέλους. Ετικετα αρχης ειναι οτι εγραψα και πιο πανω δηλαδη 2 αγκύλες μεσα στις οποιες ειναι το CODE και ετικετα τέλους το ιδιο απλα αυτη τη φορά /CODE. 1
vagg77 Δημοσ. 26 Οκτωβρίου 2013 Δημοσ. 26 Οκτωβρίου 2013 Δουλευω την C μονο 2 βδομαδες και μερικα δεν τα πολυκαταλαβαινω.Keep Learning Newbie
Star_Light Δημοσ. 26 Οκτωβρίου 2013 Δημοσ. 26 Οκτωβρίου 2013 Δουλευω την C μονο 2 βδομαδες και μερικα δεν τα πολυκαταλαβαινω.Keep Learning Newbie Οτι δεν καταλαβαινεις γράψτο εδω να το συζητήσουμε. Οπως το έγραψες Keep Learning και υπομονή. μΕΘΟΔΙΚΗ δουλειά και υπομονή.
vinso Δημοσ. 26 Οκτωβρίου 2013 Δημοσ. 26 Οκτωβρίου 2013 Στην άσκηση έχεις 2 "λάθη" ! Το πρώτο είναι στο scanf έχεις βάλει ένα % παραπάνω και το δεύτερο είναι η τελευταία printf() έχεις ξεχάσει το f! Παρόλα αυτά ο κώδικας είναι μια χαρά και τρέχει σωστά!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα