Посчитать сумму всех элементов матрицы - C (СИ)
Формулировка задачи:
Всем привет. Очень нужна ваша помощь ))
Вот код. Собственно, если вводить матрицу с консоли - всё работает. При чтении с файла - матрица читается и можно даже посчитать сумму всех элементов )) и если вывести её потом на консоль, значения в общем-то верные. Но. Невозможно посчитать сумму всех элементов этой матрицы. При первом же total+=arr[i][j] arr[i][j] = -6.2774359784998866e+066. Может ли это быть связано с переполнением буфера и как мне этого избежать?) Заранее спасибо! =)
#include "stdafx.h"
//Вспомогательная функция для расчета индекса Рандича
//int promresult принимает массив, число строк, число столбцов в нем. текущее значение i и j.
// Возвращает выражение вида 1/(v1*v1*v2*v2), где v2 - сумма по k-й строке, v1 - сумма по l-му столбцу.
float promresult(int m, int n, double **arr, int k, int l) {
int i=0;
int j=0;
float v1=0;
float v2=0;
float result;
for (i=0; i<m; ++i){
v1+=arr[i][l];
}
for (j = 0; j < n; ++j){
v2+=arr[k][j];
}
result =1/(v1*v2*v1*v2);
return result;
}
// Функция, вычисляет сумму всех элементов.
int sum(int m, int n, double **arr) {
int i=0, j=0;
int total=0;
for (i=0, total=0; i<m; ++i){
for (j = 0; j < n; ++j){
total+=arr[i][j];
}
}
return total;
}
// Функция, вычисляет значение индекса Рандича
float rand_calc(int m, int n, double **arr) {
int i, j;
float total=0;
for (i=0; i<m; ++i){
for (j = 0; j < n; ++j){
if (arr[i][j] ==1){
total += (promresult(m, n, arr, i, j))/2;
}
}
}
return total;
}
int main(){
FILE *f; // Структура, описывающая входной и выходной файл
int i, j;
float randic;
int wiener; // Индексы Рандича и Винера
int m=0; // Размеры матрицы расстояний (m х n)
char buff[512]; // Массив для ввода символов
size_t num; // Число прочитанных символов
f = fopen("c:\\distance matrix.txt", "rt"); // Открываем файл
if (f == NULL) {
perror("Error of reading");
return 1;
}
while ((num = fread(buff, 1, 512, f)) > 0)
{
for (i = 0; i < num; ++i){
if (buff[i] == '\n')
++m; // Определяем размер квадратной матрицы
}
}
fclose(f);
++m;
double **d_matrix; // Указатель на матрицу расстояний
d_matrix = (double**) malloc( m*sizeof(double *)); // Захватывает память под массив указателей
for (i = 0; i < m; ++i) {
// Захватывается память под строку с индексом i
d_matrix[i] = (double *) malloc(m * sizeof(double));
}
f = fopen("c:\\distance matrix.txt", "rt"); // Открываем файл
if (f == NULL) {
perror("Error of reading");
return 1;
}
for(i=0; i<m; i++){
for (j=0; j<m; j++){
fscanf_s(f, "%d",&d_matrix[i][j]);
}
}
fclose(f);
wiener = sum(m, m, d_matrix);
double **a_matrix; // Указатель на матрицу смежности
a_matrix = (double**) malloc( m*sizeof(double *)); // Захватывает память под массив указателей
for (i = 0; i < m; ++i) {
// Захватывается память под строку с индексом i
a_matrix[i] = (double *) malloc(m * sizeof(double));
}
for(i=0; i<m; i++){
for (j=0; j<m; j++){
if(d_matrix[i][j] == 1)
a_matrix[i][j] = 1;
else
a_matrix[i][j] = 0;
}
}
randic = rand_calc(m, m, a_matrix);
printf("Wiener = %f, Randic = %f\n", wiener, randic);
for(i=0; i<m; i++){
for (j=0; j<m; j++){
printf("%d", d_matrix [i][j]);
}
}
for(i=0; i<m; i++){
for (j=0; j<m; j++){
printf("%d", a_matrix [i][j]);
}
}
return 0;
}Решение задачи: «Посчитать сумму всех элементов матрицы»
textual
Листинг программы
total+=arr[i][j]