Две функции. Выдает ошибку.

#include <iostream>
using namespace std;

int LunaY(int);// рассчитуем лунный год от 1 до 19
int main();//рассчитуем общее число лунного дня
    int main()//поменять на Luna(int)
{
    setlocale (0, "");
    int D;//день по сол календарю
    cout<<"Введите день рождения: ";
    cin>>D;
    int M;//месяц по сол календарю
    cout<<"Введите месяц рождения: ";
    cin>>M; 
    int L;//берем из функции LunaY
    int Dl;//общее число лун
    L=LunaY(L);
    Dl=(L*11)-14+D+M;
    cout<<Dl;
    return 0;
}
    int LunaY(int)//поменять на LunaY(int)
{
    setlocale (0, "");
    int Y;//год рождения
    cout<<"Введите год рождения: ";
    cin>>Y;
    int L;//число лунного года
    L=Y-1918;//1918 - год рождения равный 1
    if(L>19){
    do {L=L-19;
    }
    while (L>19);
    }
    else
        return L;//поменять на L
}

Программа не дописана и моя первая.
После ввода месяца рождения выдает ошибку
Run-Time Check Failure #3 — The variable 'L' is being used without being initialized.
Если пропустить дальше считает правильно.
Что не так?

Посмотрите, на какую строку ругается рантайм и смотрите, почему в этом месте переменная L используется без предварительной инициализации.

так после ввода месяца рождения ты зачем то передаешь в L=LynaY(L) — то есть передаешь в функцию неинициализированное значение. Походу в этом и есть ошибка. Попробуй ничего не передавать.

Угу... всё верно говорите. Только в такой редакции программы в функцию LunaY передавать параметр не нужно: он там не используется. Соответственно из сигнатуры функции этот параметр надо убрать.

Ещё несколько замечаний по программе.

(1) Функцию setlocale здесь достаточно вызвать один раз в main до первого оператора ввода-вывода на консоль.

(2) Прототип функции main описывать не нужно.

(3) В функции LunaY оператор return сработает только в одной ветке оператора if. Что вернёт функция, если исполнение пойдёт по другой ветке, — знает только компилятор.

    if(L>19){
        do {L=L-19;
        }
        while (L>19);
        // оператор return должен быть здесь...
    }
    else
        return L; // этот return сработает только при L <= 19
    // ... или здесь

(4) В функции LunaY цикл do-while не нужен. Такую же функциональность имеет оператор %.

(5) Функция LunaY выделена логически неправильно. По большому счёту она вообще не нужна. Но уж если очень надо сделать функцию, то лучше так:

#include <iostream>
using namespace std;

int LunaY(int);     // рассчитуем лунный год от 1 до 19

//рассчитуем общее число лунного дня
int main()
{
    setlocale(0, "");

    int D;      //день по сол календарю
    cout << "Введите день рождения: ";
    cin >> D;
    int M;      //месяц по сол календарю
    cout << "Введите месяц рождения: ";
    cin >> M;
    int Y;      //год рождения по сол календарю
    cout << "Введите год рождения: ";
    cin >> Y;

    int Dl;             //общее число лун
    Dl = (LunaY(Y) * 11) - 14 + D + M;

    cout << Dl << endl;
    return 0;
}

int LunaY(int year)
{
    return (year - 1918) % 19;    // 1918 - год рождения равный 1
}

PS. Я в лунных календарях не разбираюсь, поэтому в тонкости расчётов не вникал.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.