Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2012, 23:10   #1
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию Такая вот проблемка

Всем привет. Я новичёк и совсем недавно взялся за самостоятельное изучение с++. Начал читать книгу Стивена Прата и параллельно выполнять упражнения по программированию из неё.
На четвертой задаче из 3 главы встал в тупик. Задача следующая:
Напишите программу, которая запрашивает количество секунд в виде целого
значения (используйте тип long или long long, если последний доступен) и
затем отображает эквивалентное значение в сутках, часах, минутах и секундах.
Для представления количества часов в сутках, количества минут в часе и
количества секунд в минуте используйте символические константы. Результат
выполнения программы должен выглядеть следующим образом:
Enter the number of seconds: 31600000
31600000 seconds = 365 days, 17 hours, 46 minutes, 40 seconds


Вот мой недоделанный код:
Код:
#include <iostream>
#include <conio.h>
int day(int, int, int, int);
int hour(int, int, int, int);
int sec(int);

using namespace std;

int main()
{
	long long int sec;
	cout << "Enter the number of seconds: ";
	cin >> sec;
	const int hoursInDay = 24;
	const int minutesInHour = 60;
	const int secInMinute = 60;
	cout << sec << " seconds = " << day(sec, hoursInDay, minutesInHour, secInMinute) << " days, " << hour(sec, hoursInDay, minutesInHour, secInMinute) << " hours, " << min(sec, hoursInDay, minutesInHour, secInMinute)
		 << " minutes, ";

	getch();
	return 0;
}

int day(int sec, int hoursInDay, int minutesInHour, int secInMinute)
{
	int day = sec / hoursInDay / minutesInHour / secInMinute;

	return day;
}

int hour(int sec, int hoursInDay, int minutesInHour, int secInMinute)
{
	int hour = (sec - day(sec, hoursInDay, minutesInHour, secInMinute) * hoursInDay * minutesInHour * secInMinute) / (minutesInHour * secInMinute);

	return hour;
}

int min (int sec, int hoursInDay, int minutesInHour, int secInMinute)
{
	int min = (sec - day(sec, hoursInDay, minutesInHour, secInMinute) * hoursInDay * minutesInHour * secInMinute) / (minutesInHour * secInMinute);

	return min;
}
Дописывать код нету смысла, ибо понимаю что это бред а не код, слишком громоздко всё, полюбому много лишнего, да и пробовал я в таком стиле его дописать, но код не срабатывал.

Подскажите как можно выполнить задание, чтобы еще и код выглядел простенько и был легко читаемым, а то я на эту задачу всю субботу убил - ну не допру и всё тут

И еще подскажите каких-нибудь сборников с не очень сложными задачками для новичков, для закрепления материала. Буду очень признателен
Suby вне форума Ответить с цитированием
Старый 04.11.2012, 07:40   #2
monster-bonster
Пользователь
 
Аватар для monster-bonster
 
Регистрация: 27.06.2012
Сообщений: 38
По умолчанию

Код:
#include <iostream>
using namespace std;

#define SECONDS_IN_DAY  (3600*24)
#define SECONDS_IN_HOUR 3600
#define SECONDS_IN_MIN  60

int main()
{
        long long second;

        cout << "enter seconds: ";
        cin >> second;

        long long sec = second;

        int day = (int)(second / SECONDS_IN_DAY);
        second -= (day*SECONDS_IN_DAY);
        int hour = (int)(second / SECONDS_IN_HOUR);
        second -= (hour*SECONDS_IN_HOUR);
        int min = (int)(second / SECONDS_IN_MIN);
        second -= (min*SECONDS_IN_MIN);

        cout << sec << " seconds = " << day << " days, " << hour << " hours, " << min << " minutes, " << second << " seconds" << endl;


        return 0;
}
Вот вам решение не забудьте нажать на весы, уверен прога работает. Могут возникнуть некие проблемы при компиляции так как я написал ее на GNU/Linux.
Мой вам совет - почаще используйте константы. Удачи .
monster-bonster вне форума Ответить с цитированием
Старый 04.11.2012, 08:13   #3
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от monster-bonster Посмотреть сообщение
Код:
#include <iostream>
using namespace std;

#define SECONDS_IN_DAY  (3600*24)
#define SECONDS_IN_HOUR 3600
#define SECONDS_IN_MIN  60

int main()
{
        long long second;

        cout << "enter seconds: ";
        cin >> second;

        long long sec = second;

        int day = (int)(second / SECONDS_IN_DAY);
        second -= (day*SECONDS_IN_DAY);
        int hour = (int)(second / SECONDS_IN_HOUR);
        second -= (hour*SECONDS_IN_HOUR);
        int min = (int)(second / SECONDS_IN_MIN);
        second -= (min*SECONDS_IN_MIN);

        cout << sec << " seconds = " << day << " days, " << hour << " hours, " << min << " minutes, " << second << " seconds" << endl;


        return 0;
}
Вот вам решение не забудьте нажать на весы, уверен прога работает. Могут возникнуть некие проблемы при компиляции так как я написал ее на GNU/Linux.
Мой вам совет - почаще используйте константы. Удачи .
Хе-хе, спасибо большое Но таким способом и я задачу решил
Дело в том, что есть одно НО! И это НО затаилось в условии задачи , а именно:
Для представления количества часов в сутках (т.е. 24 часа в сутках), количества минут в часе (т.е. 60 минут в часе) и
количества секунд в минуте (т.е. 60 секунд в минуте) используйте символические константы.
Т.е. константы обязательно должны быть в таком виде:
Код:
#define HOURS_IN_DAY 24
#define MINUTES_IN_HOUR 60
#define SECONDS_IN_MIN  60
или в таком:
Код:
const int hoursInDay = 24;
const int minutesInHour = 60;
const int secInMinute = 60;
Вот в чем прикол то, и для меня принципиально решить задачу именно с такими условиями, даже если путем обхождения условия есть способ решения намного легче
Но на весы всё-равно нажал, за старания

Последний раз редактировалось Suby; 04.11.2012 в 08:19.
Suby вне форума Ответить с цитированием
Старый 04.11.2012, 12:46   #4
Rait-spider
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 15
По умолчанию

Вот так примерно должна выглядить ваша программа.

Код:
#include<iostream>
using namespace std;
#define HOURS_IN_DAY 24
#define MINUTES_IN_HOUR 60
#define SECONDS_IN_MIN  60

int main() {
	int b;
	long seconds;
	int sutki,hours,minutes;
	cout<<"Vvedite chislo sekund: ";
	cin>>seconds;
	sutki = (int) (seconds / (HOURS_IN_DAY * MINUTES_IN_HOUR * SECONDS_IN_MIN)); //число заданных секунд разделил на число секунд в одних сутках
	seconds -= (sutki * HOURS_IN_DAY * MINUTES_IN_HOUR * SECONDS_IN_MIN); //из заданного числа секунд вычел число секунд в целом числе суток, которое укладывается
	hours = (int) (seconds / (SECONDS_IN_MIN * MINUTES_IN_HOUR));
	seconds -= (hours * SECONDS_IN_MIN * MINUTES_IN_HOUR);
	minutes = (int) (seconds / SECONDS_IN_MIN); //получаем число минут
	seconds -= (minutes * SECONDS_IN_MIN);
	cout<<"Days: "<<sutki<<'\n'<<"Hourses: "<<hours<<'\n'<<"Minutes: "<<minutes<<'\n'<<"Seconds: "<<(int)seconds;
	cin>>b; //задержал закрытие консоли
	return 0;
}
На ваших тестовых данных проверял, работает правильно, а далее уже вам судить об этом.
Что же касается сборников заданий, то нашёл один сборник хороший, заданий очень много и довольно много сложных заданий(они интереснее) и большинство вполне реализуемых новичками. И сам по нему сейчас занимаюсь, я же тоже на процессе обучения только ) Ссылка:
http://teacher.ucoz.net/Lection/C/zadaniya.pdf
Откроется пдфшник. Успехов в освоении с++ )
С++ - сила

Последний раз редактировалось Rait-spider; 04.11.2012 в 13:06.
Rait-spider вне форума Ответить с цитированием
Старый 04.11.2012, 12:52   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Пожалуй, решается это так:
Код:
const int hoursInDay = 24;
const int minutesInHour = 60;
const int secInMinute = 60;

void PrintTime(long seconds)
{
long time = seconds;
long secs, mins, hours, days;
secs = time % secInMinute;
time /= secInMinute;
mins = time % minutesInHour;
time /= minutesInHour;
hours = time % hoursInDay;
std::cout << seconds << " seconds = " << time << " days, " << hours << " hours, " << mins << " minutes, " << secs << " seconds" << std::endl;
}
Не проверял, но должно быть правильно.

P.S. Ну и заодно, раз уж вы еще только изучаете язык, несколько советов на примере вышеприведенных кодов.
1. Писать long long int (так же как long int, short int, signed int, unsigned int, short unsigned int и т.п.) не обязательно - если указан один или два из таких модификаторов типа, то считается, что это именно int.
2. Поскольку мы пишем на плюсах, а не на Си, то и константы следует использовать плюсовские - через const, а не макросы. Навскидку не вспомню все минусы дефайнов, но упомяну хотя бы то, что такие "константы" (а вернее - всего лишь макроопределения) не имеют типов, что может в некоторых случаях стать источником проблем. Не говоря уже об общих проблемах макросов - попробуйте только забыть скобки в выражении типа
Код:
#define DOZEN 10 + 2
и вместо дюжины в квадрате получите в коде черт-те что.
3.
Код:
cin>>b; //задержал закрытие консоли
Не самый удачный вариант, за версту выдает применение костылей, хотя и безобидных (по признаку неравенства формы и содержания). Лучше написать
Код:
cin.ignore();
cin.get();
4. Не используйте выражения типа
Код:
using namespace std;
в реальных задачах, особенно глобально, вне тела конкретной функции. Так вы полностью разрушите всю концепцию пространств имен. Либо пишите префикс, либо указывайте, что конкретно вам нужно:
Код:
using std::cout;
using std::cin;
using std::endl;
5. conio.h - исключительно виндовая библиотека, и потому обладает ограниченной переносимостью. В том же линуксе вам придется жить без функции getch.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же

Последний раз редактировалось Гром; 04.11.2012 в 13:15.
Гром вне форума Ответить с цитированием
Старый 04.11.2012, 13:02   #6
Rait-spider
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 15
По умолчанию

кстати, проверил ради интереса только что. С некоторыми значениями работает правильно, но с другими неправильно. Например, на тестовые данные 31600000 секунд выдаёт - 8777 дней,17 часов, 46 минут и 40 секунд. Не может столько дней быть да и по тестовым данным можно увидеть, что будет всего 365 дней.
С++ - сила
Rait-spider вне форума Ответить с цитированием
Старый 04.11.2012, 13:18   #7
Rait-spider
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 15
По умолчанию

спасибо за ваши замечания ) учту их обязательно )
С++ - сила
Rait-spider вне форума Ответить с цитированием
Старый 04.11.2012, 13:19   #8
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Ну да, я забыл поделить на число часов в сутках. Нужно добавить строку
Код:
time /= hoursInDay;
Тестирование - наше все.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 04.11.2012, 16:04   #9
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Вечерком проверю эту задачу в действии. Спасибо всем откликнувшимся!
Цитата:
Сообщение от Гром Посмотреть сообщение
conio.h - исключительно виндовая библиотека, и потому обладает ограниченной переносимостью. В том же линуксе вам придется жить без функции getch.
А есть какая-нибудь кросплатформенная библиотека наподобие этой? Или вбивать по 2 раза подряд cin.get() - единственный вариант?
Кстати, getchar кросплатформенная? И какая библиотека её задействует? А то я слышал звон, да не знаю где он

Последний раз редактировалось Suby; 04.11.2012 в 16:06.
Suby вне форума Ответить с цитированием
Старый 04.11.2012, 16:18   #10
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Finaly!!!
Код:
#include <iostream>
#include <conio.h>
void PrintTime(long long);

using namespace std;

int main()
{
	long long seconds;
	cout << "Enter seconds: ";
	cin >> seconds;
	PrintTime(seconds);

	getch();
	return 0;
}

void PrintTime(long long seconds)
{
	const int hoursInDay = 24;
	const int minutesInHour = 60;
	const int secInMinute = 60;
	long time = seconds;
	long secs, mins, hours, days;
	secs = time % secInMinute;
	time /= secInMinute;
	mins = time % minutesInHour;
	time /= minutesInHour;
	hours = time % hoursInDay;
	time /= hoursInDay;
	cout << seconds << " seconds = " << time << " days, " << hours << " hours, " << mins << " minutes, " << secs << " seconds" << endl;
}
Suby вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В C++ вот такая вот тема Estoque_DS Помощь студентам 2 29.05.2012 18:18
Вот такая вот задача, C++ aztec Помощь студентам 2 10.06.2009 17:27
Вот такая задача...) Gen* Помощь студентам 3 20.04.2009 19:14