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

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

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

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

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

Και στον πίνακα θα πρέπει να έχουμε τα 0,1,2 ή ολόκληρα τα strings που λένε για τον αριθμό;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

stamatiou έγραψε:Και στον πίνακα θα πρέπει να έχουμε τα 0,1,2 ή ολόκληρα τα strings που λένε για τον αριθμό;

Καλημέρα,

τον πίνακα σας τον έχω δώσει έτοιμο, κάνε τον απλά αντιγραφή στην αρχή της main για να μπορείς να τον χρησιμοποιήσεις κατοπιν. Π.χ. αν γράψεις μετά κάπου, ας πούμε:
Κώδικας: Επιλογή όλων
puts( hints[2] );

θα σου τυπώσει: Συγχαρητήρια, το βρήκατε (με ένα tab στην αρχή, λόγω του \t που έχω βάλει, κι αλλαγή γραμμής στο τέλος, λόγω του \n που έχω βάλει).

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

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

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

Οκ, το διόρθωσα(νομίζω :lol:)
Spoiler: show
Κώδικας: Επιλογή όλων
#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]);
}else if ((check(guess,right,lim)) == 1) {
puts(hints[1]);
}else if ((check(guess,right,lim)) == -1) {
printf("\tΤο όριο είναι από 0 μέχρι 150!\n");
}
if(guess < lim) {
counter++;
}
}
puts(hints[2]);
printf("με την %dη φορά!\n",counter);
return 0;
}
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

λοιπον παω να διαβασω για τις rand και srand δεν ειμαι 100% σιγουρος παντως για το τι θελει το προγραμμα και πως θα δουλεψει :P
ελπιζω σε ενα.... 3ωρο να το εχω βγαλει!

Π.Σ Πρωτη φορα θα υλοποιησω τετοια ασκηση :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/C++

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

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

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

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define MAXINBUF (255+1)

// ------------------------------------------------------------------------------
int hint_position(int guess, int hidden, int lim)
{
if (guess < 1 || guess > lim)
return -1;

if (guess < hidden)
return 0;

if (guess > hidden)
return 1;

return 2;
}

// ------------------------------------------------------------------------------
int main( void )
{
char inbuf[ MAXINBUF ]="";
int hidden, guess=-1, lim, count=0, pos;

char *hints[3] = {
"\tπιο ψηλά\n", // θέση 0
"\tπιο χαμηλά\n", // θέση 1
"\tΣυγχαρητήρια, το βρήκατε!\n" // θέση 2
};

srand( time(NULL) );

do {
printf("Ανώτατο όριο (μεγαλύτερο του 1): ");
fgets(inbuf, MAXINBUF, stdin);
lim = atoi(inbuf);
} while (lim < 1);

hidden = ( rand() % lim ) + 1;
printf("\tέβαλα έναν αριθμό από το 1 έως το %d\n\n", lim);

do {
printf("Μαντεψιά #%d: ", count+1);
fgets(inbuf, MAXINBUF, stdin);
guess = atoi(inbuf);

pos = hint_position( guess, hidden, lim);
if (pos == -1)
puts("\tμαντεψιά εκτός ορίων, ξαναπροσπαθήστε\n");
else {
puts( hints[pos] );
count++;
}
} while (pos != 2);
printf("Χρειαστήκατε %d προσπάθειες\n\n", count);

return 0;
}

Φίλε Σταματίου, πάλι μετράει λάθος ο κώδικάς σου τις μαντεψιές. Επίσης χρησιμοποιείς πάρα πολλές φορές την κλήση της συνάρτησης, αρκεί μέσα στο while να την εκχωρήσεις σε μια μεταβλητή και κατόπιν να χρησιμοποιείς αυτή τη μεταβλητή για τους ελέγχους με if μέσα στο loop. Και τέλος, μέσα στο loop δεν χρειάζεται να ελέγχεις για όλες τις πιθανές τιμές επιστροφής, αλλά μόνο για αυτήν που σηματοδοτεί σφάλμα της συνάρτησης, δηλαδή το -1 σε αυτή την περίπτωση. Αν δεν επιστρέφει σφάλμα, τότε θα πρέπει να επιστρέφει έγκυρη θέση του πίνακα (για αυτό πρέπει να αφαιρέσεις το: return 3 μέσα στη συνάρτηση).
Την έγκυρη θέση που επιστρέφει (και θα την έχεις εκχωρήσει στην μεταβλητή που λέω παραπάνω) θα τη χρησιμοποιείς για να τυπώσεις το string που θέλεις.

Δες τον κώδικά μου παραπάνω και νομίζω θα γίνει πολύ πιο κατανοητό αυτό που δυσκολεύομαι να περιγράψω με λόγια.

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

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

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

Star_Light έγραψε:λοιπον παω να διαβασω για τις rand και srand δεν ειμαι 100% σιγουρος παντως για το τι θελει το προγραμμα και πως θα δουλεψει :P
ελπιζω σε ενα.... 3ωρο να το εχω βγαλει!

Π.Σ Πρωτη φορα θα υλοποιησω τετοια ασκηση :P

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

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

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

να ρωτησω κατι? Για να δωσω ας πουμε ενα ευρος τιμων στην rand να παράγει απο το 2 ως το 100 ας πουμε θα πρεπει αρχικα να ορισω

srand(2); ? Το seed που λεει μεσα ειναι το 2? ή μαλλον οχι?

και μετα να δωσω ας πουμε rand() % 100 + 2 ;

βασικα εγω νομιζω μπορω να την καταφερω...!!!! Δεν θα δω το spoiler παρα αυριο ή μεθαυριο... θα την βγαλω δεν παιζει.

Π.Σ Ειμαι ενταξει με την εκφώνηση!!!!
Γνώσεις ⇛ 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++

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

Star_Light έγραψε:να ρωτησω κατι? Για να δωσω ας πουμε ενα ευρος τιμων στην rand να παράγει απο το 2 ως το 100 ας πουμε θα πρεπει αρχικα να ορισω

srand(2); ? Το seed που λεει μεσα ειναι το 2? ή μαλλον οχι?

και μετα να δωσω ας πουμε rand() % 100 + 2 ;

βασικα εγω νομιζω μπορω να την καταφερω...!!!! Δεν θα δω το spoiler παρα αυριο ή μεθαυριο... θα την βγαλω δεν παιζει.

Π.Σ Ειμαι ενταξει με την εκφώνηση!!!!

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

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

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

οκ. Η μεταβλητή hidden τι ακριβως θα χαρακτηρίσει? Σε αυτην θα εκχωρηθει το αποτελεσμα της rand() % lim + 1;
Γνώσεις ⇛ 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++

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

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

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

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