Lomar Δημοσ. 11 Σεπτεμβρίου 2006 Δημοσ. 11 Σεπτεμβρίου 2006 Χαίρεται! έχω το εξής πρόβλημα: Να γραφεί πρόγραμμα το οποίο: a) Θα τοποθετεί σε εναν μονοδιάστατο πίνακα Α τους 10 πρώτους περιττούς αριθμούς σε αύξουσα σειρά, κάνοντας χρήση μιας επαναληπτικής δομής. Να σχαματίζει έναν δεύτερο πίνακα Β του οποίου το στοιχείο Β είναι το άθροισμα των στοιχείων Α[1], Α[2], ... , Α του πρώτου πίνακα (για παράδειγμα το στοιχείο Β[4] είναι το άθροισμα των 4 πρώτων στοιχείων του πίνακα Α). c) Θα εμφανίζει τα στοιχεία και των δύο πινάκων. Να η λύση που έδωσα: > #include <stdio.h> int main() { int k,i,a[10],b[10]; k=0; for (i=1;i<20;i+2) { a[k]=i; k++; } for (i=0;i<=10;i++) { while (k<=i) b[i]+=a[k]; } printf ("\n PINAKAS A: \n"); for (i=0;i<=10;i++) printf (" %d ",a[i]); printf ("\n PINAKAS B: \n"); for (i=0;i<=10;i++) printf (" %d ",b[i]); return 0; } To ζήτημα τώρα είναι πως ο compiler (της Pacific C) δεν μου βγάζει κανένα λάθος, αλλά το πρόγραμμα δεν τρέχει!!!! Έναν οριζόντιο κέρσορα μου εμφανίζει μόνο!!! Η εντολή Ctrl+C δεν λειτουργεί, προκειμένου να σταματήσει το πρόγραμμα! Δλδ κολλάει το πρόγραμμα! Μπορεί τουλάχιστον να μου πεί κανείς αν υπάρχει κάποιο λάθος στον αλγόριθμο;; Ευχαριστώ εκ των προτέρων, αύριο γράφω και φοβάμαι μήπως κάνω κανένα γελοίο λάθος...
Dikemou Δημοσ. 11 Σεπτεμβρίου 2006 Δημοσ. 11 Σεπτεμβρίου 2006 Στην πρώτη λούπα βάλε i=i+2 αντί για i+2. Στο while της 2ης λούπας δεν αυξάνεις το k (εκεί κολλάει μάλλον). Πριν το while, δεν κάνεις initialize το k=0;
Aerico Δημοσ. 11 Σεπτεμβρίου 2006 Δημοσ. 11 Σεπτεμβρίου 2006 Επίσεις το κάθε Loop πρέπει να περικλείεται από αγκύλες {}. Μετά την συνθήκη της For While πρέπει να ανοίξεις αγκύλες. π.χ. while (i>1) { εντολές; } και για την For το ίδιο. Δοκίμασε το και πες αν σου δουλεύει. Αλλιώς πες ακριβώς τι σου λέει ο compiler. Επίσεις όταν εμφανίζεις τον πίνακα θέλει For (i=0;i<=9;i++){ εντολές ; } γιατί ουσιαστικά τον πας να εμφανίσει το στοιχείο α[10] του πίνακα. Όμως η C ξεκινάει από το 0 το μέτρημα άρα του ζητάς να εμφανίσει το 11 στοιχείο του πίνακα το οποίο είναι λάθος.
kickeras Δημοσ. 11 Σεπτεμβρίου 2006 Δημοσ. 11 Σεπτεμβρίου 2006 peran tis simeiwsis tou Dikemou pou o dikos mou o compiler de to dexetai an koitakseis ligo ton algorithmo sou katalavaineis oti exei kai logical errors...diladi mpaineis se endless loop. agkiles de xreiazontai otan ekteleis mono mia entoli. for (i=1;i<20;i=i+2) { a[k]=i; k++; } afto to loop trexei 10 fores ara k = 10 sto telos for (i=0;i<=10;i++) { while (k<=i) b+=a[k]; } to i ginetai 10 kai ara mpainei sto while loop....sto opoio kaneis ti?tou les gia oso to i (10) einai <= tou k (10) mpes ekei....e den allazeis tin timi tou k pouthena ara den vgainei pote apo kei mesa...
Lomar Δημοσ. 11 Σεπτεμβρίου 2006 Μέλος Δημοσ. 11 Σεπτεμβρίου 2006 thnks a lot!!!! @Aerico Οι αγκύλες δεν έχουν σημασία όταν ακολουθεί μια εντολή πχ for (i=0;i<=10;i++) while (mpla mpla) for (mpla mpla) dn xreiazontai agiles, kai pali omws to dokimasa opws m eipes k tpt, anavosvinei o idios orizontios kersoras, mono auto tpt allo k fusika to gnosto krasarisma! @Dikemou Eixes dikio!!! ksexasa o anapiros na valw to k++; !!!!!!!!! Twra omws allo bug!!! trexei kurile, alla meta ton peritto arithmo 17 anti gia 19 m vgazei: 22486 gia ton pinaka A kai meta ston pinaka B: 22486 -29 -1235 97 -1239 1098 141 -1224 15 17 24820 parepiptontws o debuges kwdikas by Dikemou >#include <stdio.h> int main() { int k,i,a[10],b[10]; for (i=1;i<20;i=i+2) { a[k]=i; k++; } k=0; for (i=0;i<=10;i++) { while (k<=i) { b[i]+=a[k]; k++; } } printf ("\n PINAKAS A: \n"); for (i=0;i<=10;i++) printf (" %d ",a[i]); printf ("\n PINAKAS B: \n"); for (i=0;i<=10;i++) printf (" %d ",b[i]); return 0; } to initialize gia to k to eixa kanei k pio prin apla twra, to evala pio panw apo to while opws k mou proteines... Twra omws??
Lomar Δημοσ. 11 Σεπτεμβρίου 2006 Μέλος Δημοσ. 11 Σεπτεμβρίου 2006 @kickeras to k THELW na ginei 10 sto telos (to zitaei h askisi) apla to evala mesa sthn loupa prokeimenou na anevazei ton metriti tou pinaka (a[k] anti gia a) Episis to while ekteleitai i fores!!! oxi 10! thn ekfwnisi ths askisis thn diavases protou me rwtiseis giati to kanw? giati to stoixeio b tha prepei na einai: b=a[i-1]+a[i-2]+...+a gia auto to kanw.
Lomar Δημοσ. 11 Σεπτεμβρίου 2006 Μέλος Δημοσ. 11 Σεπτεμβρίου 2006 Άντε βρε παιδιά πείτε μου τι να κάνω τώρα προκειμένου να μην μου βγάζει αρλούμπες το πρόγραμμα (βασικά μόνο που έτρεξε σαν εφαρμογή ήταν επιτυχία, αλλά δεν μου κάθεται καλά η εκτύπωση του πίνακα Β γαμώτο...) δεν ζητάω τον κώδικα, αλλά την λογική του αλγορίθμου για να μου εκτυπώνεται σωστά ο Β πίνακας... Ευχαριστώ εκ των προτέρων...
kickeras Δημοσ. 11 Σεπτεμβρίου 2006 Δημοσ. 11 Σεπτεμβρίου 2006 den me katalaves. katarxin me ton kainourgio kwdika ekei pou exeis valei to k=0 tha prepe na sou xtipaei sto run-time kathoti xristimopoieis to variable k apo panw xwris na to xeis kanei initialize. kata defteron to while den ekteleitai i fores. ston proigoumeno kwdika ekteloutan apeires kai se afton ekteleitai mia dioti les while (k<=i)....to k exei timi 10. ara i sinthiki ginetai alithis mono otan i = 10 diladi tin teleftaia fora pou trexei to for loop. ekei pera me ton kainourgio kwdika sou mpainei mesa, kanei b+=a[k]; kai meta k++ dld k = 11. meta otan ksanapaei na elegksei tin sinthiki leei while (k(11)<=i(10)) pou den isxiei...vgainei eksw kai bye bye... triton xrisimopoieis ton pinaka b xwris na exeis kanei initialize. an de tou xeis dwsei arxika tin timi 0 kai kaneis gia p.x. i = 5 b+=a[k]; prostheteis to a[k] se poia timi? meta otan kaneis printf trexeis to loop 11 fores oxi 10 giati ksekinas apo to 0 kai ftaneis sto 10. prosexe ta conditions otan thes na kaneis xrisi loops anyway afto nomizw theleis >#include <stdio.h> int main() { int k,i,a[10],b[10]; k=0; //initialize array b for (i=0; i<10;i++) b[i]=0; for (i=1;i<20;i=i+2) { a[k]=i; k++; } for (i=0;i<10;i++) { k = i; while(k >= 0) { b[i]+=a[k]; k--; } } printf ("\n PINAKAS A: \n"); for (i=0;i<10;i++) printf (" %d ",a[i]); printf ("\n PINAKAS B: \n"); for (i=0;i<10;i++) printf (" %d ",b[i]); return 0; }
Lomar Δημοσ. 11 Σεπτεμβρίου 2006 Μέλος Δημοσ. 11 Σεπτεμβρίου 2006 @kickeras thnks dude, τώρα την άκουσα άσχημα, έχεις δίκιο... απογοητεύτηκα τώρα , θα το τρέξω στον compiler μου να δω τι ακριβώς παίζει, εκεί που έκανεσ την αλλαγή στον κώδικά μου το b αυξάνεται κατα i α[ι] στοιχεία; thnks πάντως...
kickeras Δημοσ. 11 Σεπτεμβρίου 2006 Δημοσ. 11 Σεπτεμβρίου 2006 no worries....apla prosoxi thelei kai debugging. good luck
Lomar Δημοσ. 12 Σεπτεμβρίου 2006 Μέλος Δημοσ. 12 Σεπτεμβρίου 2006 τελικά δέν χρειαζότανε debugging (μόνο μια διόρθωση στη σύνταξη των σχολίων για το initializing του δεύτερου πίνακα)!!! Το initializing του b πινακα το είχα δοκιμάσει στην αρχή ακόμα και δεν απέδιδε, το λάθος μου ήταν στο μέτρημα των στοιχείων a που έπρεπε να προστεθούν στο εκάστοτε b. Λειτουργεί τέλεια, ιδιοφυές το τέχνασμα με το while (k>=0) k--;!!!
chiossif Δημοσ. 12 Σεπτεμβρίου 2006 Δημοσ. 12 Σεπτεμβρίου 2006 τώρα που την έλυσες σου στέλνω την δική μου πρόταση-λύση: #include <stdio.h> #include <stdlib.h> #define MAXEL 10 int main() { int a[MAXEL], b[MAXEL]; register int i, j; for (i=0;i<MAXEL;i++) a=2*i+1; for (i=0;i<MAXEL;i++){ b=0; for (j=i;j>=0;j--) b+=a[j]; } for(i=0;i<MAXEL;i++) printf("%4d\t%4d\t%8d\n",i+1,a,b); return 0; } Πιστεύω ότι έκανες τα εύκολα δύσκολα. Αλήθεια αν ήσουν δάσκαλος και διόρθωνες την δική σου λύση και την δική μου, ποιά θα σου φαινόταν πιο "αρχάρια";
alkisg Δημοσ. 12 Σεπτεμβρίου 2006 Δημοσ. 12 Σεπτεμβρίου 2006 Γίνεται και με ένα μόνο loop: >...λοιπές δηλώσεις... int sum = 0; for (i=0; i < 10; i++) { A[i] = 2*i + 1; sum += A[i]; B[i] = sum; printf("%d\t%d\n", A[i], B[i]); }
alkisg Δημοσ. 12 Σεπτεμβρίου 2006 Δημοσ. 12 Σεπτεμβρίου 2006 Και μια έκδοση με μία μόνο γραμμή μέσα στο for, εννοείται ότι είναι για πλάκα, όχι για να την παραδώσεις: >int main(void) { int A[10], B[10], i, sum = 0; for (i=0; i < 10; i++) printf("%d\t%d\n", A[i] = 2*i + 1, B[i] = sum += 2*i + 1); return getchar(); }
Lomar Δημοσ. 12 Σεπτεμβρίου 2006 Μέλος Δημοσ. 12 Σεπτεμβρίου 2006 @chiossif thnks, αλλά δεν κατάλαβα προς τι η ερώτηση σου, η "δική" μου θα μου φαινόταν πιο δύσκολη, επίσης την συνάρτηση που μου γράφεις δεν την ξέρω... @alkisg Ευχαριστώ και εσένα για τον κόπο σου να μου απαντήσεις, αλλά το return getchar (); πρώτη φορά το βλέπω και με μπερδεύει γενικότερα η λύση σου... Τώρα έχω και άλλο σκάλωμα! Το γράφω αν και ξέρω πως θα με πάρετε με τις πέτρες... :oops: Να γίνει πρόγραμμα το οποίο: 1. Διαβάζει ακέραιο αριθμό Ν απο 10 μέχρι το 100 με έλεγχο στην είσοδο. 2. Διαβάζει Ν ακεραίους και τους καταχωρεί στον Α[100]. 3. Δημιουργεί ένα δεύτερο πίνακα Β, ο οποίος περιέχει τα στοιχεία του Α με την ίδια σειρά έχοντας μετατοπίσει τα μηδενικά στοιχεία στο τέλος του. Για παράδειγμα: άν Α=[1 0 0 9 0 0 6 4 0 0], τότε Β=[1 9 6 4 0 0 0 0 0 0] Η λύση του άσχετου πρωτοεξαμηνήτη: > #include <stdio.h> main () { int n,a[100],b[100],i=0,flag=0,p=0;k=0; do { printf ("\n Dwse ton N: \n"); scanf ("%d",&n); } while (n<10 && n>100); for (i=0;i<n;i++) { printf ("\n dwse to %d stoixeio: ",i+1); scanf ("%d",&a[i]); } for (i=0;i<n;i++) b[i]=0; flag=0; for (i=0;i<n;i++) { while (flag==0) { if (a[i]==0) { flag=0; i++; } else { b[k]=a[i]; p=n-i; b[p]=0; flag=1; } } } for (i=0;i<n;i++) printf ("\n %d ",b[i]); } Όποιος με βοηθήσει στο που έκανα στον αλγόριθμο την λαλακια πριν τις 6 μ.μ. θα του είμαι βαθύτατα υπόχρεως!!! Υ.Γ. Ο compiler το τρέχει χωρίς κανένα λάθος το πρόγραμμα (κλασσικά), αλλά στην τελευταία εκτύπωση μου βγάζει τον πρώτο αριθμό που εισάγω ακολουθούμενο απο n-1 μηδενικά (0)... επίσης δοκίμασα και με 2 for και με do while αλλά τπτ γμτ...
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.