Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > вывод ошибки!


Автор: rememberme 18.7.2006, 13:53
всё работает! кроме фигни! посмотрите плиз!
программа должна выводить Error в случае если введённое число arg не попадёт в промежуток введённых ранее (x[0],x[i]) а Succes в случае если всё ок
а выводит и то и другое в любом случае! не пойму где я косячу?!
Код

#include <stdio.h>
#include <iostream.h>


int main(){
    
   
    double *x,*fx,*dfx;
    double arg;
    double res;
    int n,i;
    cout << "Vvedite kol-vo uzlov : ";
    cin >> n;
x = new double[n];
fx = new double[n];
dfx = new double[n];
        cout << "Input x\n";
    for (i=0; i<n; i++)
    {
        cout << "x[" << i+1 <<"] = ";
        cin >> x[i];
    }
    cout << "Input f(x)\n";
    for (i=0; i<n; i++)
    {
        cout << "fx[" << i+1 <<"] = ";
        cin >> fx[i];
    }
cout << "Input f'(x)\n";
    for (i=0; i<n; i++)
    {
        cout << "dfx[" << i+1 <<"] = ";
        cin >> dfx[i];
    }


cout << "Input X : ";
cin>>arg;

if (arg>x[i] || arg<x[1]) cout<<"Error"<<endl;

   for (i=0; i<n-1; i++) {
  
       if (arg>=x[i] && arg<=x[i+1]) {   
   
    double h = x[i+1]-x[i];        
    double u = (arg - x[i])/h;
    double a0 = 1-3*u*u+2*u*u*u;
    double a1 = 3*u*u-2*u*u*u;
    double b0 = u-2*u*u+u*u*u;
    double b1 = -u*u+u*u*u;

   res = a0*fx[i]+a1*fx[i+1]+b0*dfx[i]*h+b1*dfx[i+1]*h;
   
      } 
}
   cout<<"Succes: y="<<res<<endl;
   


   return 0;}
 

Автор: Rockie 18.7.2006, 14:28
Код
if (arg>x[i] && arg<x[1])   // попадает 

Код
if (arg<x[i] || arg>x[1])   // не попадает 


а на
Цитата(rememberme @  18.7.2006,  13:53 Найти цитируемый пост)
x = new double[n];

нужно делать 
Код
delete [] x;
 

Автор: ptr 18.7.2006, 15:03
1. по-моему cout<<"Success..." нужно под if (arg>=x[i] && arg<=x[i+1]) занести.
2. if (arg>x[i] || arg<x[1]) а тут случайно цикл не нужен, а то i=n-1, и не x[0] надо ли сравнивать?  

Автор: rememberme 18.7.2006, 15:37
Rockie, код C++ 
1:

 if (arg>x[i] && arg<x[1])   // попадает 

 
 



код C++ 
1:

 if (arg<x[i] || arg>x[1])   // не попадает 


а не наоборот? у меня не получается-(

а
Код

delete [] x;

 это зачем? и где это надо писать?

Добавлено @ 15:40 
ptr, 
Цитата

1. по-моему cout<<"Success..." нужно под if (arg>=x[i] && arg<=x[i+1]) занести.

как? там if под циклом, и соответственно он выводит Succes неск. раз!

Цитата

2. if (arg>x[i] || arg<x[1]) а тут случайно цикл не нужен, а то i=n-1, и не x[0] надо ли сравнивать? 

незнаю -((( я всё пробую ничё не получается! 

Автор: ptr 18.7.2006, 15:58
Цитата(rememberme @  18.7.2006,  19:37 Найти цитируемый пост)
а не наоборот? у меня не получается-(

Всё правильно при arg>x[i] && arg<x[1] arg находится в промежутке (x[i],x[1]), а при (arg<x[i] || arg>x[1]) вне его.

Цитата(rememberme @  18.7.2006,  19:37 Найти цитируемый пост)
как? там if под циклом, и соответственно он выводит Succes неск. раз!

Я хотел сказать в тело цикла.

Цитата(rememberme @  18.7.2006,  19:37 Найти цитируемый пост)
это зачем? и где это надо писать?

delete удаляет выделенную ранее new память. Его надо писать там, где x тебе больше не нужен. Или можешь заменить
Код

double *x;
x = new double[n];
 
на
Код

double x[n];

, тогда delete не потребуется.

    

Автор: rememberme 18.7.2006, 16:46
так я и не понимаю что нужно изменить-( совсем голова не работает! 

Автор: ptr 18.7.2006, 17:07
Код

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
    double arg;
    double res;
    int n,i;
    
    cout << "Vvedite kol-vo uzlov : ";
    cin >> n;
    
    double x[n];
    double fx[n];
    double dfx[n];
    
    cout << "Input x\n";
    for (i=0; i<n; i++)
    {
        cout << "x[" << i+1 <<"] = ";
        cin >> x[i];
    }
    cout << "Input f(x)\n";
    for (i=0; i<n; i++)
    {
        cout << "fx[" << i+1 <<"] = ";
        cin >> fx[i];
    }
    cout << "Input f'(x)\n";
    for (i=0; i<n; i++)
    {
        cout << "dfx[" << i+1 <<"] = ";
        cin >> dfx[i];
    }
    cout << "Input X : ";
    cin>>arg;
    
    for(i=1;i<n;i++)
    {
     if (arg>x[i] || arg<x[0])//òóò ÿ íå ïîíÿë ÷òî òû ïðîâåðÿåøü
     {
       cout<<"Error"<<endl;
     }
    }
    
   for (i=0; i<n-1; i++) 
   {
       if (arg>=x[i] && arg<=x[i+1]) {   
   
          double h = x[i+1]-x[i];        
          double u = (arg - x[i])/h;
          double a0 = 1-3*u*u+2*u*u*u;
          double a1 = 3*u*u-2*u*u*u;
          double b0 = u-2*u*u+u*u*u;
          double b1 = -u*u+u*u*u;
          res = a0*fx[i]+a1*fx[i+1]+b0*dfx[i]*h+b1*dfx[i+1]*h;
          cout<<"Succes: y="<<res<<endl;
       } 
   }
   return 0;
}

Так пойдёт? 

Автор: rememberme 18.7.2006, 17:51
про delete то я поняла!
кстати в таком виде выдаёт 9 ошибок:
 error C2057: expected constant expression
 error C2466:cannot allocate an array of constant size 0
 error C2133: 'x' : unknown size и т.д.

а вот с выводом полнейшая жопа, всё равно выводит и ошибку и успех, да ещё и по 2 раза.

Добавлено @ 17:56 
Код

for (i=0; i<n-1; i++) 
   {
       if (arg>=x[i] && arg<=x[i+1]) {  


может здесь что-то не то? 

Автор: ptr 19.7.2006, 04:44
rememberme, прокомментируй программу начиная с if (arg>x[i] || arg<x[0]) (что ты хочешь получить и как это должно работать).

Цитата(rememberme @  18.7.2006,  21:51 Найти цитируемый пост)
да ещё и по 2 раза.

Ну если я введу два раза промежуток, в который arg попадает, то и получу два результата.

Цитата(rememberme @  18.7.2006,  21:51 Найти цитируемый пост)
кстати в таком виде выдаёт 9 ошибок:
 error C2057: expected constant expression
 error C2466:cannot allocate an array of constant size 0
 error C2133: 'x' : unknown size и т.д.

g++, в отличии от Студии, мне ничего не выдавал.

Код

#include <cstdlib> 
#include <iostream> 
 
using namespace std; 
 
int main() 
{ 
    double arg; 
    double res; 
    int n, i;
     
    cout << "Vvedite kol-vo uzlov : "; 
    cin >> n; 
     
    double *x=new double[n];
    double *fx=new double[n];
    double *dfx=new double[n];
     
    cout << "Input x\n"; 
    for (i=0; i<n; i++) 
    { 
        cout << "x[" << i+1 <<"] = "; 
        cin >> x[i]; 
    } 
    cout << "Input f(x)\n"; 
    for (i=0; i<n; i++) 
    { 
        cout << "fx[" << i+1 <<"] = "; 
        cin >> fx[i]; 
    } 
    cout << "Input f'(x)\n"; 
    for (i=0; i<n; i++) 
    { 
        cout << "dfx[" << i+1 <<"] = "; 
        cin >> dfx[i]; 
    } 
    cout << "Input X : "; 
    cin>>arg; 
     
    for(i=1;i<n;i++) 
    { 
        if (arg>x[i] || arg<x[0])//как я понимаю продолжать выполнение, если здесь ошибка, не надо
        { 
            cout<<"Error"<<endl;
            delete[] x;
            delete[] fx;
            delete[] dfx;
            return -1;
        }
    } 
     
    double h=0, u=0, a0=0, a1=0, b0=0, b1=0;

    for (i=0; i<n-1; i++)  
    { 
        if (arg>=x[i] && arg<=x[i+1]) 
        {
            h = x[i+1]-x[i];         
            u = (arg - x[i])/h; 
            a0 = 1-3*u*u+2*u*u*u; 
            a1 = 3*u*u-2*u*u*u; 
            b0 = u-2*u*u+u*u*u; 
            b1 = -u*u+u*u*u; 
            res = a0*fx[i]+a1*fx[i+1]+b0*dfx[i]*h+b1*dfx[i+1]*h; 
            cout<<"Succes: y="<<res<<endl; 
       }  
   } 
   delete[] x;
   delete[] fx;
   delete[] dfx;
   return 0; 
}

Вот ещё один вариант smile . 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)