Итак, у меня есть этот проект для класса к 17-му, и мне было интересно, могу ли я получить немного помощи. По сути, мы предполагаем создать календарь, который печатает на основе дня, когда был создан григорианский календарь. Я уже понял, как выполнить задание, но у меня проблемы с високосным годом.
У меня возникла проблема с возвратом значения смещения в основную функцию, чтобы его можно было использовать в другой функции. Возможно, это слишком продвинуто для моих навыков, но я чувствую, что это должно быть довольно легко сделать.
Чтобы дать вам представление о том, как работает високосный год. После вычисления смещения столетия, если год является високосным, предполагается вычесть 1. Или, в этом случае, уменьшить. По какой-то причине смещение не будет уменьшаться в течение високосного года, такого как 2016. Если действительно запутано, почему мое заявление if не работает. Может кто-нибудь помочь?
//Write a program that will print a calendar for whatever year the user wants.
//Declaring libraries...some I might not need....
#include <iostream>
#include <cmath>
#include <iomanip>
#include <string>
#include <fstream>
using namespace std;
//Function prototypes
void ComputeCalendar(string [], string [], int, int);
void CenturyOffset(int year, int offset);
const int DAYS_OF_THE_WEEK = 7;
const int MONTHS_OF_THE_YEAR = 12;
//function calls
//Note: Use switch to calculate what day the calendar begins on
//Determines what day that calendar begins on
void CenturyOffset(int year, int offset){
int c, y, z, s, d;
c = year / 100;
y = year % 100;
z = y / 4;
s = c + y + z;
d = s % 7;
offset = d;
if (year % 4 == 0 && year % 400 == 0)
offset--;
cout << offset << endl;
}
//function for creating the calendar
void ComputeCalendar(string months[], string days[], int year, int offset) {
cout << "\n" << setw(50) << year << "\n" << endl;
int cal;
int week;
for(cal=0; cal<MONTHS_OF_THE_YEAR; cal++)
{
cout << "\n" << endl;
cout << setw(3) << months[cal] << " " << year << endl;
cout << "\n" << endl;
for(week=0; week<DAYS_OF_THE_WEEK; week++)
{
cout << setw(5) << days[week];
}
cout << endl;
}
}
//Main function that allows the user to input the year they wish to see
int main(int argc, char*argv[])
{
int year;
int offset;
cout << "What year would you like to see the calendar for? \n" << endl;
cin >> year;
cout << "\n" << endl;
while(year < 1754) //Check if the year was before or after 1754
{
cout << "You may not enter a year that is before 1754. \n" << endl;
cout << "Please enter another year." << endl;
cin >> year;
cout << "\n" << endl;
}
string days[DAYS_OF_THE_WEEK] = {"SU","MO","TU","WE","TH","FR","SA"};
//Stores days of the week in an array
string months[MONTHS_OF_THE_YEAR] = {"January", "February", "March",
"April", "May", "June",
"July", "August", "September",
"October", "November", "December"};
//Stores Months of the year in an array
ComputeCalendar(months, days, year, offset);
CenturyOffset(year, offset);
}
Если вы хотите сохранить значение offset
когда CenturyOffset(...)
выход, измените сигнатуру функции с:
void CenturyOffset(int year, int offset);
в
void CenturyOffset(int year, int& offset);
Сюда, offset
это ссылка.
Другие ссылки:
Вы также можете вернуть значение вместо того, чтобы передать его в качестве параметра:
int CenturyOffset(int year) {
int offset;
// ...
return offset
}
в основном:
int offset = CenturyOffset(year);
// ...
Не изменяя ничего, вы можете изменить сигнатуру вашей функции на:
void CenturyOffset(int year, int& offset)
Это передает ссылку, которая затем изменяет переменную, переданную из main
, а не копия.
Тем не менее, я бы рекомендовал изменить функцию, чтобы использовать возврат:
int CenturyOffset(int year){
int c, y, z, s, d, offset;
c = year / 100;
y = year % 100;
z = y / 4;
s = c + y + z;
d = s % 7;
offset = d;
if (year % 4 == 0 && year % 400 == 0)
offset--;
return offset;
}
Теперь вы можете получить значение offset
в main
:
int offset = CenturyOffset(year);
cout << offset << endl;
OtherFunction(offset);
Mainnote: Ваша логика високосного года неверна, она должна быть
year % 4 == 0 && year % 100 != 0 || year % 400 == 0
У вас есть 2 варианта возврата значения:
1) Используйте возвращаемое значение
В этом случае вы должны изменить сигнатуру вашего метода:
int CenturyOffset( int year)
И в теле этой функции вы должны написать:
return offset;
Затем в теле вашей основной функции вы используете его следующим образом:
int offset = CenturyOffset(year);
2) Вернуться по ссылке (некоторые люди знают, что это из значение)
В этом случае вы должны изменить сигнатуру вашего метода:
void CenturyOffset( int year, int& offset)
И в теле функции нет изменений.
Затем в теле вашей основной функции вы используете его следующим образом:
int offset = 0; // always should initialize a value before use
CenturyOffset(year, offset);
...
Итак, я решил этот вопрос, используя записи, которые вы, ребята, дали мне. Я решил использовать ссылки для того, чтобы вернуть целое число в основную функцию. Я приобрел еще одну проблему, но я опубликую еще один вопрос, чтобы решить эту проблему.
// Объявление прототипов функций
int dayone (int year, int * offset, int * leapyear);
// вызовы функций
// Эта функция определяет, в какой день начинается календарь
int dayone (int year, int * offset, int * leapyear) {
int c, y, z, s, d;
c = year / 100;
y = year % 100;
z = y / 4;
s = c + y + z;
d = s % 7;
*offset = d;
*leapyear = 0;
if(year % 4 == 0 || year % 400 == 0 && year % 100 != 0)
{
*offset--;
*leapyear++;
}
return *offset, *leapyear;
}
//This is in int main(), didn't want to post the rest of the code since I've done a lot since then.
dayone(year, &offset, &leapyear);
Это то, что я придумал. Извините, если мой вопрос был немного запутанным. Иногда мне трудно объяснить, что я хочу делать с кодом.