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

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

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

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

Δημοσίευσηαπό migf1 » 14 Μαρ 2012, 21:47

Προσωπικά χρησιμοποιώ το ANSI στυλ, σε ποσοστό μεγαλύτερο του 90%, ενώ στο υπόλοιπο 10% χρησιμοποιώ conventions από άλλες προτάσεις.
Π.χ. τις ελάχιστες φορές που χρησιμοποιώ καθολικές μεταβλητές, σπάω τον κανόνα και τους βάζω το πρόθεμα: g_

Επίσης, δεν είμαι συνεπής ως προς την στοίχιση των άγκιστρων παντού...

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

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

Δημοσίευσηαπό migf1 » 14 Μαρ 2012, 21:49

stamatiou έγραψε:Σε αυτό το πρόγραμμα:
Κώδικας: Επιλογή όλων
#include <stdio.h>

char *s_get2( char *s, int n )
{
register int i=0;

*s = fgetc( stdin );
while ( *s != '\n' && i < n-1 )
{
i++;
s++;
*s = fgetc( stdin );
}
*s = '\0';

return s;
}

int main(void) {
char s[100+1],*p;
p = s_get2(s,100+1);
printf("%s",p);
return 0;
}

Το p δεν θα πρέπει να δείχνει στο τέλος του s;

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

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

Δημοσίευσηαπό stamatiou » 14 Μαρ 2012, 21:51

migf1 έγραψε:
stamatiou έγραψε:Σε αυτό το πρόγραμμα:
Κώδικας: Επιλογή όλων
#include <stdio.h>

char *s_get2( char *s, int n )
{
register int i=0;

*s = fgetc( stdin );
while ( *s != '\n' && i < n-1 )
{
i++;
s++;
*s = fgetc( stdin );
}
*s = '\0';

return s;
}

int main(void) {
char s[100+1],*p;
p = s_get2(s,100+1);
printf("%s",p);
return 0;
}

Το p δεν θα πρέπει να δείχνει στο τέλος του s;

Όχι, στην αρχή του s πρέπει να δείχνει.

Γιατί, αφού με το s++ το s δεν πρέπει να δείχνει πλέον στο s[1], s[2] ...s[n];
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 14 Μαρ 2012, 21:58

stamatiou έγραψε:Σε αυτό το πρόγραμμα:
Κώδικας: Επιλογή όλων
#include <stdio.h>

char *s_get2( char *s, int n )
{
register int i=0;

*s = fgetc( stdin );
while ( *s != '\n' && i < n-1 )
{
i++;
s++;
*s = fgetc( stdin );
}
*s = '\0';

return s;
}

int main(void) {
char s[100+1],*p;
p = s_get2(s,100+1);
printf("%s",p);
return 0;
}

Το p δεν θα πρέπει να δείχνει στο τέλος του s;


Για ποιο λογο το p θα δειχνει στο τελος του s?
Για πες. Ποιες ειναι οι σκεψεις σου?
Γνώσεις ⇛ 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

Δημοσίευσηαπό stamatiou » 14 Μαρ 2012, 22:05

Το s++ δεν κάνει το s να δείχνει στο επόμενο στοιχείο του πίνακα; Έτσι στο τέλος το s δεν θα πρέπει να δείχνει στο τέλος του πίνακα; Έτσι εφόσον το p δείχνει εκεί που δείχνει το s, τότε το p θα πρέπει να δειχνει στο τελευταίο στοιχείο του πίνακα....
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 14 Μαρ 2012, 22:08

stamatiou έγραψε:Το s++ δεν κάνει το s να δείχνει στο επόμενο στοιχείο του πίνακα; Έτσι στο τέλος το s δεν θα πρέπει να δείχνει στο τέλος του πίνακα; Έτσι εφόσον το p δείχνει εκεί που δείχνει το s, τότε το p θα πρέπει να δειχνει στο τελευταίο στοιχείο του πίνακα....


To πηρα το έτρεξα και δεν κάνει τιποτα.
Πανω σε τι θες να κανεις πρακτικη? ΣΕ συναρτήσεις
οι οποιες επιστρέφουν εναν δεικτη ?
Γνώσεις ⇛ 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

Δημοσίευσηαπό stamatiou » 14 Μαρ 2012, 22:13

Star_Light έγραψε:
stamatiou έγραψε:Το s++ δεν κάνει το s να δείχνει στο επόμενο στοιχείο του πίνακα; Έτσι στο τέλος το s δεν θα πρέπει να δείχνει στο τέλος του πίνακα; Έτσι εφόσον το p δείχνει εκεί που δείχνει το s, τότε το p θα πρέπει να δειχνει στο τελευταίο στοιχείο του πίνακα....


To πηρα το έτρεξα και δεν κάνει τιποτα.
Πανω σε τι θες να κανεις πρακτικη? ΣΕ συναρτήσεις
οι οποιες επιστρέφουν εναν δεικτη ?

Βασικά, νομίζω πως όντως έτσι γίνεται..... Πρέπει να είχα ξεχάσει να κάνω save to αρχείο στο geany :P
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 14 Μαρ 2012, 22:15

stamatiou έγραψε:
Βασικά, νομίζω πως όντως έτσι γίνεται..... Πρέπει να είχα ξεχάσει να κάνω save to αρχείο στο geany :P


Bαζε παντα κάποιο μήνυμα στην printf που προτρέπει το χρηστη να κάνει κάτι ή τον προιδεάζει οτι
κάτι αναμένει. ;)
Γνώσεις ⇛ 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

Δημοσίευσηαπό migf1 » 14 Μαρ 2012, 22:21

stamatiou έγραψε:
Γιατί, αφού με το s++ το s δεν πρέπει να δείχνει πλέον στο s[1], s[2] ...s[n];

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

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

Δημοσίευσηαπό Star_Light » 14 Μαρ 2012, 23:04

Να ρωτησω κατι???

εδω ->

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

#include<stdio.h>
int main(void)
{
int i=1 , j=2 , k=3;
int max;

1. if(i>j)
2.if(i>k)
max=i;
1. else
max=k;
2. else
if(j>k)
max=j;
else
max=k;


printf("%d" , max);
return 0;
}


Η ροή είναι Αν το i>j δώσει αλήθεια προχωράμε να ερευνήσουμε το i>k αν και αυτο δώσει αληθεια τοτε max = i αλλιως max=k

Αν το 1ο - 1ο if εξαρχης ομως δώσει ψέμα τοτε πάμε απευθειας στον έλεγχο j>k οποτε κατα τα γνωστα έπονται και τα υπολοιπα.

εΠΙΣΗς κατι πολυ σημαντικό η else που εχω αριθμησει με το 2 αριστερα της ανηκει στην 1η if?

p.s Μπορεις να μπερδευτεις για πλάκα ακομη και στα if else
Γνώσεις ⇛ 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
Εκτύπωση

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

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