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

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

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

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

Δημοσίευσηαπό stamatiou » 01 Αύγ 2011, 14:41

stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 01 Αύγ 2011, 14:47

@Star_Light, πάντως δεν τα πήγες όσο άσχημα ενδεχομένως νομίζεις :)
Επιπρόσθετα σε αυτά που έγραψα παραπάνω, βάλε κι αυτά:

δ) βάλε σε loop την είσοδο για το lim μέχρι να σου δώσει κάτι που θα είναι μεγαλύτερο του 1 (όπως το έχεις, δεν ελέγχεις τι σου δίνει για lim)

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

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

Δημοσίευσηαπό migf1 » 01 Αύγ 2011, 14:48


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

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

Δημοσίευσηαπό stamatiou » 01 Αύγ 2011, 14:54

:oops: Δεν το είδα :oops:
Εγώ δεν καταλαβαίνω αυτό:
Κώδικας: Επιλογή όλων
hidden = ( rand() % lim ) + 1;
Γιατί να μην το βάλουμε έτσι:
Κώδικας: Επιλογή όλων
hidden = rand() % lim + 1;

Επίσης δεν μπορώ να βρω πού κάνει λάθος το πρόγραμμα :/
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 01 Αύγ 2011, 14:59

stamatiou έγραψε::oops: Δεν το είδα :oops:
Εγώ δεν καταλαβαίνω αυτό:
Κώδικας: Επιλογή όλων
hidden = ( rand() % lim ) + 1;
Γιατί να μην το βάλουμε έτσι:
Κώδικας: Επιλογή όλων
hidden = rand() % lim + 1;

Το ίδιο πράγμα είναι, η παρένθεση που έχω βάλει εγώ είναι επειδή δεν θυμόμουν αν η πράξη + έχει προτεραιότητα έναντι της % και ήθελα να σιγουρέψω πως πρώτα θα κάνει το % και μετά το +. Αλλά το τσεκάρισα μόλις τώρα και τελικά κάνει έτσι κι αλλιώς πρώτα το %.

έγραψε:Επίσης δεν μπορώ να βρω πού κάνει λάθος το πρόγραμμα :/

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

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

Δημοσίευσηαπό migf1 » 01 Αύγ 2011, 15:03

