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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Необъяснимая проблема 
:(
    Опции темы
m1kle
Дата 28.4.2011, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Во всяком случае для меня. Проблема никак не связана с кодом, после прохода одного хода цикла, массив принимает странные значения, может из-за того, что я его переопределяю? Как это правильно делать?

Код

#include <stdio.h>
int main()
{
    int max=4, maxk=max;
    double    koeff[max][max];
    double  zn[max];
    double koeff2[max][max];
    double gt[max][max];
    double zng[max];
    double zn2[max];
    double first=0; 
    double koeff1, first2;
    koeff[1][1]=1;
    koeff[1][2]=0;
    koeff[1][3]=0;
    koeff[1][4]=0;

    koeff[2][1]=1;
    koeff[2][2]=1;
    koeff[2][3]=1;
    koeff[2][4]=1;

    koeff[3][1]=1;
    koeff[3][2]=2;
    koeff[3][3]=4;
    koeff[3][4]=8;
    
    koeff[4][1]=1;
    koeff[4][2]=3;
    koeff[4][3]=9;
    koeff[4][4]=27;
    
    zn[1] = 0;
    zn[2] = 1;
    zn[3] = 5;
    zn[4] = 14;
    
    for(int k=1; k<=maxk; k++)
    {
            first=1;
            for(int i=1; i<=max; i++)
            {
                first2=koeff[i][1];
                for(int j=1; j<=max; j++)
                {    
                    if(first==1)
                    {
                        if(koeff[i][1]!=0)koeff1=koeff[i][1];else koeff1=1;
                        if(j==1)                    if(koeff[i][1]!=0)koeff1=koeff[i][1];else koeff1=1;
                        koeff[i][j]/=koeff1;
                        if(j==1) zn[1] /= koeff1;
                        if(j==max) first=0;
                    }
                }
                for(int n=1; n<=max; n++)
                {       
                    if(i>1 && first==0)
                    {
                        koeff[i][n]=koeff[i][n]-first2*koeff[1][n];
                        if(n==1) zn[i]=zn[i]-first2*zn[1];
                    }
                    for(int h=1; h<=max; h++)
                    {
                        for(int o=1; o<=max; o++)
                        {
                            printf("%g ", koeff[h][o]);
                            if(o==max) printf(" | %g", zn[h]);
                        }
                        printf("\n");
                    }
                    printf("\n\n");
                }
            }
            for(int q=1; q<=maxk; q++)
            {
                int l=1;
                for(int g=1; g<=maxk; g++)
                {
                     koeff2[q][g]=koeff[q][g];
                     zn2[q]=zn[q];
                     if(q==k){
                         if(g>=k){ gt[k][g]=koeff[1][l]; l++;}
                         else gt[k][g]=0;
                         if(q==k){ zng[k]=zn[1];}
                     }
                }
            }
            max--;
            double     koeff[max][max];
            double zn[max];
     
            for(int q=1; q<=max; q++)
            {
                for(int g=1; g<=max; g++)
                {
                    koeff[q][g]=koeff2[q+1][g+1];
                    printf("(%g, %d %d) **%d**", koeff[q][g], koeff[0][g], q ,g);
                    zn[q]=zn2[q+1];
                    for(int h=1; h<=max; h++)
                    {
                        for(int o=1; o<=max; o++)
                        {
                            printf("%g() ", koeff[h][o]);
                            if(o==max) printf(" | %g", zn[h]);
                            printf("----");
                        }
                        printf("\n");
                    }
                    printf("\n\n");
                }
            }
     }
     
     for(int h=1; h<=maxk; h++)
     {
         for(int o=1; o<=maxk; o++)
         {
             printf("%g ", gt[h][o]);
             if(o==maxk) printf(" | %g", zng[h]);
         }
         printf("\n");
     }
      
     printf("\n\n");
     double x[maxk];
     
     printf("Answers: \n");
     for(int i=maxk; i>=1; i--)
     {
             x[i]=zng[i];
             for(int j=1; j<=(maxk-i); j++)
             {
                     x[i]-=gt[i][i+j]*x[i+j];
             }
             printf("%g\n", x[i]);
     }
    while(1){}
    return 0;
}



P.S.: Проблема с переменной double     koeff[max][max];, и только когда её размер больше 4х4

Это сообщение отредактировал(а) m1kle - 28.4.2011, 16:10
PM MAIL WWW MSN   Вверх
bsa
Дата 28.4.2011, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



m1kle, индексы массивов в языке С нумеруются с нуля. Таким образом, индекс должен быть больше или равен 0 и меньше max.
PM   Вверх
m1kle
Дата 28.4.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я сделал max=3, все начал с нуля, в циклах оставил <=, но проблема та же.

Код

#include <stdio.h>
int main()
{
    int max=3, maxk=max;
    double koeff[max][max];
    double  zn[max];
    double koeff2[max][max];
    double gt[max][max];
    double zng[max];
    double zn2[max];
    double first=0; 
    double koeff1, first2;
    koeff[0][0]=1;
    koeff[0][1]=0;
    koeff[0][2]=0;
    koeff[0][3]=0;

    koeff[1][0]=1;
    koeff[1][1]=1;
    koeff[1][2]=1;
    koeff[1][3]=1;

    koeff[2][0]=1;
    koeff[2][1]=2;
    koeff[2][2]=4;
    koeff[2][3]=8;
    
    koeff[3][0]=1;
    koeff[3][1]=3;
    koeff[3][2]=9;
    koeff[3][3]=27;
    
    zn[0] = 0;
    zn[1] = 1;
    zn[2] = 5;
    zn[3] = 14;
 
    for(int k=0; k<=maxk; k++)
    {
            first=1;
            for(int i=0; i<=max; i++)
            {
                first2=koeff[i][0];
                for(int j=0; j<=max; j++)
                {    
                    if(first==1)
                    {
                        if(koeff[i][0]!=0)koeff1=koeff[i][0];else koeff1=1;
                        if(j==0)                    if(koeff[i][0]!=0)koeff1=koeff[i][0];else koeff1=1;
                        koeff[i][j]/=koeff1;
                        if(j==0) zn[0] /= koeff1;
                        if(j==(max-1)) first=0;
                    }
                }
                for(int n=0; n<=max; n++)
                {       
                    if(i>0 && first==0)
                    {
                        koeff[i][n]=koeff[i][n]-first2*koeff[0][n];
                        if(n==0) zn[i]=zn[i]-first2*zn[0];
                    }
                    for(int h=0; h<=max; h++)
                    {
                        for(int o=0; o<=max; o++)
                        {
                            printf("%g ", koeff[h][o]);
                            if(o==max) printf(" | %g", zn[h]);
                        }
                        printf("\n");
                    }
                    printf("\n\n");
                }
            }
            for(int q=0; q<=maxk; q++)
            {
                int l=0;
                for(int g=0; g<=maxk; g++)
                {
                     koeff2[q][g]=koeff[q][g];
                     zn2[q]=zn[q];
                     if(q==k){
                         if(g>=k){ gt[k][g]=koeff[0][l]; l++;}
                         else gt[k][g]=0;
                         if(q==k){ zng[k]=zn[0];}
                     }
                }
            }
            max--;
            double     koeff[max][max];
            double zn[max];
     
            for(int q=0; q<=max; q++)
            {
                for(int g=0; g<=max; g++)
                {
                    koeff[q][g]=koeff2[q+1][g+1];
                    printf("(%g, %d %d) **%d**", koeff[q][g], koeff[0][g], q ,g);
                    zn[q]=zn2[q+1];
                    for(int h=0; h<=max; h++)
                    {
                        for(int o=0; o<=max; o++)
                        {
                            printf("%g() ", koeff[h][o]);
                            if(o==max-1) printf(" | %g", zn[h]);
                            printf("----");
                        }
                        printf("\n");
                    }
                    printf("\n\n");
                }
            }
     }
     
     for(int h=0; h<=maxk; h++)
     {
         for(int o=0; o<=maxk; o++)
         {
             printf("%g ", gt[h][o]);
             if(o==maxk) printf(" | %g", zng[h]);
         }
         printf("\n");
     }
      
     printf("\n\n");
     double x[maxk];
     
     printf("Answers: \n");
     for(int i=maxk; i>=1; i--)
     {
             x[i]=zng[i];
             for(int j=0; j<=(maxk-i); j++)
             {
                     x[i]-=gt[i][i+j]*x[i+j];
             }
             printf("%g\n", x[i]);
     }
    while(1){}
    return 0;
}


PM MAIL WWW MSN   Вверх
bsa
Дата 28.4.2011, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(m1kle @  28.4.2011,  16:36 Найти цитируемый пост)
 циклах оставил <=, но проблема та же

так как размер массивов у тебя зависит от max, то уменьшив ее до 3-х, ты уменьшил и массивы. Короче, замени на знак меньше.
PM   Вверх
m1kle
Дата 28.4.2011, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Если заменить на знак меньше, он неправильно работает. Я сделал 3, но в цикле он проходиться по переменным начиная с нуля, а не с единицы, как было раньше.

P.S.: Главная загадка - почему он из zn[] перекладывает в koeff, когда в коде нигде такого нету. א

Это сообщение отредактировал(а) m1kle - 28.4.2011, 17:19
PM MAIL WWW MSN   Вверх
bsa
Дата 29.4.2011, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Код
    int max=3, maxk=max;
    double koeff[max][max];
    double  zn[max];
    double koeff2[max][max];
    double gt[max][max];
    double zng[max];
    double zn2[max];
 
Этот код дделает тебе массивы, которые могут содержать только ТРИ элемента. А когда ты делаешь цикл от 0 до 3-х включительно (0, 1, 2, 3), то ты выходишь за границу массива и залазишь на другие данные. Твоем случае, соседний массив. А бывает еще хуже - адрес возврата в вызывающую функцию, что приводит к краху приложения.

Добавлено через 3 минуты и 48 секунд
Этот код тоже ошибку содержит:
Код
for(int i=maxk; i>=1; i--)
     {
             x[i]=zng[i];
             for(int j=0; j<=(maxk-i); j++)
             {
                     x[i]-=gt[i][i+j]*x[i+j];
             }
             printf("%g\n", x[i]);
     }
Так как индекс maxk (в твоем случае равный max) не допустим. Запомни, допустимыми индексами массива являются 0,..., (max-1). Ты же можешь думать все что захочешь, но это так, и никак иначе (просьба профессионалам не рассказывать о методах, как это утверждение можно опровергнуть).
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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