
C/C++
Программа на СИ. Циклы с постусловием и предусловием
Напишите программу на языке Си для вычисления значений функций на всем диапазоне изменения аргумента с заданным шагом. Предусмотрите ввод всех исходных данных с клавиатуры


#include <stdio.h>
#include <math.h>
#define DEBUG
int main()
{
double a,x,dx;
double y,b,P = 1.0,S = 0.0;
char vvod;
int k = 0;
printf("Чтобы ввести все исходные данные с клавиатуры, введите \'k\': ");
scanf("%c", &vvod); /* для visual studio scanf_s */
if(vvod == 'k' || vvod == 'K')
{
printf("Введите a: ");
scanf("%lf", &a);
do
{
printf("Введите x (от -1.5 до 0.5): ");
scanf("%lf", &x);
} while(x < -1.5 || x > 0.5);
printf("Введите dx: ");
scanf("%lf", &dx);
}
else
{
a = 2.17;
dx = 0.1;
x = -1.5;
}
while(x >= -1.5 && x <= 0.5)
{
if(x >= 0.)
{
double kor = a*x + b*x;
if(kor < 0.0)
{
#ifdef DEBUG
printf("%d\n", __LINE__);
#endif /* DEBUG */
perror("Отрицательное подкоренное значение. \n");
return 1;
}
double del = a + x*x;
if(del == 0.0)
{
#ifdef DEBUG
printf("%d\n", __LINE__);
#endif /* DEBUG */
perror("Делить на ноль нельзя. \n");
return 1;
}
y = sqrt(kor) / del;
}
else /* x < 0. */
{
double f = fabs(b - x*x);
double l = a + x;
if(l <= 0.0)
{
#ifdef DEBUG
printf("%d\n", __LINE__);
#endif /* DEBUG */
perror("Неверное значение для логорифма. \n");
return 1;
}
double l2 = log(l);
if(l2 < 0.0)
{
#ifdef DEBUG
printf("%d\n", __LINE__);
#endif /* DEBUG */
perror("Неверное подкоренное значние. \n");
return 1;
}
if(a < 0.0)
{
#ifdef DEBUG
printf("%d\n", __LINE__);
#endif /* DEBUG */
perror("Неверное подкоренное значение. \n");
return 1;
}
double del2 = x + sqrt(a);
if(del2 == 0.0)
{
#ifdef DEBUG
printf("%d\n", __LINE__);
#endif /* DEBUG */
perror("Делить на ноль нельзя. \n");
return 1;
}
y = sqrt(f*l2) / del2;
}
if(y >= 0.0)
{
k++;
P *= y;
}
S += y;
b = 2.*x + a*a;
/* вывод значений */
printf("x: %lf, y: %lf, k: %d, P: %lf, S: %lf\n",x,y,k,P,S);
/* шаг цикла */
x += dx;
x = round(x * 10) / 10.0; /* округляем из-за неточности double */
}
return 0;
}
/* если не вводить вручную, возникает ошиба,
* если ввести a = 7, x = -1.5, dx = 0.1,
* получится нормальный вывод на всём промежутке
* функции.
*/
#include <math.h>
#define DEBUG
int main()
{
double a,x,dx;
double y,b,P = 1.0,S = 0.0;
char vvod;
int k = 0;
printf("Чтобы ввести все исходные данные с клавиатуры, введите \'k\': ");
scanf("%c", &vvod); /* для visual studio scanf_s */
if(vvod == 'k' || vvod == 'K')
{
printf("Введите a: ");
scanf("%lf", &a);
do
{
printf("Введите x (от -1.5 до 0.5): ");
scanf("%lf", &x);
} while(x < -1.5 || x > 0.5);
printf("Введите dx: ");
scanf("%lf", &dx);
}
else
{
a = 2.17;
dx = 0.1;
x = -1.5;
}
while(x >= -1.5 && x <= 0.5)
{
if(x >= 0.)
{
double kor = a*x + b*x;
if(kor < 0.0)
{
#ifdef DEBUG
printf("%d\n", __LINE__);
#endif /* DEBUG */
perror("Отрицательное подкоренное значение. \n");
return 1;
}
double del = a + x*x;
if(del == 0.0)
{
#ifdef DEBUG
printf("%d\n", __LINE__);
#endif /* DEBUG */
perror("Делить на ноль нельзя. \n");
return 1;
}
y = sqrt(kor) / del;
}
else /* x < 0. */
{
double f = fabs(b - x*x);
double l = a + x;
if(l <= 0.0)
{
#ifdef DEBUG
printf("%d\n", __LINE__);
#endif /* DEBUG */
perror("Неверное значение для логорифма. \n");
return 1;
}
double l2 = log(l);
if(l2 < 0.0)
{
#ifdef DEBUG
printf("%d\n", __LINE__);
#endif /* DEBUG */
perror("Неверное подкоренное значние. \n");
return 1;
}
if(a < 0.0)
{
#ifdef DEBUG
printf("%d\n", __LINE__);
#endif /* DEBUG */
perror("Неверное подкоренное значение. \n");
return 1;
}
double del2 = x + sqrt(a);
if(del2 == 0.0)
{
#ifdef DEBUG
printf("%d\n", __LINE__);
#endif /* DEBUG */
perror("Делить на ноль нельзя. \n");
return 1;
}
y = sqrt(f*l2) / del2;
}
if(y >= 0.0)
{
k++;
P *= y;
}
S += y;
b = 2.*x + a*a;
/* вывод значений */
printf("x: %lf, y: %lf, k: %d, P: %lf, S: %lf\n",x,y,k,P,S);
/* шаг цикла */
x += dx;
x = round(x * 10) / 10.0; /* округляем из-за неточности double */
}
return 0;
}
/* если не вводить вручную, возникает ошиба,
* если ввести a = 7, x = -1.5, dx = 0.1,
* получится нормальный вывод на всём промежутке
* функции.
*/
Арзамас Купатов
Спасибо работает
Арзамас Купатов
Хотя нет не получается вывести. Ввожу любое число, выходит вот это

Арзамас Купатов
Спасибо! Я уже разобрался!
Похожие вопросы
- Си. Цикл for. Что не так? Составить программу вывода на экран всех простых чисел не превосходящих введеннного числа N
- Помогите пожалуйста написать программу на Си
- Нужно написать программу с вложенным циклом
- Работа со структурами. Написать программу для СИ
- Помогите написать программу на СИ
- Чувствительны ли программы на Си к исправности железа
- Написать программы на СИ
- Завершается программа в Си
- Программа язык Си
- Написать программу на Си, помогите!!!