С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
11 / 11 / 0
Регистрация: 20.11.2012
Сообщений: 150

Перевод часов в минуты

14.09.2015, 21:28. Показов 6711. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Привожу само задание.

Написать программу, производящую перевод часов и минут в минуты. Входные данные вводятся в виде числа с плавающей точкой, где целая часть – количество часов, а дробная – количество минут. Ниже приведен рекомендуемый вид экрана.

Введите время (чч.мм) : 12.45
12 часов 45 минут это 765 минут

Сам работающий код у меня есть, но еще необходимо сделать проверку введенных данных. Тоесть если вводишь символ, то программа должна "ругаться на него" и предложить ввести данные еще раз.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <conio.h>
void main()
{
    float time, fractional, integer;
    int x;
    AP: printf ("Please, enter time (hh.mm): ");
    scanf("%f", &time);
    fractional = modf(time, &integer);
    if (fractional <= 0) printf("invalid number! Try Again? (1 - Yes 2 - No) \n");
    else printf("%.fh %.fm it's %.f minutes \n", integer, fractional * 100, integer * 60 + fractional * 100);
}
проверку правильности я реализовал через "if (fractional <= 0) printf("invalid number! Try Again? (1 - Yes 2 - No) \n");". Но думаю что это не совсем правильно. еще есть вопрос как реализовать возможность ввести данные еще раз, в случае правильного и неправильного ввода. тоесть когда высвечивается результат программа должна спросить, "хотите попробовать еще раз?" или вы хотите выйти" .
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.09.2015, 21:28
Ответы с готовыми решениями:

Перевод часов в минуты
Ребят нужна помощь! Есть програ которая переводит время из часов в минуты. Ограничение по цифрам дал. А вот как ограничить по символам не...

Перевод часов в минуты и секунды
Тут проблемка небольшая... Написал код, вроде должен считать, но показывает всегда одни значения - 60 и 3600 Есть решение?

Перевод часов в минуты, секунды, миллисекунды
Написать программу, которая в зависимости от выбранного номера и количества часов N переводила их в минуты, секунды, миллисекунды. ...

20
193 / 100 / 131
Регистрация: 23.06.2015
Сообщений: 249
16.09.2015, 11:00
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    int q, h, m, k;
    l1:
    printf("Please, enter time (hh.mm): ");
    q = scanf("%d.%d", &h, &m);
    if(q != 2)
    {
        printf("Invalid number! Try Again? (1 - Yes 2 - No)\n");
        fseek(stdin, 0, SEEK_END); //очистить буфер ввода
        
        q = scanf("%d", &k);
        if(q == 1 && k == 1) goto l1; else return 0;
    }
    
    printf("%dh %dm it's %d minutes \n", h, m, h * 60 + m);
    
    return 0;
}
1
 Аватар для lightfrag
1 / 1 / 2
Регистрация: 19.07.2013
Сообщений: 36
16.09.2015, 13:43
Цитата Сообщение от Cuellius Посмотреть сообщение
fseek(stdin, 0, SEEK_END);
Почему fflush(stdin)? Не нашел определения fflush в stdio.h, хотя возможно оно так же
0
11 / 11 / 0
Регистрация: 20.11.2012
Сообщений: 150
16.09.2015, 17:40  [ТС]
спасибо, вот только не очень понятно "if(q != 2)" , почему именно так?
0
193 / 100 / 131
Регистрация: 23.06.2015
Сообщений: 249
16.09.2015, 17:55
Цитата Сообщение от Elserjo Посмотреть сообщение
спасибо, вот только не очень понятно "if(q != 2)" , почему именно так?
Функция scanf возвращает число успешно считанных аргументов.
0
 Аватар для CoderHuligan
