Пояснение Кода

Тема в разделе "Общие вопросы по С и С++", создана пользователем spea, 22 окт 2012.

  1. spea

    spea Гость

    Есть в наличии готовая программа для определенных математических расчетов, по её аналогу пытаюсь сделать программу для своих целей.
    Вот кусок кода исходной программы
    Код (C++):
    #include<windows.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<conio.h>
    #include<string.h>

    int i,kt,K,nom[530];
    double B1,L1,B[530],L[530];
    float H1,H[530],dg0,dg[530];
    int j,i1;
    float SUM,b;
    double SGES[530],xi0[530],;
    char buf[100];
    FILE *fp,*fpT;

    void StGES(int j1);
    int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR    lpCmdLine,
    int   nCmdShow)
    {
    // TODO: Place code here.
    int j1;
    b=(1000.0/71.0)*(1000.0/71.0);
    fpT=fopen("C\\T.txt","w"); /*Чтение исходных данных*/
    fp=fopen("C:\\1.txt","rt");
    fscanf(fp,"%d",&kt);
    // printf("%d\n",kt); // getch();  
    for(i=1;i<=kt;i++)   {fscanf(fp,"%d%lf%lf%f%f",&K,&B1,&L1,&H1,&dg0);
    nom[i]=K;
    B[K]=B1;
    L[K]=L1;
    H[K]=H1;
    dg[K]=dg0; 
    fprintf(fpT,"%4.0d%10.5lf%10.5lf%10.5f%6.3f\n",K,B1,L1,H1,dg0);
    //MessageBox(NULL,buf,"Готовность",MB_OK); exit(0);
    }    
    //sprintf(buf,"%d",K);
    /*Определение xi0*/
    for (i=1;i<=kt;i++)
    {SUM=0;
    for(j=1;j<=kt;j++)
    {if (nom[i]!=nom[j])
    {i1=nom[i];
    j1=nom[j];
    //printf("i.j\n");
    //getch();
    //printf("%d\n%d\n",i,j);
    // getch();
    StGES(j1);
    SUM=SUM+dg[j1]*SGES[j1];
    //printf("SUM=");
    //printf("%lf\n",SUM);
    //getch();
    } /*for if*/
    }/*forj *///exit(0);
    xi0[i1]=(dg[i1]-SUM*b/(8*pi))/(2*pi);
    }


    ..........
    Плохо понятна вот эта часть:
    Код (C++):
     for(i=1;i<=kt;i++)  {fscanf(fp,"%d%lf%lf%f%f",&K,&B1,&L1,&H1,&dg0);
    nom[i]=K;
    B[K]=B1;
    L[K]=L1;
    H[K]=H1;
    dg[K]=dg0;
    и эта:
    Код (C++):
    //sprintf(buf,"%d",K);
    /*Определение xi0*/
    for (i=1;i<=kt;i++)
    {SUM=0;
    for(j=1;j<=kt;j++)
    {if (nom[i]!=nom[j])
    {i1=nom[i];
    j1=nom[j];
    Вроде как переменные из файла должны помещаться в массив, а затем массив индексируется. Реализовать подобное пока не получается.
    Прошу дать пояснения этого исходного кода.
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    по первому куску:
    Код (Text):
    for(i=1;i<=kt;i++) {
    fscanf(fp,"%d%lf%lf%f%f",&nom[i],&B[K],&L[K],&H[K],&dg[K]);  
    fprintf(fpT,"%4.0d%10.5lf%10.5lf%10.5f%6.3f\n",K,nom[i],B[K],L[K],H[K],dg[K]);
    }
    и вообще, тут такой говнокод, что проще заново написать чем в этой ерунде разобраться. Автор, наверное, целью ставил запутать читателей
     
  3. spea

    spea Гость

    Не было у меня такой цели) Программированием буквально 2 дня занимаюсь. Просто возникла необходимость написать программу, а сроки крайне ограничены, вот и пытаюсь разобраться в чем-нибудь готовом и по моей теме.
     
  4. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    пояснить последний выделенный вами кусок нельзя, порядок операций в нем ясен, но почему он такой известно только автору алгоритма.
    эта цель была у того, в чьем коде вы сейчас разбираетесь.
     
  5. spea

    spea Гость

    А если начинать с нулю, то как это лучше реализовать?
    Попробую кратко описать задачу. Имеются данные в txt файле в следующем виде:
    23.020834 56.979168 -9.01
    23.062500 56.979168 -10.37
    23.104166 56.979168 -11.98
    23.145834 56.979168 -13.84
    23.187500 56.979168 -15.44
    23.229166 56.979168 -17.79
    23.312500 56.979168 -18.47
    23.354166 56.979168 -19.25
    23.395834 56.979168 -20.15Количество строк заранее не известно, их около 30 000. В каждой строке 3 характеристики (A, B, C) одной точки. Точки можно условно пронумеровать от 1 до k.
    В общем, для каждой точки нужно рассчитать ещё одно значение (D).
    Для i-ой точки D= сумма произведений C[sub]k[/sub] * (A[sub]k[/sub] - A[sub]i[/sub]) * (B[sub]k[/sub] - B[sub]i[/sub]).
    Так например для первой точки D[sub]1[/sub] = C[sub]1[/sub] * (A[sub]1[/sub] - A[sub]1[/sub]) * (B[sub]1[/sub] - B[sub]1[/sub]) + C[sub]2[/sub] * (A[sub]2[/sub] - A[sub]1[/sub]) * (B[sub]2[/sub] - B[sub]1[/sub]) + ... + C[sub]k[/sub] * (A[sub]k[/sub] - A[sub]1[/sub]) * (B[sub]k[/sub] - B[sub]1[/sub])

    Основная мысль в том, что сначала исходные данные нужно считать в массив, затем проиндексировать и составить алгоритм расчета D. Но вместо всего столбца удается считать только первое значение.
    И ещё не понятно как быть, если исходные данные разбиты на 2 файла.
     
  6. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    возможно строки?вы имели в виду?
    мне кажется тогда 2 массива надо использовать
     
  7. spea

    spea Гость

    По идее для каждой характеристики (A, B, C, а затем и для D) должен быть отдельный массив, так как быть если они записаны в столбик?

    Чувствую, что говорю какой-то бред, но других идей пока нет.
     
  8. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    пока не конец файла
    ты читаешь текущюю строку(итую) целиком и первое значение в массив для А ,второе для В,третее для С
    каждое значение на итую позицию
     
  9. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    struct SomeStruct {
    float a, b, c;
    };
    std::vector<SomeStruct> someVector;

    //...

    SomeStruct t;
    std::ifstream ifst("in.txt");
    while (0 == ifst.eof()) {
    ifst >> t.a >> t.b >> t.c;
    someVector.push_back(t);
    }

    // теперь весь твой файл считан в вектор, осталось только рассчитать.



    Добавлено: а тегами кода я не пользуюсь потому что они не работают.

    Добавлено: весь файл можно засунуть в вектор, если там 30.000 записей...то это займет примерно 100Кб памяти

    Добавлено: и не забудь закрыть поток ifst ) я вот забыл )

    Добавлено:
    да ничего существенно не изменится, как ни разбивай.

    Добавлено: администрация, почините теги кода
     
Загрузка...

Поделиться этой страницей