• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Задача По С

  • Автор темы debugger
  • Дата начала
D

debugger

Задача по С, нужно вывести на экран 20 значений "y" для 20 значений "х" лежащих в промежутке от "а" до "b" c шагом "h" . Как вывести этих 20 значений? выводится почему-то только одно. И еще интересно, почему на одном компе работает строчка "setlocale(LC_CTYPE, "Russian");" а на другом получаю 15 ошибок из-за нее?

C++:
#include <stdio.h>
#include <conio.h> 
#include <math.h>
#include <process.h>
#include <locale.h>	  

void main ()  {
setlocale(LC_CTYPE, "Russian");

double x, y, h, a, b;
system("cls"); fflush(stdin);
h=0,2;
printf("Введите a: ");
scanf_s("%lf", &a);
printf("Введите b: ");
scanf_s("%lf", &b);
puts("	x  |	y  |");
puts("------------------");
for (x=a; x>=b; x+=h);
y=pow(x,2.)-10*pow(sin(x),2.)+2.;
printf("\n %.2lf | %.5lf |\n", x, y);
_getch();
}
 
L

lazybiz

for (x=a; x<=b; x+=h);

Да и вообще где блок цикла? В теле твоего цикла ничего не происходит, т.к. он заканчивается точкой с запятой.
Для примера, цикл и его тело обозначаются так:
C++:
	for ( x = a; x < b; x++ ) {
// тело цикла
}

Добавлено: h=0,2; - так вещественные числа не записываются.
 
D

debugger

исправил, работает, выводит 20 значений, но почему-то не выводит значение x = b , хотя в for я прошу вывести это значение тоже
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <process.h>
#include <locale.h>

void main () {

double x, y, h, a, b;
system("cls"); fflush(stdin);
h=.2;
printf("Enter a: ");
scanf_s("%lf", &a);
printf("Enter b: ");
scanf_s("%lf", &:);
puts(" x | f(x) |");
puts("---------------------");
for (x=a; x<=b; x+=h) {
y=pow(x,2.)-10*pow(sin(x),2.)+2.;
printf("\n %.2lf | %.5lf |\n", x, y);}
_getch();
}
 
L

lazybiz

При каких значениях a и b это происходит?

Добавлено: Не забывай: a, b и h у тебя не целочисленные переменные.
 
D

debugger

в моем случае a=-1 а b=3
24_11_2011_11_25_46.png
 
L

lazybiz

Дело в том что существует погрешность. printf округляет число до той точности которую ты указываешь (у тебя это 2 знака после запятой - %.2lf).
 

Вложения

  • Безымянный.png
    Безымянный.png
    6,8 КБ · Просмотры: 566
D

debugger

вижу только один выход: сделать b > 3 (например b=3.1) ;)
расстроен я таким положением вещей
 
L

lazybiz

Тут немного другой подход нужен... через 15 минут покажу какой.

Добавлено: Кстати, уточни задание, так как формулировка
нужно вывести на экран 20 значений "y" для 20 значений "х" лежащих в промежутке от "а" до "b" c шагом "h"
не верна. Тут либо шаг надо автоматически подсчитать, либо количество значений.
 
D

debugger

да, значений получается 21, это не суть, главное шаг 0,2 и от a до b..
 
L

lazybiz

Ок.
C++:
#include <stdio.h>
#include <math.h>
#include <float.h>

void main ()
{
int		i;
double	x, y, h = .2, a, b;

printf( "Enter a: " );
scanf( "%Lf", &a );

printf( "Enter b: " );
scanf( "%Lf", &b );

printf( "a=%Lf b=%Lf\n", a, b );

printf( "  x	|  f(x) |\n" );
printf( "-------------------\n" );
for ( i = 0; x < b; i++ ) {
x = a + h * i;
y = pow( x, 2 ) - 10 * pow( sin( x ), 2 ) + 2;
printf( "%7.4Lf | %7.4Lf |\n", x, y );
}
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!