Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2012, 18:20   #1
Katerina3262
Новичок
Джуниор
 
Регистрация: 12.05.2012
Сообщений: 4
По умолчанию Ввод коэффициентов функции

Нужно чтоб пользователь сам вводил коэффициенты a,b,c,d,k(и чтоб они могли быть только цифрами). Я пытаюсь сделать что-то, но мне кажется я совсем не правильно пытаюсь. Если функцию задать как константу, то все считает идеально. А так получается ерунда. Помогите разобраться.

Код:
#include "stdio.h"
#include "stdafx.h"
#define  n 2
#define V 100

float f (float x, float y)
{float a, b, c, k,  d;
   return a*x+b*y+c*(x*x)+d*(y*y)+k; 
}


 
void main ()
{
   float tochnost = 0.000000000001;
   float X[n + 5][n];
   float E;
  float *a,*b,*c,*d,*k;
   X[0][0] = 0;   X[0][1] = 1;   X[1][0] = 1;
   X[1][1] = 4;   X[2][0] = 2;   X[2][1] = 5;

   int A, B, C,flag = 0, flag2=0;
   int kolichestvo = 0;

        
    printf("hotite yvidet iteracii? da=Y,Net=X\n");
	char W;
	scanf("%c",&W);
	switch(W)
	{  case 'Y':
	   { flag=1;flag2=1; break;	}
	  case 'X':
	  {  flag2=1; break;  }
	}
     defaulf:
	{printf("Oshibka\n ");}


	a = (float *)malloc(sizeof(V) ) ;
	b =(float *) malloc(sizeof(V) ) ;
	c =(float *) malloc(sizeof(V) ) ;
	d =(float *) malloc(sizeof(V) ) ;
	k =(float *) malloc(sizeof(V) ) ;
   printf("Vvedite a=");
   scanf("%f",&a[V]);
    printf("Vvedite b=");
   scanf("%f",&b[V]);
    printf("Vvedite c=");
   scanf("%f",&c[V]);
    printf("Vvedite d=");
   scanf("%f",&d[V]);
      printf("Vvedite k=");
   scanf("%f",&k[V]);








			
		do
   {





   kolichestvo++;
   A = 0;   B = 0;   C = 0;
   float Maxsimum = f(X[0][0], X[0][1]);
   float Minimum = f(X[0][0], X[0][1]);
   for (int D = 1; D <= n; D ++)
   {
        if (f(X[D][0], X[D][1]) < Minimum)
         {
            Minimum = f(X[D][0], X[D][1]);
            B = D;
         }
        if (f(X[D][0], X[D][1]) > Maxsimum) 
         {
            Maxsimum = f(X[D][0], X[D][1]);
            A = D;
         }
   }
   Maxsimum = f(X[0][0], X[0][1]);
   for (int D = 1; D <= n; D ++)
   {
         if ((f(X[D][0], X[D][1]) > Maxsimum) && (D != A)) 
         {
             Maxsimum = f(X[D][0], X[D][1]);
             C = D;
         }
   }
   X[n + 1][0] = (X[0][0] + X[1][0] + X[2][0] - X[A][0]) / n;
   X[n + 1][1] = (X[0][1] + X[1][1] + X[2][1] - X[A][1]) / n;

   for (int i = 0; i < n; i++)
   X[n + 2][i] = 2 * X[n + 1][i] - X[A][i];

   if (f(X[n + 2][0], X[n + 2][1]) < f(X[B][0], X[B][1]))
   {
       X[n + 3][0] = X[n + 1][0] + 2 * (X[n + 2][0] - X[n + 1][0]);
       X[n + 3][1] = X[n + 1][1] + 2 * (X[n + 2][1] - X[n + 1][1]);

       if (f(X[n + 3][0], X[n + 3][1]) < f(X[B][0], X[B][1]))
       {
           X[A][0] = X[n + 3][0];
           X[A][1] = X[n + 3][1];
        }
  else
   {
      X[A][0] = X[n + 2][0];
      X[A][1] = X[n + 2][1];
   }
   }
   else
   if (f(X[n + 2][0], X[n + 2][1]) > f(X[C][0], X[C][1]))
   {
       if (!(f(X[n + 2][0], X[n + 2][1]) > f(X[A][0], X[A][1])))
       {
             X[A][0] = X[n + 2][0];
             X[A][1] = X[n + 2][1];
        }
   X[n + 4][0] = X[n + 1][0] + 0.5 * (X[A][0] - X[n + 1][0]);
   X[n + 4][1] = X[n + 1][1] + 0.5 * (X[A][1] - X[n + 1][1]);
       if (!(f(X[n + 4][0], X[n + 4][1]) > f(X[A][0], X[A][1])))
       {
             X[A][0] = X[n + 4][0];
             X[A][1] = X[n + 4][1];
       }
   else
   {
   for (int D = 0; D < n; D++)
      {
        X[D][0] = X[D][0] + 0.5 * (X[D][0] - X[B][0]);
        X[D][1] = X[D][1] + 0.5 * (X[D][1] - X[B][1]);
      }
   }
   }
   else
   {  
	    X[A][0] = X[n + 2][0];
        X[A][1] = X[n + 2][1];
   }
   float E1 = 0, E2 = 0;
   for (int D = 0; D < n + 1; D++)
   {
        E1 += f(X[D][0], X[D][1]);
        E2 += f(X[D][0], X[D][1]) * f(X[D][0], X[D][1]);
   }
   E = E2 - E1 * E1 / (n + 1);
   E /= (n + 1);
   if (flag==1) {printf("%.4f %.4f\n", X[0][0], X[0][1]);}
   if (flag==1) {printf("%.4f %.4f\n", X[1][0], X[1][1]);}
   if (flag==1) {printf("%.4f %.4f\n", X[2][0], X[2][1]);}
   Minimum = f(X[0][0], X[0][1]);
   for (int D = 1; D <= n; D++)
   {
        if (f(X[D][0], X[D][1]) < Minimum)
        {
              Minimum = f(X[D][0], X[D][1]);
              B = D;
         }
   }  
   if (flag==1){ printf("f = %.4f\n" , f(X[B][0], X[B][1]));}
   if (flag==1) {printf("                   \n\n\n");}
   }
    while (E > tochnost);
    if (flag2==1) printf("X = %.4f\n", X[n+1][0]);
    if (flag2==1)printf("Y = %.4f\n", X[n+1][1]);
    if (flag2==1)printf("Minimum fynkcii = %.4f\n",f(X[n + 1][0], X[n + 1][1]));
    if (flag2==1)printf("Vsego iteraciy = %d\n", kolichestvo);
          
      getchar();     
      getchar();
	
}
Katerina3262 вне форума Ответить с цитированием
Старый 12.05.2012, 18:26   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Объявите глобальными эти переменные и уберите их объявление из других функций.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 12.05.2012, 19:09   #3
Katerina3262
Новичок
Джуниор
 