1743 / 1008 / 257
Регистрация: 30.06.2015
Сообщений: 5,108
Записей в блоге: 56
16.09.2015, 18:31
Прошу тех, кто недолюбливает goto не судить строго. Код проверяет:
1) диапазон вводимых чисел;
2) формат ввода;
3) можно ввести только числа или запятую.
Правда не избавился от повторного вывода предупреждения, может кто подскажет лучший вариант.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <locale.h>
#define N 6
 int main(void)
{
setlocale(LC_ALL, "RU");
    char a[N]={0},c,b[]="0123456789, ";
    int fract, min,i,j;
    float myTime=0.0;
    float  pr;
start:  
     printf ("Ведите время: (чч,мм):\n ");
     fgets(a,N,stdin);  
            for(i=0;a[i]!='\0';i++){
         for(j=0;j<13;j++){
          if(a[i]==b[j])break;
              if(j==12){printf("Ошибка ввода!\n");
              goto start;
                       }        
                                   }
                                           }
      pr=atof(a);
    if(((int)truncf(pr)) >23 || ((int)(ceilf(( pr-truncf(pr))*100))) >59){printf("Ошибка ввода!\n"); goto start;}
      fract = (int)truncf(pr);
      min = fract*60+(int)ceilf(((pr-fract)*100)); 
      printf("%d\n",min);
      return 0;
}
0
11 / 11 / 0
Регистрация: 20.11.2012
Сообщений: 150
16.09.2015, 18:32  [ТС]
еще бы хотелось увидеть вариант как раз без goto
0
 Аватар для CoderHuligan
1743 / 1008 / 257
Регистрация: 30.06.2015
Сообщений: 5,108
Записей в блоге: 56
17.09.2015, 11:52
Цитата Сообщение от Elserjo Посмотреть сообщение
еще бы хотелось увидеть вариант как раз без goto
Без него придёться извращаться, а я этого очень не люблю. Пусть те, кто его не любит напишут без него. Посмотрим и сравним.

Добавлено через 8 минут
Если в языке есть такой оператор, то почему его нельзя использовать, тем более. что в книге Кернигана и Ритчи рекомендуется его умеренное использование.

Добавлено через 1 час 28 минут
С 26 строки у меня вылазит баг. Короче говоря, что касается проверки работает, а насчёт перевода в минуты, потом допилю...

Добавлено через 15 часов 9 минут
Вот, допилил
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <locale.h>
#include <conio.h>
#define N 6
 int main(void)
{
setlocale(LC_ALL, "RU");
    char a[N]={0},b[]="0123456789, ";
    int i,j,min;
    float  fract,pr;
start:
 printf ("Ведите время: (чч,мм):\n ");
 fgets(a,N,stdin); 
_clrscr(); 
       for(i=0;a[i]!='\0';i++){
        for(j=0;j<13;j++){
          if(a[i]==b[j])break;
              if(j==12){printf("Ошибка ввода!\n");
              goto start;
                       }        
                                   }
                                           }
    _clrscr();  
      pr=atof(a);
     fract = truncf(pr);
    if((int)fract >23 || (roundf(( pr-fract)*100)) >59){printf("Ошибка ввода!\n"); goto start;}
       min =roundf(fract*60)+roundf((pr-fract)*100);
      printf("%d\n",min);
      return 0;
}
Добавлено через 25 минут
Добавлю, что если у кого функция _clrscr(); не работает, то нужно исключить знак _ из имени функции: clrscr();
Я писал в Pelle поэтому так.
1
8 / 8 / 2
Регистрация: 23.12.2013
Сообщений: 101
17.09.2015, 12:41
Цитата Сообщение от CoderHuligan Посмотреть сообщение
start:
printf ("Ведите время: (чч,мм):\n ");
fgets(a,N,stdin);
_clrscr();
for(i=0;a[i]!='\0';i++){
for(j=0;j<13;j++){
if(a[i]==b[j])break;
if(j==12){printf("Ошибка ввода!\n");
goto start;
}
}

while(1)
{
printf ("Ведите время: (чч,мм):\n ");
fgets(a,N,stdin);
_clrscr();
for(i=0;a[i]!='\0';i++){
for(j=0;j<13;j++){
if(a[i]==b[j])break;
if(j==12){printf("Ошибка ввода!\n");
{
continue;
}
else
{
break;
}
}
}
}
Такая замена goto не прокатит?
0
 Аватар для CoderHuligan
1743 / 1008 / 257
Регистрация: 30.06.2015
Сообщений: 5,108
Записей в блоге: 56
17.09.2015, 13:40
Цитата Сообщение от Aneonfas Посмотреть сообщение
Такая замена goto не прокатит?
У меня не компилирует.
Да, и кстати строку 28(проверяет диапазон) тоже надо обработать, так как там тоже goto. Но это по желанию, конечно.
0
11 / 11 / 0
Регистрация: 20.11.2012
Сообщений: 150
17.09.2015, 21:19  [ТС]
Всем спасибо за ответы еще раз. Сейчас ради интереса на нашем форуме нашел

"После того как вводите вставьте например конструкцию вида
if(isdigit(x)) - если число
if(!isdigit(x)) - если НЕ число"

но почему-то не могу заставить работать в моем коде. вываливается со следующей ошибкой:
"Program: ....exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\i sctype.c
Line: 56

Expression: c >= -1 && c <= 255

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)"

а вот и мой код:

C
1
2
3
4
5
6
7
8
9
10
11
12
printf("Please, enter time (hh.mm): ");
                scanf("%f" , &time);
                if (!isdigit(time))
                {
                printf("Invalid Number!\n");
                }
                else
                {
                    fractional = modf(time, &integer);
                    printf("%.fh %.fm it's %.f minutes \n", integer, fractional * 100, integer * 60 + fractional * 100);
                }
            } while (time <= 0 || time > 24 ); break;
