Πρόβλημα στην εκτύπωση απο συνάρτηση με δείκτες

...ασύγχρονα μαθήματα γλώσσας C

Πρόβλημα στην εκτύπωση απο συνάρτηση με δείκτες

Δημοσίευσηαπό vellamos » 25 Αύγ 2011, 11:23

καλημερα παιδια... σε λιγο καιρο αρχιζει η εξεταστικη και επεσα σε αυτη την ασκηση στην c και χρειαζομαι βοηθεια μιας και δεν μπορω να καταλαβω πως βγαινουν τα αποτελεσματα και χρειαζομαι βοηθεια.


Κώδικας: Επιλογή όλων
#include<stdio.h>
#include<stdlib.h>
void test (int *a, int b, int *c){
*a=b+2;
*c=b-3;
b=*a+*c;
}

main()
{
int a,b,c;
b=3;
test (&a,b,&c);
printf("%d %d %d\n",a,b,c);
test (&b,c,&a);
printf("%d %d %d\n",a,b,c);
test (&c,a,&b);
printf("%d %d %d\n",a,b,c);

system("pause");
}

ζηταει ποια ειναι τα a,b,c ---καθε φορα των επαναληψεων

οποιος μπορεσει να βοηθησει....
Τελευταία επεξεργασία από linuxs και 22 Φεβ 2012, 07:59, έχει επεξεργασθεί 3 φορά/ες συνολικά
Αιτία: Επεξεργασία τίτλου
vellamos
babeTUX
babeTUX
 
Δημοσιεύσεις: 2
Εγγραφή: 25 Αύγ 2011, 11:15
Εκτύπωση

Re: συναρτηση void και δεικτες

Δημοσίευσηαπό evolgen » 25 Αύγ 2011, 11:42

Αν μεταγλωττίσεις το πρόγραμμα και το τρέξεις θα καταλάβεις:
Κώδικας: Επιλογή όλων
5 3 0
-3 2 0
-3 -6 -1

Στην πραγματικότητα, η main κάθε φορά "υπολογίζει" διαφορετικές μεταβλητές από την test. Όπου βάζει το &, σημαίνει ότι κάνει την πράξη για να το βρει, από την test, ενώ όπου δεν υπάρχει το &, κρατάει την τιμή της μεταβλητής σταθερή με αυτό που ήταν προηγουμένως.

Στην πρώτη περίπτωση, θέτει όπου b το 3 και κάνει τις πράξεις για τα άλλα δύο.
Στη δεύτερη περίπτωση κρατάει σταθερό το c και λύνει τις άλλες δύο πράξεις.
Το ίδιο και για την τρίτη με το a.


EDIT: Λάθος, δεν είναι αυτό... :problem:
Το να μειώνεις ένα έργο ελεύθερου λογισμικού, επειδή θεωρείς το δικό σου καλύτερο,
είναι απαράδεκτη συμπεριφορά και δε συμβαδίζει με τις αρχές του ελεύθερου λογισμικού.

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

Re: συναρτηση void και δεικτες

Δημοσίευσηαπό vellamos » 25 Αύγ 2011, 11:53

και παλι δεν μπορω να το καταλαβω.το -3 απο ποια πραξη βγαινει?
vellamos
babeTUX
babeTUX
 
Δημοσιεύσεις: 2
Εγγραφή: 25 Αύγ 2011, 11:15
Εκτύπωση

Re: συναρτηση void και δεικτες

Δημοσίευσηαπό evolgen » 25 Αύγ 2011, 11:59

Λοιπόν, το βρήκα. Μισό λεπτό να το γράψω...

Οι αρχικές πράξεις είναι:

a = b + 2
c = b - 3
b = a + c

Στην test έχει ορίσει τη σειρά των μεταβλητών ως εξής: πρώτα α, μετά b και τέλος c. (Γιατί ((int *a, int b, int *c)) .)
Στην πρώτη περίπτωση καλεί τη συνάρτηση test, κρατώντας σταθερό το b = 3. Η σειρά των μεταβλητών είναι ίδια με την test, δηλαδή όπου α το α, όπου b to b και όπου c το c.

Άρα, a = 3 + 2 = 5
c = 3 - 3 = 0
b = 3 (δεν το υπολογίζει, το κρατά σταθερό)

Τυπώνει λοιπόν:
5 3 0

==================================

Πάμε στη δεύτερη περίπτωση. Εδώ δεν τις καλεί με τη σειρά, όπως πριν, αλλά b, c, a. Εδώ θα βάλεις όπου a της test το b, όπου b της test το c και όπου c της test το α. Κρατάς όμως σταθερό το c = 0.

