30 δευτερόλεπτα γνώσης

Posted by Γεωργία Γεωργίου Wed, 26 Sep 2007 20:45:44 EEST

Μοιράζομαι μαζί σας πράγματα που έμαθα πρόσφατα.

Προσοχή, σχετίζονται με πληροφορική.

Χρήσιμο:

Έστω ότι έχουμε μία many-to-many σχέση. Π.χ. Άνδρας και Προτερήματα. Άρα, θα έχουμε ένα πίνακα που να αντιπροσωπεύει αυτή τη σχέση.

Τωρά, σκεφτείτε, ότι θέλουμε μια αναφορά(Report) που να βγάζει τα εξής στοιχεία. Όνομα, Ηλικία, και κατά πόσον ο συγκεκριμένος άνδρας έχει τα τρία κύρια προτερήματα.

Για να το κάνω αυτό, μπορώ να κάνω το εξής:

SELECT DISTINCT dbo.Man.Name,

‘IsRich’= CASE dbo.Advantage.Description WHEN ‘Rich’ THEN 1ELSE 0 END,

‘IsCute’ = CASE dbo.Advantage.Description WHEN ‘Cute’ THEN 1 ELSE 0 END,

‘IsSmart’ = CASE dbo.Advantage.Description WHEN ‘Smart’ THEN 1 ELSE 0 END

FROM dbo.Man INNER JOIN dbo.ManAdvantage ON

dbo.Man.ManID = dbo.ManAdvantage.ManID

Inner join dbo.Advantage on dbo.ManAdvantage.AdvantageID=

dbo.Advantage.AdvantageID

Αυτό το query θα μου επιστρέψει πλειάδες της μορφής:

Name – IsRich - IsCute – IsSmart.

Σημείωση(έπειτα από κάποια διόρθωση): για κάθε άτομο θα έχω από 0 εώς 3 records. Μπορεί όμως αυτό το query να αποτελέσει ένα view, το οποίο με ένα Group By μπορεί να μας δώσει ένα record για κάθε άτομο. Σκεφτείτε ότι το πιο πάνω query μας δημιουργεί ένα view –> vManAdv.

Άρα, Select Name, max(isnull(IsRich,0)) as IsRich, max(isnull(IsCute,0)) as ISCute, max(isnull(IsSmart,0)) as IsSmart

from vManAdv

Group by Name

Χρήσιμο ε;;

Ενδιαφέρον:

double x=0.0;

x= … κάποιος κώδικας εδώ που αλλάζει την τιμή του x.

If(x != x) { g. will win the joker!!! }

Ερώτηση: Πότε θα κερδίσει η g το Joker;;

Αν απάντησες ‘ποτέ’, εκτός από άπιστος, είσαι και λάθος!

Το (x != x) είναι αληθές σε κώδικα, στην περίπτωση που το x είναι NaN (Not a Number).

Το έχω δοκιμάσει. Έχω βάλει breakpoint στο If(x != x), και σταμάτησε εκεί ότι ισχύει.

Συγκεκριμένα το watch Που έχω βάλει είχε αυτές τις πληροφορίες:

Name: this.value != this.value Value: true Type: bool

Με λίγα λόγια, το NaN προκύπτει όταν γίνει μαθηματική πράξη που οδηγεί σε

απροσδιοριστία. Με πολλά λόγια, μπορείτε να βρείτε την εξήγηση εδώ

Ενδιαφέρον ε;;