Регистрация: 12.05.2012
Сообщений: 4
По умолчанию

Спасибо, но это не помогает.
Katerina3262 вне форума Ответить с цитированием
Старый 12.05.2012, 19:25   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include "stdio.h"
#define  n 2

float a, b, c, k,  d;

float f (float x, float y)
{
    return a*x+b*y+c*(x*x)+d*(y*y)+k;
}

int
main ()
{
    float tochnost = 0.000000000001;
    float X[n + 5][n];
    float E;
    X[0][0] = 0;
    X[0][1] = 1;
    X[1][0] = 1;
    X[1][1] = 4;
    X[2][0] = 2;
    X[2][1] = 5;
    int A, B, C,D,i,flag = 0, flag2=0;
    int kolichestvo = 0;
    printf("Do you want see iterations? Yes=Y,No=N\n");
    unsigned char W;
    scanf("%c",&W);
    switch(W)
    {
    case 'Y':
        flag=flag2=1;
        break;
    case 'N':
        flag2=1;
        break;
defaulf:
        printf("ERROR\n");
    }
    printf("Input a=");
    scanf("%f",&a);
    printf("Input b=");
    scanf("%f",&b);
    printf("Input c=");
    scanf("%f",&c);
    printf("Input d=");
    scanf("%f",&d);
    printf("Input k=");
    scanf("%f",&k);
    do
    {
        kolichestvo++;
        A = 0;
        B = 0;
        C = 0;
        float Maxsimum = f(X[0][0], X[0][1]);
        float Minimum = f(X[0][0], X[0][1]);
        for (D = 1; D <= n; D ++)
        {
            if (f(X[D][0], X[D][1]) < Minimum)
            {
                Minimum = f(X[D][0], X[D][1]);
                B = D;
            }
            if (f(X[D][0], X[D][1]) > Maxsimum)
            {
                Maxsimum = f(X[D][0], X[D][1]);
                A = D;
            }
        }
        Maxsimum = f(X[0][0], X[0][1]);
        for (D = 1; D <= n; D ++)
        {
            if ((f(X[D][0], X[D][1]) > Maxsimum) && (D != A))
            {
                Maxsimum = f(X[D][0], X[D][1]);
                C = D;
            }
        }
        X[n + 1][0] = (X[0][0] + X[1][0] + X[2][0] - X[A][0]) / n;
        X[n + 1][1] = (X[0][1] + X[1][1] + X[2][1] - X[A][1]) / n;
        for (i = 0; i < n; i++)
            X[n + 2][i] = 2 * X[n + 1][i] - X[A][i];
        if (f(X[n + 2][0], X[n + 2][1]) < f(X[B][0], X[B][1]))
        {
            X[n + 3][0] = X[n + 1][0] + 2 * (X[n + 2][0] - X[n + 1][0]);
            X[n + 3][1] = X[n + 1][1] + 2 * (X[n + 2][1] - X[n + 1][1]);

            if (f(X[n + 3][0], X[n + 3][1]) < f(X[B][0], X[B][1]))
            {
                X[A][0] = X[n + 3][0];
                X[A][1] = X[n + 3][1];
            }
            else
            {
                X[A][0] = X[n + 2][0];
                X[A][1] = X[n + 2][1];
            }
        }
        else if (f(X[n + 2][0], X[n + 2][1]) > f(X[C][0], X[C][1]))
        {
            if (!(f(X[n + 2][0], X[n + 2][1]) > f(X[A][0], X[A][1])))
            {
                X[A][0] = X[n + 2][0];
                X[A][1] = X[n + 2][1];
            }
            X[n + 4][0] = X[n + 1][0] + 0.5 * (X[A][0] - X[n + 1][0]);
            X[n + 4][1] = X[n + 1][1] + 0.5 * (X[A][1] - X[n + 1][1]);
            if (!(f(X[n + 4][0], X[n + 4][1]) > f(X[A][0], X[A][1])))
            {
                X[A][0] = X[n + 4][0];
                X[A][1] = X[n + 4][1];
            }
            else
            {
                for (D = 0; D < n; D++)
                {
                    X[D][0] = X[D][0] + 0.5 * (X[D][0] - X[B][0]);
                    X[D][1] = X[D][1] + 0.5 * (X[D][1] - X[B][1]);
                }
            }
        }
        else
        {
            X[A][0] = X[n + 2][0];
            X[A][1] = X[n + 2][1];
        }
        float E1 = 0, E2 = 0;
        for (D = 0; D < n + 1; D++)
        {
            E1 += f(X[D][0], X[D][1]);
            E2 += f(X[D][0], X[D][1]) * f(X[D][0], X[D][1]);
        }
        E = E2 - E1 * E1 / (n + 1);
        E /= (n + 1);
        if (flag==1)
        {
            printf("%.4f %.4f\n", X[0][0], X[0][1]);
            printf("%.4f %.4f\n", X[1][0], X[1][1]);
            printf("%.4f %.4f\n", X[2][0], X[2][1]);
        }
        Minimum = f(X[0][0], X[0][1]);
        for (D = 1; D <= n; D++)
        {
            if (f(X[D][0], X[D][1]) < Minimum)
            {
                Minimum = f(X[D][0], X[D][1]);
                B = D;
            }
        }
        if (flag==1)
        {
            printf("f = %.4f\n\n" , f(X[B][0], X[B][1]));
        }
    }
    while (E > tochnost);
    if (flag2)
    {
        printf("X = %.4f\n", X[n+1][0]);
        printf("Y = %.4f\n", X[n+1][1]);
        printf("Function minimum = %.4f\n",f(X[n + 1][0], X[n + 1][1]));
        printf("Count of iterations = %d\n", kolichestvo);
    }
    getchar();
    getchar();
    return 0;
}
У меня что-то считает
Проверьте ответ.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 12.05.2012, 20:10   #5
Katerina3262
Новичок
Джуниор
 
Регистрация: 12.05.2012
Сообщений: 4
По умолчанию

Спасибо Вам, большое! Проверила в Mathcad'е. Замечательно считает
Katerina3262 вне форума Ответить с цитированием
Старый 12.05.2012, 20:34   #6
Katerina3262
Новичок
Джуниор
 
Регистрация: 12.05.2012
Сообщений: 4
По умолчанию

Вот я если ввожу не число, а букву допустим, программа вылетает. А можно сделать так, чтоб она писала: Вы ввели не число, попробуйте еще раз?
Katerina3262 вне форума Ответить с цитированием
Старый 12.05.2012, 21:08   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод функции с клавиатуры Rus5 Паскаль, Turbo Pascal, PascalABC.NET 6 18.12.2011 13:36
Ввод функции 1edik6 Помощь студентам 1 16.11.2011 20:11
Ввод функции с клавиатуры yourchoice17 Помощь студентам 6 12.05.2011 23:51
добавить ввод функции aleksej01-91 Помощь студентам 0 19.04.2010 17:52