Ошибка при подсчете элементов массива - C (СИ)
Формулировка задачи:
Помогите исправить задачу,.. когда арккосинус вывожу из комментария программа запускается но при подсчете массива выдает ошибку с аварийным закрытием. А его нужно вставить.
#include <cstdlib>
#include <iostream>
#include <math.h>
#define N 15
#define L 15
void Zapol(double a[][N], int n, int m);
void PrintArray(double a[][N], int n, int m);
int SaveArray(double a[][N], int n, int m, char const *fname);
int SaveBin(double a[][N], int n, int m, char const *fname);
int LoadArray(double a[][N], char const *fname);
int LoadBin(double a[][N], char const *fname);
double Summa(double a[][N], int m, int k);
int main(int argc, char *argv[])
{
double A[L][N],B[L][N],C[L][N];
int n,m,k;
printf("Vvetite kolichestvo strok(4-15):");
scanf("%d",&n);
if(n<4||n>N)
{
printf("Nepravilnyi vvod\n");
system("PAUSE");
return 1;
}
printf("Vvedite kolichestvo stolbtsov (4-15):");
scanf("%d",&m);
if(m<4||m>N)
{
printf("Nepravilnyi vvod\n");
system("PAUSE");
return 1;
}
printf("\nVvedite strocy:");
scanf("%d",&k);
Zapol(A,n,m);
PrintArray(A,n,m);
printf("Summa %d strocy: %lf", k, Summa(A,m,k));
SaveArray(A,n,m,"Lab7.txt");
SaveBin(A,n,m,"Lab7Bin.txt");
LoadArray(B,"Lab7.txt");
printf("\n\n\n");
PrintArray(B,n,m);
LoadBin(C,"Lab7Bin.txt");
printf("\n\n\n");
PrintArray(C,n,m);
system("PAUSE");
return EXIT_SUCCESS;
}
void Zapol(double a[][N], int n, int m)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(i<j)
a[i][j]=cos(i+j);
else
//if(i=j)
a[i][j]=1;
//else
//acos((i+j)/(2*i+3*j));
}
}
void PrintArray(double a[][N], int n, int m)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%6.3lf ",a[i][j]);
printf("\n");
}
}
int SaveArray(double a[][N], int n, int m, char const *fname)
{
FILE *f=fopen(fname,"wt");
if(f==NULL)
{
return 0;
}
fprintf(f,"%d %d\n",n,m);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
fprintf(f,"%6.3lf ",a[i][j]);
fprintf(f,"\n");
}
fclose(f);
return 1;
}
int SaveBin(double a[][N], int n, int m, char const *fname)
{
FILE *f=fopen(fname,"wb");
if(f==NULL)
{
return 0;
}
fwrite(&n, sizeof(int),1,f);
fwrite(&m, sizeof(int),1,f);
int z;
for(z=0;z<m;z++)
for(int x=0;x<n;x++)
fwrite(a[z], sizeof(double), m, f);
fclose(f);
return 1;
}
int LoadArray(double a[][N], char const *fname)
{
int n,m;
FILE *f=fopen(fname,"rt");
if(f==NULL)
{
return 0;
}
fscanf(f,"%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
fscanf(f,"%lf",&a[i][j]);
fclose(f);
return n;
}
int LoadBin(double a[][N], char const *fname)
{
int n,m;
FILE *f=fopen(fname,"rb");
if(f==NULL)
{
return 0;
}
fread(&n,sizeof(int),1,f);
fread(&m,sizeof(int),1,f);
int z;
for(z=0;z<m;z++)
for(int x=0;x<n;x++)
fread(a[z], sizeof(double), m, f);
fclose(f);
return n;
}
double Summa(double a[][N], int m, int k)
{
double s=0;
for(int j=0;j<m;j++)
s+=a[k-1][j];
return s;
}Решение задачи: «Ошибка при подсчете элементов массива»
textual
Листинг программы
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(i<j)
a[i][j]=cos(i+j);
else
//if(i=j)
a[i][j]=1;
//else
//acos((i+j)/(2*i+3*j));// уберете комментарии и у Вас получается здесь при i==0 и j==0 деление на ноль (аварийное закрытие). Предыдущую строку if(i=j) нужно заменить на if(i==j)
Объяснение кода листинга программы
В этом коде выполняется два вложенных цикла. Первый цикл идет по строкам массива a от 0 до n-1, а второй цикл идет по столбцам массива a от 0 до m-1. Внутри двойного цикла проверяется, меньше ли значение переменной i, чем значение переменной j. Если это так, то элементу массива a[i][j] присваивается значение функции cos(i+j). Если же i больше или равно j, то проверяется, равны ли они друг другу. Если это так, то элементу массива a[i][j] присваивается значение 1. В противном случае (если i не равно j), выполняется вычисление значения функции acos((i+j)/(2i+3j)) и присваивается элементу массива a[i][j]. Комментарии в коде:
- Уберете комментарии и у Вас получается здесь при i==0 и j==0 деление на ноль (аварийное закрытие).
- Предыдущую строку if(i=j) нужно заменить на if(i==j).