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

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

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

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

Δημοσίευσηαπό Star_Light » 23 Ιούλ 2011, 02:51

migf1 έγραψε:Αν νήμα εννοείς το thread, όχι δεν είναι συνώνυμο με συνάρτηση.


Ναι φυσικα το thread εννοω. Βασικα εχω διαβασει τι παιζει με τα νηματα. Και απλα ειπα να εκφρασω μια εικασια. Επειδη και οι συναρτησεις εχουν δικη τους στοιβα αλλα και τα νηματα απο οτι διαβασα. Απλα μοιραζονται ολα τα αλλα με μια διεργασια πχ.
Γνώσεις ⇛ 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++

Δημοσίευσηαπό stamatiou » 23 Ιούλ 2011, 16:50

Έχω τον παρακάτω κώδικα:
Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(void)
{
int c = EOF;
printf("EOF = %d\n",c);
return 0;
}

αλλά όταν δοκίμασα τον παραπάνω κώδικα και έγραψα -1 συνέχισε, γιατί;

Υ.Γ.
Εγώ ρώτησα έκανα τις παραπάνω ερωτήσεις αλλά τις έκανα με pm επειδή πίστευα ότι μπορεί να θεωρηθεί σαν spam με τόσες ερωτήσει και μάλιστα χαμηλού επιπέδου. Και πάλι ευχαριστώ όμως το migf1 που με κάλυψε! :lol:
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 23 Ιούλ 2011, 19:01

Αυτός ο κώδικας τι πρόβλημα έχει;
Κώδικας: Επιλογή όλων
#include <stdio.h>

int fahr_2_celsius(int fahr)
{
float celsius = (5.0/9.0) * (fahr - 32);
return celsius;
}

int main(void)
{
int fahr;
printf("FAHR TO CELSIUS TABLE - THE C PROGRAMMING LANGUAGE\n");
for(fahr = 0;fahr <= 300;fahr += 20)
{
printf("%3d %6.1f\n",fahr,fahr_2_celsius(fahr));
}
return 0;
}


και μου βγάζει error
Κώδικας: Επιλογή όλων

warning: format ‘%6.1f’ expects type ‘double’, but argument 3 has type ‘int’

Edit: :oops:
Επίσης μήπως μπορεί να μου εξηγήσει κάποιος τον παρακάτω κώδικα:

Κώδικας: Επιλογή όλων
int atoi(char s[])
{
int i,n;
n = 0;
for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
n = 10 * n + (s[i] - '0');
return n;
}

Δεν καταλαβαίνω τι κάνει το s[i] >= '0' && s[i] <= '9' και το n = 10 * n + (s[i] - '0')
Edit2:Μπορεί κάποιος να μου εξηγήσει πώς δουλεύει αυτή η συνάρτηση;
Κώδικας: Επιλογή όλων
/* squeeze: delete all c from s */
void squeeze(char s[], char s2[])
{
int i, j;
for (i = j = 0; s[i] != '\0'; i++)
{
if (s[i] == s2[i])
{
s[j + 1] = s[i];
}
}
s[j] = '\0';
}

και επίσης δεν ξέρω πώς να υλοποιήσω την παρακάτω άσκηση, όχι λόγω κώδικα αλλά ως λογικής:
Spoiler: show
Exercise 2-5. Write the function any(s1,s2), which returns the first location in
a string s1 where any character from the string s2 occurs, or -1 if s1 contains no
characters from s2. (The standard library function strpbrk does the same job but
returns a pointer to the location.)
Τελευταία επεξεργασία από stamatiou και 24 Ιούλ 2011, 01:47, έχει επεξεργασθεί 4 φορά/ες συνολικά
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό clepto » 23 Ιούλ 2011, 19:05

δεν έβαλες το error :P
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

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

Δημοσίευσηαπό Qdata » 23 Ιούλ 2011, 20:22

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

int fahr_2_celsius(int fahr)
{
float celsius = (5.0/9.0) * (fahr - 32);
return celsius;
}

int main(void)
{
int fahr;
printf("FAHR TO CELSIUS TABLE - THE C PROGRAMMING LANGUAGE\n");
for(fahr = 0;fahr <= 300;fahr += 20)
{
printf("%3d %6.1f\n",fahr,fahr_2_celsius(fahr));
}
return 0;
}


και μου βγάζει error
Κώδικας: Επιλογή όλων

warning: format ‘%6.1f’ expects type ‘double’, but argument 3 has type ‘int’

Edit: :oops:
Επίσης μήπως μπορεί να μου εξηγήσει κάποιος τον παρακάτω κώδικα:

Κώδικας: Επιλογή όλων
int atoi(char s[])
{
int i,n;
n = 0;
for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
n = 10 * n + (s[i] - '0');
return n;
}

Δεν καταλαβαίνω τι κάνει το s[i] >= '0' && s[i] <= '9' και το n = 10 * n + (s[i] - '0')


Σου πετάει το Error γιατί η συνάρτηση fahr_2_celsius είναι τύπου int ενώ εσύ δήλωσες στο αλφαριθμητικό μορφοποίησης ότι η printf() πρέπει να περιμένει τύπο float.Οπότε κάνε την συνάρτησή σου τύπου float.
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
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 24 Ιούλ 2011, 18:43

stamatiou έγραψε:#include <stdio.h>

int main(void)
{
int c = EOF;
printf("EOF = %d\n",c);
return 0;
}

Που το έγραψες το -1; Ο παραπάνω κώδικας δεν ζητάει είσοδο από τον χρήστη.

Όπως και να 'χει, το EOF χρησιμοποιείται κυρίως όταν διαβάζεις αρχεία. Όταν διαβάζεις την κύρια είσοδο (stdin) είναι καλύτερα να ελέγχεις για τον χαρακτήρα '\n' που αντιστοιχεί σε ENTER.

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

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

Δημοσίευσηαπό migf1 » 24 Ιούλ 2011, 19:16

stamatiou έγραψε:
[snip]
Επίσης μήπως μπορεί να μου εξηγήσει κάποιος τον παρακάτω κώδικα:

Κώδικας: Επιλογή όλων
int atoi(char s[])
{
int i,n;
n = 0;
for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
n = 10 * n + (s[i] - '0');
return n;
}

Δεν καταλαβαίνω τι κάνει το s[i] >= '0' && s[i] <= '9' και το n = 10 * n + (s[i] - '0')
[snip]


Εξετάζει μέσα σε ένα for-loop έναν-έναν τους χαρακτήρες του string s μέχρι να βρει κάποιον που ΔΕΝ είναι αριθμητικό ψηφίο. Στον πίνακα ASCII οι αριθμητικοί χαρακτήρες είναι συνεχόμενοι, από τον '0' έως και τον '9'.

Οπότε το for-loop σταματάει όταν βρει s[i] με ASCII code μικρότερο από το ASCII code του χαρακτήρα '0' ή μεγαλύτερο από το ASCII code του χαρακτήρα '9'.

Για όσους χαρακτήρες όμως ικανοποιούν τη συνθήκη του for-loop (είναι δηλαδή αριθμητικά ψηφία) τους περνάει έναν-έναν μέσα στο κυρίως σώμα της επανάληψης και τους πολλαπλασιάζει κάθε φορά με το 10 πριν τους προσθέσει στο εκάστοτε προηγούμενο άθροισμα.

Αυτό που κάνει η συνάρτηση είναι πως μετατρέπει ένα string s σε ακέραιο αριθμό int (ascii to int = atoi )

Π.χ. ας πούμε ότι το s αποτελείται από τα εξής ψηφία: 235 δηλαδή έχουμε ότι:

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

s[0] == '2'
s[1] == '3'
s[2] == '5'

Για να κάνει την πράξη που υπολογίζει το n μέσα στο κυρίως σώμα του for-loop, πρέπει το κάθε χαρακτήρα από αυτούς να τον αντιστοιχήσει πρώτα στην ακέραια τιμή που υποδηλώνει ο καθένας τους, η οποία ΔΙΑΦΕΡΕΙ από το ASCII code του.

Για παράδειγμα, το ASCII code του χαρακτήρα '2' δεν είναι το 2 αλλά το 50. Ομοίως το ASCII code του χαρακτήρα '3' δεν είναι το 3 αλλά το 51 (και του '5' είναι το 53).

Οπότε τι κάνει; Για καθένα ψηφίο του s αφαιρεί από το ASCII code του το ASCII code του χαρακτήρα '0' (το οποίο είναι 48) με το...
Κώδικας: Επιλογή όλων

s[i] - '0

Δηλαδή, όταν το s[i] είναι '2' η παραπάνω αφαίρεση ισούται με τον ακέραιο 2 ( 50-48 ), όταν το s[i] είναι '3' η αφαίρεση δίνει 3 ( 51-48 ) κι όταν το s[i] είναι '5' η αφαίρεση δίνει 5 ( 53-48 ).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 24 Ιούλ 2011, 20:53

migf1 έγραψε:
stamatiou έγραψε:
[snip]
Επίσης μήπως μπορεί να μου εξηγήσει κάποιος τον παρακάτω κώδικα:

