Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вывод ошибки! с++ 
:(
    Опции темы
rememberme
Дата 18.7.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 5.7.2006

Репутация: нет
Всего: нет



всё работает! кроме фигни! посмотрите плиз!
программа должна выводить 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;}
 
PM MAIL   Вверх
Rockie
Дата 18.7.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



Код
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;
 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
ptr
Дата 18.7.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: нет
Всего: 14



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

Это сообщение отредактировал(а) ptr - 18.7.2006, 15:05


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
rememberme
Дата 18.7.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 5.7.2006

Репутация: нет
Всего: нет



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] надо ли сравнивать? 

незнаю -((( я всё пробую ничё не получается! 
PM MAIL   Вверх
ptr
Дата 18.7.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: нет
Всего: 14



Цитата(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 не потребуется.

    

Это сообщение отредактировал(а) ptr - 18.7.2006, 16:45


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
rememberme
Дата 18.7.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 5.7.2006

Репутация: нет
Всего: нет



так я и не понимаю что нужно изменить-( совсем голова не работает! 
PM MAIL   Вверх
ptr
Дата 18.7.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: нет
Всего: 14



Код

#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;
}

Так пойдёт? 


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
rememberme
Дата 18.7.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 5.7.2006

Репутация: нет
Всего: нет



про 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]) {  


может здесь что-то не то? 
PM MAIL   Вверх
ptr
Дата 19.7.2006, 04:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: нет
Всего: 14



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 . 


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.