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

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

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

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

Δημοσίευσηαπό migf1 » 29 Φεβ 2012, 19:07

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

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

Δημοσίευσηαπό Star_Light » 29 Φεβ 2012, 19:13

migf1 έγραψε:Αν σου πω ότι δεν θυμάμαι, νομίζω ναι όμως.


Ναι αυτο ειναι. -.-
Γνώσεις ⇛ 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

Δημοσίευσηαπό Star_Light » 29 Φεβ 2012, 20:03

Οντως πολυ σημαντικές οι σελίδες 44-47.

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include<stdio.h>
int main(void)
{
int x , y;

printf(" Give x " );
scanf("%d" , &x);

printf(" Give y ");
scanf("%d" , &y);

printf(" x is : %d " , x);
printf(" y is : %d" , y);

return 0;
}


Υποθέτοντας οτι έχουμε αυτο σε περίπτωση που εγω δώσω 5.2
ο μεν x θα ισούται με 5 επειδη ένας ακέραιος δεν μπορει να ξεκινάει με τον χαρακτήρα '.' και αρα ο '.' μαζι με τον 2
θα φύγουν για την επόμενη scanf οπου και εκεί λογω του ιδιου λογου δεν θα μπορέσει να κάνει locate του y συμφωνα με %d
μορφοποιηση και άρα επειδη θα αποτύχει να διαβάσει το item θα επιστρέψει 0 συμφωνα και με το reference της scanf εδω ->

http://www.cplusplus.com/reference/clib ... dio/scanf/

το 0 δηλαδη που εκτυπωνει δεν ειναι by lack νομιζω ή οχι ?
Γνώσεις ⇛ 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

Δημοσίευσηαπό Star_Light » 29 Φεβ 2012, 20:41

btw και αυτο δουλευει πολυ καλα ->

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

#include<stdio.h>
int main(void)
int x , y;

printf(" Give x AND y with a comma like this -> x,y : " );
scanf("%d" , &x);
scanf(", %d" , &y);

printf(" x is : %d " , x);
printf(" y is : %d" , y);

return 0;
}


Μονο ομως οταν δεν πατήσεις το space μετα τον 2ο αριθμο επειδη θα διαβάσει ',' + space η 2η scanf οποτε θα τερματισει χωρις να κάνει διαβασει με επιτυχια οπως επισημαινει και στην σελιδα 46 χωρις να λεει το γιατι βεβαια . Για την συγκεκριμενη περιπτωση παντοτε. Στον 1ο αριθμο φυσικα και μπορεις να δωσεις οσα space characters θες καθως και '\n' αφου τα κανει skip :) To περιεργο της υποθεσης επισης ειναι πως αν δωσω στην αρχη αριθμο και μετα '\n' και αριθμο τα διαβαζει κανονικα. Ισως μονο με τον κενο το τρωει το σκάλωμα αλλα δεν λεει μεσα το βιβλιο γιατι ρε γμτ αυτο ειναι λαθος τελικα.
Γνώσεις ⇛ 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

Δημοσίευσηαπό Star_Light » 29 Φεβ 2012, 22:23

Οπα λάθος νομιζω το λέει στην σελίδα 45... πάει να κάνει "match" τον ordinary ',' με το space και επειδη δεν υπάρχει ταίριασμα η scanf τερματίζει δεν το ξαναλεει στην σελιδα 46 επειδη ηδη το εχει εξηγησει στην 45 οποτε αναγκάζει και τους τεμπέληδες - απρόσεκτους να ξανακοιτάξουν :P

Kαι μια τελευταία απορια.... ο '\n' ο οποιος δεν διαβάζεται απο την 1η scanf και τιθεται στην 2η (επομενη κληση της) σαν εισοδος στην 2η λοιπον λαμβάνεται σαν space/blank character και αρα γινεται skip ετσι? Επισης δεν ειναι απαραιτητο να βάλεις μεσα στο format string white space ωστε να μπορεις να δέχεσαι απο το input γιατι τα κανει skip οπως ειπαμε.

Μην μπερδέψω κανεναν μιας και αυτο που λεει στην σελιδα 45 στο πρωτο bulletin ειναι για τους ordinary... Δηλαδη αρκει εγω να βάλω στην scanf

Κώδικας: Επιλογή όλων
scanf("%d /%d" , &x , &y);

έναν κενό ωστε πριν τον ordinary / να δώσω οσους θλεω στο input χωρις να υπάρχει προβλημα....
ωστε μετα η "pattern matching" scanf να κανει match τον / με τον / να ταιριαξουν και να συνεχισει
ασχετα με τα ποσα κενα πληκτρολογησαμε...

Γιατι αν εχεις
Κώδικας: Επιλογή όλων
scanf(" %d/%d", &x , &y);

και πας να δωσεις στο input
Κώδικας: Επιλογή όλων
2 /5
θα πετάξει σφάλμα....

ενω με το 1ο και
Κώδικας: Επιλογή όλων
2 / 5
να δωσεις εισαι οκ. ;)
Γνώσεις ⇛ 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 » 29 Φεβ 2012, 23:45

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

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

Δημοσίευσηαπό Star_Light » 29 Φεβ 2012, 23:55

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


Κατι θα ξέρεις :P

Ο μονος λογος που θα πρέπει να θυμάσαι απεξω πραγματα
ειναι οταν δεν έχεις προσβαση σε κάποιο βιβλιο ή manual :lol: :lol: :lol:

Παω να τσιμπησω κατι... και ερχομαι να κοιταξω τον viewer σου.
Eλπιζω να μην μου έχει ξεφυγει καποια χαζομαρα στην λειτουργια της scanf :P
Γνώσεις ⇛ 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

Δημοσίευσηαπό Ilias95 » 01 Μαρ 2012, 21:46

Θέλω να γράψω μια συνθήκη ισοδύναμη με:
Κώδικας: Επιλογή όλων
if (a == 1 || a == 2 || a == 3 || a == 4 || a == 5 || a == 6)
//do something

Σε πολλές γλώσσες θα γράφαμε:
Κώδικας: Επιλογή όλων
if a in (1, 2, 3, 4, 5, 6)

Μπορώ να κάνω κάτι αντίστοιχο στην C;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 01 Μαρ 2012, 22:29

Οι λύσεις μου στις ασκήσεις 12, 13 σελ.158.

12.
Εκφώνηση:
Spoiler: show
Writes a program that evaluates an expression:
Κώδικας: Επιλογή όλων
Enter an expression: 1+2.5*3
Value of expression: 10.5

The operands in the expression are floating-point numbers; the operators are +, -, * and /.
The expression is evaluated from left to right (no operator takes precedence over any other operator).

Λύση:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(void)
{
char ch;
float x, result;

printf("Enter an expression: ");

scanf("%f", &x);
result = x;
x = 0.0;

while ((ch = getchar()) != '\n') {
scanf("%f", &x);
switch (ch) {
case '+': result += x; break;
case '-': result -= x; break;
case '*': result *= x; break;
case '/': result /= x; break;
}
x = 0.0;
}

printf("Value of expression: %.2f", result);

return 0;
}


13.
Εκφώνηση:
Spoiler: show
Write a program that calculates the average world length for a sentence.
For simplicity, your program should consider a punctuation mark to be part of the word to wich it is attached.
Display the average word length to one decimal place.

Λύση:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(void)
{
char ch;
int words = 1, digits = 0;

printf("Enter a sentence: ");

while ((ch = getchar()) != '\n') {
if (ch == ' ')
words++;
else
digits++;
}

printf("Avarage word length: %.1f", (float) digits / words);

return 0;
}


Η 12 δουλεύει μόνο όταν δεν υπάρχουν κενά ανάμεσα στους τελεστές και τους τελεστέους όπως στο παράδειγμα.

Οποιεσδήποτε υποδείξεις ευπρόσδεκτες.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 02 Μαρ 2012, 15:28

Ilias95 έγραψε:Θέλω να γράψω μια συνθήκη ισοδύναμη με:
Κώδικας: Επιλογή όλων
if (a == 1 || a == 2 || a == 3 || a == 4 || a == 5 || a == 6)
//do something

Σε πολλές γλώσσες θα γράφαμε:
Κώδικας: Επιλογή όλων
if a in (1, 2, 3, 4, 5, 6)

Μπορώ να κάνω κάτι αντίστοιχο στην C;

Εφόσον είναι συνεχόμενοι οι αριθμοί, μπορείς να το γράψεις ως εξής:

Μορφοποιημένος Κώδικας: Επιλογή όλων
if ( a > 0 && a < 7 )  ή  if ( a >=1 && a <= 6 )

Μπορείς επίσης να έχεις τα όρια ως σταθερές, π.χ. LOLIM και HILIM ίσες με 0 και 7, αντίστοιχα (ορισμένες είτε με #define είτε με const int) και να γράψεις...
Μορφοποιημένος Κώδικας: Επιλογή όλων
if ( a > LOLIM && a < HILIM )

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

Μορφοποιημένος Κώδικας: Επιλογή όλων
enum Ten { TEN_LOLIM=0, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, HILIM=11 };

και να ορίσεις κι ένα validation macro...

Μορφοποιημένος Κώδικας: Επιλογή όλων
#define TEN_ISVALID( n )    ( (n) > TEN_LOLIM && (n) < TEN_HILIM )


Οπότε τώρα, για οποιαδήποτε μεταβλητή ορισμένη ως enum Ten, μπορείς να γράφεις κάτι σαν το παρακάτω...

Μορφοποιημένος Κώδικας: Επιλογή όλων
...
enum Ten n;

printf( "Enter a number between %d and %d: ", TEN_LOLIM+1, TEN_HILIM-1);
mySCANF( "%d", &n );

if ( !TEN_ISVALID(n) )
puts( "The number you entered was out of range");
...

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

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

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