Προς το περιεχόμενο

programmataki se c++ (PLEASE HELP)


mantiz

Προτεινόμενες αναρτήσεις

Δημοσ.

Paidia mporei kapios na mou kanei auto to programmataki? einai thema stin exetastiki mou kai den exw idea pws ginete... thanks :)

 

Χρησιμοποιώντας την κλάση για την ημερομηνία να γίνει το εξής πρόγραμμα;.

Δυο παίκτες βάζουν ημερομηνίες ο ένας μετά των άλλον αν είναι η ημερομηνία είναι λάθος παίρνουν -10 πόντος αν είναι σωστή παίρνουν 5 πόντους αν είναι δίσεκτο το έτος τότε παίρνουν 15 πόντους. Νικητής είναι αυτός που θα συμπληρώσει 100 πόντους

 

Καλή τύχη

 

ΥΓ μόνο το πρόγραμμα. Όποιος αντιγράψει μέρος της κλάσης ή ολόκληρη την κλάση το γραπτό του μηδενίζεται.

Δημοσ.

εεε..... καποιες διευκρινισεις

ποια κλαση για ημερομηνια; ο ενας παιχτης σκεφτεται μια ημερομηνια και ο αλλος προσπαθει να μαντεψει ποια είναι; και αν αυτη ειναι σε δισεκτο ετος και την μαντεψει σωστα παιρνει 15; ετσι απλα;

Δημοσ.

Den xerw pia class gia date, poses iparxoun diladi? Einai eina loop pou rwtaei prwta mia imerominia apo ton 1 paixti, kanei ta aparetita check, bathmologi, meta rwtaei mia imerominia apo ton 2 paixi, kanei pali ta checks kai bathmologi, kai pali apo tin arxi, rwtaei ton 1 paixti... mexri kapios paixtis piasei 100 pontous kai nikisi.

Δημοσ.

Ο παρακάτω κώδικας (γραμμένος σε Borland C/C++ Builder 6.0) ζητά από τον πρώτο παίκτη μια ημερομηνία, ύστερα ζητά από τον δεύτερο παίκτη να μαντέψει την ημερομηνία που έδωσε ο πρώτος παίκτης. Εάν ο δεύτερος παίκτης μαντέψει σωστά κερδίζει 5 πόντους ή 15 πόντους εάν η ημερομηνία που έθεσε ο πρώτος παίκτης ήταν δίσεκτη. Εάν ο δεύτερος παίκτης μαντέψει λάθος τότε ο πρώτος παίκτης κερδίζει ανάλογα, 5 πόντους ή 15 πόντους εάν η ημερομηνία που έθεσε ήταν δίσεκτη ή όχι.

 

Το παιχνίδι ολοκληρώνεται όταν ένας από τους δυο παίκτες κερδίσει από 100 και πάνω πόντους ενώ προβλέπει την πιθανότητα ισοπαλίας μεταξύ τους.

 

Η εισαγωγή ημερομηνιών γίνεται ως κείμενο (gets) Ημέρα/Μήνας/Έτος για κάθε παίκτη μετατρεπόμενη στην δομή - τύπο μας TMyDate (_ToDate). Κλειδί στην μετατροπή παίζει η ρουτίνα strtok η οποία χωρίζει το κείμενο σε μπλοκ (token) ανά / και ύστερα η atoi που μετατρέπει το κάθε μπλοκ σε αριθμητική τιμή αποθηκεύοντας την στην υποδεικνυόμενη από την nTokenIdx μεταβλητή του τύπου TMyDate. Η _ToDate δεν κάνει επισταμένο ημερολογιακό έλεγχο στα δεδομένα, πράγμα που μπορείς να προσθέσεις μόνος σου αργότερα αρκετά απλά.

 

Το παιχνίδι μπορεί να διακοπεί με την ολοκλήρωση κάθε γύρου πατώντας το πλήκτρο Q ή δίδοντας κενό Enter στην εισαγωγή ημερομηνίας.

 

Ο έλεγχος και η απόδοση πόντων γίνεται από την ρουτίνα _DatePoints η οποία συγκρίνει τις ημερομηνίες - δομές των δυο παικτών (memcmp) και κρίνει εάν πρόκειται για δίσεκτο έτος. Ο έλεγχος του δίσεκτου έτους γίνεται κατά τις υποδείξεις της Wikipedia http://en.wikipedia.org/wiki/Leap_year.

 

