Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Теория программирования > Алгоритмы
Перезагрузить страницу Схема Халецкого как написать программу
Ответ
 
Опции темы Опции просмотра
  (#16 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 31.03.2009, 14:54

Цитата:
Я думаю, первокурсники инженерных специальностей, где преподают С++ скажут тебе большое спасибо. Я часто встречал эту задачу как курсовую А на практике она наверно не очень-то применима.Там вроде на матрицу условия накладываются специфичные.
Самое глупое и это во всем мире, преподовать первокурсникам инженерных специальностей язык для программистов - профессиалов. Для них нужен и преднозначет Матлаб!
Ответить с цитированием
  (#17 (permalink)) Старый
yasya yasya вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.03.2009
Unhappy 02.04.2009, 01:17

#include <alloc.h>

а это что за библиотека такая?
я пыталась запустить программу, а она говорит, что не может открыть эту библиотеку
Ответить с цитированием
  (#18 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 02.04.2009, 06:45

Цитата:
#include <alloc.h>

а это что за библиотека такая?
я пыталась запустить программу, а она говорит, что не может открыть эту библиотеку
Стандартный файл-заголовок для языка Си. Необходим для функции void* malloc(unsigned int), которая выделет неободимый для работы блок памяти.
Какой у вас компилятор языка Си?
Ответить с цитированием
  (#19 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 02.04.2009, 11:01

Цитата:
Стандартный файл-заголовок для языка Си. Необходим для функции void* malloc(unsigned int), которая выделет неободимый для работы блок памяти.
Хм, Стандарт языка о таком заголовке умалчивает, и при этом явно требует, чтобы функция malloc() была объявлена в заголовке <stdlib.h> (Ст. 9899-1999, 7.20.3.3)


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#20 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 02.04.2009, 23:26

Цитата:
Хм, Стандарт языка о таком заголовке умалчивает, и при этом явно требует, чтобы функция malloc() была объявлена в заголовке <stdlib.h> (Ст. 9899-1999, 7.20.3.3)
Может быть теперь. Писал я её на Борланде 4.0, 1995 года выпуска. Так если у него так, то пусть подключит <stdlib.h>. Вся проблема. Если не ошибаюсь, то можно и в ручную, в своем файле, объявить прототип.
А еще проще, посмотреть в нелпе своего компилятора, какой файл-заголовок нужен для этой финкции.
Ответить с цитированием
Ads.
  (#21 (permalink)) Старый
yasya yasya вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.03.2009
По умолчанию 03.04.2009, 00:45

Цитата:
Может быть теперь. Писал я её на Борланде 4.0, 1995 года выпуска. Так если у него так, то пусть подключит <stdlib.h>. Вся проблема. Если не ошибаюсь, то можно и в ручную, в своем файле, объявить прототип.
А еще проще, посмотреть в нелпе своего компилятора, какой файл-заголовок нужен для этой финкции.
да теперь работает! =)


#define EQU_ORDER 5

float left[EQU_ORDER][EQU_ORDER] = {
{4.0f, 1.0f, 2.0f, 0.5f, 2.0f},
{1.0f, 0.5f, 0.0f, 0.0f, 0.0f},
{2.0f, 0.0f, 3.0f, 0.0f, 0.0f},
{0.5f, 0.0f, 0.0f, 0.625f, 0.0f},
{2.0f, 0.0f, 0.0f, 0.0f, 16.0f}};

float right[EQU_ORDER] = {7.0f, 3.0f, 7.0f, -4.0f, -4.0f};

float bb[EQU_ORDER][EQU_ORDER];

float xx[EQU_ORDER];


а это что за инициализачия такая?
???ее ведь можно заменить на:

(внутри функции main)

float left[5][5] = {
{4.0f, 1.0f, 2.0f, 0.5f, 2.0f},
{1.0f, 0.5f, 0.0f, 0.0f, 0.0f},
{2.0f, 0.0f, 3.0f, 0.0f, 0.0f},
{0.5f, 0.0f, 0.0f, 0.625f, 0.0f},
{2.0f, 0.0f, 0.0f, 0.0f, 16.0f}};

float right[5] = {7.0f, 3.0f, 7.0f, -4.0f, -4.0f};

float bb[5][5];

float xx[5];


может быть глупый вопрос, но я просто не очень хорошо знаю С++:
а что значит f в этих числах?
это значит float!?
заранее огромное спасибо! =)
Ответить с цитированием
  (#22 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 03.04.2009, 11:47

Просто символ f после числа в формате пт - что бы компилятор понимал эту константу типа float.
Ответить с цитированием
  (#23 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 04.04.2009, 09:08

Код:
/*
    test108.cpp

    2/11/2007
*/

#include <stdio.h>
#include <alloc.h>
#include <float.h>
#include <math.h>

int cholesky_decomp(float *mat_a, float *mat_b, int sz)
{
    double sum;
    int    ii, jj, kk;

    for(ii = 0;ii < sz;ii++)
    {
        for(jj = ii;jj < sz;jj++)
        {
            sum = *(mat_a + ii + sz*jj);

            for(kk = ii - 1;kk >= 0;kk--)
                sum = sum - (*(mat_a + ii + sz*kk))*(*(mat_a + jj + sz*kk));

            if(ii == jj)
            {
                if(sum < 4*FLT_EPSILON)
                {
                    printf("Cholesky method failed!\n");

                    return 0;
                }     

                *(mat_b + ii + sz*ii) = sqrt(sum);
            }
            else
                *(mat_b + jj + sz*ii) = *(mat_a+ jj + sz*ii) = sum/( *(mat_b + ii + sz*ii));
        }
    }

   return 1; 
}

void cholesky_solver(float *mat_b, float right[], float xx[], int sz)
{
    double sum;
    float  *p_temp;
    int    ii, jj;

    p_temp = (float*)malloc(sz*sizeof(right[0]));

    for(ii = 0; ii < sz; ii++)
    {
        sum = 0.0;

        for(jj = 0; jj < ii; jj++)
            sum += (*(mat_b + ii + sz*jj))*p_temp[jj];

        p_temp[ii] = (right[ii] - sum)/(*(mat_b + ii + sz*ii));
    }

    for(ii = sz - 1; ii >= 0; ii--)
    {
        sum = 0.0;

        for(jj = sz - 1; jj > ii; jj--)
            sum += (*(mat_b + jj + sz*ii))*xx[jj];

        xx[ii] = (p_temp[ii] - sum)/(*(mat_b + ii + sz*ii));
    }

     free(p_temp);
}

#define EQU_ORDER 4

float left[EQU_ORDER][EQU_ORDER] = {
                          {2.0f, -4.0f, -3.25f, 1.0f},
                          {3.0f, -3.0f, -4.3f, 8.0f},
                          {1.0f, -5.0f, 3.3f, -20.0f},
                          {2.5f, -4.0f, 2.0f, -3.0f}};

float right[EQU_ORDER] = {4.84f, 8.89f, -14.01f, -20.29f};

float bb[EQU_ORDER][EQU_ORDER];

float xx[EQU_ORDER];

int main()
{
    int ii;

    if(!cholesky_decomp((float*)&left[0][0], (float*)&bb[0][0], EQU_ORDER))
        return 0;

    cholesky_solver((float*)&bb[0][0], right, xx, EQU_ORDER);

    printf("Cholesky's Method\n\n");
     
    for(ii = 0; ii < EQU_ORDER; ii++)
       printf("  X%d = %+f\n", ii, xx[ii]);

    return 0;
}
ledoti, вот я одставил твои данные. Все остальное - твоя работа. Удачи, студент!
Ответить с цитированием
  (#24 (permalink)) Старый
yasya yasya вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.03.2009
По умолчанию 05.04.2009, 00:49

Насколько я помню, * - это указатель.
???А что тогда означают следующие записи:

p_temp = (float*)malloc(sz*sizeof(right[0]));

sum += (*(mat_b + ii + sz*jj))*p_temp[jj];

p_temp[ii] = (right[ii] - sum)/(*(mat_b + ii + sz*ii));
Да и еще, а что делает функция malloc??
Ответить с цитированием
Ads
  (#25 (permalink)) Старый
ledoti
Guest
 
Сообщений: n/a
Post 05.04.2009, 05:34

Stone Большое Спасибо!=))
Ответить с цитированием
  (#26 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 05.04.2009, 07:20

Цитата:
Насколько я помню, * - это указатель.
???А что тогда означают следующие записи:

p_temp = (float*)malloc(sz*sizeof(right[0]));

sum += (*(mat_b + ii + sz*jj))*p_temp[jj];

p_temp[ii] = (right[ii] - sum)/(*(mat_b + ii + sz*ii));
Да и еще, а что делает функция malloc??
Все просто, что бы их понять, надо понимать самое важное в языке Си - указатели. Сами понимаете, что я не могу заменить вам учебник язвка Си.
Ответить с цитированием
  (#27 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 05.04.2009, 07:22

Цитата:
Stone Большое Спасибо!=))
Пожалуйста! Люблю студентов и студенток тоже.
Ответить с цитированием
  (#28 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 05.04.2009, 08:21

Цитата:
FLT_EPSILON - это минимальное число типа float.
Насколько я знаю, минимальное нормализованное положительное число типа float - это FLT_MIN, а FLT_EPSILON - это разница между наименьшим числом, большим единицы, и единицей. Отличаются они довольно сильно: на моей машине FLT_MIN=1.17549e-38, а FLT_EPSILON=1.19209e-07.
Ответить с цитированием
  (#29 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 05.04.2009, 10:46

Цитата:
Насколько я знаю, минимальное нормализованное положительное число типа float - это FLT_MIN, а FLT_EPSILON - это разница между наименьшим числом, большим единицы, и единицей. Отличаются они довольно сильно: на моей машине FLT_MIN=1.17549e-38, а FLT_EPSILON=1.19209e-07.
Все правильно! Просто я решил выбрать такой критерий малости, то есть приближени числа к нулю. Согласен, достаточно сильно и с большим запапсом. Не помню, почему я так сделал, может в условии было задано. Используйте свой, главное, что надежно работало.
Ответить с цитированием
  (#30 (permalink)) Старый
yasya yasya вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.03.2009
По умолчанию 05.04.2009, 13:50

Все равно огромное спасибо =))
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу на C++ qi7 Вопросы начинающих программистов 0 14.11.2011 23:21
написать программу Альбина зин Pascal 2 28.10.2011 14:21
написать программу 27diesel Вопросы начинающих программистов 1 11.10.2011 10:31
написать программу Виктория123 Вопросы начинающих программистов 0 11.05.2011 14:28
Как написать программу Викусик Delphi 1 20.09.2010 10:22
Как решить задачу по схеме Халецкого Dilka Вопросы начинающих программистов 7 21.12.2009 14:48
Как написать TSR программу в С++ kosetsky Вопросы начинающих программистов 1 03.10.2009 21:25
Написать программу blackcat Задания за деньги 3 20.09.2009 12:12
Принципиальная схема и блок схема оперативной памяти DIMM SDRAM Picnik Разное 0 06.03.2009 20:08
Как написать программу в С++ FARA Вопросы начинающих программистов 9 01.11.2005 19:08
XML как написать программу imported_Aslan Другие СУБД 0 29.10.2004 12:48
Написать программу которая закрывает любую программу из автозагрузки без перезагрузк Anonymous C++ Builder 1 07.10.2003 11:24



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов