![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
18192123 |
![]()
Сообщение
#1
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Дана матрица А(55). Определить массив Х из 5 элементов, каждый из которых равен сумме элементов того столбца, в котором находится первый положительный элемент соответствующей строки, и нулю, если все элементы строки неположительны.
Объясните пожалуйста, каким способом решать задачу...не могу составить конкретного алгоритма.... (есть такое предположение : записать в один массив суммы элементов каждого столбца, в другой - номер столбца, где находится первый положительный элемент строки, а после сравнивнить: равны ли очерёдный элемент второго массива и индекса 1-го массива) |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
А просто пробегать по строке в поисках первого положительного ее элемента, и если он найден - то считать сумму столбца - никак нельзя? (изначально сумме присвоить значение 0, так что если положительных нет, тот же ноль и останется...)
|
klem4 |
![]()
Сообщение
#3
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
# include <stdlib.h>
# include <stdio.h>
int ColumnSum(int **mx, int col, int n) {
int s = 0;
for (int i = 0; i < n; i++) { s += mx[i][col]; }
return s;
}
void CreateVector(int **mx, int *arr, int n) {
for (int i = 0; i < n; i++) {
int j = 0;
while ((j < n) && (mx[i][j] <= 0)) j++;
arr[i] = (j < n) ? ColumnSum(mx, j, n) : 0;
}
}
int n, *x, **m;
int main (void) {
n = 5;
x = (int*)malloc(n * sizeof(int));
m = (int**)malloc(n * sizeof(int*));
for (int i = 0; i < n; i++)
m[i] = (int*)malloc(n * sizeof(int));
srand(time(NULL));
for (i = 0; i < n; i++) {
printf("\n");
for (int j = 0; j < n; j++) {
m[i][j] = rand() % 10 - 5;
printf("%4d", m[i][j]);
}
}
CreateVector(m, x, n);
printf("\n\n");
for (i = 0; i < n; i++) printf("%5d", x[i]);
free(x);
for (i = 0; i < n; i++) free(m[i]);
free(m);
return 0;
}
упс, опоздал ![]() Сообщение отредактировано: klem4 - 5.06.2007 17:49 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
18192123 |
![]()
Сообщение
#4
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
упс, опоздал ![]() спасибо, но мне с динамической памятью не нужно было... зато взяла для себя идеи формирования вектора х...
int *mas_x (int (*a)[n], int *x)
{
int i,j;
for (j = 0; j < n; j++)
{
int sum = 0;
for (i = 0; i < n; i++)
sum+=a[i][j];
x[j] = sum;
}
for (i=0; i < n; i++)
{
j = 0;
while ((j < n)&&(a[i][j] <=0)) j++;
x[i] = (j < n) ? x[j] : 0;
}
return x;
}
//одно НО! у меня выходной массив х получается из одинаковых элементов, т.к. в строчке
//x[i] = (j < n) ? x[j] : 0;
//не могу предусмотреть изменение x[j]. в таком варианте это вообще выполнимо?
Сообщение отредактировано: 18192123 - 5.06.2007 22:34 |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата в таком варианте это вообще выполнимо? Только с использованием дополнительного локального буфера (в него заносишь суммы столбцов, а потом заполняешь этими суммами вектор X). |
klem4 |
![]()
Сообщение
#6
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
18192123, Я так понял ты хочешь сначала посчитать все суммы для столбцов ? Зачем ? А если матрица размером 1000 * 1000 ? Представляешь сколько ты лишнего времени потратишь...
Сообщение отредактировано: klem4 - 6.06.2007 6:12 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
18192123 |
![]()
Сообщение
#7
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Почему такой вариант не правильно рабатает?
int *mas_x (int (*a)[n], int *x)
{
int i,j, sum, j_pol;
for (i = 0; i < n; i++)
{
sum = 0; j_pol=-1;
for (j = 0; j < n; j++)
if (a[i][j] > 0)
{
j_pol = j;
for (j = j_pol; j < j_pol + 1; j++)
{
for (i = 0; i< n; i++)
{
sum+=a[i][j];
x[j] = sum;
} break;
}
}
}
return x;
}
|
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Цитата Почему такой вариант не правильно рабатает? Может быть потому, что ты меняешь j внутри цикла по j? for (j = 0; j < n; j++) // Цикл по какой переменной?
if (a[i][j] > 0)
{
j_pol = j;
for (j = j_pol; j < j_pol + 1; j++) // <--- Все, значение j безнадежно испорчено ...
|
18192123 |
![]()
Сообщение
#9
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Может быть потому, что ты меняешь j внутри цикла по j? а, точно... я попробывала ввести ещё одну переменную - и снова в чём-то ошибка!
int *mas_x (int (*a)[n], int *x)
{
int i,j, sum, j_pol,k;
for (i = 0; i < n; i++)
{
sum = 0; j_pol=-1;
for (j = 0; j < n; j++)
if (a[i][j] > 0)
{
j_pol = j;
for (k = j_pol; k < j_pol + 1; k++)
{ sum = 0;
for (i = 0; i< n; i++)
{
sum+=a[i][k];
x[i] = sum;
} break;
}
}
}
return x;
}
|
![]() ![]() |
![]() |
Текстовая версия | 17.07.2025 19:55 |