Ο καθαρισμός της οθόνης γίνεται με την εντολή clrscr() την οποία προσφέρει η βιβλιοθήκη conio.h της Borland C/C++ και ενδεχομένως να μην υπάρχει σε άλλους compiler τουλάχιστον με την ίδια ονομασία.

 

Υ.Γ.

 

Σφάλματα φυσικά μπορεί να υπάρχουν, άλλωστε ο κώδικας λόγο περιορισμένου χρόνου γράφθηκε «εν τάχυ», συνεπώς κάθε διόρθωση ευπρόσδεκτη.

 

Καλή τύχη.

 

>
//---------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

//---------------------------------------------------------------------------
typedef struct tagMyDate
{
  int   Year,Month,Day;
}TMyDate;

TMyDate  UserDateA,UserDateB;
char     szDateA[128], szDateB[128];
int      nUser2Quit, nUser1Score = 0, nUser2Score = 0, nUser2Point, nQuitKey = 0;
//---------------------------------------------------------------------------
int   _DatePoints(TMyDate *ptrDateA, TMyDate *ptrDateB)
{
  int   nLeapYear;

  // Are both ptrDatA & ptrDateB the same?
  if(memcmp(ptrDateA,ptrDateB,sizeof(TMyDate))!=0)
   return  -10;

  // Yup, Is a leap year?
  if((nLeapYear=ptrDateA->Year%100)==0)
   nLeapYear=ptrDateA->Year%400;

  return (!nLeapYear)?15:5;
}
//---------------------------------------------------------------------------
int   _ToDate(char *pszDate,TMyDate &NewDate)
{
  char  *pszToken   =  NULL;
  int   nTokenIdx   =  0;

  memset(&NewDate,-1,sizeof(NewDate));

  if((pszToken=strtok(pszDate,"/"))!=NULL)
   {
     do{
         switch(nTokenIdx)
          {
            case 0:       // Day
             NewDate.Day  =  atoi(pszToken);
            break;
            case 1:       // Month
             NewDate.Month=  atoi(pszToken);
            break;
            case 2:       // Year
             NewDate.Year =  atoi(pszToken);
            break;
          }

         nTokenIdx++;
       }while((pszToken=strtok(NULL,"/"))!=NULL && nTokenIdx<3);

     // Check date for nonsense - invalid - date
     if(NewDate.Year==-1 || NewDate.Month==-1 || NewDate.Day==-1 ||
        NewDate.Year==0  || NewDate.Month==0  || NewDate.Day==0)
      return  0;

     return   1;
   }

  // Invalid input
  return   0;
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
  // Clear Screen
  clrscr();

  while(nQuitKey!='Q' && nQuitKey!='q')
   {
     nUser2Quit  =  0;

     // Get Player 1 Date
     printf(" Player 1 Date [DD/MM/YEAR] ?");  gets(szDateA);

     // On empty string - quit game
     if(!strlen(szDateA))
      break;

     // Covert Player 1 string to TMyDate type if possible
     if(!_ToDate(szDateA,UserDateA))
      {
        printf(" Invalid date - %s\n",szDateA);
        continue;
      }

     // Clear Screen
     clrscr();

     for(;
      {
        // Get Player 2 Date
        printf(" Player 2 Date [DD/MM/YEAR] ?");  gets(szDateB);

        // On empty string - quit game
        if(!strlen(szDateB))
         { nUser2Quit=1; break; }

        // Covert Player 2 string to TMyDate type if possible
        if(!_ToDate(szDateB,UserDateB))
         {
           printf(" Invalid date - %s\n",szDateB);
           continue;
         }

        // Ok valid date let's continue
        break;
      }

     // Did Player 2 ask to quit?
     if(nUser2Quit)
      break;

     // Make checks
     nUser2Point =  _DatePoints(&UserDateA,&UserDateB);
     if(nUser2Point==-10)
      nUser1Score += _DatePoints(&UserDateA,&UserDateA);
     else
      {
        nUser2Score += nUser2Point;
        nUser1Score -= 10;
      }

     // Clear Screen
     clrscr();

     // End of game?
     if(nUser1Score>=100)
      {
        printf(" GAME OVER - USER 1 WON - SCORE: %d\n",nUser1Score);
        printf(" Press any key to quit..");
        getch();
        break;
      }
     if(nUser2Score>=100)
      {
        printf(" GAME OVER - USER 2 WON - SCORE: %d\n",nUser2Score);
        printf(" Press any key to quit..");
        getch();
        break;
      }
     if(nUser1Score>=100 && nUser2Score>=100 && nUser2Score==nUser1Score)
      {
        printf(" GAME OVER - DRAW - USER 1: %d USER 2: %d\n",nUser1Score,nUser2Score);
        printf(" Press any key to quit..");
        getch();
        break;
      }

     printf("\n User 1 Date: %d-%d-%d\n",UserDateA.Day,
                                         UserDateA.Month,
                                         UserDateA.Year);

     printf(" User 2 Date: %d-%d-%d\n",UserDateB.Day,
                                       UserDateB.Month,
                                       UserDateB.Year);

     printf("\n User 1 Score: %d \n User 2 Score: %d\n\n",nUser1Score,nUser2Score);

     printf("Press Q to Quit other key to continue..\n");
     nQuitKey=getch();

     // Clear Screen
     clrscr();
   }

  return 0;
}
//---------------------------------------------------------------------------

Δημοσ.

Nomizo, apo tin deuteri perigrafi tou mantiz oti to thema den zitaei apo kanenan na mantepsei. Thelei aplos nomimes imerominies.

 

Px, an o protos paikths dosei 29/02/1999 enai lathos imerominia giati den itan disekto to 1999

 

An dosei 31/04/2006 pali lathos giati o aprilios exei 30.

Genikos an dosei 32 opoioudipote mina, mines pano apo 12 klp i arnitikous, dekadikous otidipote na xanei pontous.

 

An einai sosti kai to etos disekto, px 14/06/2000 pairnei 15 pontous

 

Fysika o protos exei probadisma etsi opos to perigrafeis.

 

Einai poly aplo, dystixos den xero c++ na sto grapso

Δημοσ.

Παρακάτω ακολουθεί κώδικας σε C/C++ που υλοποιεί την δεύτερη εκδοχή, τόσο η TMyDate class όσο και το υπόλοιπο πρόγραμμα έχει επαρκεί σχολιασμό και δανείζεται στα κρίσιμα σημεία κώδικα από την προηγούμενη C λύση - ελπίζω να φανεί εξίσου χρήσιμος.

 

>
//-DIRECTX-------------------------------------------------------------------
#include <iostream>
#include <stdlib.h>
#pragma hdrstop

//---------------------------------------------------------------------------
class TMyDate
{
  private:
     bool     IsLeapYear  (int Year);

  public:
     TMyDate  (void);
    ~TMyDate  (void);

     bool     IsValidDate (int Day,int Month,int Year);
     bool     IsValidDate (char *pszDate,bool bParseCheck);
     bool     IsValidDate (char *pszDate);

     bool     IsValidParse(char *pszDate);

     bool     bLeapYear;
};

TMyDate::TMyDate(void)
{ /* Nothing to initialize */ }
TMyDate::~TMyDate(void)
{ /* Nothing to delete */ }

bool  TMyDate::IsValidDate(char *pszDate,bool bParseCheck)
{
  char  *pszToken   =  NULL, *pszDateTMP = NULL;
  int   nTokenIdx   =  0, nDay     =  -1,
					   nMonth   =  -1,
					   nYear    =  -1;
  bool  bSuccess    =  false;

  // Since strtok is destructive for pszDate we duplicate it into pszDateTMP
  pszDateTMP = new char[strlen(pszDate)+1];
  strcpy(pszDateTMP,pszDate);

  if((pszToken=strtok(pszDateTMP,"/"))!=NULL)
{
  do{
	  switch(nTokenIdx)
	   {
		 case 0:       // Day
		  nDay  =  atoi(pszToken);
		 break;
		 case 1:       // Month
		  nMonth=  atoi(pszToken);
		 break;
		 case 2:       // Year
		  nYear =  atoi(pszToken);
		 break;
	   }

	  nTokenIdx++;
	}while((pszToken=strtok(NULL,"/"))!=NULL && nTokenIdx<3);

  // Just check if the date was parsed (not checked)
  if(bParseCheck)
   {
	 delete[] pszDateTMP;
	 return   (nDay==-1 || nMonth==-1 || nYear==-1)?false:true;
   }

  // Check date for nonsense - invalid - date
  if((bSuccess=IsValidDate(nDay,nMonth,nYear))==true)
   bLeapYear=IsLeapYear(nYear);
}

  delete[] pszDateTMP;
  return   bSuccess;
}

bool  TMyDate::IsValidDate (char *pszDate)
{ return   IsValidDate(pszDate,false); }

bool  TMyDate::IsValidDate(int Day,int Month,int Year)
{
  // Is our date valid?
                               // 0  1  2
  static int     nMaxDay[12] = { 31,00,31, // Jan - Mar
                                 30,31,30, // Apr - Jun
                                 31,31,30, // Jul - Sep
                                 31,30,31  // Oct - Dec
                             };// 9 10 11

  if(Year<1900   || Year>2100)
   return  false;

  nMaxDay[1]  =  (IsLeapYear(Year))?29:28;

  if(Month<1     || Month>12)
   return  false;
  if(Day<1       || Day>nMaxDay[Month-1])
   return  false;

  return   true;
}

bool  TMyDate::IsValidParse(char *pszDate)
{  return   IsValidDate(pszDate,true); }

bool  TMyDate::IsLeapYear(int Year)
{
  // Is Year leap?

  if(!(Year%100))
   if(!(Year%400))
    return true;

  return false;
}
//---------------------------------------------------------------------------
TMyDate  mydateUser1,mydateUser2;
char     szUser1Date[128], szUser2Date[128];
int      nUser1Score = 0, nUser2Score = 0, nUser1Point, nUser2Point;
bool     bFirstPlayerInput =  true;
//---------------------------------------------------------------------------
using namespace std;

#pragma argsused
int main(int argc, char* argv[])
{
  for(;
   {
     cout <<  ((bFirstPlayerInput)? "Player 1 Enter a Date (DD/MM/YEAR)?" :
                                    "Player 2 Enter a Date (DD/MM/YEAR)?");
     cin.getline((bFirstPlayerInput)?szUser1Date:szUser2Date,127);

     if(!strlen((bFirstPlayerInput)?szUser1Date:szUser2Date))
      break;

     if(!((bFirstPlayerInput)?mydateUser1.IsValidParse(szUser1Date):
                              mydateUser1.IsValidParse(szUser2Date)))
      {
        cout << " Invalid date - " << ((bFirstPlayerInput)?szUser1Date:szUser2Date) << endl;
        continue;
      }

     if(!bFirstPlayerInput)
      {
        if(mydateUser1.IsValidDate(szUser1Date))
         nUser1Point=(mydateUser1.bLeapYear)?15:5;
        else
         nUser1Point=-10;

        if(mydateUser2.IsValidDate(szUser2Date))
         nUser2Point=(mydateUser2.bLeapYear)?15:5;
        else
         nUser2Point=-10;

        nUser1Score+=nUser1Point;
        nUser2Score+=nUser2Point;

        if(nUser1Score>=100 && nUser2Score>=100 && nUser1Score==nUser2Score)
         {
           cout << " Users Draw ! " << endl;
           break;
         }
        if(nUser1Score>=100)
         {
           cout << " User 1 Won with " << nUser1Score << " points" << endl;
           break;
         }
        if(nUser2Score>=100)
         {
           cout << " User 2 Won with " << nUser1Score << " points" << endl;
           break;
         }

        cout << " User 1 Score : " << nUser1Score << endl;
        cout << " User 2 Score : " << nUser2Score << endl;

        bFirstPlayerInput=true;
      }
     else
      bFirstPlayerInput =  false;
   }

  return 0;
}
//---------------------------------------------------------------------------

 

Υ.Γ.

Για λόγους συμβατότητας απέφυγα την χρήση exception handling, ο κώδικας έχει αναπτυχθεί σε Borland Builder C/C++ 6 ενώ είναι συμβατός και με τον Borland Turbo C++ Explorer, επίσης μπορεί να υπάρχουν Bugs.

 

Καλή συνέχεια.

:)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...