Άσχετο, όταν τελειώσουμε με την άσκηση, θέλετε πριν πάμε σε πίνακες να πούμε πρώτα 2-3 πράγματα για macros (#define), πρόσθετους τύπους (typedef) και enumerated types (enum) ?
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 01 Αύγ 2011, 15:20

migf1 έγραψε:Άσχετο, όταν τελειώσουμε με την άσκηση, θέλετε πριν πάμε σε πίνακες να πούμε πρώτα 2-3 πράγματα για macros (#define), πρόσθετους τύπους (typedef) και enumerated types (enum) ?

Γιατί όχι; :D
migf1 έγραψε:
stamatiou έγραψε::oops: Δεν το είδα :oops:
Εγώ δεν καταλαβαίνω αυτό:
Κώδικας: Επιλογή όλων
hidden = ( rand() % lim ) + 1;
Γιατί να μην το βάλουμε έτσι:
Κώδικας: Επιλογή όλων
hidden = rand() % lim + 1;

Το ίδιο πράγμα είναι, η παρένθεση που έχω βάλει εγώ είναι επειδή δεν θυμόμουν αν η πράξη + έχει προτεραιότητα έναντι της % και ήθελα να σιγουρέψω πως πρώτα θα κάνει το % και μετά το +. Αλλά το τσεκάρισα μόλις τώρα και τελικά κάνει έτσι κι αλλιώς πρώτα το %.

έγραψε:Επίσης δεν μπορώ να βρω πού κάνει λάθος το πρόγραμμα :/

Οκ, να ο τελικός κώδικας:
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int check(int guess,int right,int lim) {
if(guess <= 0 || guess > lim) {
return -1;
}else if(guess < right) {
return 0;
}else if(guess > right) {
return 1;
}else {
return 2;
}
return 3;
}

int main(void) {
char inbuf[256];
char *hints[3] = {"\tΠιο ψηλά\n","\tΠιο χαμηλά\n","\tΣυγχαρητήρια, το βρήκατε "};
int guess,right,lim,counter=0;
srand(time(NULL));
printf("Which will be the limit? ");
fgets(inbuf,256,stdin);
sscanf(inbuf,"%d",&lim);
right = rand() % lim + 1;
printf("Enter the number: ");
while((check(guess,right,lim)) != 2) {
fgets(inbuf,256,stdin);
guess = atoi(inbuf);
if((check(guess,right,lim)) == 0) {
puts(hints[0]);
counter++;
}else if ((check(guess,right,lim)) == 1) {
puts(hints[1]);
counter++;
}else if ((check(guess,right,lim)) == -1) {
printf("\tΤο όριο είναι από 0 μέχρι %d!\n",lim);
}
}
puts(hints[2]);
printf("με την %dη φορά!\n",++counter);
return 0;
}

Βάλε μια-δυο μαντεψιές εκτός ορίων και δες το πλήθος προσπαθειών που σου βγάζει στο τέλος, νομίζω μετράει και τις άκυρες μαντεψιές.

Να και ο τελευταίος κώδικας:
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int check(int guess,int right,int lim) {
if(guess <= 0 || guess > lim) {
return -1;
}else if(guess < right) {
return 0;
}else if(guess > right) {
return 1;
}else {
return 2;
}
return 3;
}

int main(void) {
char inbuf[256];
char *hints[3] = {"\tΠιο ψηλά\n","\tΠιο χαμηλά\n","\tΣυγχαρητήρια, το βρήκατε "};
int guess,right,lim,counter=0;
srand(time(NULL));
printf("Which will be the limit? ");
fgets(inbuf,256,stdin);
sscanf(inbuf,"%d",&lim);
right = rand() % lim + 1;
printf("Enter the number: ");
while((check(guess,right,lim)) != 2) {
fgets(inbuf,256,stdin);
guess = atoi(inbuf);
if((check(guess,right,lim)) == 0) {
puts(hints[0]);
counter++;
}else if ((check(guess,right,lim)) == 1) {
puts(hints[1]);
counter++;
}else if ((check(guess,right,lim)) == -1) {
printf("\tΤο όριο είναι από 0 μέχρι %d!\n",lim);
}
}
puts(hints[2]);
printf("με την %dη φορά!\n",++counter);
return 0;
}
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 01 Αύγ 2011, 15:35

Και πάλι χρησιμοποιείς απόλυτες αναφορές στις θέσεις του πίνακα hints όταν τυπώνεις τα strings που περιέχει. Το ζουμί είναι να κρατάς την τιμή επιστροφής της συνάρτησης σε μια μεταβλητή η οποία είτε θα είναι -1 είτε θα αντιστοιχεί σε έγκυρη θέση του πίνακα, ώστε να τυπώνεις το string που αντιστοιχεί σε αυτή τη θέση χρησιμοποιώντας τη μεταβλητή αυτή.

Αυτή η μεταβλητή είναι η pos στο δικό μου κώδικα.

Αυτό σου γλιτώνει τα πολλαπλά if-else μέσα στο κεντρικό loop της main σου (που τα κάνεις έτσι κι αλλιώς μέσα στη συνάρτηση, οπότε δεν χρειάζεται να τα επαναλάβεις κι απέξω... φαντάσου να είχες 10 μηνύματα μέσα στον πίνακα, θα έκανες 10 ελέγχους μέσα στη συνάρτηση κι άλλους 10 απ' έξω;)

Επίσης, ο κώδικάς σου καλεί την συνάρτηση 4 φορές ανά επανάληψη του loop !!! (επειδή την καλείς σε κάθε if-else έλεγχο μέσα στο loop, ο οποίος κάθε έλεγχος είναι και περιττός όπως εξήγησα παραπάνω).

Δες τον δικό μου κώδικα, η συνάρτηση καλείται μια και μόνη φορά ανά επανάληψη του loop στην main, και η κάθε επανάληψη κάνει 2 μονάχα ελέγχους: αν η τιμή επιστροφής της συνάρτησης είναι -1 ή όχι.

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

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

Δημοσίευσηαπό stamatiou » 01 Αύγ 2011, 15:55

Όντως, καλύτερα με την pos :clap:
Από εμένα δεν υπάρχει καμιά απορρία :D
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 01 Αύγ 2011, 16:09

AAAAAAAAAAAAAAXXXXXX κοντα ήμουν!!!!!!

Κώδικας: Επιλογή όλων
r=hint_position(guess,hidden,lim);
printf("%s",r);


Μέγιστη μαγκιά

Κώδικας: Επιλογή όλων
r=hint_position(guess,hidden,lim);
puts(hints[r]); //ανάλογα με την τιμή επιστροφής τυπώνει και το ανάλογο item


πραγματικα εντυπωσιακο απο τον μαγο της C τον κυριο migf1 !

Αλλα δεν τελειωσα ακομη γιατι μου πεταει το αποτελεσμα.... λολ μαλλον θα φταιει η scanf... πρεπει να βλαω sscanf????
Γνώσεις ⇛ 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
Εκτύπωση

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

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