• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

  • Автор темы spea
  • Дата начала
S

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];

Вроде как переменные из файла должны помещаться в массив, а затем массив индексируется. Реализовать подобное пока не получается.
Прошу дать пояснения этого исходного кода.
 
R

rrrFer

по первому куску:
Код:
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]);
}
и вообще, тут такой говнокод, что проще заново написать чем в этой ерунде разобраться. Автор, наверное, целью ставил запутать читателей
 
S

spea

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

rrrFer

пояснить последний выделенный вами кусок нельзя, порядок операций в нем ясен, но почему он такой известно только автору алгоритма.
Не было у меня такой цели)
эта цель была у того, в чьем коде вы сейчас разбираетесь.
 
S

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 файла.
 
W

Whatka

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

spea

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

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

Whatka

пока не конец файла
ты читаешь текущюю строку(итую) целиком и первое значение в массив для А ,второе для В,третее для С
каждое значение на итую позицию
 
R

rrrFer

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 ) я вот забыл )

Добавлено:
И ещё не понятно как быть, если исходные данные разбиты на 2 файла.
да ничего существенно не изменится, как ни разбивай.

Добавлено: администрация, почините теги кода
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!