Алгоритм программы, подскажите

Алгоритм программы, подскажите

Так как в программировании я даже меньше, чем 0, то прошу помощи.
Изучил 5 уроков и так как нет домашних заданий, придумал его. Захотелось, чтобы при вводе с консоли месяца года, программка говорила мне, к какому сезону месяц относится. Типа ввожу февраль, мне в ответ, это месяц зимы.
Но вот с практической частью ничего не получается. Не могу придумать как это должно быть осуществлено.
Мои мысли. Создать четыре массива, в каждом по 3 месяца сезона. При вводе с клавиатуры названия месяца, происходит поиск по этим трем массивам и если совпадет с массивом, например, 2, то переменной присваивается значение Весна.
Но вот проблема. Я не знаю, как присвоить переменной значение из нескольких букв (слово), и не знаю, как сделать поиск в массиве.
Наверно, информации из первых 5 уроков для составлении этой программки маловато.

Не знаю, зачем создавать 4 двумерных массива, по моему, достаточно одного. Осуществить поиск можно простым перебором, с помощью стандартной функции strcmp.
Ну, как то так, что ли:

#include <iostream>
#include <cstring> // для функции strcmp и strcpy
#include <cctype> // для цункции tolower

using namespace std;

const char mouths[12][10] = { "january", "december", "february", 
                              "march", "april", "may",
                              "june", "july", "august",
                              "september", "october", "november" };

const int StrSize = 256;

int main()
{
    //setlocale ( 0, "Russian" );
    cout << "Введите строку( на английском):";
    char buffer[StrSize];
    char YearTime[10];
    cin.get( buffer, StrSize );
    cin.ignore(); 
    register int i;
    for ( i = 0; buffer[i]; i++ )
        buffer[i] = tolower ( buffer[i] ); переводим в нижний регистр, для обеспечения регистронезависимости
    bool FindOk = false; // флаг, который установлен в 1, если время года найдено
    for ( i = 0; i < 3; i++ ) 
    {
        if ( !strcmp ( buffer, mouths[i] ) ) // проверка на зиму
        {
            FindOk = true;
            strcpy ( YearTime, "winter" ); //если нашли, записываем в YearTime winter, и сваливаем из цикла
            break;
        }
        if ( !strcmp ( buffer, mouths[i+3] ) )
        {
            FindOk = true;
            strcpy ( YearTime, "spring" ); 
            break;
        }
        if ( !strcmp ( buffer, mouths[i+6] ) )
        {
            FindOk = true;
            strcpy (YearTime, "summer" );
            break;
        }
        if ( !strcmp ( buffer, mouths[i+9] ) )
        {
            FindOk = true;
            strcpy ( YearTime, "autumn" );
            break;
        }
    }
    if ( FindOk )
        cout << "Ваше время года: " << YearTime;
    else
        cout << "Не удалось определить время года!";
    return 0;
}

мда... спасибо конечно, но...нифига не понятно.... видно 5 уроков для этого кода ну очень мало.

#include <iostream>
#include <cstring> // для функции strcmp и strcpy
#include <cctype> // для цункции tolower

using namespace std;

const char mouths[12][10] = { "january", "december", "february", 
                              "march", "april", "may",
                              "june", "july", "august",
                              "september", "october", "november" };

const int StrSize = 256;

int main()
{
    //setlocale ( 0, "Russian" );
    cout << "vvedi na anlgisom:";
    char buffer[StrSize];
    char YearTime[10];
    cin.get( buffer, StrSize );
    cin.ignore(); 
    register int i;
    for ( i = 0; buffer[i]; i++ )
        buffer[i] = tolower ( buffer[i] );
    bool FindOk = false; // флаг, который установлен в 1, если время года найдено
    for ( i = 0; i < 3; i++ ) 
    {
        if ( !strcmp ( buffer, mouths[i] ) ) // проверка на зиму
        {
            FindOk = true;
            strcpy ( YearTime, "winter" ); //если нашли, записываем в YearTime winter, и сваливаем из цикла
            break;
        }
        if ( !strcmp ( buffer, mouths[i+3] ) )
        {
            FindOk = true;
            strcpy ( YearTime, "spring" ); 
            break;
        }
        if ( !strcmp ( buffer, mouths[i+6] ) )
        {
            FindOk = true;
            strcpy (YearTime, "summer" );
            break;
        }
        if ( !strcmp ( buffer, mouths[i+9] ) )
        {
            FindOk = true;
            strcpy ( YearTime, "autumn" );
            break;
        }
    }
    if ( FindOk )
        cout << "karoche vrema: " << YearTime<< endl;
    else
        cout << "ne udalos prasti brat!"<<endl;
    system ("pause");
    return 0;
}

Император, а что это сейчас было?
И код надо оформлять правильно. И ещё. Там специально в начале есть setlocale, так что можно не писать транслитом.

fitter не беспокойся — побольше практики и у тебя все получится!

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

