Даны действительные числа [latex]a, b[/latex], натуральное число [latex]n(b>a) [/latex]. Получить [latex](f_1+…+f_n)h[/latex], где
[latex]h=\frac{b-a}{n}[/latex], [latex]f_i=\frac{a+(i-\frac{1}{2})h}{1+(a+(i-\frac{1}{2})h)^{2}}[/latex]a | b | n | h | f | Комментарий |
5 | 7 | 0 | — | — | Введенное ‘n’ не натуральное |
17 | 10 | 15 | — | — | Первое введенное число больше второго |
47.421 | 57.421 | 5 | 2 | 1.912507e-01 | Пройден |
3 | 12 | 6 | 1.5 |
1.330323e+00
|
Пройден |
1 | 5 | 1 | 4 | 1.2 | Пройден |
2 | 14 | 2 | 6 | 1.694830e+00 | Пройден |
Код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <stdio.h> #include <math.h> int main() { double a,b,h,f; int n; scanf("%lf %lf %d",&a,&b,&n); if((n<=0)||(a==b))printf("Введенное 'n' не натуральное или введены два одинаковых числа\n"); else if (a>b)printf("Первое введеное число больше второго"); else { h=(b-a)/n; f=0; for(int i=1;i<=n;i++) { f+=(a+(i-0.5)*h)/(1+((a+(i-0.5)*h)*(a+(i-0.5)*h))); } printf("%le ",f*h); } 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 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { Scanner in=new Scanner(System.in); double a=in.nextDouble(); double b=in.nextDouble(); int n=in.nextInt(); if((n<=0)||(a==b))System.out.println("Введенное 'n' не натуральное или введены два одинаковых числа\n"); else if (a>b)System.out.println("Первое введеное число больше второго"); else { double h=(b-a)/n; double f=0; for(int i=1;i<=n;i++) { f+=(a+(i-0.5)*h)/(1+((a+(i-0.5)*h)*(a+(i-0.5)*h))); } System.out.println(f*h); } } } |
Дано [latex]a,b,n[/latex]. Если [latex]n<1[/latex] или [latex]a=b[/latex], то выведем ошибку. Если [latex]a>b[/latex], то выведем ошибку.
По формуле вычислим [latex]h=\frac{b-a}{n}[/latex] и с помощью цикла по формуле [latex]f_i=\frac{a+(i-\frac{1}{2})h)}{1+(a+(i-\frac{1}{2})h)^{2})}[/latex] вычислим сумму. Домножим сумму на [latex]h[/latex].
Код программы на С++ можно посмотреть тут
Код программы на Java можно посмотреть тут
1. В формуле для f_i (математической) проблема со скобками и в числителе и в знаменателе — сравните с условием задачи в Абрамове.
2. Значения суммы забыли домножить на h — ответ получился неверный, каким же образом тесты пройдены??? Или Вы просто то, что вывела программа записали в результат? Проверять нужно альтернативным способом — например, на калькуляторе или листочке или в google-калькуляторе.
3. Странное решение проверить только условие n==0 (ноль не подходит), а не написать, что меньшие или равные нулю n не подходят.
4. Почему первое слагаемое (a+(1-0.5)*h)/(1+pow((a+(1-0.5)*h),2)) выделено отдельно (создается дублирование кода)?
5. Вы не поставили метки (ключевые слова).
Исправил
— Поставьте отступы в программе в соответствии с вложенностью операторов. Посмотрите здесь как это делается.
— Поставьте в тексте пробелы после знаков препинания.
— Для возведения в квадрат нужно умножить значение само на себя. Функция pow() более применима для нецелых степеней.
— «Формула» это очень неудачное ключевое слово для статьи. Нужно выбрать что-то, лучшим образом характеризующее особенности Вашей статьи.
— Какой смысл в таком «1.2000000e+00» формате записи чисел?
1)Кажется,исправил.
2)Поставил
3)Исправил
4)Добавил
5)Я считаю,что ответы должны выводиться в одном и том же формате,для общности решения.
«Общность решения»? Вы имеете в виду формат вывода Вашей программы? Я говорю про тесты. Они пишутся ДО написания программы. Тесты строятся на базе простых примеров, которые можно посчитать, например, устно.
— Посмотрите, как ставятся отступы в условном операторе. Я уже давал ссылку. Это несложно.
— Исправил Вам орфографические ошибки и поставил пробелы после запятых. Постарайтесь это делать сами.
Засчитано, но…
Вы возводите в квадрат довольно громоздкое выражение и для этого повторно его вычисляете. Правильнее сохранить его в переменной: t = a+(i-0.5)*h, а потом уже t * t
Несколько небрежно оформлена программа:
if((n<=0)||(a==b))System нет пробелов, все визуально сливается, по хорошему объединение все в одну строку вообще не оправдано, т.к. получилась очень длинная и громоздкая строка
if (a>b)S... та же самая проблема — хотя один из пробелов есть
Образцы форматирования условных операторов можете увидеть здесь: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/if.html и http://blog.jooq.org/2012/01/18/if-else-coding-style-best-practices/. Заметьте, что там фигурные скобки расставлены в Java-стиле (это я не требую, как обязательный элемент, но было бы желательно и к такому стилю привыкнуть).
Ну и правильно советовал Игорь Евгеньевич: три раза повторяется громоздкое выражение a+(i-0.5)*h — почему бы не ввести переменную для него?