Так как в программировании я даже меньше, чем 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;
}
ну а если с двумерным массивом, то у меня есть предложение сделать так
// время года
#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++ строка оканчивается нулём.
Юрий
Просто у меня компилятор в этом месте выдавал предупреждение подобного рода
Хех!.. Вместо названия месяца лучше вводить его номер )))
Макар
Слава новичок, когда что-то постишь, под окошком с твоим сообщением, рядом с кнопкой ОТПРАВИТЬ, есть ещё одна кнопка: ПОСМОТРЕТЬ, ЧТО ПОЛУЧИЛОСЬ. Ты ей пользуешься перед отправкой сообщения?
Слава новичок
да, но я не мог подправить, поэтому так и отправил.
А с вводом числа вместо названия тогда ещё проще будет
Макар
Что бы текст программы корректно здесь отображался надо с начала строки ввести три обратных апострофа и «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 давай!!! :)
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Так как в программировании я даже меньше, чем 0, то прошу помощи.
Изучил 5 уроков и так как нет домашних заданий, придумал его. Захотелось, чтобы при вводе с консоли месяца года, программка говорила мне, к какому сезону месяц относится. Типа ввожу февраль, мне в ответ, это месяц зимы.
Но вот с практической частью ничего не получается. Не могу придумать как это должно быть осуществлено.
Мои мысли. Создать четыре массива, в каждом по 3 месяца сезона. При вводе с клавиатуры названия месяца, происходит поиск по этим трем массивам и если совпадет с массивом, например, 2, то переменной присваивается значение Весна.
Но вот проблема. Я не знаю, как присвоить переменной значение из нескольких букв (слово), и не знаю, как сделать поиск в массиве.
Наверно, информации из первых 5 уроков для составлении этой программки маловато.
Не знаю, зачем создавать 4 двумерных массива, по моему, достаточно одного. Осуществить поиск можно простым перебором, с помощью стандартной функции
strcmp
.Ну, как то так, что ли:
мда... спасибо конечно, но...нифига не понятно.... видно 5 уроков для этого кода ну очень мало.
Император, а что это сейчас было?
И код надо оформлять правильно. И ещё. Там специально в начале есть
setlocale
, так что можно не писать транслитом.fitter не беспокойся — побольше практики и у тебя все получится!
Не пойму для чего здесь двумерный массив. Это объявление
можно сделать проще, допустим так
ну а если с двумерным массивом, то у меня есть предложение сделать так
fitter, думаю krendkrend прав, побольше пиши кода и не слаживай руки, задавай вопросы, google-e и разбирай написанный тобою код в отладчике, пошагово. На первых порах очень помогает разобраться.
Дерзай:)))
Юрий , мне кажется, или того, что вы описываете нет в 1-5 уроках? Поэтому я старался сделать код понятным. А так, естественно, всегда надо стараться сделать код проще( с чем у меня явные проблемы :( )
P.S. Вы стараетесь упростить мой код, но свой за чем то усложняете..
зачем делать так? когда можно без
static_cast
обойтись стандартным неявным преобразованием, которое работает неплохо, да и вызовstrlen
каждый раз будет требовать некоторых ресурсов, достаточно знать, что вC\C++
строка оканчивается нулём.Просто у меня компилятор в этом месте выдавал предупреждение подобного рода
я не разбирался почему, поэтому сделал явное приведение типов. Я ведь тоже в этом деле не profi ;)
Ты прав это место можно переписать и так
и поздравить нас, что совместными усилиями написали компактный и читабельный код. :)
Вот код АЛЯ-ПРОСТОТА И НЕЛОГИЧНОСТЬ :)
вот,сдесь понятнее для тебя наверное будет :)
код оформился как то неправильно...
Хех!.. Вместо названия месяца лучше вводить его номер )))
Слава новичок, когда что-то постишь, под окошком с твоим сообщением, рядом с кнопкой ОТПРАВИТЬ, есть ещё одна кнопка: ПОСМОТРЕТЬ, ЧТО ПОЛУЧИЛОСЬ. Ты ей пользуешься перед отправкой сообщения?
да, но я не мог подправить, поэтому так и отправил.
А с вводом числа вместо названия тогда ещё проще будет
Что бы текст программы корректно здесь отображался надо с начала строки ввести три обратных апострофа и «cpp» (в латинице). Потом, с новой строки, текст программы. Потом, опять с новой строки еще три обратных апострофа. (обычно на одной клавише ~ и `).
Ребята, в данном случае, если вы хотите вводить месяц как число может быть можно сделать еще проще, допустим так...
А еще короче слабО? ;)
P.S.: а про защиту от дурака никто ничего не говорил :)
P.S.S.: проддолжая тему неполной оговорки задания:
эта программа показывает номер времени года ( 1 — зима и т.д. )
( опять же, без защиты от дурака, см.выше :) )
Для честности ( аля Юрий ) можно:
Ну что, кто короче? ;)
Э- э -э брат porshe не мухлюй :)
Даже с первого взгляда видно, что код не рабочий и дело даже не в защите от дурака.
1. При вводе 3 — значение будет
if ( n >= 1 || n <= 3 ) std::cout << "Your year time is winter";
2. При вводе числа выходящего за диапазон 1-12 никакого вывода не последует (ты о защите от дурака предупредил:))
3. Но все это были цветочки, дело в том, что ягодки начинались до них :))), твой код, какую бы ты цифру не ввел, всегда будет отображать первые три условия, даже не заходя в проверочное условие else
Наверное ты имел в виду, что вроде этого
Э -э -э, брат porshe и в этих двух программах тоже слукавил:)))
Здесь
выйдя из диапазона получим 5, 6, ... n-е время года.
Здесь
те же грабли наоборот, выйдя за диапазон останемся постоянно осенью:)
porshe давай!!! :)