Реально ли его заставить работать?
0
 Аватар для CoderHuligan
1743 / 1008 / 257
Регистрация: 30.06.2015
Сообщений: 5,108
Записей в блоге: 56
17.09.2015, 21:58
Цитата Сообщение от Elserjo Посмотреть сообщение
Реально ли его заставить работать?
Надо во первых подключить заголовочный файл <ctype.h>, чтобы эта функция заработала.
Во вторых, эта функция принимает тип int, а переменная time имеет тип float.
0
11 / 11 / 0
Регистрация: 20.11.2012
Сообщений: 150
01.10.2015, 18:53  [ТС]
имеется очередной вопрос.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <ctype.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
 
int main()
{
    double time, fractional, integer;
    for (;;)
    {
        printf("\nPlease, enter time (hh.mm): ");
        if (scanf_s("%lf", &time))
        {
            if (time <= 0 || time > 23.59)
            {
                printf("Invalid Number!");
 
            }
            else
            {
                fractional = modf(time, &integer);
                printf("%.lf h %.lf m it's %.lf minutes \n", integer, fractional * 100, integer * 60 + fractional * 100);
            }
        }
        else
        {
            printf("You Enter Letters!");
            break;
        }
    }
 
    _getch();
    return 0;
}
возможно ли в данном коде сделать запрет на ввод более двух чисел после запятой? Тоесть чтобы можно было ввести данные только в строгом формате "ЧЧ.ММ".
0
 Аватар для CoderHuligan
1743 / 1008 / 257
Регистрация: 30.06.2015
Сообщений: 5,108
Записей в блоге: 56
02.10.2015, 13:48
Цитата Сообщение от Elserjo Посмотреть сообщение
имеется очередной вопрос.
Ввожу вместо (например) 23.59 такое число: 23.70 - никаких ошибок...
0
11 / 11 / 0
Регистрация: 20.11.2012
Сообщений: 150
02.10.2015, 15:27  [ТС]
хотелось бы сделать так, что в случае ввода данных не по формату, программа предупредила об этом. тоесть вводим, например, 23.700, программа предупреждает что формат не правильный.
0
 Аватар для CoderHuligan
1743 / 1008 / 257
Регистрация: 30.06.2015
Сообщений: 5,108
Записей в блоге: 56
02.10.2015, 15:47
Цитата Сообщение от Elserjo Посмотреть сообщение
тоесть вводим, например, 23.700, программа предупреждает что формат не правильный.
Это понятно.
У тебя код не проверяет максимум минут или часов, а только проверяет само дробное число, что не есть правильно, я думаю. Трудно сделать проверку чисто на преобразованиях дробного числа. Особенно преобразование дробной части, когда не знаешь, какой длины оно будет при вводе. Короче говоря - большой геморр. Не проще ли вводить цифры минут и часов в виде строки, а потом её тупо парсить? Затем перевод в double и вычисление количества минут.
0
11 / 11 / 0
Регистрация: 20.11.2012
Сообщений: 150
02.10.2015, 19:16  [ТС]
так ведь char в double нельзя перевести.

Добавлено через 36 минут
так, сейчас имею
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <string.h>
int main()
{
    char str1[10];
    printf("\nPlease, enter time (hh.mm): ");
    scanf("%s", &str1);
    int n = strlen(str1);
    if (n > 5) printf("Error");
    return 0;
}
больше 5 символов вводить не получится. но как дальше вести преобразования?
хотя, например, можно ввести 1.235
0
 Аватар для CoderHuligan
