Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.204.218.79] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте! Помогите, пожалуйста, найти ошибку в коде. При выполнении программы создается текстовый документ(вообще 3, но интересуют только два из них, Efull.txt и M.txt) и туда записывается, например, в Efull.txt, столбец значений T, столбец Efull и третий столбец с ошибками. Первые два столбца вроде как заполняются нормально, а третий заполнен каждый раз нулями. Это лабораторная работа в универе, сравнивал с другими работами, с готовыми, там все примерно то же самое, но файлы правильно заполняются. Уже много разных изменений в код добавлял, но ничего не меняется. Ошибка вычисляется в функции double er(double *xi, double x) строка 112. Вызов функции происходит в строках 182 и 186, а печать в файл - 184 и 188.
#include <iostream> #include <cstdlib> #include <math.h> #include <fstream> #include <cmath> #include <ctime> using namespace std; void array(int n, int **arr) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { arr[i][j]=rand()%2; if(arr[i][j]==0) { arr[i][j]=-1; } cout<<arr[i][j]<<"\t"; } cout<<endl; } } void sosedi(int i, int j, int n, int *s, int **arr) { if(i==0) { s[0]=arr[n-1][j]; } else { s[0]=arr[i-1][j]; } if(i==n-1) { s[1]=arr[0][j]; } else { s[1]=arr[i+1][j]; } if(j==0) { s[2]=arr[i][n-1]; } else { s[2]=arr[i][j-1]; } if(j==n-1) { s[3]=arr[i][0]; } else { s[3]=arr[i][j+1]; } } double e1sp(int i, int j, int n, int **arr) { double sum=0.0; int s[4]; sosedi(i, j, n, s, arr); for(int a=0; a<4; a++) { sum+=arr[i][j]*s[a]; } return (-1)*sum; } double poles(int n, int **arr) { double sum=0.0; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { sum+=e1sp(i, j, n, arr); } } return sum/(n*n); } double sreden(int n, int **arr) { return poles(n, arr)/(n*n); } double namag(int n, int **arr) { double sum=0.0; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { sum+=arr[i][j]; } } return fabs(sum/(n*n)); } double tepl(double Esum1, double Esum2, double T){ double Esr=0, Esrkv=0; Esr=Esum1/10; Esrkv=Esum2/10; return (Esrkv-(Esr*Esr))/(T*T); } double er(double *xi, double x){ x/=10; double sum=0; for (int i=0; i<10; i++) { sum+=(xi[i]-x)*(xi[i]-x); } return sqrt((1/9)*sum); } int main() { int n=0; srand(time(0)); ofstream Ef, Mf, Cf; cout<<"Vvedite n:"; cin>>n; cout<<endl; int **arr=new int *[n]; for (int i=0; i<n; i++) { arr[i]=new int[n]; } array(n, arr); cout<<endl; int i=rand()%n; int j=rand()%n; cout<<"Energia vibrannogo spina="<<e1sp(i, j, n, arr)<<endl; cout<<"Energia vsey sistemi="<<poles(n, arr)<<endl; cout<<"Namagnichennost vsey sistemi="<<namag(n, arr)<<endl; sreden(n, arr); double T, Efull=0.0, M=0.0, C=0.0, Esum1=0.0, Esum2=0.0; double Estep[10], Mstep[10], Cstep[10]; double Msum=0.0, Csum=0.0; double Emist=0.0, Mmist=0.0, Cmist=0.0; Ef.open("Efull.txt"); Mf.open("M.txt"); Cf.open("C.txt"); for(T = 0.01; T<4; T+=0.1) { for(int step=0; step<10; step++) { for(long int MK=0; MK<100000; MK++) { double E1=0.0, E2=0.0, p=0.0, slch=0.0; int i=rand()%n; int j=rand()%n; E1=e1sp(i, j, n, arr); arr[i][j]=(-1)*arr[i][j]; E2=e1sp(i, j, n, arr); if(E2>=E1) { p=exp(((-1)*(E2-E1))/T); p*=100; slch=rand()%101; if(p>=slch) { arr[i][j]=(-1)*arr[i][j]; } } } Efull=poles(n, arr); Estep[step]=Efull; Esum1+=Efull; Esum2+=(Efull*Efull); Mstep[step]=namag(n, arr); Msum+=Mstep[step]; } cout<<"T="<<T<<endl; Efull=poles(n, arr); Emist=er(Estep, Esum1); cout<<"E(T)="<<Efull<<endl; Ef<<T<<"\t"<<Efull<<"\t"<<Emist<<endl; M=namag(n, arr); Mmist=er(Mstep, Msum); cout<<"M(T)="<<M<<endl; Mf<<T<<"\t"<<M<<"\t"<<Mmist<<endl; C=tepl(Esum1, Esum2, T); cout<<"C(T)="<<C<<endl; Cf<<T<<"\t"<<C<<endl; } for(int i=0; i<n; i++) { delete[] arr[i]; } delete[] arr; Ef.close(); Mf.close(); Cf.close(); } |
Сообщ.
#2
,
|
|
|
Строка 119. Выражение 1/9 целочисленное, т.к. у него целые аргументы. Результат деления 0. Естественно, все умножения дают нули.
|
Сообщ.
#3
,
|
|
|
Спасибо, получилось)
|