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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2011, 12:59   #11
Паркер
Пользователь
 
Аватар для Паркер
 
Регистрация: 11.08.2011
Сообщений: 23
По умолчанию

Код:
#include<stdio.h>
void main()
{
int m,n,T,x1,x2;
scanf("%d,m");
scanf("%d,n");
T=m*60+n;
x1=(int)(T/(720/11));
x2=720*(x1+1)/11-T;
x=(int)x2;
printf ("%d\n",x);
}
Знаю, здесь куча ошибок, и одна из них точно связана с целой частью.
Паркер вне форума Ответить с цитированием
Старый 03.10.2011, 04:22   #12
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Паркер Посмотреть сообщение
Знаю, здесь куча ошибок, и одна из них точно связана с целой частью.
И никакая и не куча, а всего парочка )).
Первая - не описана переменная x - ерунда, можно и не считать ошибкой )).
Вторая существенная. Даже очень. Я скажу про нее подробнее..
То, что ты делаешь вот в этой строке
Код:
x=(int)x2;
- это называется приведение типов. Разные типы переменных по-разному представлены в памяти. Приведение типов - это НЕ ОПЕРАЦИЯ. Ему не соответствует никакая команда на ассемблере. Это просто сообщение компилятору, примерно такое:
"Я хочу использовать вот этот участок памяти не так, как он описан, а иначе. Я понимаю возможные последствия этого и прошу мне не препятствовать. Если в результате получится чушь, я не буду тянуть на тебя, уважаемый Компилятор, я буду упрекать только себя. Спасибо."
Вещественное число и целое число предствалены в памяти абсолютно по-разному. Даже если их значения совпадают - тут 2 и там 2, например - содержимое памяти не совпадает ни в коей мере. Если ты хочешь перевести действительное число в целое, тебе надо использовать специальную функцию. Какую именно - решаешь сама. Вот, почему..

Если ты переделываешь целое в вещественное, то не возникает никакой неоднозначности, целая двойка становится действительной. Это можно сделать простым перекладыванием:
a = i;
Это потому, что множество вещественным чисел ШИРЕ, чем множество целых. А если ты переводишь, скажем, 2.5 в целые, то возникает законный вопрос: ты хочешь получить 2 или 3? Еще понятнее это становится, если нужно перевести 2.99. Можно переводить с недостатком, можно с избытком, а можно округлять (куда ближе). А для этого нужны определенные ДЕЙСТВИЯ (в отличие от приведения типов). Для твоих целей тут лучше всего подходит функция floor() - она возвращает максимальное целое, не превосходящее аргумента.

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

Код:
#include <stdio.h>
#include <stdlib.h>

#define hour 60
#define circle 720

int main()
{
    int x,h,m,t;
    printf("type in the time\n");
    printf("hours: ");
    scanf("%d",&h);
    printf("minutes: ");
    scanf("%d",&m);
    t= hour*h + m;
    x = floor(circle*(floor(t/(circle/11))+1)/11 - t);
    printf("till the next time the hands meet together, %d full minutes will pass",x);
    return 0;
}
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 03.10.2011 в 04:25.
TinMan вне форума Ответить с цитированием
Старый 03.10.2011, 23:25   #13
Паркер
Пользователь
 
Аватар для Паркер
 
Регистрация: 11.08.2011
Сообщений: 23
По умолчанию

Цитата:
Первая - не описана переменная x - ерунда, можно и не считать ошибкой
Ага,можно)))
Я писала код по памяти, поэтому и забыла про х, сорри))
Цитата:
Обрати внимание, что я не поленился написать слова (в приглажениях на ввод и в печати результата)
Спасибо!!!
И еще, можно один вопрос?
stdlib.h подключается для
#define hour 60
#define circle 720
да?
Паркер вне форума Ответить с цитированием
Старый 04.10.2011, 00:49   #14
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Паркер Посмотреть сообщение
stdlib.h подключается для
#define hour 60
#define circle 720
да?
Нет.
Вообще-то, stdlib.h тут вообще не нужна.. Она попала по недосмотру (-1 мне). Правильно было бы делать так:
Цитата:
#include <stdio.h> // для ввода/вывода
#include <math.h> // для floor
Тогда кмпилятор не будет ругаться.

А что касается define - для них не нужна никакая библиотека, их ты можешь сама делать, какие хочешь. Это просто кусочек текста, который будет подставлен в код ниже. Если у тебя есть в задаче числа, которые повторяются несколько раз, то лучше их предствалять такими вот "дефайнами". Впоследствии, если понадобится изменить число, тебе не надо будет лазить по всему коду и выискивать его вхождения (их может быть много). Автоматически менять тоже нехорошо, потому что если у тебя в коде некоторые числа 60 представляют длину часа И пенсионный возраст, то если тебе потребуется перейти с минут на секунды и ты заменишь автоматом 60 на 3600 (секунд в часе) - то бедные ветераны труда все получат инфаркт, увидев, что им еще до пенсии больше трех тысяч лет работать.. Так что всегда делай именованные константы и называй их понятно.

define - это очень мощное средство. Можно заменять не только СВОИ переменные, но вообще, что угодно. Вот, посмотри, как я изуродовал ту нашу с тобой программулину с помощью define

Код:
#include <stdio.h>
#include <math.h>

#define hour 60
#define circle 720
#define eto_u_nas_celye int
#define narisui_slovechki_i_ciferki printf
#define BOSS main
#define otdai_obratno return
#define kushai_Pushok scanf
#define ravno =
#define pribavitj +
#define otnyatj -
#define delitj_na /

eto_u_nas_celye BOSS()
{
    eto_u_nas_celye x,h,m,t;
    narisui_slovechki_i_ciferki("type in the time\n");
    narisui_slovechki_i_ciferki("hours: ");
    kushai_Pushok("%d",&h);
    narisui_slovechki_i_ciferki("minutes: ");
    kushai_Pushok("%d",&m);
    t ravno hour*h pribavitj m;
    x ravno floor(circle*(floor(t delitj_na (circle delitj_na 11)) pribavitj 1) delitj_na 11 otnyatj t);
    narisui_slovechki_i_ciferki("till the next time the hands meet together, %d full minutes will pass",x);
    otdai_obratno 0;
}
Ты можешь скомпилить ее (она будет работать!) и даже сдать ее на проверку препу - он будет ужасно рад )). Надеюсь, тебе тоже понравилось.. ))

#define привет пока

привет!
))
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 04.10.2011 в 00:55. Причина: изменил по мелочи для благозвучия ))
TinMan вне форума Ответить с цитированием
Старый 05.10.2011, 01:07   #15
Паркер
Пользователь
 
Аватар для Паркер
 
Регистрация: 11.08.2011
Сообщений: 23
По умолчанию

#define привет!
Не знаю как препаду, но мне такая интерпретация очччееень понравилась)))
Такого я еще нигде не видела!!!
Паркер вне форума Ответить с цитированием
Старый 10.02.2012, 19:49   #16
iris_ka
Пользователь
 
Регистрация: 10.02.2012
Сообщений: 44
По умолчанию

программа не прокатит, если ввести время, например, 11ч 55мин.выдает 70мин.
я добавила одно условие перед выводом х:
if (x>65) x=x-65;
и вроде сработало.
но наверное так нельзя было делать.не знаю.я в этом чайник.
iris_ka вне форума Ответить с цитированием
Старый 15.10.2013, 05:51   #17
spartacusgaming
Новичок
Джуниор
 
Регистрация: 15.10.2013
Сообщений: 1
По умолчанию на 1 курсе прикладной информатике делал

Код:
#include <iostream>
#include <clocale>
#include <math.h>
using namespace std;
int main()
{setlocale(LC_ALL,"Russian");
double m, n, x;
cout <<"Введите часы:";
cin >>m;
cout <<"Введите минуты:";
cin >>n;
{if (m<1)
	x=65-n;
else
{if (m==1 && n<=5)
x=5-n;
else
{if (m==1)
x=70-n;
else
{if (m==2 && n<=10)
x=10-n;
else
{if (m==2)
x=76-n;
else
{if (m==3 && n<=16)
x=16-n;
else
{if (m==3)
x=81-n;
else
{if (m==4 && n<=21)
x=21-n;
else
{if (m==4)
x=87-n;
else
{if (m==5 && n<=27)
x=27-n;
else
{if (m==5)
x=92-n;
else
{if (m==6 && n<=32)
x=32-n;
else
{if (m==6)
x=98-n;
else
{if (m==7 && n<=38)
x=38-n;
else
{if (m==7)
x=103-n;
else
{if (m==8 && n<=43)
x=43-n;
else
{if (m==8)
x=109-n;
else
{if (m==9 && n<=49)
x=49-n;
else
{if (m==9)
x=114-n;
else
{if (m==10 && n<=54)
x=54-n;
else
{if (m==10)
x=120-n;
else
{if (m==11)
x=60-n;
else
	x=0;}}}}}}}}}}}}}}}}}}}}}}
{if (x!=0)
cout <<"До совпадения стрелок на циферблате осталось"<<" "<<x<<" "<<"минут"<<'\n';
else
{if (x==0)
cout <<"Стрелки на циферблате совпадают!"<<'\n';}}
system ("pause");
return 0;
}
spartacusgaming вне форума Ответить с цитированием
Старый 04.01.2015, 14:34   #18
isst
Пользователь
 
Регистрация: 02.01.2015
Сообщений: 85
По умолчанию

Цитата:
Сообщение от TinMan Посмотреть сообщение
Спасибо за перевод - я-то и так понял, но другим это может быть важно.

А хочешь? в смысле - хочешь "догнать"? ))
Слушай, Паркер, большинство народу тут хочет готовый код, чтобы сдать его все забыть. Если ты не такая - мы могли бы помочь тебе сделать все самой. Ты ответь, а пока я тогда начну..

Задача про совпадение стрелок стара, как мир. Нарисуй себе циферблат (12-часовой, говорим только о нем) на листочке и отметь все положения стрелок, когда они совпадают. Их будет 11. Первое в 12:00. Как узнать следующее? Для этого нужно решить уравнение.

Пусть t - это время (от 12:00), в которое стрелки снова встретились. Минутная стрелка проходит полный круг за 1 час. Значит, за время t она пройдет угол (считая в полных оборотах), равный t/60 (время считаем в минутах). Часовая стрелка проходит полный круг за 12 часов, то есть 12*60=720 минут. Значит, за время t она пройдет угол t/720. Приравниваем эти два числа и получаем уравнение для t

t/60 = t/720
12*t= t
11*t = 0
t = 0

Мы получили ответ t=0. Это означает, что в самый начальный момент времени (в 12:00) стрелки совпадают. Это правильно, но только это мы и так знали. Это совпадение будем называть нулевым, t(0)=0 (в скобках я пишу индекс). Как рассчитать другие совпадения?

Если ты последишь за часами с 12:00 до 1:00 (то есть в течение первого часа), ты увидишь, что стрелки ни разу не встретились. А встретятся они в начале второго часа, когда минутная, пройдя полный круг, догонит часовую. Это значит, что она пройдет на самом деле угол, больше полного круга. Но нас интересеут только часть этого пути ЗА полным кругом. Поэтому мы вычтем из полного угла один оборот:
t(1)/60 - 1
(напоминаю: в скобках я пишу индекс) И теперь, как и прежде, снова приравняем углы:
t(1)/60 - 1 = t(1)/720
И решим это уравнение:
12*t(1) - 720 = t(1)
11*t(1) = 720
t(1) = 720/11 = 65.454545454545454545454545454545.. . = 65.(45) = 60 + 5.(45)

То есть, стрелки встретятся через 1 час и 5 мин с секундами.

Чтобы найти второй момент встречи, можно либо решить уравнение:
t(2)/60 - 2 = t(2)/720
(потому что встреча происходит после двух полных оборотов минутной стрелки), либо просто заметить, что время между моментами встречи должно проходить одинаковое - в силу симметрии, ведь мы могли бы повернуть циферблат (без стрелок), чтобы первый момент встречи снова был на 12:00.

Таким образом, мы получаем следующую формулу:
t(i) = t(1) * i = 720/11 * i

Это - точные моменты встречи. Если мы подставим i=11 в эту формулу, то получим, что 11-ый момент встречи произойдет через 720 минут, что есть ровно 12 часов. То есть стрелки в 11-ый раз встретятся ровно через полсуток, снова на 12:00. Это вполне соответствует нашему опыту и служит проверкой на правильность.

Кул? ))

Теперь возвращаемся к условию задачи: нам дано текущее время T, нужно предсказать cколько пройдет до следующей встречи с точностью до минут. Для того, чтоб это сделать, надо сначала определить, сколько встреч уже произошло. Это можно сделать по формуле:
n = [T/t(1)]
- квадратные скабки означают целую часть.
Тут остается вопрос.. Как быть, если время T точно совпало с моментом какой-то встречи стрелок? Считать эту встречу "следующей" (то есть до нее 0 минут) - или считать, что она уже произошла, и следующая наступит через t(1)? Поскольку в условии это не уточнено, то предлагаю поступать вторым образом. Тогда вышеприведенную формулу не придется корректировать )).

Итак, мы знаем, что уже было n встреч. Значит, следующая встреча будет иметь номер n+1, и ее время можно рассчитать по той формуле как:
t(n+1) = 720/11*(n+1)
- тут первые скобки это индекс, а вторые - нет.

Ну вот, осталось только вычесть T из t(n+1) - и мы узнаем, сколько времени с момента T до следующей встречи. Это время будет в минутах, но только оно включает и дробную часть. Нас же спрашивают, сколько ПОЛНЫХ минут, так что нужно снова воспользоваться услугами целой части.

x = [720/11*(n+1) - T]
где
n = [T / (720/11)]

Или, полностью:

x = [720*([T/(720/11)]+1)/11 - T]

Понятно пока? Жду ответа.
Я хотел спросить, а если у меня одна стрелка делает оборот за 1 час, а вторая - аж за 1 сутки, то как изменится математическая постановка задачи?
isst вне форума Ответить с цитированием
Старый 04.01.2015, 17:18   #19
isst
Пользователь
 
Регистрация: 02.01.2015
Сообщений: 85
По умолчанию

Цитата:
Сообщение от isst Посмотреть сообщение
Я хотел спросить, а если у меня одна стрелка делает оборот за 1 час, а вторая - аж за 1 сутки, то как изменится математическая постановка задачи?
А-а, понял сам, спасибо
isst вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
коды стрелок Lapo4ka Общие вопросы C/C++ 9 16.04.2017 22:53
Проверка стрелок Ковалёв Александр Общие вопросы C/C++ 4 04.01.2011 09:01
Врашение стрелок ddeman666 Помощь студентам 3 16.05.2010 22:37
Коды стрелок (Delphi) VadEr Помощь студентам 6 13.06.2009 12:57
Borland C, перхват нажатий стрелок Arion Помощь студентам 3 30.04.2008 12:33