Задача. Русские неметрические единицы длинны: 1 верста = 500 саженей; 1 сажень = 3 аршина; 1 аршин = 16 вершков; 1 вершок = 44,45 мм. Длинна некоторого отрезка составляет P метров. Перевести её в русскую неметрическую систему.
Тесты:
P(м) | Результат | Комментарий |
0 | Длинна отрезка P равна нулю. | Пройден |
1 | Длинна отрезка P — 1 аршин 6 вершков. | Пройден |
99 | Длинна отрезка P — 46 саженей 1 аршин 3 вершка. | Пройден |
345999 | Длинна отрезка P — 324 вёрст 166 саженей 2 аршина 4 вершка. | Пройден |
-9999 | Не имеет смысла. | Пройден |
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#include <stdio.h> int main(void) { float p, v1, x1, y1, z1; scanf("%f", &p); int v, x, y, z; v1=p/500/3/16/0.04445; //Переводим наш отрезок P из метров в верста. v=(int)v1; //Записываем переменную обозначающую отрезок P в верстах в виде целого числа. x1=(v1-v)*500; //Вычисляем дробную часть от предыдущей величины(верста) и переводим её в сажени. x=(int)x1; //Опять же записываем переменную в виде целого числа. y1=(x1-x)*3; //Вычисляем дробную часть от предыдущей величины(сажени) и переводим её в аршины. y=(int)y1; //Опять же записываем переменную в виде целого числа. z1=(y1-y)*16; //Вычисляем дробную часть от предыдущей величины(аршины) и переводим её в вершки. z=(int)z1; //И вновь записываем переменную в виде целого числа. if(p > 0) printf("Длинна отрезка P -"); else if(p==0) printf("Длинна отрезка P равна нулю"); else printf("Не имеет смысла"); if(v==1) printf(" %d верста", v); else if(v==0) ; else if(v>=2,v<=4) printf(" %d версты", v); else if(v>=5) printf(" %d вёрст", v); if(x==1) printf(" %d сажень", x); else if(x==0) ; else if(x>=2,x<=4) printf(" %d сажени", x); else if(x>=5) printf(" %d саженей", x); if(y==1) printf(" %d аршин", y); else if(y==0) ; else if(y>=2,y<=4) printf(" %d аршина", y); else if(y>=5) printf(" %d аршинов", y); if(z==1) printf(" %d вершок", z); else if(z==0) ; else if(z>=2,z<=4) printf(" %d вершка", z); else if(z>=5) printf(" %d вершков", z); printf("."); return 0; //Это очень важный момент. } |
Идея такой записи пришла мне в голову еще недели 2-3 назад. Я отлично понимаю что есть способы записать все это в более простом виде но…работает(хоть и не очень шустро) и это главное.
Из задачи ясно, что нам нужно перевести некоторый отрезок P из метров в русскую неметрическую систему измерения, в нашем случае как я понял мы должны использовать исключительно 4 меры длинны: верста, сажени, аршины и вершки. Я записал 5 переменных в тип «float» для 5-ти единиц измерения, затем для 4-х из них записал еще 4 переменные в тип «int«, обозначающие соответствующие им, но в виде целого числа переменные. Сделал я это для того чтобы все соответствующие переменные записать в виде целых чисел, а так же для того чтобы выделить разность целого числа и числа с плавающей точкой и перевести её в меньшую единицу измерения, затем сделав тоже самое с последующими переменными до тех пор пока не дойду до наименьшей единицы измерения.
— Добавьте метки (ключевые слова). Рубрику я уже сам поставил.
— Сделайте пожалуйста ссылку на Вашу программу в ideOne, чтобы читатель (и я!) могли с ней поэкспериментировать.
— Строки 7-14 сдвинуты вправо не по правилам. Они должны начинаться с одной табуляции. Но я понимаю, что Вы хотели сказать и строки 8, 10, 12, 14 можно оставить как есть (хоть это не привычно и сбивает). А остальные нужно поставить как положено
— Сдвиг для демонстрации структуры вложенных операторов обязателен. Чтобы разобраться, что у Вас происходит я был вынужден его сделать сам. И теперь все читатели тоже? Нет, так нельзя! Расставьте везде сдвиги.
— 1 сажень, 2-4 сажени, 5-9 саженей. С остальными похожая картина.
====
P.S. Вы обратили внимание на то, что задача из раздела «Линейные вычисления»? Она может решаться в одну (пусть и длинную) строчку. Я не против тех усложнений, которые Вы в неё вносите. Все они вполне разумны. Но как следствие к решению предъявляются требования раздела «Программы с ветвлением». Поэтому так много замечаний.
Вам следует выбрать как поступить. Или довести до завершения начатую работу по ветвлениям, либо отказаться от них и сделать первое простенькое задание. Мне больше нравится идея продолжения работы. Но это труднее, чем просто выбросить все if-else.
Сделал.
– Сделайте пожалуйста ссылку на Вашу программу в ideOne, чтобы читатель (и я!) могли с ней поэкспериментировать.
— Вы тесты придумывали и считали вручную или просто выдаёте результаты работы программы за тесты? Что можно таким образом проверить?
У вас в тестах 1 метр это два вершка, а 300 километров это 32 версты. Вас ничего не смущает?
Перепутал сантиметры с миллиметрами =/, впредь буду внимательнее.
Уже исправил, ссылку тоже добавил.
Точно! Что перепутал, это не беда. А вот то, что на готовых тестах не проверил программу — это плохо.
Однако теперь зачтено, молодец!
P.S. Решил все же проверить. Набрал в Google «3 версты 14 саженей 2 аршина 7 вершков» получил 3232 метра. Оказалось Вы в 14-й строке вершки не округляете к ближайшему целому функцией round(), а просто отбрасываете дробную часть.