10 comments

    Reader's Comments

  1. Το τερπνόν μετά του ωφελίμου

    Μπράβο Γεωργία.

    Όσον αφορά το δεύτερο κομμάτι νομίζω ότι έχει να κάνει περισσότερο με το είδος της γλώσσας. Έτσι από περιέργεια δοκίμασε το με C που δεν έχει boolean data type.

    -- Χάρης Μιλητός ~harry, September 26, 2007

  2. Πρώτο, σε 30 δευτερόλεπτα δεν προλαβαίνω να κατανοήσω το βαθύτερο νόημα. Θέλω την ώρα μου. Δεύτερο και κυριότερο. Αν το if ισχύει αλλά το χ δεν είναι αριθμός τότε πως θα κερδίσεις το Τζόκερ αφού για να το κερδίσεις πρέπει να βρεις …. τους αριθμούς ;

    -- Ανδρέας Φλωρίδης ~flo, September 26, 2007

  3. @Χάρη:

    #include <stdio.h> #include "math.h"

    int main()

    { double x;

    x=1.0/0.0;

    printf("Step 1: x=%e ",x);

    x=x*0.0;

    printf("Step 2: x=%e ",x);

    if(x!=x) { printf("Hey Harry ! Look! x!=x is valid

    "); printf("The expresion has value: %d",x!=x );

    }

    }

    Αποτέλεσμα:

    $ ./a.exe Step 1: x=inf Step 2: x=nan Hey Harry ! Look! x!=x is valid

    The expresion has value: 1

    @Φλω: Είναι ένα μικρό εμπόδιο που πρέπει να ξεπεράσουμε. Βασικά, προκύπτει από το γεγονός ότι κάπου εμφανίζεται το -Infinite. Θα δείξει. have faith ;).

    -- Γεωργία Γεωργίου ~georgia, September 26, 2007

  4. Κάποια " " εχαθήκαν από το προηγούμενό μου σχόλιο (Νεόφυτε, γιατί μας τρώει γραμμές;; ).

    Αλλά νομίζω είναι καθαρός ο κώδικας και το αποτέλεσμα :).

    -- Γεωργία Γεωργίου ~georgia, September 26, 2007

  5. Ίσως επειδή γράφεις κώδικα στο ελεύθερο κείμενο (χρησιμοποίησε καλύτερα τα %% για κώδικα με τον ίδιο τρόπο που χρησιμοποιείς τα :: για preformatted). Αν είναι στείλε μου ακριβώς αυτό που έγραψες και θα εξηγήσω αν πρόκειται για bug ή αν απλά αυτό που έγραψες άθελα ενεργοποίησε κάποιο κανόνα για formating (όπως γνωρίζεις τα quotes χρησιμοποιούνται για τα λινκς αλλά και για άλλα)

    -- Νεόφυτος Δημητρίου ~k2pts, September 26, 2007

  6. Δηλαδή με λίγα λόγια, το βαθύτερο νόημα είναι ότι θέλεις άντρα και λεφτά; Πρέπει να σε προειδοποιήσω ότι οι προγραμματιστικές σου γνώσεις δεν θα σε βοηθήσουν!!! ;)

    -- Κωνσταντίνος Κωνσταντίνου ~constandinos, September 26, 2007

  7. @Κωνσταντίνο: Τα λεφτά είναι αρκετά.

    -- Γεωργία Γεωργίου ~georgia, September 27, 2007

  8. Ο compiler του Visual Studio 2005 δεν μου το μεταγλωττίζει και μου δίνει το ακόλουθο μήνυμα:

      Error        1 error C2124: divide or mod by zero

    για το σημείο :

      x=1.0/0.0;

    -- Χάρης Μιλητός ~harry, October 01, 2007

  9. Όμως με μια ελαφριά τροποποίηση του κώδικα:

      #include <stdio.h>   #include "math.h"   int main() {          double x;                double y;         x = 1; y = 0;         x= x/y ;         printf(" Step 1: x=%e ",x);         x=x*0.0;         printf(" Step 2: x=%e ",x);         if(x!=x) {           printf(" Hey Harry ! Look! x!=x is valid ");                  printf(" The expresion has value: %d",x!=x );         }        }

    το αποτέλεσμα έχει ως εξής:

      Step 1: x=1.#INF00e+000   Step 2: x=-1.#IND00e+000   Hey Harry ! Look! x!=x is valid   The expression has value: 1

    Ενδιαφέρον . . .

    -- Χάρης Μιλητός ~harry, October 01, 2007

  10. Σημαντικό πάντως να αναφερθεί ότι εάν θέσουμε τα x,y ως int τότε θα έχουμε πάλι:

      0xC0000094: Integer division by zero

    -- Χάρης Μιλητός ~harry, October 01, 2007