mandiom Δημοσ. 24 Απριλίου 2009 Δημοσ. 24 Απριλίου 2009 Λοιπόν, κατ αρχήν γεια σε όλους! Χρειάζομαι τη βοήθειά σας καθώς έχω μια εργασία σε C (στο μάθημα έγιναν μόνο γενικές αναφορές στη γλώσσα... Τπτ που θα μας βοηθούσε στην εργασία. Προφανώς θέλει να το ψάξουμε μόνοι μας - κάτι που έκανα ως ένα βαθμό.) Πρώτα η εκφώνηση: Για να ελεγχθεί η ισχύς του αναλογικού σήματος που εκπέμπει ένας σταθμός καταγράφονται οι τιμές από n διαδοχικές εκπομπές του. Από τις τιμές αυτές διαγράφονται όσες βρίσκονται έξω από τα αποδεκτά όρια για την ισχύ του σήματος και ως τελική τιμή για την ισχύ του θεωρείται ο μέσος όρος των τιμών που βρίσκονται μέσα στα αποδεκτά όρια. Να γραφεί το πρόγραμμα το οποίο να διαβάζει τον αριθμό n, το ελάχιστο min και μέγιστο max αποδεκτό όριο για την ισχύ του σήματος. Στη συνέχεια, διαβάζοντας τις n τιμές της ισχύος του σήματος που έχουν καταγραφεί, να υπολογίζει και να εκτυπώνει τον μέσο όρο όσων από αυτές βρίσκονται στο διάστημα (min,max). Τέλος το πρόγραμμα να εκτυπώνει ακόμη τον αριθμό των τιμών που βρέθηκαν έξω από τα όρια και τη μεγαλύτερη και τη μικρότερη τιμή για την ισχύ του σήματος που έχει καταγραφεί. Να ξεκαθαρίσω πως ΔΕ ΖΗΤΑΩ τη λύση έτοιμη. Απλά κάποια βοήθεια γιατί όσο να ναι το Help του Dev C++ δεν είναι και το καλύτερο μέρος να ψάχνεις... Σκοπεύω να ξαναδώ όσο μπορέσω το πρόγραμμα. Μέχρι στιγμής έχω αυτό: > #include <math.h> #include <stdio.h> int main(void) { int n, min, max, offlim, inlim, bsum; float avg; offlim = 0; //ìåôñÜåé ðüóåò ôéìÝò Þôáí åêôüò ïñßùí inlim = 0; //ìåôñÜåé ðüóåò ôéìÝò Þôáí åíôüò ïñßùí (ãéá ôï ìÝóï üñï) avg = 0; //ìÝóïò üñïò printf("Enter 'n' (number of values) \n"); scanf("%d",&n); printf("Enter 'min' (lower limit) \n"); scanf("%d",&min); printf("Enter 'max' (upper limit) \n"); scanf("%d",&max); int a[n], b[n], c[n]; int i; i = 0; /* for (i=0; i<n; ++i) scanf("%d",&a[i]); if(a[i]>min && a[i]<max) a[i] == b[i]; else a[i] == b[i]; */ printf("Enter 'n' values \n"); loop: scanf("%d",&a[i]); if(a[i]>min && a[i]<max) a[i] = b[i]; inlim++; else { // a[i] = c[i]; offlim++; } i++; if(i<n) goto loop; bsum = 0; for(i=n; i=0; --i) bsum = bsum + b[i]; avg = bsum/inlim; printf("Off limit: \n"); printf("%d",offlim); printf("Average of 'in-limit' : \n"); printf("%d",avg); return 0; } (Τα σχόλια χάλασαν στο copy-paste, δεν ξέρω γιατί...) Σας ενημερώνω πως είναι η πρώτη φορά που γράφω σε C (η πρώτη φορά που την αγγίζω ουσιαστικά...) και δεν έχω ιδέα... Τώρα, μερικές βασικές ερωτήσεις: *Στέκει το array[n] ?? Δλδ, δηλώνω έναν αριθμό και τον περνάω στο array. Αν όχι, πώς γίνεται; *Μπορώ να ομαδοποιήσω ένα 'else' ; *Αυτά τα ρημαδοfor πώς συνδυάζονται με scanf και απλή πρόσθεση;; Και γενικά όποιος μπορεί και θέλει ας δώσει ένα χεράκι... Και κάτι τελευταίο... Πως στην ευχή μπορείς να τρέξεις κώδικα στο Visual Studio Express (Visual C++) 2008 χωρίς να κάνεις project;; Δεν ανάβει το πράσινο βελάκι αν δεν δημιουργήσω νέο project... Τώρα χρησιμοποιώ Dev C++.. Σας ευχαριστώ θερμά εκ των προτέρων
bxenos Δημοσ. 24 Απριλίου 2009 Δημοσ. 24 Απριλίου 2009 (Τα σχόλια χάλασαν στο copy-paste, δεν ξέρω γιατί...) Άλλο set χαρακτήρων, εσύ γράφεις σε κονσόλα dos ενω εδώ τα πέρασες σε windows unicode Σας ενημερώνω πως είναι η πρώτη φορά που γράφω σε C (η πρώτη φορά που την αγγίζω ουσιαστικά...) και δεν έχω ιδέα... ηλίου φαεινότερο... Τώρα, μερικές βασικές ερωτήσεις: *Στέκει το array[n] ?? Δλδ, δηλώνω έναν αριθμό και τον περνάω στο array. Αν όχι, πώς γίνεται; Όχι,δεν ισχύει σε όλα τα πρότυπα C/C++. Το τυπικό (που ισχύει παντού)είναι > int *array; //εδω δηλώνουμε οτι θα θέλαμε ενα πίνακα(pointer σε πίνακα) array = (int *)malloc(sizeof(int) * n));//εδω δεσμεύουμε μνήμη απο το "σωρό" (heap) *Μπορώ να ομαδοποιήσω ένα 'else' ; Τι να σημαίνει αυτό άραγε;;; Μήπως να βάλεις περισσότερες απο μια εντολές; π.χ. > if(mhtsos==32) printf("jsdhkjdh"); else { printf("jshdvjdv"); printf("kjxhvdskjfvh"); } *Αυτά τα ρημαδοfor πώς συνδυάζονται με scanf και απλή πρόσθεση;; δηλαδή; Και γενικά όποιος μπορεί και θέλει ας δώσει ένα χεράκι... Και κάτι τελευταίο... Πως στην ευχή μπορείς να τρέξεις κώδικα στο Visual Studio Express (Visual C++) 2008 χωρίς να κάνεις project;; Δεν ανάβει το πράσινο βελάκι αν δεν δημιουργήσω νέο project... Τώρα χρησιμοποιώ Dev C++.. Κάνε ένα project, τζάμπα είναι... Προσοχή στα == και στα = Το a == 32 μεταφράζεται ώς: "Ειναι το a ίσο με το 32?" και έχει σαν αποτέλεσμα ΑΛΗΘΕΣ ή ΨΕΥΔΕΣ. Το a δεν αλλάζει τιμή Το a = 32 μεταφράζεται ώς: "Βάλε το 32 στο a" και έχει σαν αποτέλεσμα το a να αλλάζει πιθανά τιμή.
teo64x Δημοσ. 24 Απριλίου 2009 Δημοσ. 24 Απριλίου 2009 Έχεις πολλά λαθάκια στον κώδικά σου, με αποτέλεσμα να μην κάνει αυτό που περιγράφεις. Δες μία διορθωμένη έκδοση. >#include <math.h> #include <stdio.h> #include <stdlib.h> int main(void) { int n, min, max, offlim, inlim, bsum; float avg; offlim = 0; inlim = 0; avg = 0; printf("Enter 'n' (number of values) \n"); scanf("%d",&n); printf("Enter 'min' (lower limit) \n"); scanf("%d",&min); printf("Enter 'max' (upper limit) \n"); scanf("%d",&max); int a[n], b[n], c[n]; int i; i = 0; printf("Enter 'n' values \n"); loop: scanf("%d",&a[i]); if(a[i]>min && a[i]<max) { b[i] = a[i]; // b[i]=a[i], δηλαδή από το input στον "καθαρό" πίνακα και όχι το ανάποδο. inlim++; } else { offlim++; } i++; if(i<n) goto loop; bsum = 0; for(i=n-1; i>=0; --i) bsum = bsum + b[i]; // αρχική συνθήκη i=n-1 (ο πίνακας n στοιχείων φτάνει ως b[n-1]) και συνθήκη ελέγχου >= (επίσης, τελεστής σύγκρισης είναι το == και όχι το =) float fa=bsum, fb=inlim; avg = fa/fb; // Για να περαστεί σωστή τιμή στο avg, πρέπει η διαίρεση να είναι μεταξύ float και float, όχι int και int (νομίζω) printf("Off limit: \n"); printf("%d\n",offlim); printf("Average of 'in-limit' : \n"); printf("%g\n",avg); // Τυπώνεις ως %g και όχι ως %d τη float system("pause"); return 0; }
ippo00 Δημοσ. 24 Απριλίου 2009 Δημοσ. 24 Απριλίου 2009 Variable length arrays υπάρχουν σε C99 (αλλά το gcc π.χ δεν τα υποστηρήζει `edit: και όμως τα υποστηρήσει πια`). Λογικά πάντως θα λειτουργήσει επειδή χρησιμοποιείς C++ compiler. Δες απλά αν θα σε κράξει. Αλλιώς θα θες malloc. Άν ομαδοποιήσω εννοείς: else {} τότε ναι μπορείς, αλλιώς δεν είναι ξεκάθαρο τι ρωτάς. huh?
bxenos Δημοσ. 24 Απριλίου 2009 Δημοσ. 24 Απριλίου 2009 Σημπλήρωμα: To printf("%d",a) περιμένει η μεταβλητή a να είναι τυπου %d (integer). Τι είναι τα b[n],c[n] που "δεσμεύεις" και "προσπαθείς" να χρησιμοποιήσεις; > for (i=0; i<n; ++i) { scanf("%d",&a[i]); εδω κάνεις ότι άλλο θέλεις να κάνεις στο βρογχο } Στο σχόλιο το είχες καλό το for loop. Γιατί δεν το χρησιμοποίησες και πήγες στο goto; Οι while,if,else,for,do-while εντολες είναι compound statements. Αν θέλεις δηλαδή να τους ανοικουν περισσότερες απο μία ενολές πρεπει να βάλεις αγγιστρα {}
ippo00 Δημοσ. 24 Απριλίου 2009 Δημοσ. 24 Απριλίου 2009 Έκανες και ενα πρωτοφανές λάθος. Χρησιμοποίησες == αντί για = ; Συνήθως γίνεται το αντίστροφο.
Επισκέπτης Δημοσ. 24 Απριλίου 2009 Δημοσ. 24 Απριλίου 2009 Λοιπον ενα ενα.Εχεις πολλα λαθη αλλα δεν πειραζει γιατι εισαι ακομα αρχαριος.Θα μαθεις με τον καιρο. 1ον)Σε συμβουλευω να δηλωνεις ολες τις μεταβλητες του προγραμματος στην αρχη του κωδικα. 2ον)Αντι για τη δηλωση:int offlim; offlim=0; μπορεις να δηλωσεις απευθειας:int offlim=0;.Ετσι δηλωνεις και αρχικοποιεις τη μεταβλητη σου. 3ον)Η δηλωση:int a[n],b[n],c[n]; ειναι λαθος γιατι στη C δεν ειναι αποδεκτο να δηλωνεται ενας πινακας με μεταβλητο μεγεθος μ'αυτον τον τροπο.Ενας αποδεκτος τροπος ειναι ο εξης: int *a,*b,*c; a=(int *)malloc(n*sizeof(int)); b=(int *)malloc(n*sizeof(int)); c=(int *)malloc(n*sizeof(int)); Η δηλωση int *a; δηλωνει εναν δεικτη προς ακεραιο.Δηλαδη το a ειναι μια μεταβλητη που δειχνει σε μια θεση μνημης.Τωρα για δεικτες γενικα χρειαζεται διαβασμα και εισαι ακομα στην αρχηη οποτε υπομονη. 4ον)Αυτη η δηλωση:int i; i = 0; for (i=0; i<n; ++i) θα μπορουσε να γινει με δυο τροπους.Ετσι:int i=0; for(;i<n;i++) ή ετσι:int i; for(i=0;i<n;i++) Καλο θα ειναι στις for να χρησιμοποιεις το ++ ή -- μετα την μεταβλητη. Επισης εδω:for(i=n; i=0; --i) μαλλον θες να πεις αυτο:for(i=n;i>0;i--). Γενικα υπαρχουν κι αλλα λάθη στη λειτουργια του προγραμματος. Ελπιζω να βοηθησα οσο μπορουσα.
mandiom Δημοσ. 27 Απριλίου 2009 Μέλος Δημοσ. 27 Απριλίου 2009 Παιδιά σας ευχαριστώ απίστευτα όλους! Τώρα βιάζομαι γτ έχω μάθημα και δεν μπορώ να πω πολλά, απλά παραθέτω άλλες μια-δυο ερωτήσεις μιας και η εργασία είναι για τις 12 το βράδυ... (Δεν είχα ιντερνετ... ) Όταν δεν υπάρχουν offlim τιμές (εκτός ορίων) ο μέσος όρος βγαίνει οκ. Όταν υπάρχουν βγάζει ότι να ναι... Γιατί;; Και τέλος, δεδομένου ότι έχω όλες τις εισαχθείσες τιμές στον πίνακα a[n], υπάρχει κάποιος τρόπος να πω στη C να μου δώσει τη μικρότερη και τη μεγαλύτερη τιμή που υπάρχει στον a[n];; Σας ευχαριστώ και πάλι θερμά!
teo64x Δημοσ. 27 Απριλίου 2009 Δημοσ. 27 Απριλίου 2009 Για να σου απαντήσουμε σ' αυτή την ερώτηση, θα βοηθούσε να μας πεις πρώτα τι αλλαγές (με βάση τις υποδείξεις που σου έγιναν) έχεις κάνει (αν έχεις κάνει) από τον αρχικό κώδικα που πόσταρες.
Directx Δημοσ. 27 Απριλίου 2009 Δημοσ. 27 Απριλίου 2009 Και τέλος, δεδομένου ότι έχω όλες τις εισαχθείσες τιμές στον πίνακα a[n], υπάρχει κάποιος τρόπος να πω στη C να μου δώσει τη μικρότερη και τη μεγαλύτερη τιμή που υπάρχει στον a[n];; Αν προγραμμάτιζες σε C++ θα μπορούσες να χρησιμοποιούσες τις max_element και min_element. Στην C αν δεν θες να γράψεις κάποια δικιά σου ρουτίνα (ή αν δεν θες να ψάξεις στο Google καθώς υπάρχουν αρκετές και μάλιστα πολύ απλές) που να κάνει τον ανάλογο έλεγχο στα περιεχόμενα του πίνακα A μπορείς να βασισθείς στην ρουτίνα qsort (stdlib.h) που προσφέρει η οποία σου επιτρέπει να ταξινομήσεις τα στοιχεία ενός πίνακα με ότι κριτήρια επιθυμείς και παρέχεις σε μια εξωτερική ρουτίνα που η qsort καλεί καθώς θα ταξινομεί τα περιεχόμενα του πίνακα. Σε αυτή την περίπτωση καθοδηγείς την qsort να ταξινομήσει τις μικρότερες τιμές ας πούμε στην κορυφή του πίνακα (πχ η μικρότερη τιμή να είναι στην θέση A[0]) ενώ τις μεγαλύτερες τιμές προς το τέλος του (πχ η μεγαλύτερη τιμή να είναι στην τελευταία θέση του πίνακα A[n-max]). Το μειονέκτημα αυτής της λύσης είναι βέβαια ότι η αρχική σειρά με την οποία έχουν καταχωρηθεί τα δεδομένα στον πίνακα αφού εφαρμοσθεί η qsort, αλλάζει. Για την ιστορία εκτός από την qsort μέθοδο πρόσθεσα και δυο γρήγορα γραμμένες ρουτίνες (MaxElement & MinElement) που επιστρέφουν το Max / Min αριθμό ενός int array απευθείας . Ακολουθεί ένα μικρό παράδειγμα γραμμένο σε CodeGear C++ Builder: > /* Min/Max with (and without) QSort directx */ #include <stdio.h> #include <stdlib.h> #include <time.h> #define _ARRAY_LEN 15 #define _MAX_RANDOM_NUMBER 100 int QCmp(const void*, const void*); int MaxElement(int[], int nLen); int MinElement(int[], int nLen); int main(void) { int nA[_ARRAY_LEN], nALen = sizeof(nA) / sizeof(int), nIdx; /* Fill array with random numbers */ srand(time(NULL)); for(nIdx = 0; nIdx < nALen; nIdx++) nA[nIdx] = rand() % _MAX_RANDOM_NUMBER + 1; /* Simplier way */ printf(" MaxElement number: %d\n MinElement number: %d\n\n", MaxElement(nA, nALen), MinElement(nA, nALen)); /* Sort from less to more */ qsort(&nA, nALen, sizeof(int), QCmp); /* Dump data */ printf(" Array after QSort:\n"); for(nIdx = 0; nIdx < nALen; nIdx++) printf("\t[%.2d] = %d\n", nIdx, nA[nIdx]); /* Max number should be on the bottom of the array, Min on the top */ printf("\n Thus max number: %d\n Thus min number: %d\n", nA[nALen - 1], nA[0]); /* End */ printf("\n Press Enter to exit.."); getchar(); return 0; } int QCmp(const void *A, const void * { /* From less to more */ if(*(int*)A < *(int*) return -1; if(*(int*)A > *(int*) return 1; return 0; } int MaxElement(int Array[], int nLen) { /* Return Max array element (sequential search) */ int nIdx, nMax = Array[0]; for(nIdx = 0; nIdx < nLen; nIdx++) if(Array[nIdx] > nMax) nMax = Array[nIdx]; return nMax; } int MinElement(int Array[], int nLen) { /* Return Min array element (sequential search) */ int nIdx, nMin = Array[0]; for(nIdx = 0; nIdx < nLen; nIdx++) if(Array[nIdx] < nMin) nMin = Array[nIdx]; return nMin; } Έξοδος: > MaxElement number: 77 MinElement number: 4 Array after QSort: [00] = 4 [01] = 5 [02] = 10 [03] = 10 [04] = 11 [05] = 13 [06] = 21 [07] = 26 [08] = 27 [09] = 31 [10] = 34 [11] = 39 [12] = 42 [13] = 46 [14] = 77 Thus max number: 77 Thus min number: 4 Press Enter to exit.. Φυσικά μπορεί να υπάρχουν bugs ή άλλες αβλεψίες. Καλή συνέχεια!
mandiom Δημοσ. 2 Μαΐου 2009 Μέλος Δημοσ. 2 Μαΐου 2009 Παιδιά σας ευχαριστώ πάρα πολύ!! Αυτός είναι ο κώδικας που έστειλα και πέρασε (δε βαθμολογείται, απλά απαιτείται προσπάθεια): >#include <math.h> #include <stdio.h> #include <stdlib.h> int main(void) { int n, min, max; // ðëÞèïò ôéìþí, êÜôù üñéï, ðÜíù üñéï float avg=0; // ìÝóïò üñïò int offlim = 0; // ìåôñÜåé ðüóåò ôéìÝò Þôáí åêôüò ïñßùí int inlim = 0; // ìåôñÜåé ðüóåò ôéìÝò Þôáí åíôüò ïñßùí (ãéá ôï ìÝóï üñï) int bsum = 0; // Üèñïéóìá ôéìþí åíôüò ïñßùí int i=0; // ìåôñçôÞò(1) ãéá ôï for loop int j=0; // ìåôñçôÞò(2) ãéá ôï for loop int k,m=0; // ìåôñçôÝò(3 êáé 4) ãéá max_val êáé min_val loops áíôßóôïé÷á // ÅéóáãùãÞ ðëÞèïõò ôéìþí êáé ïñßùí printf("Enter 'n' (number of values) \n"); scanf("%d",&n); printf("Enter 'min' (lower limit) \n"); scanf("%d",&min); printf("Enter 'max' (upper limit) \n"); scanf("%d",&max); int a[n], b[n]; // ðßíáêáò åéóá÷èÝíôùí ôéìþí, ðßíáêáò ôéìþí åíôüò ïñßùí (äåí ïñßæïíôáé ðéï ìðñïóôÜ ãéáôß äåí Ý÷åé ïñéóôåß ôï n) // ÎåêéíÜåé ç åéóáãùãÞ ôùí ôéìþí printf("Enter 'n' values \n"); for (i=0; i<n; i++) // äéáâÜæåé ôéìÝò, åëÝã÷åé áí åßíáé åíôüò Þ åêôüò ïñßùí, ôñïðïðïéåß ó÷åôéêïýò ìåôñçôÝò (inlim êáé offlim) { scanf("%d",&a[i]); if(a[i]>min && a[i]<max) { b[i] = a[i]; inlim++; } else { offlim++; } } for(j=inlim-1; j>=0; j--) bsum = bsum + b[j]; // õðïëïãßæåé Üèñïéóìá ôéìþí åíôüò ïñßùí float fa=bsum, fb=inlim; // íá ãßíïõí float ãéá íá äÝ÷åôáé êáé äåêáäéêïýò ï ìÝóïò üñïò avg = fa/fb; // õðïëïãßæåé ìÝóï üñï // Âñßóêåé ìÝãéóôç êáé åëÜ÷éóôç ôéìÞ ðïõ êáôáãñÜöçêå int max_val=a[0]; // ìåôáâëçôÝò ãéá ìÝãéóôç/åëÜ÷éóôç ôéìÞ (äåí ïñßæïíôáé ðéï ìðñïóôÜ ãéáôß äåí Ý÷åé ïñéóôåß ï a[]) int min_val=a[0]; // Max_val - ÌÝãéóôç for(k=1; k<n; k++) { if(a[k]>max_val) { max_val = a[k]; } } // Min_val - ÅëÜ÷éóôç for(m=1; m<n; m++) { if(a[m]<min_val) { min_val = a[m]; } } // Ôýðùóå ôá áðïôåëÝóìáôá printf("Off-limit: %d \n",offlim); printf("Average of 'in-limit': %g \n",avg); printf("Greatest value entered: %d \n",max_val); printf("Smallest value entered: %d \n",min_val); system("pause"); // êáðñßôóéá ôïõ Dev... return 0; // o Dev ôç èÝëåé int êáé áíáãêáóôçêÜ äåí åðéóôñÝöåé ôßðïôá... } Τώρα γράφω την επόμενη η οποία νομίζω πάει οκ Αν χρειαστώ, τώρα ξέρω που θα ρωτήσω Σας ευχαριστώ και πάλι
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.