Κώδικας: Επιλογή όλων
int atoi(char s[])
{
int i,n;
n = 0;
for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
n = 10 * n + (s[i] - '0');
return n;
}

Δεν καταλαβαίνω τι κάνει το s[i] >= '0' && s[i] <= '9' και το n = 10 * n + (s[i] - '0')
[snip]


Εξετάζει μέσα σε ένα for-loop έναν-έναν τους χαρακτήρες του string s μέχρι να βρει κάποιον που ΔΕΝ είναι αριθμητικό ψηφίο. Στον πίνακα ASCII οι αριθμητικοί χαρακτήρες είναι συνεχόμενοι, από τον '0' έως και τον '9'.

Οπότε το for-loop σταματάει όταν βρει s[i] με ASCII code μικρότερο από το ASCII code του χαρακτήρα '0' ή μεγαλύτερο από το ASCII code του χαρακτήρα '9'.

Για όσους χαρακτήρες όμως ικανοποιούν τη συνθήκη του for-loop (είναι δηλαδή αριθμητικά ψηφία) τους περνάει έναν-έναν μέσα στο κυρίως σώμα της επανάληψης και τους πολλαπλασιάζει κάθε φορά με το 10 πριν τους προσθέσει στο εκάστοτε προηγούμενο άθροισμα.

Αυτό που κάνει η συνάρτηση είναι πως μετατρέπει ένα string s σε ακέραιο αριθμό int (ascii to int = atoi )

Π.χ. ας πούμε ότι το s αποτελείται από τα εξής ψηφία: 235 δηλαδή έχουμε ότι:

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

s[0] == '2'
s[1] == '3'
s[2] == '5'

Για να κάνει την πράξη που υπολογίζει το n μέσα στο κυρίως σώμα του for-loop, πρέπει το κάθε χαρακτήρα από αυτούς να τον αντιστοιχήσει πρώτα στην ακέραια τιμή που υποδηλώνει ο καθένας τους, η οποία ΔΙΑΦΕΡΕΙ από το ASCII code του.

Για παράδειγμα, το ASCII code του χαρακτήρα '2' δεν είναι το 2 αλλά το 50. Ομοίως το ASCII code του χαρακτήρα '3' δεν είναι το 3 αλλά το 51 (και του '5' είναι το 53).

Οπότε τι κάνει; Για καθένα ψηφίο του s αφαιρεί από το ASCII code του το ASCII code του χαρακτήρα '0' (το οποίο είναι 48) με το...
Κώδικας: Επιλογή όλων

s[i] - '0

Δηλαδή, όταν το s[i] είναι '2' η παραπάνω αφαίρεση ισούται με τον ακέραιο 2 ( 50-48 ), όταν το s[i] είναι '3' η αφαίρεση δίνει 3 ( 51-48 ) κι όταν το s[i] είναι '5' η αφαίρεση δίνει 5 ( 53-48 ).

Οκ, αλλά γιατί στο n έχει και αυτό το 10 * n;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 24 Ιούλ 2011, 20:55

stamatiou έγραψε:
Edit2:Μπορεί κάποιος να μου εξηγήσει πώς δουλεύει αυτή η συνάρτηση;
Κώδικας: Επιλογή όλων
/* squeeze: delete all c from s */
void squeeze(char s[], char s2[])
{
int i, j;
for (i = j = 0; s[i] != '\0'; i++)
{
if (s[i] == s2[i])
{
s[j + 1] = s[i];
}
}
s[j] = '\0';
}


Γράψε αν θες αναλυτικά τι δεν καταλαβαίνεις ακριβώς από την παραπάνω συνάρτηση.

έγραψε:και επίσης δεν ξέρω πώς να υλοποιήσω την παρακάτω άσκηση, όχι λόγω κώδικα αλλά ως λογικής:
Spoiler: show
Exercise 2-5. Write the function any(s1,s2), which returns the first location in
a string s1 where any character from the string s2 occurs, or -1 if s1 contains no
characters from s2. (The standard library function strpbrk does the same job but
returns a pointer to the location.)

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

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

Δημοσίευσηαπό migf1 » 24 Ιούλ 2011, 21:03

stamatiou έγραψε:
Οκ, αλλά γιατί στο n έχει και αυτό το 10 * n;

Γιατί π.χ. το 253 ισούται με 10*2 + 10*5 + 3

Πάρε χαρτί και μολύβι, υπέθεσε πως το s = "253" ακολούθησε τον κώδικα και γράφε στο χαρτί τις τιμές των i,n και s[i] σε κάθε επανάληψη του for-loop και θα το καταλάβεις.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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