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

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

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

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

Δημοσίευσηαπό migf1 » 26 Φεβ 2012, 11:44

Star_Light έγραψε:migf1 δηλαδη ενας unsigned int στον αριθμο 65536 θα κρασάριζε??? ή δεν εχει καμια σχεση αυτο που λεω????

Σαφώς κι έχει σχέση, υπό την έννοια πως είναι πολύ λογική απορία. Δεν κρασάρει όχι, τα unsigned κάνουν wrap around... δλδ (όριο+1) γυρίζει σε 0, (όριο+2) γυρίζει σε 1, κλπ. Ομοίως κι από την άλλη μέρια: -1 γυρίζει σε όριο, -2 γυρίζει σε (όριο-1), κλπ.

έγραψε:Btw τα 16 bits που έχεις πιο πάνω αντιστοιχούν σε μια λέξη? Ενω πχ τα 8 bit ειναι τα nibbles

Αυτό είναι platform dependent, ανάλογα την πλατφόρμα το word μπορεί να αντιστοιχεί σε 2, 4 ή και σε 8 bytes (μπορεί και περισσότερα).

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

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

Δημοσίευσηαπό stamatiou » 26 Φεβ 2012, 12:13

Οκ, άρα να ξεκινήσω και εγώ να το διαβάζω...
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 » 26 Φεβ 2012, 20:58

Μπα εγω ακομη ειμαι στις ασκησεις του 2ου κεφαλαίου δεν βγαζουμε τοσο ευκολα τα κεφαλαια :D
ειπαμε μεθοδικοτητα !

ΣΤο μεταξυ εγω θα λύσω πρωτα και τις ασκήσεις 7 & 8 στο κεφάλαιο 2 (Programming Projects) και μετα μπαινω 3ο.

Στο 8 τι παιζει???? 6% τοκο δεν λέει? και μηνιαια δοση 386.66

Ωραια -> 20000.00 + 6/100 * 20000.00 = 21200.00 - 386.66 = 20813.34
το 19713.34 που το βρίσκει??? θα μας τρελανει??? εκτος και αν εχω ξεχασει του τοκους πως υπολογιζονται ή δεν εχω καταλαβει
την εκφωνηση. :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

Δημοσίευσηαπό Ilias95 » 26 Φεβ 2012, 23:01

Star_Light έγραψε:Στο 8 τι παιζει???? 6% τοκο δεν λέει? και μηνιαια δοση 386.66

Ωραια -> 20000.00 + 6/100 * 20000.00 = 21200.00 - 386.66 = 20813.34
το 19713.34 που το βρίσκει??? θα μας τρελανει??? εκτος και αν εχω ξεχασει του τοκους πως υπολογιζονται ή δεν εχω καταλαβει
την εκφωνηση. :S

Βρίσκεις πρώτα το monthly interest rate το οποίο είναι: 6 τοις εκατό / 12 = (6/100) / 12 = 0.005
Σου λέει ότι το υπόλοιπο μειώνετε κατά monthly payment και αυξάνεται κατά υπόλοιπο επί το monthly interest rate.

Άρα έχουμε:
balance after first payment = balance - monthly payment + balance * monthly interest rate = 20000 - 386.66 + 20000 * 0.005 = 19713.34
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 27 Φεβ 2012, 01:59

Programming project 7 σελ.96 στο βιβλίο του King
έγραψε:Write a program that finds the largest and smallest of four integers entered by the user.
Use as few if statements as possible. Hint: Four if statements are sufficient.

Με έσκασε μέχρι να το καταφέρω με μόλις 4 if statements:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include "myextras.h"

int main(void)
{
int n1, n2, n3, n4, largest, smallest;

printf("Enter four integers: ");
mySCANF("%d %d %d %d", &n1, &n2, &n3, &n4);

if ((n1 > n2 && n1 > n3 && n1 > n4) || (n1 < n2 && n1 < n3 && n1 < n4))
n1 > n2 ? (largest = n1) : (smallest = n1);
if ((n2 > n1 && n2 > n3 && n2 > n4) || (n2 < n1 && n2 < n3 && n2 < n4))
n2 > n1 ? (largest = n2) : (smallest = n2);
if ((n3 > n1 && n3 > n2 && n3 > n4) || (n3 < n1 && n3 < n2 && n3 < n4))
n3 > n1 ? (largest = n3) : (smallest = n3);
if ((n4 > n1 && n4 > n2 && n4 > n3) || (n4 < n1 && n4 < n2 && n4 < n3))
n4 > n1 ? (largest = n4) : (smallest = n4);

printf("Largest: %d\n", largest);
printf("Smallest: %d\n", smallest);

return 0;
}

Η λύση μου φαίνεται στραβή, κακή και άσχημη, αλλά δεν πρέπει να υπάρχει άλλος τρόπος να γίνει με 4 if. :problem:
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό eliasps » 27 Φεβ 2012, 02:33

Έχω την εντύπωση ότι υπάρχουν 2-3 τρόποι να το κάνεις. Αλλά θα χρειαστεί να χρησιμοποιήσεις και if-else ή κάποια επανάληψη, ή και τη συνάρτηση swap.

Στο δικό σου πρόγραμμα πάντως, άμα δώσεις 2 ίδιους ακέραιους για μεγαλύτερους ή 2 ίδιους για μικρότερους (ή και τα 2), το πρόγραμμα δεν θα λειτουργήσει σωστά. Δοκίμασε να το τρέξεις πχ χρησιμοποιώντας τους: 7, 7, 5, 1. Ή 8, 6, 2, 2. Ή 8, 8, 2, 2. Δεν νομίζω να δίνει σωστά outputs εκτός και αν δεν βλέπω κάτι! :problem:
Άβαταρ μέλους
eliasps
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4017
Εγγραφή: 16 Δεκ 2011, 22:25
Τοποθεσία: Αθήνα, Αττική
Launchpad: eliasps
IRC: eliasps
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 27 Φεβ 2012, 02:45

eliasps έγραψε:Έχω την εντύπωση ότι υπάρχουν 2-3 τρόποι να το κάνεις. Αλλά θα χρειαστεί να χρησιμοποιήσεις και if-else ή κάποια επανάληψη, ή και τη συνάρτηση swap.

Στο δικό σου πρόγραμμα πάντως, άμα δώσεις 2 ίδιους ακέραιους για μεγαλύτερους ή 2 ίδιους για μικρότερους (ή και τα 2), το πρόγραμμα δεν θα λειτουργήσει σωστά. Δοκίμασε να το τρέξεις πχ χρησιμοποιώντας τους: 7, 7, 5, 1. Ή 8, 6, 2, 2. Ή 8, 8, 2, 2. Δεν νομίζω να δίνει σωστά outputs εκτός και αν δεν βλέπω κάτι! :problem:

Έχεις δίκιο. Θεώρησα δεδομένο (κακώς) ότι δεν θα υπάρχουν ίδιοι αριθμοί. Θα επανέλθω.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 27 Φεβ 2012, 12:46

Καλημέρα και χρόνια πολλά!

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

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

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

Δημοσίευσηαπό migf1 » 27 Φεβ 2012, 13:16

Αντίθετα, μιας και μιλάμε για if-else, κάτι που είναι ιδιαίτερα πρακτικό & χρήσιμο είναι η χρήση δικών μας pre-processor directives που να μας επιστρέφουν την μεγαλύτερη ή/και την μικρότερη ανάμεσα σε 2 τιμές...

Μορφοποιημένος Κώδικας: Επιλογή όλων
#define myMIN(x,y)    ( (x) < (y) ? (x) : (y) )
#define myMAX(x,y) ( (x) > (y) ? (x) : (y) )

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

Ας πούμε για παράδειγμα πως έχουμε ένα σημείο (χ,y) και ζητάμε από την χρήστη να μας δώσει πλάτος w ώστε να δημιουργήσουμε ένα τετράγωνο, με την πάνω αριστερή γωνία του στο σημείο (x,y). Καμβάς είναι οθόνη μας, ξεκινώντας από το σημείο (0,0) στην πάνω αριστερή γωνία της. Έχουμε επίσης περιορισμό στο μέγιστο πλάτος( W_MAX) που μπορεί να έχει οποιοδήποτε από τα τετράγωνα που διαχειρίζεται το πρόγραμμά μας...

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

#define W_MAX 300 /* in pixels */
#define myMIN(x,y) ( (x) < (y) ? (x) : (y) )

int main( void )
{
int x = 20, y = 10, w = 0;

printf( "Enter width for square starting at (%d,%d): ", x, y );
mySCANF( "%d", &w );

w = ( w < x ) ? x : myMIN(w, W_MAX);
...
return 0;
}

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

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

Δημοσίευσηαπό Ilias95 » 27 Φεβ 2012, 18:03

migf1 έγραψε:Καλημέρα και χρόνια πολλά!

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

ΥΓ. Το ζητούμενο της άσκησης είναι τετριμμένη διαδικασία αν σε άφηνε να χρησιμοποιήσεις βρόχους ή/και πίνακες.

Καλησπέρα.

Πιθανότατα έχεις δίκιο στο ότι μπορεί να μην έχει πρακτική εφαρμογή σε πραγματικά προγράμματα, αλλά δεν νομίζω ότι είναι άσχημη άσκηση.
Μία έξυπνη λύση που βρήκα:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>

void swap(int *i, int *j) {
int t = *i;
*i = *j;
*j = t;
}

int main(void)
{
int first, second, third, fourth;
scanf("%d %d %d %d", &first, &second, &third, &fourth);

if (first > second)
swap(&first, &second);
if (third > fourth)
swap(&third, &fourth);
if (first > third)
swap(&first, &third);
if (second > fourth)
swap(&second, &fourth);

printf("Largest: %d\n", fourth);
printf("Smallest: %d\n", first);

return 0;
}

Χρησιμοποιεί 4 if και δουλεύει σωστά σε όλες τις περιπτώσεις.
Βέβαια χρησιμοποιείται η συνάρτηση (;) swap και υποτίθεται δεν έχουμε μάθει από συναρτήσεις ακόμα, αλλά χωρίς την χρήση της συνάρτησης απλά θα γράφαμε το ίδιο πράγμα 4 φορές.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

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

cron