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

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

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

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

Δημοσίευσηαπό Star_Light » 02 Αύγ 2011, 15:40

migf1 έγραψε:Σωστό είναι, γιατί τα 2 πρώτα της ορίσματα δεν πειράζονται μέσα στη συνάρτηση (βασικά κανένα της όρισμα δεν πειράζει η sscanf).


Βασικα για να γινω πιο συγκεκριμενος δεν καταλαβαινω το εξης..... για να χρησιμοποιησουμε την sscanf λογικα θα έχουμε ορισει και εναν πινακα που θα αρχικοποιειται με μια συμβολοσειρα ή με χαρακτήρες (ξέρω οτι υπαρχει διαφορα μεταξυ τους ' ' , " " :P) . Eπομενως καθε φορα που ο χρηστης εισαγει την συμβολοσειρα στο inbuf και αυτη διαβαζεται απο την sscanf ουσιαστικα η μνήμη κάθε φορα δεν ανανεώνεται??? Αφου βαζει διαφορετικους χαρακτηρες ο χρηστης.... για αυτο δεν καταλαβαινω το const char ας πουμε.
Γνώσεις ⇛ 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 » 02 Αύγ 2011, 15:41

Για τον φίλο μου Star_Light ένα απλό προγραμματάκι που ρίχνει 2 ζάρια και τυπώνει το αποτέλεσμά τους και το τι έφερε το καθένα τους ξεχωριστά (αλλάζοντας τη σταθερά NZARIA π.χ. σε 5 θα ρίχνει 5 ζάρια).

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

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

#define NZARIA 2
#define MAX_TIMHZARIOY 6

// ---------------------------------------------------------------------------
int rije_zaria( int *zaria, const int nzaria, const int maxtimh)
{
int i, sum=0;
for (i=0; i < nzaria; i++) {
zaria[i] = rand() % maxtimh + 1;
sum += zaria[i];
}

return sum;
}

// ---------------------------------------------------------------------------
void typwse_jexwrista( const int *zaria, const int nzaria )
{
int i;
for (i=0; i < nzaria; i++)
printf("\tζάρι#%d: %d\n", i+1, zaria[i]);
putchar('\n');

return;
}

// ---------------------------------------------------------------------------
int main( void )
{
const int nzaria = (NZARIA < 1 ? 1 : NZARIA);
int result, zaria[ nzaria ];

srand( time(NULL) );

result = rije_zaria( zaria, nzaria , MAX_TIMHZARIOY);
printf("Ζαριά: %d\n", result);
typwse_jexwrista( zaria, nzaria );

return 0;
}
Τελευταία επεξεργασία από migf1 και 02 Αύγ 2011, 15:58, έχει επεξεργασθεί 4 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Star_Light έγραψε:
migf1 έγραψε:Σωστό είναι, γιατί τα 2 πρώτα της ορίσματα δεν πειράζονται μέσα στη συνάρτηση (βασικά κανένα της όρισμα δεν πειράζει η sscanf).


Βασικα για να γινω πιο συγκεκριμενος δεν καταλαβαινω το εξης..... για να χρησιμοποιησουμε την sscanf λογικα θα έχουμε ορισει και εναν πινακα που θα αρχικοποιειται με μια συμβολοσειρα ή με χαρακτήρες (ξέρω οτι υπαρχει διαφορα μεταξυ τους ' ' , " " :P) . Eπομενως καθε φορα που ο χρηστης εισαγει την συμβολοσειρα στο inbuf και αυτη διαβαζεται απο την sscanf ουσιαστικα η μνήμη κάθε φορα δεν ανανεώνεται??? Αφου βαζει διαφορετικους χαρακτηρες ο χρηστης.... για αυτο δεν καταλαβαινω το const char ας πουμε.

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

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

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

migf1 έγραψε:Για τον φίλο μου Star_Light ένα απλό προγραμματάκι που ρίχνει 2 ζάρια και τυπώνει το αποτέλεσμά τους και το τι έφερε το καθένα τους ξεχωριστά (αλλάζοντας τη σταθερά NZARIA π.χ. σε 5 θα ρίχνει 5 ζάρια).

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

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

Δημοσίευσηαπό Star_Light » 02 Αύγ 2011, 15:56

migf1 έγραψε:
To inbuf στο πρόγραμμά σου το δηλώνεις ως κανονικό char *. Εσύ το περνάς ως char * στην sscanf, αλλά αυτή μέσα της το θεωρεί const char * (δλδ δεν επιχειρεί να το πειράξει).


α δηλαδη δεν μπορει να το πειραξει γιατι ο χρηστης ειναι αυτος που δινει την εισοδο ε???
Α ναι σωστα η sscanf απλα διαβαζει..... τις επιλογες του χρηστη .
Ωρες ωρες αναρωτιεμαι και εγω ο ιδιος με τις αποριες μου!

Π.Σ Καλο αυτο με τα ζαρια εγω σκεφτηκα να μην χρησιμοποιησω loop ομως και να βαλω την rand απλα να παιζει στο ευρος απο 1 εως 6!
Βεβαια αυτο θα ειχε ως αποτελεσμα καθε φορα ο χρηστης να παιζει μονο μια φορα και ετσι να τερματιζεται το προγραμμα.... :shifty: :shifty:
Γνώσεις ⇛ 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 » 02 Αύγ 2011, 15:59

Star_Light έγραψε:Π.Σ Καλο αυτο με τα ζαρια εγω σκεφτηκα να μην χρησιμοποιησω loop ομως και να βαλω την rand απλα να παιζει στο ευρος απο 1 εως 6!
Βεβαια αυτο θα ειχε ως αποτελεσμα καθε φορα ο χρηστης να παιζει μονο μια φορα και ετσι να τερματιζεται το προγραμμα.... :shifty: :shifty:

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

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

Δημοσίευσηαπό Star_Light » 02 Αύγ 2011, 17:27

βασικα ειμαι οκ με αυτα που εγραψες migf1 (typedef / enum /macros ) εριξα μια πολυ κλεφτη ματια στον κωδικα σου.... ειναι και 300 lines :P :P

οσο για αυτο που ειπες με την sscanf ok. Δεν επιχειρει να το πειραξει... αλλα θα μπορουσε και να το μεταβάλλει???? και αν ναι πως????
Γνώσεις ⇛ 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 » 02 Αύγ 2011, 18:14

Όχι, δεν το μεταβάλει (αυτό εννοώ όταν λέω δεν το πειράζει).

Χαίρομαι που είμαστε ΟΚ με τα macros, enum και typedef :)

Ορίστε κι ο κώδικας για το... μπαρμπούτι που λέγαμε :lol: Δεν κάνω πλάκα, σοβαρά είναι ένα απλοποιημένο μπαρμπούτι. Εξάρες, έξι-πέντε, πεντάρες, τριάρες κερδίζουν, άσοι, ασό-δυο, διπλές και ντόρτια χάνουν και σε όλα τα υπόλοιπα ξαναπαίζεις.

Επειδή είναι συγκεκριμένο το παιχνίδι, δουλεύει με 2 και μόνο ζάρια και όλη η ιστορία του είναι ο 2-διάστατοσ πίνακας Status tabstatus[6][6] που ουσιαστικά περιέχει όλους τους 36 πιθανούς συνδυασμούς (6χ6 = 36 κελιά) με τον καθένα τους να περιέχει LOSE, WIN ή AGAIN, ανάλογα με τον συνδυασμό που αντιπροσωπεύει το κάθε κελί ;)

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

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

#define MAXINBUF 255+1

#define NDICE 2 // ΥΠΟΧΡΕΩΤΙΚΑ ΝΑ ΕΙΝΑΙ 2
#define MAX_DIEVAL 6 // ΥΠΟΧΡΕΩΤΙΚΑ ΝΑ ΕΙΝΑΙ 6

#define STATUS_MAX_TXTLEN (20+1)

typedef enum status { LOSE=0, WIN, AGAIN } Status;

// ------------------------------------------------------------------------------------
char *s_ncopy( char *dst, const char *src, int n )
{
char *ret = dst;
while ( (dst-ret) < n-1 && (*dst=*src) != '\0' )
dst++, src++;

if ( *dst )
*dst = 0;

return ret;
}

// ---------------------------------------------------------------------------
int throw_dice( int *dice, const int ndice, const int maxval,
const Status tabstatus[maxval][maxval] )
{
dice[0] = rand() % maxval + 1;
dice[1] = rand() % maxval + 1;

return tabstatus[ dice[0]-1 ][ dice[1]-1 ];
}

// ---------------------------------------------------------------------------
char *status2text( char *text, const Status tabstatus )
{
if (tabstatus == AGAIN)
s_ncopy(text, "play again", STATUS_MAX_TXTLEN);
else if ( tabstatus == WIN )
s_ncopy(text, "you win!", STATUS_MAX_TXTLEN);
else if ( tabstatus == LOSE )
s_ncopy(text, "you loose!", STATUS_MAX_TXTLEN);
else
text = NULL;

return text;
}
// ---------------------------------------------------------------------------
int main( void )
{
char inbuf[ MAXINBUF ] = "";
const int ndice = (NDICE != 2 ? 2 : NDICE);
int bet = 0, dice[ ndice ];
char txtstatus[ STATUS_MAX_TXTLEN ] = "";
Status status;
const Status tabstatus[MAX_DIEVAL][MAX_DIEVAL] = {
/*+1/+1 0 1 2 3 4 5 */
/* 0 */ LOSE, LOSE, AGAIN, AGAIN, AGAIN, AGAIN,
/* 1 */ LOSE, LOSE, AGAIN, AGAIN, AGAIN, AGAIN,
/* 2 */ AGAIN, AGAIN, WIN, AGAIN, AGAIN, AGAIN,
/* 3 */ AGAIN, AGAIN, AGAIN, LOSE, AGAIN, AGAIN,
/* 4 */ AGAIN, AGAIN, AGAIN, AGAIN, WIN, WIN,
/* 5 */ AGAIN, AGAIN, AGAIN, AGAIN, WIN, WIN
};

srand( time(NULL) );

puts("To exit type x, or anything else to throw the dice");
do {
printf("> ");
fgets(inbuf, MAXINBUF, stdin);
if (*inbuf == 'x')
break;

status = throw_dice( dice, ndice, MAX_DIEVAL, tabstatus);
printf("Dice thrown: %d %d\n", dice[0], dice[1]);
printf("\t%s\n", status2text( txtstatus, status ) );

} while ( status != LOSE );

return 0;
}

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

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

Δημοσίευσηαπό clepto » 03 Αύγ 2011, 14:51

έχεις κανείς 2-3 ασκήσεις να κάνω; βαριέμαι :P
όχι και πολύ δύσκολες ε γιατί έχω καιρό να ασχοληθώ... :)
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

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

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

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

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

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