Οι πράξεις μετασχηματίζονται σε:

b = c + 2
a = c - 3
c = b + a

Για c = 0:
b = 0 + 2 = 2
a = 0 - 3 = -3
c = 0 (σταθερό)

Στο τέλος για να τυπώσει στην οθόνη όμως, μπορεί να καλέσει τις μεταβλητές με όποια σειρά θέλει, στην προκειμένη a, b, c.
Τυπώνει λοιπόν:
-3 2 0

Ομοίως και το 3ο, ενώ οι πράξεις γίνονται

c = a + 2
b = a - 3
a = c + b



============================
Το πρόγραμμα σε μπερδεύει γιατί χρησιμοποιεί τα ίδια ονόματα μεταβλητών στην test και στην main. Αν στην test είχε α, b, c και στην main greece, france, england, θα ήταν πιο ξεκάθαρο. Θα έβαζε όπου Greece το a, όπου France το b και όπου England το c.
Το να μειώνεις ένα έργο ελεύθερου λογισμικού, επειδή θεωρείς το δικό σου καλύτερο,
είναι απαράδεκτη συμπεριφορά και δε συμβαδίζει με τις αρχές του ελεύθερου λογισμικού.

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

Re: συναρτηση void και δεικτες

Δημοσίευσηαπό Qdata » 25 Αύγ 2011, 12:19

Τον κώδικα τον βάζουμε μέσα σε [cοde]κώδικας[/cοde]. Επιλέγουμε το κείμενο και πατάμε το κουμπάκι Εικόνα.



-------------------------------------------------

έγραψε:
Κώδικας: Επιλογή όλων
test (&a,b,&c);

Πρώτη κλήση της συνάρτησης test με test (&a,b,&c); :
*a=b+2; Μέσω των δεικτών η πράξη b+2(3+2=5) καταχωρίζετε στην διεύθυνση μνήμης της μεταβλητής a της
συνάρτησης main.
Οπότε η μεταβλητή a της main έχει την τιμή 5.
*c=b-3; Μέσω των δεικτών η πράξη b-3(3-3=0) καταχωρίζετε στην διεύθυνση μνήμης της μεταβλητής c της συνάρτησης main.Οπότε η μεταβλητή c της main έχει την τιμή 0.
b=*a+*c; Το αποτέλεσμα της πράξης a+c(5+0=5) καταχωρίζετε στην μεταβλητή b της συνάρτησης test και όχι της main.

-------------------------------------------------

έγραψε:
Κώδικας: Επιλογή όλων
test (&b,c,&a);


Δεύτερη κλήση της συνάρτησης test με test (&b,c,&a); :
*a=b+2; Μέσω των δεικτών η πράξη b+2(0+2=2) καταχωρίζετε στην διεύθυνση μνήμης της μεταβλητής b της συνάρτησης main.Οπότε η μεταβλητή b της main έχει την τιμή 2.
*c=b-3; Μέσω των δεικτών η πράξη b-3(0-3= -3) καταχωρίζετε στην διεύθυνση μνήμης της μεταβλητής a της συνάρτησης main.Οπότε η μεταβλητή a της main έχει την τιμή -3.
b=*a+*c; Το αποτέλεσμα της πράξης a+c(2+-3= -1) καταχωρίζετε στην μεταβλητή b της συνάρτησης test και όχι της main.

-------------------------------------------------

έγραψε:
Κώδικας: Επιλογή όλων
test (&c,a,&b);


Τρίτη κλήση της συνάρτησης test με test (&c,a,&b); :
*a=b+2; Μέσω των δεικτών η πράξη b+2(-3+2= -1) καταχωρίζετε στην διεύθυνση μνήμης της μεταβλητής c της συνάρτησης main.Οπότε η μεταβλητή b της main έχει την τιμή -1.
*c=b-3; Μέσω των δεικτών η πράξη b-3(-3 - 3= -6) καταχωρίζετε στην διεύθυνση μνήμης της μεταβλητής a της συνάρτησης main.Οπότε η μεταβλητή a της main έχει την τιμή -6.
b=*a+*c; Το αποτέλεσμα της πράξης a+c(-6 + -1 = -7) καταχωρίζετε στην μεταβλητή b της συνάρτησης test και όχι της main.

-------------------------------------------------

Αν πάλι δεν κατάλαβες πες μου να το κάνω πιο απλό. ;)
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Μαθήματα C