Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Матрицы и массивы в языке C.

Илья Волков Ученик (94), на голосовании 1 неделю назад
Задание такое: дана матрица A(N,M), которая вводится из файла, и число k,
вводимое с клавиатуры. В k-ом столбце найти максимальный элемент.
В той строке, где этот элемент находится, найти сумму модулей
элементов.

Я составил следующий код:

 #include <stdio.h> 
#include <stdlib.h>
#include <math.h>
int xsum(int k, int n, int **x)
{
int i, s=0;
for(i=0; i<n; i++)
s += fabs(x[k][i]);
return s;
}

void xmax(int n, int*x, int*r, int*k)
{
int i;
*r=x[0]; *k=0;
for(i=1;i<n;i++)
if (x[i]>*r)
{
*r=x[i]; *k=i;
}
return;
}

int main()
{
int i, j, n, m, k, r, *y, *x, *s, **a;
FILE *in;
if((in=fopen("digits.txt","r"))==NULL){
printf("\nFile is not opened");
getchar();
exit(1);
}

printf("Type values of m and n: ");

scanf("%d%d", &m, &n);
x=(int*)malloc(n*sizeof(int));
s=(int*)malloc(n*sizeof(int));
a=(int**)malloc(m*sizeof(int*));

for(i=0;i<m;i++)
a[i]=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
for(j=0;j<m;j++)
fscanf(in, "%d",&a[i][j]);

printf("Type the number of the column (k): ");

scanf("%d", &k);

xmax(m, y, &r, &k);

y = (int*)malloc(n * sizeof(int));

for(i=0;i<n;i++)
y[i] = a[i][k];

printf("summ = %d, max_element = %d", xsum(k, n, a), r);

for(i=0;i<n;i++)
free(a[i]);
free(a); free(x); free(s); free(y);
fclose(in);

getchar();
}

Пробовал вводить разные значения — ответы неверные. Например, при m = 3 и n = 3 программа выдает: "summ = 12, max_element = 1077940385". Подскажите, в чем ошибка?

Файл txt такой: 3 -4 5 -5 0 1 -1 -2 3.
Дополнен 1 месяц назад
 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
int xsum(int k, int n, int **x)
{
int i, s=0;
for(i=0; i<n; i++)
s += fabs(x[k][i]);
return s;
}

void xmax(int n, int*x, int*r, int*k)
{
int i;
*r=x[0]; *k=0;
for(i=1;i<n;i++)
if (x[i]>*r)
{
*r=x[i]; *k=i;
}
return;
}

int main()
{
int i, j, n, m, k, r, *y, *x, *s, **a;
FILE *in;
if((in=fopen("digits.txt","r"))==NULL){
printf("\nFile is not opened");
getchar();
exit(1);
}

printf("Type values of m and n: ");

scanf("%d%d", &m, &n);
x=(int*)malloc(n*sizeof(int));
s=(int*)malloc(n*sizeof(int));
a=(int**)malloc(m*sizeof(int*));

for(i=0;i<m;i++)
a[i]=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
for(j=0;j<m;j++)
fscanf(in, "%d",&a[i][j]);

printf("Type the number of the column (k): ");

scanf("%d", &k);

xmax(m, y, &r, &k);

y = (int*)malloc(n * sizeof(int));

for(i=0;i<n;i++)
y[i] = a[i][k];

printf("summ = %d, max_element = %d", xsum(k, n, a), r);

for(i=0;i<n;i++)
free(a[i]);
free(a); free(x); free(s); free(y);
fclose(in);

getchar();
}
Голосование за лучший ответ
Хлебушек Оракул (76341) 1 месяц назад
судя по значению max_element, вероятно ты забыл инициировать его нулем
Илья ВолковУченик (94) 1 месяц назад
А что будет, если не инициировать? Какое значение вместо нуля ставится?
Хлебушек Оракул (76341) Илья Волков, любое, которое было до этого в памяти
Данил ДудинковУченик (161) 2 недели назад
Инициализировать нулëм не лучшая идея, т.к. всё елементы могут быть меньше нуля. Изначально лучше записать первое считанное значение, затем сравнивать с последующими и перезаписывать.
Похожие вопросы