THMMY.gr

Μαθήματα Βασικού Κύκλου => Δομημένος Προγραμματισμός => Topic started by: ultraviolet on May 05, 2011, 16:40:16 pm



Title: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: ultraviolet on May 05, 2011, 16:40:16 pm
Aνεβηκε και η τεταρτη εργασια στο ethmmy:

Εργαστήριο D


Μια εταιρία κινητής τηλεφωνίας έχει εγκατεστημένους, σε μια περιοχή, Ν πυλώνες αναμετάδοσης του σήματος. Για τον κάθε πυλώνα είναι γνωστή η ισχύς με την οποία εκπέμπει καθώς και οι συντεταγμένες x,y της θέσης του. Η εταιρία, για να βελτιώσει την απόδοση του συστήματος, θέλει να αντικαταστήσει έναν από τους πυλώνες με έναν σταθμό βάσης ο οποίος θα δέχεται τα σήματα από τους υπόλοιπους πυλώνες και θα τα διαβιβάζει στον κεντρικό σταθμό της εταιρίας. Για την επιλογή της θέσης του σταθμού βάσης έχουν οριστεί τα εξής κριτήρια.
α) Η ισχύς του σήματος που θα φτάνει από έναν πυλώνα στον σταθμό βάσης δεν πρέπει να είναι μικρότερη από μια τιμή minp που ορίζουν οι προδιαγραφές του σταθμού.
β) Ο αριθμός των πυλώνων που θα εξυπηρετούνται από τον σταθμό βάσης σύμφωνα με το κριτήριο α να είναι ο μέγιστος.
γ) Στην περίπτωση που υπάρχουν περισσότερες από μια θέσεις που πληρούν τα κριτήρια α και β, επιλέγεται η θέση για την οποία η μέση τιμή της ισχύος των αποδεκτών σημάτων που φτάνουν σε αυτήν είναι η μέγιστη.
Να γραφεί το πρόγραμμα το οποίο, αφού διαβάσει τον αριθμό των πυλώνων, να δεσμεύει δυναμικά μνήμη για τρεις μονοδιάστατους πίνακες x, y, και p. Στους δύο πρώτους να καταχωρούνται οι συντεταγμένες των θέσεων των πυλώνων και στον τρίτο η ισχύς με την οποία εκπέμπει ο κάθε πυλώνας. Στο πρόγραμμα να ορίζεται η συνάρτηση void calk(…) η οποία να δέχεται, μέσα από τα ορίσματά της, τον αύξοντα αριθμό ενός πυλώνα. Η συνάρτηση να υπολογίζει, για τη θέση αυτού του πυλώνα, τον αριθμό των πυλώνων και τη μέση τιμή της ισχύος των σημάτων τους που φτάνουν στη θέση αυτή και που πληρούν το κριτήριο α. Το πρόγραμμα, χρησιμοποιώντας τη συνάρτηση calk(), για κάθε πυλώνα, να βρίσκει, με βάση τα κριτήρια που ορίστηκαν, τον πυλώνα που πρέπει να αντικατασταθεί από τον σταθμό βάσης.
Παρατηρήσεις:
1)Να μη χρησιμοποιηθούν πουθενά γενικές μεταβλητές.   
2) Η συνάρτηση calk() να μη διαβάζει δεδομένα και να μην εκτυπώνει αποτελέσματα.
3) Η συνάρτηση calk() να δέχεται μέσα από τα ορίσματά της όλα τα απαραίτητα δεδομένα
4) Ένα σήμα που εκπέμπεται  ισχύ P από μια θέση Α φτάνει σε μια θέση Β με ισχύ w=P/d2 όπου d η απόσταση ανάμεσα στις θέσεις Α και Β.
5) Οι πυλώνες αριθμούνται από το 0 έως το Ν-1.
6) Οι συντεταγμένες των θέσεων των πυλώνων ορίζονται σε ένα τοπικό σύστημα καρτεσιανών συντεταγμένων. 










edit by mod: title


Title: Re: ΕΡΓΑΣΙΑ D
Post by: Silvershot on May 06, 2011, 22:07:40 pm
Ποτε ληγει η προθεσμια παραδοσης?

Εdit: 15/05/11 δεν το προσεξα διπλα απο την εργασια λολ


Title: Re: ΕΡΓΑΣΙΑ D
Post by: titan1 on May 12, 2011, 11:22:58 am
Πως πάει η εργασία; Δεν βλέπω απορίες


Title: Re: ΕΡΓΑΣΙΑ D
Post by: elen// on May 12, 2011, 11:55:34 am
μπορει να βοηθησει καποιος στο πως να κανουμε την συναρτηση??


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: Faros on May 12, 2011, 23:05:17 pm
Στη συναρτηση θα δωσεις ως ορισματα τις διευθυνσεις των αρχικων τιμων των πινακων στους οποιους εχεις καταχωρησει τα x,y και p.Οποτε στο εσωτερικο της συναρτησης χρησημοποιεις pointers για για να διατρεχεις τους πινακες και να σχηματισεις τις εντολες που θελεις.


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: Silvershot on May 12, 2011, 23:15:31 pm
Στη συναρτηση θα δωσεις ως ορισματα τις διευθυνσεις των αρχικων τιμων των πινακων στους οποιους εχεις καταχωρησει τα x,y και p.Οποτε στο εσωτερικο της συναρτησης χρησημοποιεις pointers για για να διατρεχεις τους πινακες και να σχηματισεις τις εντολες που θελεις.
Oυσιαστικα θα περνας τη διευθυνση μνημης μεσα στην συναρτηση και θα τη καταχωρεις στους pointers οι οποιοι θα δειχνουν στις διευθυνσεις μνημης των στοιχειων των πινακων, ετσι?


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: Faros on May 12, 2011, 23:21:22 pm
ακριβως


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: dimitris21 on May 14, 2011, 12:17:41 pm
χρησιμοποιουμε malloc η calloc ?


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: Ναταλία on May 14, 2011, 13:05:55 pm
χρησιμοποιουμε malloc η calloc ?

νομιζω και τα δυο ειναι σωστα.
αν χρησιμοποιησεις malloc απλα πρεπει να μηδενισεις τουσ πινακες (οχι ολους) με μια for.


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: elen// on May 14, 2011, 13:59:30 pm
μπορει κανεις να βοηθησει με το παρακατω?
οταν οριζουμε την συναρτηση θα πρεπει να βαλουμε στα ορισματα ποιντερ και τουσ πινακες ωστε να παρει την διευθυνση και μετα με διπλο ποιντερ οταν μεσα στην συναρτηση θελουμε να χρησιμοποιησουμε τις τιμες του πινακα??εκανα κατι τετοιο αλλα το βγαζει λαθοσ...εχει κανεις καμια ιδεα??


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: teslaaaa on May 14, 2011, 16:40:08 pm
γενικευμενες και global μεταβλητες το ιδιο δεν ειναι? :-\


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: Nerevar on May 14, 2011, 20:36:06 pm
Nαι.


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: chrimour on May 14, 2011, 21:21:24 pm
 παιδια μπορει καποιος να βοηθησει στο κομματι που λεει να δεσμευσουμε δυναμικα μνημη για τους πινακες x,y,p; πως το κανουμε αυτο; δεν το εχω καταλαβει ακριβως..


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: Faros on May 15, 2011, 03:31:17 am
Θετεις αρχικα εναν pointer τυπου float,εστω το *x,επειτα με μια scanf δινει ο χρηστης το n (αριθμο των πυλωνων) και για να δημιουργησεις εναν πινακα x[n] :
x=(float*)malloc(n*sizeof(float));


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: elen// on May 15, 2011, 12:35:40 pm
μπορει κανεις να βοηθησει με το παρακατω?
οταν οριζουμε την συναρτηση θα πρεπει να βαλουμε στα ορισματα ποιντερ και τουσ πινακες ωστε να παρει την διευθυνση και μετα με διπλο ποιντερ οταν μεσα στην συναρτηση θελουμε να χρησιμοποιησουμε τις τιμες του πινακα??εκανα κατι τετοιο αλλα το βγαζει λαθοσ...εχει κανεις καμια ιδεα??

ξερει κανεις τι πρεπει  να κανουμε?? :???:


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: zisis00 on May 15, 2011, 14:16:17 pm
μπορει κανεις να βοηθησει με το παρακατω?
οταν οριζουμε την συναρτηση θα πρεπει να βαλουμε στα ορισματα ποιντερ και τουσ πινακες ωστε να παρει την διευθυνση και μετα με διπλο ποιντερ οταν μεσα στην συναρτηση θελουμε να χρησιμοποιησουμε τις τιμες του πινακα??εκανα κατι τετοιο αλλα το βγαζει λαθοσ...εχει κανεις καμια ιδεα??

ξερει κανεις τι πρεπει  να κανουμε?? :???:

Έστω οτι έχουμε έναν pointer p_foo και δεσμέυουμε μνήμη γι'αυτόν με την malloc() στην main

Code:
main () {
   int *p_main;
   p_main = (int *)malloc(N*sizeof(int));
   p[0] = 15;
}

0x7fff6a40852c: p_main                                    0x7fffcdd1337 (= η πρώτη θέση της μνήμης που δεσμεύτηκε απο την malloc())
-------------------------------                                     -------------------------------------------
|      0x7ffcfdd1337      |                ----->             |  15 | ... | ... | ... |             ...           |
-------------------------------                                     --------------------------------------------
**TIP: Η τιμή πριν την p_main( 0x7fff6a40852c ) είναι η διεύθυνση μνήμης της p_main  (&p_main) ωστε να την καταλαβαίνει ο compiler. Είναι σταθερή και δεν μπορει να αλλάξει και ούτε μας ενδιαφέρει σε αυτήν την περίπτωση. Δεν έχει καμία σχέση με την τιμή μέσα στο κουτάκι η οποία ειναι μεταβλητή και μπορεί να αλλάζει κατα την διάρκει της εκτέλεσης.

Στο σουπερ-γαμάτο σχήμα φαίνεται ο δείκτης p_main (o οποίος έχει διεύθυνση μνήμης 0x7fff6a40852c , δηλαδή το &p_main), κρατάει αποθηκευμένη μέσα στο κουτακι του την διεύθυνση μνημης του πρώτου στοιχείου που έγινε allocate  με την malloc(). Έτσι η εντολή p[0] = 23; θα δώσει στο πρώτο στοιχείο την τιμή 0. (το p[1] θα έδινε στο δεύτερο κ.ο.κ)

Κατόπιν καλούμε την συνάρτηση foo()

Code:
void foo(int *p_foo) {
   p_foo[0]  = 23;
}

int main () {
   ...
   fοο(p_main);
   ...
}

Στην foo στέλνουμε την τιμή που είναι αποθηκευμένη στην p_main δηλαδή την 0x7ffcfdd1337. Οπότε ο νέος pointer μεσα στην foo, ο p_foo θα έχει και αυτος την τιμή 0x7ffcfdd1337.

Και το σχήμα μας γίνετα ως εξής

p_foo
------------------------------
|   0x7ffcfdd1337        |                    ----------------
------------------------------                                      |
                                                                           V
0x7fff6a40852c: p_main                                    0x7fffcdd1337 (= η πρώτη θέση της μνήμης που δεσμεύτηκε απο την malloc())
-------------------------------                                     -------------------------------------------
|      0x7ffcfdd1337      |                ----->             |  15 | ... | ... | ... |             ...           |
-------------------------------                                     --------------------------------------------

οπότε η εντολή p_foo[0] = 23; θα δώσει την τιμή 23 στο πρώτο στοιχειο που δείχνει ο pointer p_foo δηλαδή στην μνήμη που έχει δεσμευτεί απο την malloc()
και το τελικό σχήμα είναι:

p_foo
------------------------------
|   0x7ffcfdd1337        |                    ----------------
------------------------------                                      |
                                                                           V
0x7fff6a40852c: p_main                                    0x7fffcdd1337 (= η πρώτη θέση της μνήμης που δεσμεύτηκε απο την malloc())
-------------------------------                                     -------------------------------------------
|      0x7ffcfdd1337      |                ----->             |  23 | ... | ... | ... |             ...           |
-------------------------------                                     --------------------------------------------

Οπότε κανένα άγχος για διπλους pointers στην άσκηση η οτιδήποτε τετοιο.. Παρακάτω παρουσιάζω και ολοκληρο το source αν κάποιος θέλει να παίξει ωστε να τα κατανοήσει καλύτερα.

Code:
#include <stdio.h>
#include <stdlib.h>

void foo(int *p_foo) {
p_foo[0] = 23;
}

int main() {
int *p_main = (int *) malloc(5*sizeof(int));
p_main[0] = 15;
printf("%d\n", p_main[0]);
foo(p_main);
printf("%d\n", p_main[0]);

return 0;
}


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: Άντι ιστ κρίιγκ on May 15, 2011, 15:24:43 pm
Όταν λέει
" Να μη χρησιμοποιηθούν πουθενά γενικές μεταβλητές. "

τι ακριβώς εννοεί; ότι δε μπορώ να δηλώσω καμία μεταβλητή στη main; Κι αν ναι, πώς θα το πετύχω αυτό;


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: teslaaaa on May 15, 2011, 15:29:49 pm
απ οτι καταλαβα εννοει να μη δηλωσεις μεταβλητες πανω πανω οι οποιες θα εχουν εμβελεια για ολες τις συναρτησεις που θα χρησιμοποιησεις στο προγραμμα..


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: Άντι ιστ κρίιγκ on May 15, 2011, 15:31:11 pm
To προγραμμα θα έχει μόνο μία συνάρτηση, την calk?


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: teslaaaa on May 15, 2011, 15:35:16 pm
την calk και τη main λογικα...


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: Άντι ιστ κρίιγκ on May 15, 2011, 15:36:41 pm
Ευχαριστώ! Αυτό εδώ
Code:
        int *x = malloc(N * sizeof (float));
        if (x == NULL)
        {
          
               exit(0)
              
        }


είναι που εννοούμε όταν λέμε δέσμευση μνήμης;

θα το βάλω μέσα στην calk, ή στη main;


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: teslaaaa on May 15, 2011, 15:42:34 pm
Ευχαριστώ! Αυτό εδώ
Code:
        int *x = malloc(N * sizeof (float));
        if (x == NULL)
        {
          
               exit(0)
              
        }


είναι που εννοούμε όταν λέμε δέσμευση μνήμης;

θα το βάλω μέσα στην calk, ή στη main;
ναι το χρησιμοποιεις για να δεσμευσεις δυναμικα μνημη για τους πινακες που σου ζηταει και το βαζεις στη main ωστε να το χρησιμοποιησεις μετα και στν calk μαλλον...
αν και νομιζω οτι ξεχασες εναν (float*) μπροστα απ τη malloc που δειχνει τις διευθυνσεις των θεσεων μνημης που χρησιμοποιησε η συναρτηση..


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: Kle on May 15, 2011, 15:49:01 pm
αφου η συναρτηση calk πρεπει να ειναι void και δεν μας επιτρεπει να εκτυπωνουμε αποτελεσματα πως θα επιστρεψουμε τον πυλώνα που πρέπει να αντικατασταθεί από τον σταθμό βάσης ?


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: teslaaaa on May 15, 2011, 15:55:06 pm
με pointers..εκανε παρομοιο παραδειγμα ο μαμαλακης την παρασκευη..


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: Άντι ιστ κρίιγκ on May 15, 2011, 15:57:04 pm
Η calk ποιες παραμέτρους θα έχει; x,y,p?


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: butterfly_1 on May 15, 2011, 19:11:51 pm
με pointers..εκανε παρομοιο παραδειγμα ο μαμαλακης την παρασκευη..

μπορει καποιος να ανεβασει το συγκεκριμενο παραδειγμα που εκανε την παρασκευη;


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: marc0. on May 15, 2011, 19:13:39 pm
Όντως =]


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: Άντι ιστ κρίιγκ on May 15, 2011, 21:00:47 pm
α) Η ισχύς του σήματος που θα φτάνει από έναν πυλώνα στον σταθμό βάσης δεν πρέπει να είναι μικρότερη από μια τιμή minp που ορίζουν οι προδιαγραφές του σταθμού.

Εδω μιλαει για  το w? Ή το p?


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: istar on May 15, 2011, 22:25:42 pm
α) Η ισχύς του σήματος """που θα φτάνει"" από έναν πυλώνα στον σταθμό βάσης δεν πρέπει να είναι μικρότερη από μια τιμή minp που ορίζουν οι προδιαγραφές του σταθμού.

Εδω μιλαει για  το w? Ή το p?

4) Ένα σήμα που εκπέμπεται  ισχύ P από μια θέση Α """φτάνει"" σε μια θέση Β με ""ισχύ"" w=P/d2 όπου d η απόσταση ανάμεσα στις θέσεις Α και Β.

Άρα μιλάει για το w.


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: png on May 16, 2011, 00:12:27 am
που είσαι ρε θοδωρήηηηηηηη  :-\


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: Angel C. on June 18, 2011, 13:46:04 pm
Η βιβλιοθήκη <process.h> που βάζει στην λύση σε τι χρειάζεται;  :-\


Title: Re: [Δομημένος Πρ.] ΕΡΓΑΣΙΑ D
Post by: zisis00 on June 18, 2011, 14:15:13 pm
Η βιβλιοθήκη <process.h> που βάζει στην λύση σε τι χρειάζεται;  :-\

Κακές γλώσσες λένε ότι ούτε ο ίδιος ξέρει ..