Проверьте программу на наличие плохого кода - C (СИ)
Формулировка задачи:
Добрый день. Проверьте программу,(может быть программы, которые я буду в дальнейшем выкладывать) на наличие плохого тона в программировании(говнокода). Я понимаю, что одну задачу можно решить разными способами.
Я сейчас учу программирование для себя. Сам уже несколько лет работаю системным администратором. По работе поднимал несколько сайтов на разных движках, иногда нужны были кое-какие корректировки в коде, я их делал. Так-же пишу скрипты на баше. Хотелось бы в будущем работать именно программистом, сейчас начал усиленно учить Си, как основу для будущего.
Делаю все чисто для себя самого, проверить меня некому, а в книгах, ответы даны не ко всем задачам. Буду благодарен за помощь, или корректировки.
Итак первая задача. из книги Дейтла № 3.17.
Задача
Из за высокой цены на бензин, водители интерессуются пробегом своих автомобилей. Некий водитель отследил несколько заправон своего автомобиля, записывая пройденное расстояние в милях и объем каждой заправки в галлонах. Разработайте программу для ввода пройденного расстояния в милях и объема каждой заправки в галлонах. Программа должна вычислять и отображать на экране кол-во пройденных миль на галлон, для каждой заправки автомобиля. После обработкти всей входной информации должно вычисляться и выводиться общая информация, об милях, литрах и расходе топлива, милей на галон по всем заправкам.
Единственное, я использовал литры и километры. Но тут не суть.
Программа полностью работающая, проверьте пожалуйста, если можно сделать ее как то по другому.
Спасибо.
#include <stdio.h>
int main()
{
int zapravka, put, vsegokm, vsegotop, i;
float rashod, rashodtotal, rashodarif;
vsegotop = 0, vsegokm = 0, rashodtotal = 0, i = 0;
while (zapravka != -1){
printf("Vvedite koli4estvo zapravlennonho d litrah(-1 exit)\n");
scanf ("%d", &zapravka);
if (zapravka != -1){
printf("Vvedite rasstoyanie v kilimetrah\n");
scanf ("%d", &put);
rashod = (float) put / zapravka;
vsegokm = vsegokm + put;
vsegotop = vsegotop + zapravka;
printf("rashod topliva km-rov na 1 litr = %f\n", rashod);
rashodtotal = rashod + rashodtotal;
i++;
}
}
printf("Vsego proydeno %d\n",vsegokm);
printf("Vsego topliva potracheno %d\n",vsegotop);
rashodarif = rashodtotal/i;
printf("srednii rashod topliva %f\n",rashodarif);
return 0;
}Решение задачи: «Проверьте программу на наличие плохого кода»
textual
Листинг программы
#include <stdio.h>
int main ()
{
int x=0, y=0, z=0, m=0, n=0;
while ((m<=0) || (n<=0) || (x<=0) || (y<=0) || (z<=0))
{
printf("enter door size M*N, \n");
scanf ("%d%d", &m, &n);
printf ("enter box size X*Y*Z\n");
scanf ("%d%d%d", &x, &y, &z);
if (m<=0 || n<=0 || x<=0 || y<=0 || z<=0)
{
printf("Reentr door or box size\n");
}
}
if ((y>m && x>n) || (y>m && z>n) || (z>n && x>m) || (x>m && y>n) || (z>n &&y>m) || (z>m && x>n))
{
printf ("BOX does not pass\n");
}
else
{
printf ("BOX passes\n");
}
return 0;
}
Объяснение кода листинга программы
- В начале программы объявляются переменные
x,y,z,m,nтипаintи инициализируются значением 0. - Затем программа входит в цикл while, который будет выполняться до тех пор, пока любой из следующих условий истинно:
mменьше или равно 0,nменьше или равно 0,xменьше или равно 0,yменьше или равно 0,zменьше или равно 0. - Внутри цикла программа запрашивает у пользователя ввод размеров двери
M*Nи размеров коробкиX*Y*Z, используя функциюscanf. - Затем программа проверяет, выполняется ли хотя бы одно из условий, указанных в цикле while. Если это так, программа выводит сообщение
Reentr door or box sizeи цикл продолжается. - Если все условия выполняются, программа проверяет, проходит ли коробка через дверь, сравнивая
yиm,yиz,zиm,xиm,xиy,zиy. Если какое-либо из этих сравнений истинно, программа выводит сообщениеBOX does not pass. В противном случае программа выводит сообщениеBOX passes. - В конце программы возвращается 0, что означает успешное выполнение.