1743 / 1008 / 257
Регистрация: 30.06.2015
Сообщений: 5,108
Записей в блоге: 56
03.10.2015, 15:00
Цитата Сообщение от Elserjo Посмотреть сообщение
так ведь char в double нельзя перевести.
Почему нельзя? Всё можно. Есть функции для этого: atof или ещё лучше: strtod
1
11 / 11 / 0
Регистрация: 20.11.2012
Сообщений: 150
03.10.2015, 15:29  [ТС]
с этим вроде разобрался. только я начал делать наоборот. я хочу сначала перевести в char, посчитать количество символов у целого числа и его дробной части и дальше уже использовать операторы условия.

для вычисления длины строки я использую strlen, вот только он нули не считает. поэтому если ввести 0001.22, то программа начнет выполняться.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <string.h>
int main(void)
{
    double time, fractional, integer;
    char str[10];
    printf("Please, enter time (hh.mm): ");
    scanf_s("%lf", &time);
    fractional = modf(time, &integer);
   _gcvt (integer, 6, str);
    int n = strlen(str);
    printf("%d\n", n);
    if (n >= 3)printf("Eroor");
    else
    printf("%.lf h %.lf m it's %.lf minutes \n", integer, fractional * 100, integer * 60 + fractional * 100);
    return 0;
    }
0
 Аватар для CoderHuligan
1743 / 1008 / 257
Регистрация: 30.06.2015
Сообщений: 5,108
Записей в блоге: 56
03.10.2015, 16:17
Цитата Сообщение от Elserjo Посмотреть сообщение
для вычисления длины строки я использую strlen
Если использовать для ввода функцию fgets, то ненужно использовать strlen, так как она может обрабатывать количество введённых символов и попросту обрубит то, что превышает аргумент количества.
Вот код(до вычисления количества минут), который может принимать либо запятую, либо точку, и не позволяет вводить вне формата чч.мм. То есть нельзя ввести 3.45, а нужно 03.45, нельзя ввести 03.4, а правильно 03.04. Невозможно так: 03.333 и т.д.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <locale.h>
#include <math.h>
#include <conio.h>
#include <string.h>
 int main(void)
{
setlocale(LC_ALL, "RU");
 char a[6],b[]="0123456789,. ";
    int i,t1,t,j,er,k;
    //k - где находится точка или запятая
    //t - флаг наличия точки или запятой
    //t1- количество точек или запятых
start:
    printf("\nPlease, enter time (hh.mm): ");
    er=t=t1=k=0;
   fgets(a,6,stdin);
        _clrscr(); 
       for(i=0;a[i]!='\0';i++){
        if(a[i]=='.' || a[i]==','){t=1;t1++;k=i;}
       for(j=0;j<14;j++){
          if(a[i]==b[j])break;
          if(j==13){printf("Ошибка ввода!\n");
                                                              goto start;
                       }        
                                 }
                                      }
        if((t==0 || t1>1) || (k!=2)){printf("Ошибка ввода!\n");
                                                          goto start;
                    }
    _clrscr();
      return 0;
}
goto можно убрать, главное принцип.

Добавлено через 16 минут
Да, и ещё одно уточнение. 9 строчку
C
1
char a[6],b[]="0123456789,. ";
лучше заменить на:
C
1
char a[6],b[]="0123456789,.\0";
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.10.2015, 16:17
Помогаю со студенческими работами здесь

Перевести время: из дней в часы, из часов в минуты, из минут в секунды
Напишите программу, которая переводит время:из дней в часы, из часов в минуты, из минут в секунды. Вот что я написал, но компилятор...

Перевод числа в часы, минуты и секунды
Помогите пожалуйста написать программу, с использованием оператора if, ввода целого числа и перевода его в часы, минуты и секунды....

Перевод величин из радиан в градусы, минуты, секунды
Когда вводим 1 радиан, должно быть 57 градусов, 17 минут, 45 секунд. Помогите исправить ошибки. #include &lt;stdio.h&gt; #include...

Перевод часов в минуты
Здравствуйте. Надо вычислить длительность телефонного звонка, если известно время начала и время окончания. Время начала и конца у меня в...

Перевод часов в минуты
Поле first - целое положительное число часы. Поле second - целое положительное число минуты. Реализовать метод minutes() - приведение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru