Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 02 Σεπ 2011, 20:42

migf1 έγραψε:
β) Εκεί λοιπόν έχουμε *s1: a και *s2: \0 και πριν ξεκινήσει η αφαίρεση ο s2 μετακινείται λόγω του -- μια θέση πίσω, άρα *s2: b ... οπότε η αφαίρεση που εκτελείται τελικά κι επιστρέφεται ως αποτέλεσμα είναι η: a - b


Η if ειναι το σώμα της while ε? Για αυτο δεν μπαινει καν στην if βεβαια το *s2 το αυξάνει επειδη είναι εκτός αγκυλών?
δηλαδη

Κώδικας: Επιλογή όλων
while(*s1==*s2)
{
if(*s1=='\0')
{
s1++;
return 0;
}
*s2++;
}


ή δεν το σκέφτομαι καλα??? και αν ας πουμε το αυξάνει γιατι αυτο ομως θα το αυξήσει????

Eκανα και το 3ο test case για εξασκηση.... λοιπον στην περιπτωση που

Κώδικας: Επιλογή όλων
s1[]="a" & s2[]="ab"


τοτε η αφαιρεση βγαινει 0-65 = 0-65 (γιατι \0-a) σωστο??
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 02 Σεπ 2011, 20:53

Πριν προχωρήσουμε στους έξτρα ελέγχους, είναι πολύ σημαντικό να έχουμε ξεκαθαρίσει διαφορές και ομοιότητες μεταξύ των παρακάτω ορισμών:

Κώδικας: Επιλογή όλων
char *s;

Κώδικας: Επιλογή όλων
char *s = NULL;

Κώδικας: Επιλογή όλων
char *s = "testing";

Κώδικας: Επιλογή όλων
char s[] = "";

Κώδικας: Επιλογή όλων
char s[] = "testing";

Κώδικας: Επιλογή όλων
char s[8] = "testing";

Κώδικας: Επιλογή όλων
char s[100] = "testing";

Κώδικας: Επιλογή όλων
char s[80];


Ας ξεκινήσουμε με την πιο απλή ερώτηση/άσκηση: για καθένα από τους παραπάνω ορισμούς γράψτε τι είδους μεταβλητή ορίζουν, και ποιο είναι το μέγεθος της κάθε μεταβλητής σε bytes.

ΥΓ: @Star_Light, για την προηγούμενη ερώτηση... ναι η if εκεί είναι το κυρίως σώμα του while. O "ισοδύναμος" κώδικας που έγραψες δεν είναι σωστός, ο σωστός είναι έτσι:
Κώδικας: Επιλογή όλων

while ( *s1 == *s2, s2++ )
{
if ( *s1 == '\0' )
{
s1++;
return 0;
}
}

Κοινώς η αύξηση του s2 γίνεται πριν καν ανοίξει άγκιστρο.
Τελευταία επεξεργασία από migf1 και 02 Σεπ 2011, 21:01, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 02 Σεπ 2011, 21:00

να σαι καλα ρε migf1 μου τα ξεδιαλυνες.. δηλαδη υπάρχει κολπο οπου μπορει να βάλεις την αύξηση και μέσα στην συνθήκη ελέγχου της while με ενα κόμμα ε? και να κανει ολη αυτη την λειτουργια δεν το ηξερα καθολου αυτο... δηλαδη ασχετα με το αν θα μπει η δεν θα μπει στην if η s2 αυξάνεται μια φορα... καλα εννοειται πως ολα αυτα τα σημειωνεις γιατι ειναι δυσευρετες σημειωσεις... καμια σχεση με τους καθηγητες στην σχολη η μερα με την νυχτα.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 02 Σεπ 2011, 21:04

Ακριβώς, υπάρχει και o τελεστής κόμμα στη C (κύλα λίγο τη σελίδα)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 02 Σεπ 2011, 21:37

migf1 έγραψε:Πριν προχωρήσουμε στους έξτρα ελέγχους, είναι πολύ σημαντικό να έχουμε ξεκαθαρίσει διαφορές και ομοιότητες μεταξύ των παρακάτω ορισμών:

Κώδικας: Επιλογή όλων
1.char *s;

Κώδικας: Επιλογή όλων
2.char *s = NULL;

Κώδικας: Επιλογή όλων
3.char *s = "testing";

Κώδικας: Επιλογή όλων
4.char s[] = "";

Κώδικας: Επιλογή όλων
5.char s[] = "testing";

Κώδικας: Επιλογή όλων
6.char s[8] = "testing";

Κώδικας: Επιλογή όλων
7.char s[100] = "testing";

Κώδικας: Επιλογή όλων
8.char s[80];


