PDA

View Full Version : مشکل کد usaco



sa1378
پنج شنبه 01 آبان 1393, 17:44 عصر
سلام
برای یه سوال یه کد زدم ولی خروجی اشتباه میده
میخواستم ببینم اشکالش چیه
سوال اصلی :
http://cerberus.delosent.com:791/usacoprob2?a=tjEQ3WFdRQC&S=friday
ترجمه سوال (به صورت خلاصه):
Friday the Thirteenthقراره یه برنامه بنویسیم که برامون محاسبه کنه در هر ماه روز 13ام چه روزیه؟ اول یه عدد n درورودی میار بعد برنامه ی شما باید محاسبه کنه که از ژانویه ی 1900 تا دسامبر 1900+n-1 چند تا ماه 13امش شنبه بوده چند تا ماه یکشنبه بوده چند تا .....ودر خروجی به ترتیب تعداد شنبه ها بعد یکشنبه ها بعد دو شنبه ها ......بعد جمعه ها رو چاپ کنید یعنی 7 تا عدد در یک خط !

چیزایی که باید بدونید : 1. اول ژانویه ی 1900 دوشنبه بوده
2. سپتامبر آپریل ژون نوامبر 31 روزه و فبریه 28 روزه است به جز سال های کبیسه که 29 روزه می شه
3 . هر سالی که مضرب 4 باشه کبیسه حساب می شه مثلا 1992 =4*498 واسه همین کبیسه است !
4 . مورد بالا در مورد سال هایی که اول قرن اند برقرار نیست مثل 1900 1800 1700 2100 اما در همین قاعده هم مضرب های 400 استثنا اند ( می شه استثنا تو استثنا ) مثلا 2000 کبیسه حساب می شه !
در ورودی سوال فقط یک n هست که از 400 کوچیکتره!

کد:
/*
ID: sa.13781
PROG: friday
LANG: C++‎‎‎‎‎‎
*/
#include <iostream>
#include <fstream>
using namespace std;
int n,day[7],p,month,year;


int month_calc() // CORRECT
{
if(month==4 || month==6 || month==9 || month==11)
return 30;

else if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
return 31;

else if (month==2)
{
if(year%100==0)
{
if(year%400==0)
return 29;
else
return 28;
}
else if(year%4==0)
return 29;
else
return 28;
}
}

void output() // CORRECT
{
ofstream fout ("friday.out");
for(int i=0;i<7;i++)
fout<<day[i]<<" ";
fout<<"\n";
}

void calc()
{
year=1900;
month=1;
p=1;
day[1]++;
while(year<1900+n)
{
int ex=month_calc();
p=(p+ex)%7;
day[p]++;
month++;
if(month==12)
{
month=1;
year++;
}
}

}


int main()
{
ifstream fin ("friday.in");
fin>>n;
calc();
output();
return 0;
}

یه نکته دیگه هم اینه که من اشکال این کدم اصلا برام مهم نیست
لطفا اگه میتونین بگین که قدم به قدم چیکار کردین که تونستین اشکال کد رو پیدا کنین
با تشکر

مسعود اقدسی فام
پنج شنبه 01 آبان 1393, 23:37 عصر
کد رو گام به گام با مثال ساده‌ای بررسی کنید و پیش برید. مثلا n = 1 رو در نظر بگیرید که به صورت دستی هم می‌شه نتیجه‌ی کلی و نتیجه‌ی هر مرحله رو سریع حساب کرد. بعد با کد پیش برید و ببینید کجای کار محاسبات اشتباهی اتفاق می‌افته.

sa1378
جمعه 02 آبان 1393, 08:44 صبح
کد رو گام به گام با مثال ساده‌ای بررسی کنید و پیش برید. مثلا n = 1 رو در نظر بگیرید که به صورت دستی هم می‌شه نتیجه‌ی کلی و نتیجه‌ی هر مرحله رو سریع حساب کرد. بعد با کد پیش برید و ببینید کجای کار محاسبات اشتباهی اتفاق می‌افته. برای ورودی 1 درست کار میکنه ولی برای مثال سوال که ورودی 20 داده جوابش اشتباهه باید مشکل از رفتن سال به جلو باشه(و تغییر ماه از 12 به 1 شاید)

sa1378
جمعه 02 آبان 1393, 09:56 صبح
کدم رو یکم تغییر دادم:
/*
ID: sa.13781
PROG: friday
LANG: C++
*/
#include <iostream>
#include <fstream>
using namespace std;
int n,day[7],p,month,year;


int month_calc() // CORRECT
{
if(month==4 || month==6 || month==9 || month==11)
return 30;

else if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
return 31;

else if (month==2)
{
if(year%100==0)
{
if(year%400==0)
return 29;
else
return 28;
}
else if(year%4==0)
return 29;
else
return 28;
}
}

void test_month_calc() // CORRECT
{
month=2;
for(year=1900;year<2001;year++)
{
if(month_calc()==29)
cout<<"YES\n";
else if(month_calc()==28)
cout<<"NO\n";
}
}

void output() // CORRECT
{
ofstream fout ("friday.out");
for(int i=0;i<7;i++)
cout<<day[i]<<" ";
cout<<"\n";
}

void calc()
{
year=1900;
month=1;
p=0;
day[p]++;
while(year<1900+n)
{
int ex=month_calc();
p=(p+ex)%7;
day[p]++;
month++;
if(month==12)
{
month=1;
year++;
}
}

}


int main()
{
ifstream fin ("friday.in");
cin>>n;
calc();
output();
return 0;
}


اصل کار توی تابع calc هست
که اول میاد 13 ام جانویه رو که شنبه میشه رو حساب میکنه
بعد یکی یکی سیزدهم ماه های بعد رو با توجه به تعداد روز های هر ماه حساب میکنه

rahnema1
جمعه 02 آبان 1393, 10:48 صبح
تابع را درست کردم
شما می تونید برنامه را بهینه تر هم بنویسید مثلا جوری بنویسید که محاسبه ex نخواد هر دفعه به این مقدار تکرار بشه

void calc()
{
year=1900;
month=1;
p=0;
while(year<1900+n)
{
while(month<13)
{
int ex=month_calc();
day[p]++;
p=(p+ex)%7;
month++;
}
month=1;
year++;
}
}