Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα. ξεκίνησα σιγά σιγά να ασχολούμε με c++ για να μάθω. Είπα να ξεκινήσω με κάτι απλό. Για παράδειγμα να ζητάω 5 αριθμούς και να μου δίνει άρθοισμα και μέσω όρο.

Δοκίμασα όμως και στο Geany και στο cpp.sh και δεν δουλέυει οπως θέλω. Στο Geany πετάει σφάλματα, στο cpp.sh δεν δίνει αποτέλεσμα και ζητάει συνέχεια κωδικούς. Τι κανω λάθος;

 

Ο κώδικας είναι αυτός

#include <iostream>

using namespace std;

int main ()
	{
        int i,b,mo,s=0;	
	
		for (i=1;i<=5;i++)
		{
			cin >>  b;
			s = s + b;
			i=i++;
		}
		mo = s / 5;
		cout << "Το άρθοισμα των βαθμών είναι: " << s << endl;
		cout << "Ο μέσος όρος των βαθμών είναι: " << mo << endl;
		return 0;
	}

ΥΓ. Υπάρχει κάτι σαν το geany για c++ και python που να βοηθάει δίεχνοντας πιο κατανοητά τα συντακτικά σφάλματα σε αυτά τα πρώτα μου βήματα?

post-272239-0-90862300-1512082493_thumb.jpg

post-272239-0-69771700-1512082494_thumb.jpg

  • Moderators
Δημοσ.

Μέσα στα {} τώρα, έχεις τη γραμμή

i = i++;

 

Αυτό προκαλεί το λεγόμενο "undefined behavior", δηλαδή μια συμπεριφορά η οποία είναι απροσδιόριστη. Δεν υπάρχει κανένας τρόπος να ξέρεις τι αποτέλεσμα θα έχει αυτή η γραμμή.

Δημοσ.

Μέσα στα {} τώρα, έχεις τη γραμμή

i = i++;

Αυτό προκαλεί το λεγόμενο "undefined behavior", δηλαδή μια συμπεριφορά η οποία είναι απροσδιόριστη. Δεν υπάρχει κανένας τρόπος να ξέρεις τι αποτέλεσμα θα έχει αυτή η γραμμή.

έχεις δίκιο, αλλα και που το έβγαλα, πάλι δεν δουλευέι. Κοιτα εδώ http://cpp.sh/4vaor

Δημοσ.

Στο link που έδωσες έτρεξε με την πρώτη.

Έκανα copy/paste και τον αρχικό σου κώδικα και τον δοκίμασα στο cpp.sh αφαιρώντας το i = i++ και λειτούργησε κανονικά. Μήπως έχει κανένα θέμα ο browser σου; Με Chrome το πήγα.

Δημοσ.

 

        int i,b,s=0;	
        double mo;
	
		mo = s / 5;

 

 

 

int mo είναι λάθος. Ακέραιος θα είναι ο μέσος όρος;

Δες πρώτα αυτό που είπε ο defacer. Πέρα από αυτό θα αντιμετωπίσεις ακόμη ένα πρόβλημα. Ας υποθέσουμε ότι αλλάζεις την δήλωση του mo και την κάνεις float ή double όπως έγραψα πάνω. Πάλι δεν θα παίξει. Γιατί ?

 

Έχεις τη δήλωση "s / 5". Τι τύπο έχουν οι τελεστέοι της διαίρεσης ? Και το s και το 5 έχει τύπο ακέραιο οπότε θα γίνει ακέραια διαίρεση και μετά το αποτέλεσμά της θα αποθηκευτεί στον mo. Το ό,τι δηλαδή ο mo είναι float / double δεν θα επηρεάσει σε τίποτα και πάλι θα παίρνεις λάθος αποτέλεσμα.

 

Για να παίξει σωστά (αφού φυσικά αλλάξεις τύπο στην μεταβλητή mo όπως πρότεινε ο defacer) θα πρέπει να πραγματοποιήσεις διαίρεση κινητής υποδιαστολής το οποίο μπορεί να γίνει με δύο τρόπους. Μπορείς να γράψεις "(float) s / 5" οπότε με το cast αλλάζεις τον τύπο του s και αναγκάζεις να γίνει η σωστή διαίρεση ή εφόσον έχεις το literal 5 να γράψεις το πιο απλό "s / 5.0".

  • Like 1
Δημοσ.

Μπορείς να γράψεις "(float) s / 5" οπότε με το cast αλλάζεις τον τύπο του s και αναγκάζεις να γίνει η σωστή διαίρεση ή εφόσον έχεις το literal 5 να γράψεις το πιο απλό "s / 5.0".

 

Εδώ κάπου είναι που ανακαλεί κανείς τις συζητήσεις "γιατί τι έχει η C σα γλώσσα εκμάθησης" κλπ   :-D

Δημοσ.

Εδώ κάπου είναι που ανακαλεί κανείς τις συζητήσεις "γιατί τι έχει η C σα γλώσσα εκμάθησης" κλπ   :-D

 

Μπα... οι κανόνες της C είναι απλοί και πολύ συγκεκριμένοι. Θες να κάνεις ακέραια διαίρεση, διαιρείς με ακεραίους. Θες να κάνεις διαίρεση με δεκαδικά ψηφία, διαιρείς με πραγματικούς. Ευκαιρία να μάθει και ο μαθητής ότι τα διαφορετικά μέρη μιας έκφρασης δε συνδέονται όπως νομίζει. H C είναι απλή, btw. :P

Δημοσ.

 

 

Πέτυχα τις προάλλες αυτό το macro σε κώδικα που κοιτούσα:

#define LDAP_UTF8GETC(s) ((0x80 & *(unsigned char *)(s)) ? ldap_utf8getcc((const char **)&s) : *s++)

Χρειάστηκε να είμαι έτσι για λίγη ώρα -> :huh: :wacko:

 

Αυτό που θέλω να πω είναι ότι νομίζω ότι υπάρχουν και πιο απλές γλώσσες. :P

 

 

  • Like 1
Δημοσ.

 

 

Πέτυχα τις προάλλες αυτό το macro σε κώδικα που κοιτούσα:

#define LDAP_UTF8GETC(s) ((0x80 & *(unsigned char *)(s)) ? ldap_utf8getcc((const char **)&s) : *s++)
Χρειάστηκε να είμαι έτσι για λίγη ώρα -> :huh: :wacko:

 

Αυτό που θέλω να πω είναι ότι νομίζω ότι υπάρχουν και πιο απλές γλώσσες. :P

 

 

Αυτό όμως δεν δείχνει ότι η C είναι πολύπλοκη αλλά ότι ο προγραμματιστής επέλεξε να το υλοποιήσει έτσι. Θα μπορούσε να το κάνει πιο απλά. Εκτός αυτού δεν το λες και πολύπλοκο macro (θα φρίξεις αν δεις τι macros κυκλοφορούν). Μια απλή χρήση του τελεστή ?: είναι σε συνδυασμό με ιδιομορφίες που χρειάζεται για char > 0x7F.

Δημοσ.

Στο ερώτημα μου...

 

Θα δοκιμάσω τις αλλαγές το βράδυ που θα πάω σπίτι. Πρόλαβα να δοκιμάσω εχθές τα σβησω τα ελληνικά που είπε ο φίλος πιο πάνω και στο cpp.sh, έτρεξε μια χαρα. Δεν έτρεξε όμως στο geany. Θα δοκιμάσω και τις μεταβλητές το βράδυ να δω αν θα τρέξει.

 

 

Περί γλώσσας τώρα...

 

Είναι η πρώτη επαφή μου με προγραμματισμο και γλώσσες. Θα προτιμούσα να μάθω καμία python ή java αλλά στο ΙΕΚ κάνουμε c++. Πιστεύω θα δυσκολευτω πολύ περισσότερο, να κάνω c++ στο ΙΕΚ και python ή java στο σπίτι.

 

Επίσης αν μπορείτε να με βοηθήσετε και σε αυτό που ρωτάω στο υ.γ του πρώτου ερωτήματος.

 

 

 

- πάντως ένα είναι το σίγουρο. Ότι τελικά φαίνεται ότι μου αρέσει ο προγραμματισμός και θέλω να εμβαθύνω!!!

Δημοσ.

Επίσης αν μπορείτε να με βοηθήσετε και σε αυτό που ρωτάω στο υ.γ του πρώτου ερωτήματος.

 

Αν είσαι με windows να πας σε visual studio αλλιώς code:blocks

Δημοσ.

Μπα... οι κανόνες της C είναι απλοί και πολύ συγκεκριμένοι. Θες να κάνεις ακέραια διαίρεση, διαιρείς με ακεραίους. Θες να κάνεις διαίρεση με δεκαδικά ψηφία, διαιρείς με πραγματικούς. Ευκαιρία να μάθει και ο μαθητής ότι τα διαφορετικά μέρη μιας έκφρασης δε συνδέονται όπως νομίζει. H C είναι απλή, btw. :P

 

Οι κανόνες της C (και ιδιαίτερα της C++ που έχουμε και καλά εδώ) είναι σίγουρα πολύ συγκεκριμένοι, αλλά μη λες απλοί γιατί θα γελάσει το παρδαλό κατσίκι.

 

Αν πιστεύεις ότι είναι τόσο απλοί πες μου λίγο με δικά σου λόγια τι λέει ο strict aliasing rule που είναι σούπερ βασικός (undefined behavior ντε!) χωρίς να ανατρέξεις κάπου. Αν δε μπορείς, consider ότι μόλις είπες "πολύ απλοί κανόνες" ενώ αγνοείς τις λεπτομέρειες ενός από αυτούς ο οποίος σύμφωνα με το πρότυπο μπορεί να κάνει το πρόγραμμά σου να σου κάνει φορμάτ κλπ κλπ τα γνωστά. Εξάλλου όπως έχω ξαναπεί, μόνο και μόνο η ύπαρξη του UB σαν ενδεχόμενο είναι ένα υπερτεράστιο "hint" ότι η γλώσσα ενδιαφέρεται περισσότερο να είναι βολική στον compiler writer παρά στον χρήστη του compiler.

 

I could go on, νομίζω δε χρειάζεται.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...