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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2011, 20:32   #1
-=Andriushka=-
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 91
По умолчанию цикл

добрый вечер!пишу небольшую программку на интерполяционный многочлен ньютона,и возникла загвоздка,не могу написать цикл,цикл такой:
1
01
101
0101
101
01
1
т.е,имеется массив к примеру из 4 элементов,и надо из 4 вычесть 3,из 3 вычесть второй,из 2 вычесть 1...потом из полученных трех тоже самое сделать,и до тех пор пока неостанется одно число!!!подскажите пожалуйста как это сделать
-=Andriushka=- вне форума Ответить с цитированием
Старый 31.10.2011, 21:26   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Объяснение не особо отчётливо, но попробуйте приложить такую концепцию:
Пусть есть массив значений функции, n элементов. Массивом дискретной производной порядка k назовём массив из (n-k) элементов (который не проблема хранить в массиве, рассчитаном на n элементов), равный исходному массиву при k=0 и получаемый из массива производной порядка k-1 вычитанием последовательных членов при k>0.
Обратите внимание, что процесс получения массива производных порядка k>=1 примерно одинаков. Напишите функцию GetNextDifferential, которая принимает на вход массив дискретной производной некоторого порядка из m членов, само значение m и массив, в который в результате работы функции должна быть записана дискретная производная следующего порядка (считая, что в переданном массиве места для этого достаточно).
Ну, а потом, если Вам надо получить именно то самое одно число, это можно сделать так:
Код:
float GetHighestPossibleDiff(float* func, int num){
    //Заводим пару массивов под промежуточные операции
    float *diff = new float[num];
    float *nextDiff = new float[num];
    //Первый шаг - заносим в diff начальный массив
    memcpy(func, diff, num*sizeof(float));
    //И в цикл
    for(int i=num; i>1; --i){
        //Считаем
        GetNextDifferential(diff, i, nextDiff);
        //Меняем местами diff и nextDiff
        swap(diff, nextDiff);
    }
    //Всё, в diff один элемент
    float ret=diff[0];
    //Обозначаем, что массивы нам больше не нужны
    delete[] diff; delete[] nextDiff;
    return ret;
}
Abstraction вне форума Ответить с цитированием
Старый 31.10.2011, 21:42   #3
-=Andriushka=-
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 91
По умолчанию

for(j=1;j<=n;j++)
for(i=n-j;i>=0;i--)
{
mas[n][m]=(i+1)-(i);
cout<<mas[n][m]<<endl;
}
а если как то так?и как допустим можно сделать чтобы когда мы 1 столбец посчитали то мы последнее число записали допустим в новый массив,и так каждый раз после просчета столбца?ну чтобы потом для следующего шага были известны вот эти элементы(2):
2
02
102
0102
101
01
1
-=Andriushka=- вне форума Ответить с цитированием
Старый 31.10.2011, 22:08   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Код:
(i+1)-(i)
?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 31.10.2011, 22:26   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Я не понимаю, что именно у Вас записано треугольником. Также я не вполне понимаю, как именно звучит задание - что должно быть на входе, что на выходе.
Моё основное предложение - сделать расчёт следующей дискретной производной отдельной функцией и из основной программы при необходимости дёргать её. Почему Вы этого не хотите сделать, при том, что одновременно думать над основной логикой программы и конкретными расчётами по массивам явно получается не очень, я опять же не понимаю.
Abstraction вне форума Ответить с цитированием
Старый 01.11.2011, 07:18   #6
-=Andriushka=-
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 91
По умолчанию

задание такое что мы сначала вводим интервал,разбиваем на отрезки,и в каждой точке считаем значение выбранной функции и заносим в массив,а затем начитаем считать по этому треугольнику чтобы найти погрешность
-=Andriushka=- вне форума Ответить с цитированием
Старый 01.11.2011, 20:12   #7
-=Andriushka=-
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 91
По умолчанию

Код:

#include "stdafx.h"
#include "iostream"
#include "math.h"
#define n 5
#define m 20
#define z 20
using namespace std;

double Func1(double,int);
double diff(double, int, int);

int main()
{
	double y=0,y1,pog_prac=0,pog_teor=0, b=1;
	int x_test;
	double power=1.0;
	int i=0,k,q,v,j = 0,x1,x2,h;
	double
		mas[n][m];
	double mas1[z];
	setlocale(LC_ALL,"Russian");
    cout<<"введите концы отрезка\n";
	cin>>x1>>x2;
	cout<<"введите тестовое значение\n";
	cin>>x_test;
    cout<<"введите шаг разбиения\n";
	cin>>q;
    cout<<"выберите нужную функцию\n";
	cout<<"1. exp(x), 2. sin(x), 3. cos(x)\n";
	cin>>k;
			h=(x2-x1)/q;
				for((i=x1) && (j=0);(i<=x2)&&(j <= z);(i+=h)&&(j++))
				{
					mas1[j]=i;
					mas1[j]=Func1(i,k);
					cout<<mas1[j]<<endl;
				}
		for(j=1;j<=n;j++) 
		{
			for(i=1;i<=n-j+1;i++)
			{
				mas[i-1][j]=(mas[i][j-1]-mas[i-1][j-1])/(mas[i]-mas[i-1]);
				cout<<mas[i][j]<<endl;
            }
		}
		 
      y1=Func1(x_test,k);
        cout<<"Точное значение тестовой функции равно: y1 = "<<y1<<'\n';
	  cout<<"Приближенное значение тестовой функции по Ньютону равно: y = "<<y<<'\n';
	  pog_prac = fabs(y1-y);
	    cout<<"Практическая погрешность равна: pog_prac = "<<pog_prac<<'\n';
	  pog_teor = fabs(diff(x2,i,k)*power/b);
	    cout<<"Теоретическая погрешность равна: pog_teor = "<<pog_teor<<'\n';
	  cout<<"Если вам необходимо выбрать другую тестовую функцию, то нажмите 1, иначе 0\n";
	  cin>>v;
	  if(v==1)
		  main();
	return 0;
}
	double Func1(double x,int k)
    {
       if(k==1) 
		   return exp(x);
       else if(k==2)
		   return sin(x*3.14/180);
       else if(k==3) 
		   return cos(x*3.14/180);
	   else 
	   return 0;
    }
подскажите почему считает неправильно?
-=Andriushka=- вне форума Ответить с цитированием
Старый 01.11.2011, 23:34   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

М-м-м... Вы ещё не запутались в том, какая переменная что означает? Я почти.
Код:
h=(x2-x1)/q;
h - число отрезков разбиения. Целое число. Чему он будет равен при x1=0, x2=5, q=2?
Ладно, пусть (x2-x1) делится нацело на q. Скажем, x1=0, x2=10, q=2. h=5.
Код:
for((i=x1) && (j=0);(i<=x2)&&(j <= z);(i+=h)&&(j++))
В первой и третьей части вместо && можно было бы писать запятую. Что интереснее, из цикла мы выходим за минимум из z+1, q+1 итераций. В данном случае, итераций будет всего три - при i=0, i=5, i=10.
Код:
mas1[j]=i;
mas1[j]=Func1(i,k);
cout<<mas1[j]<<endl;
Всё страньше и страньше. mas1[j] мы присваиваем i, затем сразу же значение функции в i. Что ж, пусть выбрана экспонента. Имеем mas1[0]=1, mas1[1]=148.4, mas1[2]=22023.5, прочие значения - любой мусор.
Код:
for(j=1;j<=n;j++) 
{
    for(i=1;i<=n-j+1;i++)
    {
        mas[i-1][j]=(mas[i][j-1]-mas[i-1][j-1])/(mas[i]-mas[i-1]);
        cout<<mas[i][j]<<endl;
    }
}
Дальше мы проводим какие-то действия с массивом mas, но, поскольку мы в него ничего не записывали, в нём хранится случайный мусор; преобразование мусора даёт мусор.
Заметим, что в конце концов i=2, j=n+1.
Код:
      
	  cout<<"Приближенное значение тестовой функции по Ньютону равно: y = "<<y<<'\n';
	  pog_prac = fabs(y1-y);
	    cout<<"Практическая погрешность равна: pog_prac = "<<pog_prac<<'\n';
	  pog_teor = fabs(diff(x2,i,k)*power/b);
	    cout<<"Теоретическая погрешность равна: pog_teor = "<<pog_teor<<'\n';
Поскольку с начала программы y мы не меняли, в качестве y выведется ноль. В качестве практической погрешности имеем |y1|, теоретической - diff(10,2,1)*1/1.

Это отвечает на Ваш вопрос
Цитата:
подскажите почему считает неправильно?
?
Abstraction вне форума Ответить с цитированием
Старый 02.11.2011, 07:26   #9
-=Andriushka=-
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 91
По умолчанию

Код:
for(j=1;j<=n;j++) 
{
    for(i=1;i<=n-j+1;i++)
    {
        mas[i-1][j]=(mas[i][j-1]-mas[i-1][j-1])/(mas[i]-mas[i-1]);
        cout<<mas[i][j]<<endl;
    }
}
вот это место почему то считает не так как хотелось бы...надо чтобы к примеру из 4 элементов остался всего лишь 1...надо чтобы они повычитывались друг из друга по очереди и получилось 3 элемента,потом эти 3 элемента повычитывались друг за другом и получили 2 элемента,и затем из этих 2-х элементов получился 1...я так понял из вышеописанного что все дело в mas?изза того что ни чего в нем не записанно и там всякий мусор,хотя я записывал значения в mas1?
-=Andriushka=- вне форума Ответить с цитированием
Старый 02.11.2011, 08:20   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
изза того что ни чего в нем не записанно и там всякий мусор,хотя я записывал значения в mas1?
В ящике моего стола лежит пачка бумаги. Вопрос: что лежит у меня в шкафу, ввиду этой информации?
В массив mas1 занесли какие-то данные. Вопрос: какие данные лежат в массиве mas, ввиду этой информации?
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл For ..to.. maksim_serg Общие вопросы Delphi 6 02.01.2011 11:47
Цикл по времени - Как сделать так чтобы цикл выполнялся к примеру 10 секунд ? Anarki Общие вопросы C/C++ 3 13.11.2009 19:23
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34