Δημοσιεύτηκε: 09 Μαρ 2012, 17:10
από migf1
Ilias95 έγραψε:Τελείωσα και το κεφάλαιο 9 με τις συναρτήσεις.

:)

έγραψε:Ορίστε μια λύση για το 8ο programming project στην σελίδα 217:
...
Θέλω να ρωτήσω κάτι σχετικά με την παραπάνω λύση.
Στην συνάρτηση play_game() στα σημεία όπου έχουμε νίκη ή ήττα επέλεξα να φεύγω κατευθείαν απ' την συνάρτηση με την return επιστρέφοντας true ή false ανάλογα.
Έτσι όμως έχω 4 σημεία εξόδου απ' την συνάρτηση (τα οποία άλλη φορά μπορεί να ήταν περισσότερα).

Θα ήταν καλύτερα μήπως να θέσω μία μεταβλητή τύπου bool η οποία όπου έχουμε νίκη ή ήττα να γίνεται true ή false, να φεύγω απ' τον βρόχο με break και τελικά να επιστρέφω την μεταβλητή;

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

Σε αυτό που συμφωνεί όμως η πλειοψηφία είναι πως μετά από return ή break μέσα σε if, το else αυτού του if είναι τελείως περιττό (και κάνει πιο δυσανάγνωστο τον κώδικα). Συνεχόμενα if (με break ή return) χωρίς else είναι πιο ευανάγνωστα.

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

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdbool.h> // bool, true, false
#include <stdlib.h> // srand(), rand()
#include <time.h> // time()
#include <ctype.h> // tolower()

#define LOSE_POINT 7

#define FIRST_ROLL_WIN(sum) ((sum) == 7 || (sum) == 11)
#define FIRST_ROLL_LOOSE(sum) ((sum) == 1 || (sum) == 2 || (sum) == 12)

int roll_dice( void )
{
// int a = (rand() % 6) + 1, b = (rand() % 6) + 1;
return ( 1 + rand() % 6 ) + ( 1 + rand() % 6 );
}

bool play_game( void )
{
int roll = 0, point, sum;

for (;;)
{
sum = roll_dice();
printf("You rolled: %d\n", sum);
roll++;

if ( roll != 1 ) {
if ( sum == point )
return true;
if ( sum == LOSE_POINT )
return false;
}

if ( FIRST_ROLL_WIN(sum) )
return true;
if ( FIRST_ROLL_LOOSE(sum) )
return false;

point = sum;
printf("Your point is %d.\n", point);
}
}

int main( void )
{
int wins = 0, losses = 0;
srand( (unsigned) time(NULL) );

for (;;)
{
bool play = play_game();
printf( "You %s!\n\n", play ? "win" : "loose" );

play ? wins++ : losses++;

printf("Play again? ");
if ( 'y' != tolower(getchar()) )
break;
getchar(); // catch '\n'
}
printf("Wins: %d Losses: %d\n", wins, losses);

return 0;
}