Коя дата ще сме след седмица?

Напишете програма, която позволява да въведете ден, месец и година и после отпечатва коя дата ще сме след седмица.

Публикувано в 11а, 11в с етикети , . Постоянна връзка.

8 Responses to Коя дата ще сме след седмица?

  1. Данаил каза:

    Охо, още едно решение? И то преди да съм обявил задачите във вашия клас – супер :-) Подсети ме утре преди часа да я обсъдим, става ли?

    (Решението по-горе е изтрито поради публикуване на подобрен вариант).

    • krisizdravi95 каза:
      
      #include <cstdlib>
      #include <iostream>
      
      using namespace std;
      
      int main(int argc, char *argv[])
      {
      int den,mesec,godina,posledenden;
      int den1,mesec1,godina1;
      
      cout<<"Vuvedete data: ";
      cin>>den>>mesec>>godina;
      
      if((mesec<0)||(mesec>12)||(den<0))
      {
      cout<<" Nevalidna data!\n";
      return 0;
      }
      
        
      switch(mesec){
          case 1:
          case 3:
          case 5:
          case 7:
          case 8:
          case 10:
          case 12: posledenden=31;break;
          case 4:
          case 6:
          case 9:
          case 11: posledenden=30;break;
          case 2: if((godina%4)==0)
                  posledenden=29;
                  else posledenden=28;
                  break;
      }
      
      
      if(den>posledenden){
      cout<<" Nevalidna data!\n";
      return 0;
      }
      
      
      if((den+7)>posledenden){
      den1=((den+7)-posledenden);
          if(mesec==12)
      {
          mesec1=1;
         godina1=++godina;
      }
         else  
      {
              mesec1=++mesec;
              godina1=godina;
      }
      }
      else 
      {
           den1=den+7;
           mesec1=mesec;
           godina1=godina;
      }
      
      
      cout<<den1<<"."<<mesec1<<"."<<godina1<<"\n";
      
      
      }
       
      
      

      Доколкото ми беше възможно, оптимизирах решението. Сега изтрийте другото :D

      • Данаил каза:

        Браво, решението е перфектно! Използвала си и новите оператори :)

        Ако искаш дори още малко да я оптимизираш, може да не декларираш den1,mesec1,godina1, ами директно да увеличаваш den,mesec,godina – което и както е нужно. Така ще си спестиш няколко присвоявания. Но и така е мноооого добре!

        • krisizdravi95 каза:
          
          #include <cstdlib>
          #include <iostream>
          
          using namespace std;
          
          int main(int argc, char *argv[])
          {
          int den,mesec,godina,posledenden;
          
          cout<<"Vuvedete data: ";
          cin>>den>>mesec>>godina;
          
          if((mesec<0)||(mesec>12)||(den<0))
          {
          cout<<" Nevalidna data!\n";
          return 0;
          }
          
            
          
          switch(mesec){
              case 1:
              case 3:
              case 5:
              case 7:
              case 8:
              case 10:
              case 12: posledenden=31;break;
              case 4:
              case 6:
              case 9:
              case 11: posledenden=30;break;
              case 2: if((godina%4)==0)
                      posledenden=29;
                      else posledenden=28;
                      break;
          }
          
          
          if(den>posledenden){
          cout<<" Nevalidna data!\n";
          return 0;
          }
          
          
          if((den+7)>posledenden){
          den=((den+7)-posledenden);
              if(mesec==12)
          {
              mesec=1;
             godina=++godina;
          }
             else  mesec=++mesec; 
          }
          else den=den+7;
          
          
          cout<<den<<"."<<mesec<<"."<<godina<<"\n";
          
          
          }
          

          Започнах с различните променливите за свое улеснение и съм забравила за тази опция. Ще внимавам по-нататък.

          • Данаил каза:

            Не беше проблем както я беше решила и преди малко – просто по новия начин още малко се опростява кода. А това в много случаи е важно – по-прост код по-лесно се чете, по-лесно се коригират грешки в него, по-лесно се разширява.

            Затова непрекъснато настоявам да опростявате кода и да си форматирате добре програмата – така човек си създава навици да пише кратък, ясен и оптимален код.

            В текущия вариант, ако искаш да използваш съкратените оператори за цели числа ще стане така:

            if((den+7)>posledenden){
              den+=7-posledenden;
              if(mesec==12)
              {
                mesec=1;
                godina++;
              }
              else mesec++; 
            }
            else den+=7;
            

            Но и както си го написала е също вярно :-) Много добре стана задачата!

  2. maleboldjia каза:
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    int d,m,g;
    cout<<"Vavedi data,mesec i godina: ";
    cin>>d>>m>>g;
    d+=7;
    
    if (m>12) {
    	cout<<"Nevalidna data."<<endl;
    	system("PAUSE");
    	return 0;
    }
    
    if ((m==1)||(m==3)||(m==5)||(m==7)||(m==8)||(m==10)||(m==12))
        if ((d>31)&&(d<39)){
    	 d-=31;
    	 m+=1;
    	    }
    	    else if(d>31){
              cout<<"Tozi mesec ima 31 dni."<<endl;
              system("PAUSE");
    	      return 0;
                }
           
    if ((m==4)||(m==6)||(m==9)||(m==11))
        if ((d>30)&&(d<38)){
    	 d-=30;
    	 m+=1;
    	    }
    	    else if (d>30) {
               cout<<"Tozi mesec ima 30 dni."<<endl;
               system("PAUSE");
               return 0;
                 }
              
    if (m==2)
       	if ((((g%4)==0)&&((g%100)!=0))||((g%400)==0)){
    	    if ((d>29)&&(d<37))
            {
    	 d-=29;
    	 m+=1;
    		}
    	    else if (d>29) {
               cout<<"Tozi mesec ima 29 dni."<<endl;
               system("PAUSE");
    	       return 0;
                 }
           }
    	 
        else {
            if ((d>28)&&(d<36)){
    	 d-=28;
    	 m+=1;
    	   }
    		else if(d>28) {
               cout<<"Tozi mesec ima 28 dni."<<endl;
               system("PAUSE");
               return 0;
                 }
    }
    
     if ((m>12)&&(m<14)){
    	 m=1;
    	 g+=1;
    	   }
    
     cout<<"Datata sled edna sedmica shte e: "<<d<<"-"<<m<<"-"<<g<<endl;
    
    
    	system("PAUSE");
    	return 0;
    }
    
    • Данаил каза:

      Според мен ако след проверките за различните месеци намериш само кой е последния ден, ще можеш да обединиш пресмятанията, които сега са след всеки if – виж че са твърде подобни. Това ще опрости още повече кода. Другото е че вместо m+=1; може да ползваш m++; А иначе адмирации за интересното решение! Много ми харесаха тези d+=7; и d-=31; :-)

      Слагай по някой коментар (на други места слагаш, а тук не си) – това ще улесни и теб след време, а и други да вникнат в логиката ти на мислене. Добавянето на адекватни коментари по кода е полезен навик за всеки, който се занимава с програмиране.

  3. Gadget каза:
     
    int d,pd,m,g;
        cout<<"Vavedete data (den mesetz godina):"<<endl;
        cin>>d>>m>>g;
        if(d<=0){//Izpolzvame uslovie s koeto proverqvame dali vuvedenata data e validna
            cout<<"Nevalidna data!"<<endl;
            system("PAUSE");
            return 0;}
        //Preglejdame mesecite
        switch(m){ //Namirame posleden den ot vseki mesec po otdelno
                  case 2:if(g%4==0)//Proverka za visokosna godina
                  pd=29;
                  else
                  pd=28;break;
                  case 1:
                  case 3:
                  case 5:
                  case 7:
                  case 8:
                  case 10:
                  case 12:pd=31;break;
                  case 4:
                  case 6:
                  case 9:
                  case 11:pd=30;break;
                  default:cout<<"Nevalidna data!"<<endl;
                  system("PAUSE");
                  return 0;
                  }
        if(pd<d){//Izpolzvame uslovie s koeto proverqvame dali vuvedenata data e validna
                 cout<<"Nevalidna data!"<<endl;
                 system("PAUSE");
                 return 0;
                 }
        if(pd<d+7){//Proverqavme vuvedeniqt den+7 dali e po-golqm ot posledniq den
              d=((d+7)-pd);
              if(m==12){//Proverqvame dali sme i kum kraq na godinata    
                        ++g;//Pribavqme kum godinata 1
                        m=1;//Mesecut prisvoqva 1(Qnuari)
                        }
              else
                ++m;//Ako ne sme kum kraq na godinata togava samo mesecut uvelichavame s 1
        }
        else
          d+=7;//Ako nito edno ot usloviqta ne e izpulneno togava samo dobavqme kum vuvedenite dni 7
        cout<<"Datata sled 7 dena e: "<<d<<"/"<<m<<"/"<<g<<endl;//Otpechatvame otgovora
    

    Относно m==1 не ми е направило впечатление и съм го пропуснал. В това решение всички ваши забележки ги взех под внимание. И ако може изтрийте предишното ми решение. :)

Вашият коментар