const char mouths[12][10] = { "january", "december", "february", 
                              "march", "april", "may",
                              "june", "july", "august",
                              "september", "october", "november" };

можно сделать проще, допустим так

const char* mouths[12] = { "january", "december", "february", 
                              "march", "april", "may",
                              "june", "july", "august",
                              "september", "october", "november" };

ну а если с двумерным массивом, то у меня есть предложение сделать так

// время года
#include <iostream>
#include <string>
#include <cctype>      // tolower()
#include <cstring>     // strlen()

using namespace std;

const int STR_LINE = 256;
const int LINE = 4;
const int COLMN = 4;
const string seasons[LINE][COLMN] = {
    {"winter", "december", "january", "february"},
    {"spring", "march", "april", "may"},
    {"summer", "june", "july", "august"},
    {"atumn", "september", "october", "november"}
};

int main()
{
    cout << "Enter a month: ";
    string s_month;
    char ch_month[STR_LINE];
    cin.getline(ch_month, STR_LINE);

// перевод строки в нижний регистр
    for (int i = 0; i < static_cast<int>(strlen(ch_month) + 1); ++i)
        ch_month[i] = tolower(ch_month[i]);

// присваивание С-строки string
    s_month = ch_month;

// поиск и отображение времени года
    bool flag = true;
    for (int i = 0; i < LINE && flag; ++i){
        for (int j = 1; j < COLMN; ++j){
            if (s_month == seasons[i][j]){
                cout << seasons[i][j] << " is a " << seasons[i][0] << "'s month.\n";
                flag = false;
                break;
            }
        }
    }
    if (flag)
        cout << "There's no this month in the year.\n";

    return 0;
}

fitter, думаю krendkrend прав, побольше пиши кода и не слаживай руки, задавай вопросы, google-e и разбирай написанный тобою код в отладчике, пошагово. На первых порах очень помогает разобраться.
Дерзай:)))

Юрий , мне кажется, или того, что вы описываете нет в 1-5 уроках? Поэтому я старался сделать код понятным. А так, естественно, всегда надо стараться сделать код проще( с чем у меня явные проблемы :( )
P.S. Вы стараетесь упростить мой код, но свой за чем то усложняете..

for (int i = 0; i < static_cast<int>(strlen(ch_month) + 1); ++i)
        ch_month[i] = tolower(ch_month[i]);

зачем делать так? когда можно без static_cast обойтись стандартным неявным преобразованием, которое работает неплохо, да и вызов strlen каждый раз будет требовать некоторых ресурсов, достаточно знать, что в C\C++ строка оканчивается нулём.

Просто у меня компилятор в этом месте выдавал предупреждение подобного рода

1>d:\мои документы\программирование\my_training\my_training\training.cpp(27): warning C4018: '<' : signed/unsigned mismatch

я не разбирался почему, поэтому сделал явное приведение типов. Я ведь тоже в этом деле не profi ;)
Ты прав это место можно переписать и так

// перевод строки в нижний регистр
    for (int i = 0; 0 != ch_month[i]; ++i)
        ch_month[i] = tolower(ch_month[i]);

и поздравить нас, что совместными усилиями написали компактный и читабельный код. :)

Вот код АЛЯ-ПРОСТОТА И НЕЛОГИЧНОСТЬ :)

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main(){
    setlocale(0, "");
    system("color F0"); 
    string mun;
    string mon[12]= {
        "january","february","march","april","may",
        "june","july","august","september","october",
        "november","december"};

    cout << "Ââåäèòå ìåñÿö : ";
    cin >> mun;

    if(mun == mon[0] || mun == mon[1] || mun == mon[11]){
        cout << "Ýòî ìåñÿö çèìû" <<endl;
    }
    else if(mun == mon[2] || mun == mon[3] || mun == mon[4]){
        cout << "Ýòî ìåñÿö âåñíû" <<endl;
    }
    else if(mun == mon[5] || mun == mon[6] || mun == mon[7]){
        cout << "Ýòî ìåñÿö ëåòà" <<endl;
    }
    else if(mun == mon[8] || mun == mon[9] || mun == mon[10]){
        cout << "Ýòî ìåñÿö îñåíè" <<endl;
    }
    else{
        cout << "Ýòî âîîáùå íå íàçâàíèå ìåñÿöà :/" <<endl;
    }
    return 0;
}

вот,сдесь понятнее для тебя наверное будет :)

код оформился как то неправильно...

Хех!.. Вместо названия месяца лучше вводить его номер )))

Слава новичок, когда что-то постишь, под окошком с твоим сообщением, рядом с кнопкой ОТПРАВИТЬ, есть ещё одна кнопка: ПОСМОТРЕТЬ, ЧТО ПОЛУЧИЛОСЬ. Ты ей пользуешься перед отправкой сообщения?

да, но я не мог подправить, поэтому так и отправил.
А с вводом числа вместо названия тогда ещё проще будет

Что бы текст программы корректно здесь отображался надо с начала строки ввести три обратных апострофа и «cpp» (в латинице). Потом, с новой строки, текст программы. Потом, опять с новой строки еще три обратных апострофа. (обычно на одной клавише ~ и `).

Ребята, в данном случае, если вы хотите вводить месяц как число может быть можно сделать еще проще, допустим так...

// время года
#include <iostream>

using namespace std;

enum {january = 1, february,
    march, april, may,
    june, july, august,
    september, october, november, december};

int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "Enter a month (1 - 12): ";
    int month;
    cin >> month;

    switch(month){
    case 1: case 2: case 12: cout << "Это зимний месяц.\n";
        break;
    case 3: case 4: case 5: cout << "Это весна.\n";
        break;
    case 6: case 7: case 8: cout << "Это лето.\n";
        break;
    case 9: case 10: case 11: cout << "Этот месяц осенью.\n";
        break;
    default : cout << "Такого месяца в году нет.\n";
        break;
    }

    return 0;
}

А еще короче слабО? ;)

#include <iostream>
int main()
{
    std::cout << "Enter Mouth number(1-12): \n";
    int n;
    std::cin >> n;
    if ( n >= 12 ||  n <= 2 ) std::cout << "Your year time is winter";
    if ( n > 2 || n <= 5 ) std::cout << "Your year time is spring";
    if ( n > 6 || n <= 9 ) std::cout << "Your year time is summer";
    else std::cout << "Your year time is autumn";
}

P.S.: а про защиту от дурака никто ничего не говорил :)
P.S.S.: проддолжая тему неполной оговорки задания:

#include <iostream>
int main()
{
    std::cout << "Enter Mouth number(1-12): \n";
    int n;
    std::cin >> n;
    std::cout << "Your number year time is :" << n / 3 + 1;
}

эта программа показывает номер времени года ( 1 — зима и т.д. )
( опять же, без защиты от дурака, см.выше :) )
Для честности ( аля Юрий ) можно:

#include <iostream>
int main()
{
    std::cout << "Enter Mouth number(1-12): \n";
    int n;
    std::cin >> n;
    switch ( n / 3 + 1 )
    {
        case 1: std::cout << "It is Winter"; break;
        case 2: std::cout << "It is Spring"; break;
        case 3: std::cout << "Is is Summer"; break;
        default: std::cout << "It is Autumn"; break;
    }
}

Ну что, кто короче? ;)

Э- э -э брат porshe не мухлюй :)
Даже с первого взгляда видно, что код не рабочий и дело даже не в защите от дурака.
1. При вводе 3 — значение будет if ( n >= 1 || n <= 3 ) std::cout << "Your year time is winter";
2. При вводе числа выходящего за диапазон 1-12 никакого вывода не последует (ты о защите от дурака предупредил:))
3. Но все это были цветочки, дело в том, что ягодки начинались до них :))), твой код, какую бы ты цифру не ввел, всегда будет отображать первые три условия, даже не заходя в проверочное условие else

if ( n >= 1 || n <= 3 )
       std::cout << "Your year time is winter";
    if ( n > 3 || n <= 6 )
       std::cout << "Your year time is spring";
    if ( n > 6 || n <= 9 )
       std::cout << "Your year time is summer";

Наверное ты имел в виду, что вроде этого

// время года
#include <iostream>

using namespace std;

int main()
{
    cout << "Enter mouth number (1-12): \n";
    int n;
    cin >> n;
    if (n >= 1 && n < 3 || 12 == n)
        cout << "This year's time is winter.\n";
    else if (n >= 3 && n < 6)
        cout << "This year's time is spring.\n";
    else if (n >= 6 && n < 9)
        cout << "This year's time is summer.\n";
    else if (n >= 9 && n < 12)
        cout << "This year's time is autumn.\n";
    else
        cout << "There's no this month in the year.\n";
    return 0;
}

Э -э -э, брат porshe и в этих двух программах тоже слукавил:)))
Здесь

#include <iostream>
int main()
{
    std::cout << "Enter Mouth number(1-12): \n";
    int n;
    std::cin >> n;
    std::cout << "Your number year time is :" << n / 3 + 1;
}

выйдя из диапазона получим 5, 6, ... n-е время года.
Здесь

#include <iostream>
int main()
{
    std::cout << "Enter Mouth number(1-12): \n";
    int n;
    std::cin >> n;
    switch ( n / 3 + 1 )
    {
        case 1: std::cout << "It is Winter"; break;
        case 2: std::cout << "It is Spring"; break;
        case 3: std::cout << "Is is Summer"; break;
        default: std::cout << "It is Autumn"; break;
    }
}

те же грабли наоборот, выйдя за диапазон останемся постоянно осенью:)
porshe давай!!! :)

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

Ответить

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

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

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

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

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

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