Ας ξεκινήσουμε με την πιο απλή ερώτηση/άσκηση: για καθένα από τους παραπάνω ορισμούς γράψτε τι είδους μεταβλητή ορίζουν, και ποιο είναι το μέγεθος της κάθε μεταβλητής σε bytes.


1. δείκτης σε χαρακτήρα με μέγεθος 1 byte

2. δεικτης που πρόκειται να δειξει σε char αλλα που ειναι αρχικοποιημενος σε NULL και παλι μεγεθος 1 byte νομιζω

3. δηλωση δεικτη σε συμβολοσειρα μέγεθος 8 bytes

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

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

6. το ιδιο με πανω. Και μεγεθος 8 bytes

8. πινακας χαρακτηρων (80) 80 bytes

και θα μπω μετα να δω τα λαθη μου... παω μια μικρη βολτα. Cya
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 02 Σεπ 2011, 21:52

migf1 έγραψε:
...
ΥΓ: @Star_Light, για την προηγούμενη ερώτηση... ναι η if εκεί είναι το κυρίως σώμα του while. O "ισοδύναμος" κώδικας που έγραψες δεν είναι σωστός, ο σωστός είναι έτσι:
Κώδικας: Επιλογή όλων

while ( *s1 == *s2, s2++ )
{
if ( *s1 == '\0' )
{
s1++;
return 0;
}
}

Κοινώς η αύξηση του s2 γίνεται πριν καν ανοίξει άγκιστρο.

Ήρθα σπιτάκι μου!

Λοιπόν ο τελεστής κόμμα είναι ΛΑΘΟΣ στον κώδικα που έδωσα πριν !!!!!!!!
Βασικά τον χρησιμοποιούμε ΜΟΝΟ στα for-loops, γιατί πάντα αγνοεί τον πρώτο όρο κι επιστρέφει τον τελευταίο... οπότε τον παραπάνω κώδικα πάρε τον σαν ΨΕΥΔΩΚΩΔΙΚΑ και όχι ως κανονικό κώδικα C.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 02 Σεπ 2011, 23:45

Star_Light έγραψε:
migf1 έγραψε:Πριν προχωρήσουμε στους έξτρα ελέγχους, είναι πολύ σημαντικό να έχουμε ξεκαθαρίσει διαφορές και ομοιότητες μεταξύ των παρακάτω ορισμών:

Spoiler: show
Κώδικας: Επιλογή όλων

1. char *s;
2. char *s = NULL;
3. char *s = "testing";
4. char s[] = "";
5. char s[] = "testing";
6. char s[8] = "testing";
7. char s[100] = "testing";
8. char s[80];

Ας ξεκινήσουμε με την πιο απλή ερώτηση/άσκηση: για καθένα από τους παραπάνω ορισμούς γράψτε τι είδους μεταβλητή ορίζουν, και ποιο είναι το μέγεθος της κάθε μεταβλητής σε bytes.

Spoiler: show
1. δείκτης σε χαρακτήρα με μέγεθος 1 byte

2. δεικτης που πρόκειται να δειξει σε char αλλα που ειναι αρχικοποιημενος σε NULL και παλι μεγεθος 1 byte νομιζω

3. δηλωση δεικτη σε συμβολοσειρα μέγεθος 8 bytes

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

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

6. το ιδιο με πανω. Και μεγεθος 8 bytes

8. πινακας χαρακτηρων (80) 80 bytes

και θα μπω μετα να δω τα λαθη μου... παω μια μικρη βολτα. Cya

Λείπει το 7.

Άλλος;
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 03 Σεπ 2011, 00:00

migf1 έγραψε:
Ήρθα σπιτάκι μου!

Λοιπόν ο τελεστής κόμμα είναι ΛΑΘΟΣ στον κώδικα που έδωσα πριν !!!!!!!!
Βασικά τον χρησιμοποιούμε ΜΟΝΟ στα for-loops, γιατί πάντα αγνοεί τον πρώτο όρο κι επιστρέφει τον τελευταίο... οπότε τον παραπάνω κώδικα πάρε τον σαν ΨΕΥΔΩΚΩΔΙΚΑ και όχι ως κανονικό κώδικα C.


ΦΤΟΥΥΥ Και τα ειχα σημειωσει τοσο ωραια... και τωρα τι γινεται? :lol: :lol: θελω να πω.... τελικα ειναι σωστη η γενικοτερη φιλοσοφια οτι δηλαδη με την εντολη που δινεις
Κώδικας: Επιλογή όλων
while(*s1==*s2++)
αυξανει το s2 πριν μπουμε στα άγκιστρα ε? απλα ειναι λάθος ο τελεστης κομμα.

Οσο για το 7. στα ερωτηματα που δινεις... νομιζω οτι θελει να δειξει οτι ειναι διαφορετικο το μεγεθος του πινακα (100) σε αυτη την περιπτωση απο το τελικο μηκος που μπορει να εχει η συμβολοσειρα μας.
Αν μπορεις και εχεις χρονο θελω να μου πεις σε ποια απο αυτα εχω κανει λαθακια... στα 8 τα αριθμημενα :D
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 03 Σεπ 2011, 00:06

εν τω μεταξυ σε αυτον εδω τον κωδικα

Spoiler: show
Κώδικας: Επιλογή όλων
#include <stdio.h>
int raiseToPower(int basen, int n);

int main()
{

int basen, n;
int z,i;

printf("\nPoses dunameis arithmwn thelete na upologisete? \n");
scanf("%d",&z);

for(i=0; i<z; i++)
{
printf("Give the base: ");
scanf("%d",&basen);
printf("Give the exponent: ");
scanf("%d",&n);
if(n<0)
{
printf("\n Invalid value \n");
z++; // An o xristis dwsei 2 fores upologismo kai h 1 einai me arnitiki dunami tote
// Exei invalid value kai oi 2 fores diathrounte se sugrisi me prin pou eixe mono alli 1
// enw kanonika eixe dwsei 2 kai athela tou evale enan arnhtiko arithmo san ektheti
continue;
}
printf("The result is : %d^%d = %d\n", basen, n, raiseToPower(basen, n));
}


return 0;
}


int raiseToPower(int basen, int n )
{

if(n==0)
return 1;

return( basen * raiseToPower(basen, n-1) );
}


που θελω να δω αν ειναι οκ.. Τα test cases ειναι ας πουμε οι διαφορετικες εισοδοι που θα δίνω? Πχ τα δεδομενα που θα δινω ειναι τα test cases? σε γενικες γραμμες δηλαδη με τα test cases εξεταζουμε την ακεραιοτητα ενος αλγοριθμου ως προς την "αναπαντεχη" εισοδο απο τον χρηστη? και συνεπως την ασφαλεια του.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 03 Σεπ 2011, 00:19

Star_Light έγραψε:
migf1 έγραψε:
Ήρθα σπιτάκι μου!

Λοιπόν ο τελεστής κόμμα είναι ΛΑΘΟΣ στον κώδικα που έδωσα πριν !!!!!!!!
Βασικά τον χρησιμοποιούμε ΜΟΝΟ στα for-loops, γιατί πάντα αγνοεί τον πρώτο όρο κι επιστρέφει τον τελευταίο... οπότε τον παραπάνω κώδικα πάρε τον σαν ΨΕΥΔΩΚΩΔΙΚΑ και όχι ως κανονικό κώδικα C.


ΦΤΟΥΥΥ Και τα ειχα σημειωσει τοσο ωραια... και τωρα τι γινεται? :lol: :lol: θελω να πω.... τελικα ειναι σωστη η γενικοτερη φιλοσοφια οτι δηλαδη με την εντολη που δινεις
Κώδικας: Επιλογή όλων
while(*s1==*s2++)
αυξανει το s2 πριν μπουμε στα άγκιστρα ε? απλα ειναι λάθος ο τελεστης κομμα.

Ναι, η φιλοσοφία είναι σωστότατη (απλά η συγκεκριμένη σύνταξη με το κόμμα είναι λάθος)

έγραψε:
Οσο για το 7. στα ερωτηματα που δινεις... νομιζω οτι θελει να δειξει οτι ειναι διαφορετικο το μεγεθος του πινακα (100) σε αυτη την περιπτωση απο το τελικο μηκος που μπορει να εχει η συμβολοσειρα μας.
Αν μπορεις και εχεις χρονο θελω να μου πεις σε ποια απο αυτα εχω κανει λαθακια... στα 8 τα αριθμημενα :D

Κάνω κάτι πιο εποικοδομητικό, δίνω τις απαντήσεις σε spoiler και πείτε μου σε ποιες έχετε απορίες

Spoiler: show
Κώδικας: Επιλογή όλων

char *s; // μη-αρχικοποιημένος δείκτης (4 bytes)
char *s = NULL; // αρχικοποιημένος δείκτης (4 bytes)
char *s = "testing"; // αρχικοποιημένο string (4 bytes)
char s[] = ""; // αρχικοποιημένο string (1 byte)
char s[] = "testing"; // αρχικοποιημένο string (8 bytes)
char s[8] = "testing"; // αρχικοποιημένο string (8 bytes)
char s[100] = "testing"; // αρχικοποιημένο string (100 bytes)
char s[80]; // μη-αρχικοποιημένο string (80 bytes)

ΥΓ. Ναι, αυτά είναι τα test-cases φίλε Star_Light
Τελευταία επεξεργασία από migf1 και 04 Σεπ 2011, 23:49, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι