проект — Календарь C ++ (невозможно получить значение переменной для возврата в основную функцию)

Итак, у меня есть этот проект для класса к 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);
}

1

Решение

Если вы хотите сохранить значение 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);
// ...
3

Другие решения

Не изменяя ничего, вы можете изменить сигнатуру вашей функции на:

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);
1

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);
...
0

Итак, я решил этот вопрос, используя записи, которые вы, ребята, дали мне. Я решил использовать ссылки для того, чтобы вернуть целое число в основную функцию. Я приобрел еще одну проблему, но я опубликую еще один вопрос, чтобы решить эту проблему.

// Объявление прототипов функций
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);

Это то, что я придумал. Извините, если мой вопрос был немного запутанным. Иногда мне трудно объяснить, что я хочу делать с кодом.

0
По вопросам рекламы [email protected]