@CatalystXP
Человек

Оцените код. Как можно заменить goto?

Написал простую программу вычисления времени загрузки файла. Смущают инструкции goto. Чем их можно заменить? Они уместны?
//time_download.c вычисляет время загрузки файлов
#include<stdio.h>
#define bits 8/*количество битов в байте*/
#define PER_IN_SEC 60/*значение секунд в минуте*/
int main(void)
{
	int a, b;//цельночислительные переменные
	float size, time, speed;//вещественные переменные
	printf("Enter file size in megabyts and download speed in megabits:");
	scanf_s("%f %f", &size, &speed);//ввод значений "размер" и "скорость"
mark:while (size > 0.00&&speed>0.00)/*цикл проверки ввода. Метка mark для goto в 25 строке*/
	{
		size = size*bits;//преобразование мегабайт в мегабиты
		time = size / speed;//вычисление времени загрузки
		size = size / bits;//обратное преобразование мегабит в мегабайты
		if (time < 60.00)//проверка результата на временной диапазон
		{
			printf("File size %.2f megabytes will be loaded at speed"
				" %.2f megabits\nin sec behind %.2f seconds\n", size, speed, time);
			printf("Enter new data or press 0 for exit\n");
			scanf_s("%f", &size);//ввод нового значения
			while (size <=0)//проверка ввода
				goto check;//в случае неудачи, переход по метке check на 40 строку
			scanf_s("%f", &speed); goto mark;//в случае успеха, переход по метке(строка 11 на проверку ввода
		}
		else//если значение time больше 60 секунд
		{
			a = time / PER_IN_SEC;//вычисление количества минут
			b = (int)time%PER_IN_SEC;//преобразование float в int для деления по модулю
		}
		printf("File size %.2f megabytes will be loaded at speed"
			" %.2f megabits\nin sec behind %d minuts and %d seconds\n", size, speed, a, b);
		printf("Enter new data or press 0 for exit\n");
		scanf_s("%f", &size);//ввод новых значений
		while (size <= 0)//проверка ввода 
			goto check;//переход на 39 строчку для выхода
		scanf_s("%f", &speed); goto mark;//в случае успеха, переход на строку 11 для проверки значения speed
	}
	check:return 0;
}
  • Вопрос задан
  • 466 просмотров
Пригласить эксперта
Ответы на вопрос 3
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
while (size <=0)//проверка ввода
        goto check;//в случае неудачи, переход по метке check на 40 строку

это
if (size <= 0)
    break;


goto mark;

это просто continue; в первом случае и просто ничего во втором.
Ответ написан
Комментировать
GavriKos
@GavriKos
Вместо goto check можно сразу написать return 0.
Вместо mark вариантов несколько. Если правильно понял - можно весь остальной код цикла засунуть в else и все.

Попробуйте нарисовать блок-схему, может понятнее будет )
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Почитайте что-нибудь о структурном программировании.
Что бы лучше понять методы структурного программирования, просто запретите себе использовать goto. Вы быстро с ним освоитесь, когда будете пытаться придумать способ обойтись без goto.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы