Задать вопрос
Niks1982
@Niks1982
Атипичный юрист

Корректен ли данный код, возможна ли оптимизация?

Доброго времени суток. В порядке изучения Си для самых-самых маленьких гуманитариев набросал калькулятор по НДС (выделение/начисление). Работает. Вот он
spoiler

#include <stdio.h>
#include <unistd.h>

int main()
{
	int chng, valVAT; 
	double sumInVAT, sumNoVAT, sumVAT;
	while(1)
	{
		printf ("Введите ставку НДС (10, 18 или 20) либо 0 для выхода из программы: ");
		scanf ("%d", &valVAT);
		if ((valVAT == 10) || (valVAT == 18) || (valVAT == 20))
		{
			while(1)
			{
				printf ("Выделить НДС: введите 1\nНачислить НДС: введите 2\n");
                                printf ("Выход из программы: введите 0\nВведите номер операции: ");
				scanf ("%d", &chng);
				if(chng == 1)
				{
					printf ("Введите сумму, из которой необходимо выделить НДС: ");
					scanf ("%lf", &sumInVAT);
					sumVAT = sumInVAT / (100 + valVAT) * valVAT;
					sumNoVAT = sumInVAT-sumVAT;
					printf ("НДС в том числе составляет: %.2lf\nСумма без НДС: %.2lf\n", sumVAT, sumNoVAT);
					printf ("Всего доброго!\n");
	        		return 0;
				}
				else if(chng == 2)
				{
					printf ("Введите сумму, на которую необходимо начислить НДС: ");
					scanf ("%lf", &sumNoVAT);
					sumVAT = sumNoVAT * valVAT / 100;
					sumInVAT = sumNoVAT + sumVAT;
					printf ("НДС к начислению составляет: %.2lf\nСумма с НДС: %.2lf\n", sumVAT, sumInVAT);
					printf ("Всего доброго!\n");
					return 0;
				}
				else if(chng == 0)
				{
					printf ("Всего доброго!\n");
					return 0;
				}
				else
				{
					printf ("\nОШИБКА! Выберите допустимое значение операции.\n\n");
					sleep(1);
					continue;
				}
			}
		}
		if(valVAT == 0)
		{
			printf ("Всего доброго!\n");
			return 0;	
		}
		if ((valVAT != 0) || (valVAT != 10) || (valVAT != 18) || (valVAT != 20))
		{
			printf("\nОШИБКА! Укажите допустимую ставку налога.\n\n");
			sleep(1);
			continue;
		}
	}
	return 0;
}


Хотел бы услышать мнение по корректности примененных функций и операторов (в частности continue), оформлению кода. В идеале - услышать предложения по оптимизации. Всем откликнувшимся: спасибо!
  • Вопрос задан
  • 126 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
В целом неплохо, оптимизировать тут нечего, ибо программа тривиальная и работает так быстро как это только возможно.

По коду есть комментарии:
1)
if ((valVAT == 10) || (valVAT == 18) || (valVAT == 20)) {
...


Тут у вас один большой мега-if в котором что-то делается. Гораздо проще для понимания и визуально читабельнее, если делать "ранний выход". Вместо if(a) { много кода } стоит писать:
if (!a) {
  continue; // или return; если это в функции.
}
// много кода.


У вас стоит сначала проверить, что valVAT == 0 и выйти из цикла через break в этом случае. Потом проверить, что valVat != 10 && valVAT != 18 && valVAT != 20 и вывести сообщение об ошибке и сделать continue. Дальше уже идет тело цикла с вычислениями.

2) Вместо if(chng == 1) {} else if (chng == 2) {}... стоит использовать конструкцию
switch (chng) {
case 0:
  // код
  break;
case 1:
  // код
  break;
case 2:
  // код
  break;
default:
  // сообщение об ошибке
  continue;
}


3)
sleep(1) после вывода сообщения об ошибке, на мой взгляд не нужен. Зачем это? Заставить пользователя прочитать сообщение об ошибке?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы