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

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

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

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

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

Για δείτε, και πείτε... χάνεται η μπάλα ή το ψιλο-παρακολουθούμε;

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

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

#define MAXINBUF (255+1)
#define MAX_MESSAGES 8

typedef enum {
MSG_OUTOFBOUNDS = 0,
MSG_HIGHER,
MSG_LOWER,
MSG_CONGRATS,
MSG_FMT_TRIES,
MSG_UPPERLIMIT,
MSG_FMT_SETHIDDEN,
MSG_FMT_PROMPT
} MsgPos;

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

if (guess < hidden)
return MSG_HIGHER;
if (guess > hidden)
return MSG_LOWER;

return MSG_CONGRATS;
}

// ----------------------------------------------------------------------------
char **set_language( char **msg_en, char **msg_gr )
{
char inbuf[ MAXINBUF ];

puts("Choose language / Επιλέξτε γλώσσα:");
puts("\n\t1: English (default)\n\t2: Ελληνικά");
printf("> ");
fgets(inbuf, MAXINBUF, stdin);

if ( atoi( inbuf ) == 2 )
return msg_gr;

return msg_en;
}
// ----------------------------------------------------------------------------
int main()
{
char inbuf[ MAXINBUF ] = "";
int limit, guess = -1, hidden, count = 0;
MsgPos pos;
char *msg_gr[MAX_MESSAGES] = {
"\tεκτός ορίων, ξαναπροσπαθήστε\n", // MSG_OUTOFBOUNDS
"\tπιο ψηλά\n", // MSG_HIGHER
"\tπιο χαμηλά\n", // MSG_LOWER
"\nΣυγχαρητήρια, το βρήκατε!", // MSG_CONGRATS
"\tχρειαστήκατε %d προσπάθειες\n\n", // MSG_FMT_TRIES
"Ανώτατο όριο ( μεγαλύτερο του 1 ): ", // MSG_UPPERLIMIT
"\tέβαλα έναν αριθμό από το 1 έως το %d\n\n", // MSG_FMT_SETHIDDEN
"Μαντεψιά #%d: " // MSG_FMT_PROMPT
};
char *msg_en[MAX_MESSAGES] = {
"\tout of bounds, try again\n", // MSG_OUTOFBOUNDS
"\thigher\n", // MSG_HIGHER
"\tlower\n", // MSG_LOWER
"\nCongratulations, you found it!", // MSG_CONGRATS
"\tit took you %d tries\n\n", // MSG_FMT_TRIES
"Give upper limit ( greater than 1 ): ", // MSG_UPPERLIMIT
"\tI set a number from 1 to %d\n\n", // MSG_FMT_SETHIDDEN
"Guess #%d: " // MSG_FMT_PROMPT
};
char **messages = NULL; // δεικτης σε πίνακα από strings

srand( time(NULL) ); // γεννήτρια ψευδοτυχαίων

messages = set_language( msg_en, msg_gr ); // επιλογή γλώσσας
putchar('\n');

do { // διάβασμα ανώτατου ορίου
printf( messages[ MSG_UPPERLIMIT ] );
fgets(inbuf, MAXINBUF, stdin);
limit = atoi( inbuf );
} while ( limit < 1 );

hidden = rand() % limit + 1; // επιλογή τυχαίου αριθμού
printf( messages[ MSG_FMT_SETHIDDEN ], limit);

// το κεντρικό μας loop
do {
printf( messages[ MSG_FMT_PROMPT ], count+1);
fgets(inbuf, MAXINBUF, stdin); // διάβασμα μαντεψιάς
guess = atoi( inbuf ); // μετατροπή της σε int

pos = hint_position(guess,hidden,limit);// επιλογή απάντησης
if ( pos != MSG_OUTOFBOUNDS ) // έγκυρη μαντεψιά
count++; // μετρητής προσπαθειών
puts( messages[ pos ] ); // τύπωμα απάντησης

} while (guess != hidden);

printf( messages[ MSG_FMT_TRIES ], count); // τύπωμα προσπαθειών

return 0;
}

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

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

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

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, 17:48

βασικα migf1 επειδη έκατσε μια δουλεια... θα μεινω λιγο σε αυτα που ειπες πριν προχωρησω στον νεο κωδικα που εδωσες... επειδη ειναι 2-3 σημεια ακομη που θελω να ξαναδω οκ??? θα τα ξανακοιταξω το βραδακι.
Γνώσεις ⇛ 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, 17:51

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

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

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

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

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

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

stamatiou έγραψε:Από εμένα το τελευταίο κομμάτι κώδικα είναι οκ! Δεν έχω καμιά απορρία :D

Μη μου λες τέτοια και ξεθαρρεύω :lol:

Ξέρεις τι είναι ωραία βελτίωση στον κώδικα αυτόν; Αντί τα μηνύματα να είναι γραμμένα μέσα στους πίνακες, και μάλιστα μέσα σε διαφορετικούς πίνακες για κάθε γλώσσα, να είναι γραμμένα σε αρχεία.

Ο παίκτης θα διαλέγει γλώσσα και το πρόγραμμα θα διαβάζει το αρχείο που της αντιστοιχεί, και θα φορτώνει όλα τα μηνύματα που θα βρίσκει στο αρχείο μέσα στον πίνακα (π.χ. τον messages).

Οπότε όποιος θέλει να μεταφράσει το πρόγραμμα σε άλλη γλώσσα, θα ανοίγει π.χ. το αρχείο με τα ελληνικά μηνύματα, θα τα μεταφράζει στη γλώσσα του και θα το σώζει με άλλο όνομα.

Π.χ. αν το ελληνικό αρχείο ονομάζεται: guess_el.txt κι αυτός το μεταφράσει στα γαλλικά, θα το ονομάσει: guess_fr.txt. Το πρόγραμμα μπορεί να χρησιμοποιεί τα 2 τελευταία γράμματα για να διαλέγει ποιο αρχείο θα φορτώσει.

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

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

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

Πάντως αν βαριέστε και θέλετε κάτι σαφώς πιο εύκολο από τα αρχεία, κλπ.... μπορείτε να προσθέσετε στο game τη δυνατότητα να επιλέγει ο παίκτης πόσες προσπάθειες θέλει να παίξει, κι ανάλογα την απάντησή του να καθορίζει το πρόγραμμα το εύρος τιμών μέσα από τις οποίες θα διαλέγει το τυχαίο νούμερο, π.χ. με αντιστοιχία 1 προς 3.

Δηλαδή, αν πει πως θέλει να παίξει 4 προσπάθειες, το πρόγραμμα θα βάζει νούμερο μεταξύ του 1 και του 4*3 = 12. Μπορείτε επίσης να του βγάζετε σε κάθε προσπάθεια πόσες του έχουν απομείνει ακόμα. Και προφανώς το πρόγραμμα θα σταματάει το κεντρικό του loop είτε όταν βρει το νούμερο, είτε όταν ξεμείνει από προσπάθειες.

Αν θέλετε κι άλλη βελτίωση, μπορείτε να προσθέσετε κι άλλα hints, π.χ. αν η μαντεψιά του απέχει 2 νούμερα από το σωστό να του λέει κάτι σαν το "πιο ψηλά και είσαι πολύ κοντά" ή αντίστοιχα "πιο χαμηλά και είσαι πολύ κοντά". Ή άμα απέχει ξέρω γω πάνω από 10 νούμερα να του λέει "... και έχεις πολύ ακόμα" :lol:

Κι αν θέλετε κι άλλη βελτίωση, μπορείτε να βάλετε 2 επίπεδα στο παιχνίδι: εύκολο και δύσκολο. Π.χ. στο εύκολο να είναι όπως τα παραπάνω, και στο δύσκολο να μη του δίνει καθόλου έξτρα πληροφορίες και να έχει την αντιστοιχία προσπαθειών προς εύρος τιμών 1 προς 7 (αντί για 1 προς 4).
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, 21:11

migf1 έγραψε:
Star_Light έγραψε:
δ) αυτο δεν καταλαβαινω πως να το κανω....

Θα βάλεις σε loop να του ζητάει το lim όσο αυτός επιμένει να σου δίνει νούμερο που είναι μικρότερο του 1.

έγραψε:ε) εδω πειραζει που αντι για αυτο που μου λες εβαλα ενα ακομη ορισμα στον πινακα *hints πχ *hints[4] το οποιο ορισα σαν "ektos oriwn ksanaprospathiste" και μεσα στην συναρτηση εβαλα να μου επιστρέφει την τιμη 3? :D

Όχι μόνο δεν πειράζει, είναι και πολύ ωραίο! Αρκεί να το έχεις κάνει σωστά, γιατί... μυρίζομαι πως θα έχεις κάνει καμιά πατάτα :lol: Θα σου πω όταν ποστάρεις τον κώδικα.

έγραψε:στ) Δεν εχω βάλει ομως να μετραει τον αριθμο των προσπαθειων που χρειάστηκε ο χρήστης + οτι μου πεταει το αποτέλεσμα :/

Για το αποτέλεσμα, δες το προηγούμενο ποστ μου... εσύ του λες να στο τυπώνει :lol:


Για πάμε να δουμε τι μαγειρεψαμε παλι....

Κώδικας: Επιλογή όλων
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int hint_position(int guess,int hidden, int lim);

int main()
{
int r;
int lim , guess , hidden;
char *hints[4] = {
"\tpio psila\n", // thesi 0
"\tpio xamila\n", // thesi 1
"\tsugxaritiria to vrikes\n", // thesi 2
"\t ektos oriwn prospa8iste ksana \n" // thesi 3
};


srand(time(NULL)); // klhsh tis srand

do
{
printf("Dwse to orio (to euros ksekina apo 1 ews to orio): \n");
scanf("%d",&lim);
} while (lim<1);

hidden=rand()%lim+1;


do {
printf ("Dwse ton arithmo : ");
scanf("%d",&guess);
r=hint_position(guess,hidden,lim);
puts( hints[ r ]);
} while (hidden!=guess);


return 0;
}
int hint_position(int guess, int hidden , int lim)
{
if( (guess<1) || (guess > lim) )
return 3;

else if (guess<hidden)
return 0;

else if (guess>hidden)
return 1;


else if(guess==hidden)
return 2;

}


εκανα τις αλλαγες στην do ... while για το lim<1 που μου ειπες... + το εξτρα ορισμα στον πινακα

@stamatiou καλα θα δεις στα δικτυα τι εχεις να παθεις!!! ΠΟυ τον κανεις και ξεθαρευει!!! χαχαχαχαχα

Π.Σ => Απορια... η puts οπως την διαβασα στην τεκμηριωση ουσιαστικα επιστρεφει int ενω δεχεται const char *str καταρχην το const τι ακριβως σημαινει??? σταθερα??? και το int που επιστρεφει δεν καταλαβαινω εδω πως δουλεψε... αφου εμενα μου εκτυπωσε string.
Γνώσεις ⇛ 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++

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

βασικα οκ με την puts επιστρεφει int (0 αν εχεις επιτυχια και 1 για αποτυχια) απλα το const char *str σαν παραμετρο που χρησιμοποιει στο προτυπο της ειναι για να παρεμβει στην θεση μνημης και να γράψει στο stdout?

Θελω να πω πως μπορει εκτος απο void συναρτηση να έχεις και int τυπο επιστροφης και μεσα στα ορισματα να χεις δεικτες για να κάνουν άλλη δουλεια ειπαμε εκτος απο αυτην που επιστρεφει η συναρτηση πχ μια τιμη για να δειξει επιτυχια ή αποτυχια στην συναρτηση που την καλεσε...
Γνώσεις ⇛ 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, 23:37

Μια χαρά δουλεύει :) Μόνο ο μετρητής των προσπαθειών σου λείπει (επίσης τα else μέσα στη συνάρτηση είναι περιττά).

Το const δηλώνει μεταβλητές των οποίων οι τιμές ΔΕΝ αλλάζουν (είναι read only δηλαδή).

Εγώ πάντως τα έκανα όλα όσα έγραψα στο προηγούμενο post στο game, εκτός από το να διαβάζει τη γλώσσα από αρχείο. Έβαλα 2 επίπεδα δυσκολίας, με περισσότερα hints στο εύκολο επίπεδο (αν η μαντεψιά απέχει λιγότερο από DIFF_HOT βγάζει "... (είστε πολύ κοντά)" κι αν απέχει περισσότερο από DIFF_COLD βγάζει "... (είστε πολύ μακριά)". Τα έχω ορίσει σε 2 και 10 αντίστοιχα.

Επίσης, στο εύκολο επίπεδο πολλαπλασιάζει τον μέγιστο αριθμό προσπαθειών που του δίνει ο παίκτης επί LVL_EASY_MULTI και παίρνει το αποτέλεσμα ως ανώτατο όριο για να διαλέξει κρυφό αριθμό, ενώ στο δύσκολο επίπεδο πολλαπλασιάζει επί LVL_HARD_MULTI (τα έχω ορίσει 3 και 40 αντίστοιχα).

Ακόμα, του δείχνει στο prompt το μέγιστο πλήθος προσπαθειών π.χ. 3/10 (που σημαίνει: είσαι στην 3η από τις 10) και στο τέλος του αποκαλύπτει και τον κρυφό αριθμό, αν δεν τον έχει βρει.

Και τέλος, πρόσθεσα άλλες 3 συναρτήσεις, οι οποίες ουσιαστικά διαβάζουν από τον παίκτη και ορίζουν τη γλώσσα, το επίπεδο δυσκολίας και τον μέγιστο πλήθος προσπαθειών (από 3 έως 8 το έβαλα).

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

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

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