Задача: Селекция. Селекционер вывел новый сорт зерновой культуры и снял с опытной делянки [latex]k[/latex] кг семян. Посеяв 1 кг семян, можно за сезон собрать [latex]p[/latex] кг семян. Через сколько лет селекционер сможет засеять новой культурой поле площадью [latex]s[/latex] га, если норма высева [latex]n[/latex] кг/га?
Тесты:
k | p | s | n | result |
1 | 1 | 1 | 1 | error |
1 | 2 | 3 | 4 | 2 |
3.5 | 11 | 56 | 3.77 | 1 |
34 | 55.4 | 109 | 31.456 | error |
Исходный код программы:
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 |
#include <stdio.h> #include <math.h> int main(void) { // Объявление переменных k,p,s,n типа float для хранения входных данных float k = 0; float p = 0; float s = 0; float n = 0; // Вывод приветствия printf("====================================\n"); printf("========== W E L C O M E ===========\n"); printf("= to the harvest estimation system =\n"); printf("====================================\n"); // Ввод пользователем значений переменных k,p,s,n с помощью scanf printf("please enter k:\n"); scanf("%f",&k); printf("please enter p:\n"); scanf("%f",&p); printf("please enter s:\n"); scanf("%f",&s); printf("please enter n:\n"); scanf("%f",&n); // Вывод исходных данных printf("------------------------------------\n"); printf("k= %f\n",k); printf("p= %f\n",p); printf("s= %f\n",s); printf("n= %f\n",n); printf("------------------------------------\n"); // Вычисление и вывод результата по формуле с предварительной проверкой значения p, // которое не должно равняться 1, так как находиться в формуле под логарифмом. if ( p == 1 ) { printf("wrong input data: p = 1\n"); } else { int result = 0; if ( k >= p ) { printf("! WARNING !, suspicious input data:output weight less or equal to the initial weight!\n"); } result = (int) log((n*s)/k)/log(p); // приводим к целому числу сезонов. if ( result < 1 ) { printf("! ERROR ! Growing time is shorter than one season!\n"); } else { printf("result is: %d\n",result); } } printf("====================================\n"); // Завершение программы return 0; } |
Версия кода на языке Java:
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 72 73 |
import java.util.*; import java.lang.*; import java.io.*; class LogApp { public static Float scanFloat( Scanner in ) { return ( ( in.hasNextFloat() ) ? in.nextFloat() : null ); } public static void main( String[] args ) { // Объявление переменных k,p,s,n типа float для хранения входных данных float k = 0; float p = 0; float s = 0; float n = 0; Scanner in = new Scanner(System.in); // Ввод пользователем значений переменных k,p,s,n с помощью scanf System.out.println( "please enter k:\n" ); k = scanFloat( in ); System.out.println( "please enter p:\n" ); p = scanFloat( in ); System.out.println( "please enter s:\n" ); s = scanFloat( in ); System.out.println( "please enter n:\n" ); n = scanFloat( in ); in.close(); // Вывод исходных данных System.out.printf("------------------------------------\n"); System.out.printf("k = %f\n",k); System.out.printf("p = %f\n",p); System.out.printf("s = %f\n",s); System.out.printf("n = %f\n",n); System.out.printf("------------------------------------\n"); // Вычисление и вывод результата по формуле с предварительной проверкой значения p, // которое не должно равняться 1, так как находиться в формуле под логарифмом. if ( p == 1 ) { System.out.printf("wrong input data: p = 1\n"); } else { int result = 0; if ( k >= p ) { System.out.printf("! WARNING !, suspicious input data:output weight less or equal to the initial weight!\n"); } result = (int) ( Math.log10( ( n * s ) / k ) / Math.log10( p ) ); // приводим к целому числу сезонов. if ( result < 1 ) { System.out.printf("! ERROR ! Growing time is shorter than one season!\n"); } else { System.out.printf("result is: %d\n", result); } } System.out.printf("====================================\n"); } } |
Ссылка:http://ideone.com/2TY3PH
Программы вычисляет результат по найденной формуле:
[latex]\frac{log(\frac{(n \times s)}{k})}{log(p)}[/latex]
Поскольку используется функция логарифма, необходимо включить заголовок math библиотеки математических функций.
Программа состоит из следующих частей:
- Объявление переменных k,p,s,n типа float для хранения входных данных
- Вывод приветствия
- Ввод пользователем значений переменных k,p,s,n с помощью scanf
- Вывод исходных данных
- Вычисление и вывод результата по формуле с предварительной проверкой значения p, которое не должно равняться 1, так как находиться в формуле под логарифмом.
- Завершение программы
Программа проверялась по таблице наборов входных данных. Некоторые наборы содержали неправильное значение p = 1. Для этих значений программа выдала предусмотренное сообщение об ошибке. Для правильны данных результат совпал с вычисленным вручную.
Пожалуйста, используйте laTex там, где нужны формулы.
Найдите кнопку для списков и не ставьте номера вручную — Вы сделали абзацы вместо списка.
Урожай нельзя собрать за 0.456 сезона — он ещё не созрел.
Уберите точку после «Ю» в названии
А еще задайте рубрику и ключевые слова (метки).
Понял, уже исправил. Ожидаю проверки.
Для дробей в laTeX нужно использовать специальную команду fraction (есть кнопочка с дробью в редакторе).
С нецелым количеством лет Вы так и не разобрались? Всё очень просто. Считается, что один раз в год (например, первого августа) собирают урожай. И никак иначе. Даже если Вам достаточно половины урожая, его нельзя собрать в феврале.
Максим, ну только представьте: комбайнеры зимой под снегом наивно пытаются найти половину урожая! Это как школьные полтора землекопа! Так не бывает. Исправьте это в таблице тестов, пожалуйста.
Тесты исправлены в соответствии с новым кодом программы. Теперь программа выдает только целое число лет ( обрезает результат )- к примеру : 1,70015… — вместо него выдаёт — 1.
Засчитана Java версия.
Единственное замечание: С++ версия и Java выдают разные ответы на тесте
1 2 3 4 : Java — ответ 3, а С++ — как указано в таблице — ответ 2.
А все потому, что эквивалентом кода
будет код
т.е. с внешними скобками — и вроде этот обновленный вариант более логичный (впрочем не хочу углубляться в исходную прошлогоднюю задачу дальше).
Еще небольшое замечание — выбирайте язык Java для инструмента Crayon (карандаш).
Посмотрите в моем комментарии — если подвести курсор к верхней строке — будет язык Java (в коде тега pre можно указать lang=»java» ).