Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2009, 13:10   #1
spirit_trapper
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 19
По умолчанию Двумерные массивы. Сумма элементов столбца. (Си)

Есть задача:

Сформировать матрицу Типа A=(aij), где

aij={(1/(i^2+2)), i<=j} (Это система уравнений)
{(1/(i+j)), i>j}

Найти сумму элементов k-го столбца.

Вот такой код получился:

Код:
#include <ncurses.h>
#include <stdio.h>
#include <math.h>
# define N 20

int Str (double A[N][N], int a, int b);
int Stb (double A[N][N], int a, int b);
double s(int i, int j);
double Summ(double A[N][N], int k, int b);

int main()
{
	double A[N][N], B[N][N];
	int M=20,a,b,k;
	
	do
	{
		clear;
		printf ("Введите a: ");
		scanf ("%u", &a);
		printf ("Введите b: ");
		scanf ("%u", &b);
	}
	while (a>M && b>M);
	printf("\n");
	Str (A,a,b);
	Stb (A,a,b);
	do
	{
		printf ("\nВведите k: ");
		scanf ("%u", &k);
	}
	while (0>=k||k>a);
	printf ("\nСумма элементов k-столбца=%-7.4lf", Summ(A,k,b));
	return 0;
	getch();
}

int Str (double A[N][N], int a, int b)
{
	int i,j;
	for (i=0; i<a; i++)
	{
		for (j=0; j<b; j++)
		A[i][j]=s(i,j);
	}
	return i,j;
}

int Stb (double A[N][N], int a, int b)
{
	int i,j;
	
	for (i=0; i<a; i++)
	{
		for (j=0; j<b; j++)
		printf ("A[%d][%d]=%-7.4lf", i+1, j+1, A[i][j]);
	}
	printf ("\n");
	return i,j;
}

double s(int i, int j)
{
	if (i<=j)
	return (1/((i*i)+2));
	else
	if (i>j)
	return (1/(i+j));
}

double Summ(double A[N][N], int k, int b)
{
	int i,j;
	double sum=A[0][k];
	
	for (j=0; j<b; j++)
	{
		sum=0.0;
		for(i=0; i<=N; i++)
		A[i][j]+=sum;
	return sum;
	}
}
Но сумма не находится, и вместо матрицы значений выдается матрица заполненная нулями. В чем проблема?

Последний раз редактировалось spirit_trapper; 23.12.2009 в 13:13.
spirit_trapper вне форума Ответить с цитированием
Старый 23.12.2009, 13:49   #2
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Код:
		for(i=0; i<=N; i++)
		A[i][j]+=sum;
исправьте на
Код:
		for(i=0; i<=N; i++)
		sum+=A[i][j];
но, думаю что это сумма строки, для столбца
д.б A[j][i]
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 23.12.2009, 15:10   #3
spirit_trapper
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 19
По умолчанию

Sweta
Спасибо. Работает.

Есть ещё ошибки, только я не могу понять где. На выходе получается матрица заполненная нулями (а должны быть значения, отличные от нуля, я думаю) и одной единицей, а при вводе к - вообще опять появляется "Введите к: ". В чем здесь проблема. Не могу додуматься никак.
spirit_trapper вне форума Ответить с цитированием
Старый 23.12.2009, 15:17   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Код:
while (0>=k||k>a);
Может нужно от нуля до а (0 < k < a)?
Код:
while (0 <= k && k < a);
psycho-coder вне форума Ответить с цитированием
Старый 23.12.2009, 15:37   #5
spirit_trapper
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 19
По умолчанию

Цитата:
Сообщение от psycho-coder Посмотреть сообщение
Может нужно от нуля до а (0 < k < a)?
Не помогает. Всё равно выдает нулевые значения в матрице.

Хотя К теперь считает. Спасибо. Хотя в данном случае К неизменно =0.
spirit_trapper вне форума Ответить с цитированием
Старый 23.12.2009, 15:41   #6
spirit_trapper
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 19
По умолчанию

Напишу код как он выглядит после изменений:

Код:
#include <ncurses.h>
#include <stdio.h>
#include <math.h>
# define N 20

int Str (double A[N][N], int a, int b);
int Stb (double A[N][N], int a, int b);
double s(int i, int j);
double Summ(double A[N][N], int k, int b);

int main()
{
	double A[N][N], B[N][N];
	int M=20,a,b,k;
	
	do
	{
		clear;
		printf ("Введите a: ");
		scanf ("%u", &a);
		printf ("Введите b: ");
		scanf ("%u", &b);
	}
	while (a>M && b>M);
	printf("\n");
	Str (A,a,b);
	Stb (A,a,b);
	do
	{
		printf ("\nВведите k: ");
		scanf ("%u", &k);
	}
	while (0 <= k && k < a);
	printf ("\nСумма элементов k-столбца=%-7.4lf", Summ(A,k,b));
	return 0;
	getch();
}

int Str (double A[N][N], int a, int b)
{
	int i,j;
	for (i=0; i<a; i++)
	{
		for (j=0; j<b; j++)
		A[i][j]=s(i,j);
	}
	return i,j;
}

int Stb (double A[N][N], int a, int b)
{
	int i,j;
	
	for (i=0; i<a; i++)
	{
		for (j=0; j<b; j++)
		printf ("A[%d][%d]=%-7.4lf", i+1, j+1, A[i][j]);
	}
	printf ("\n");
	return i,j;
}

double s(int i, int j)
{
	if (i<=j)
	return (1/((i*i)+2));
	else
	if (i>j)
	return (1/(i+j));
}

double Summ(double A[N][N], int k, int b)
{
	int i,j;
	double sum=A[0][k];
	
	for (j=0; j<b; j++)
	{
		sum=0.0;
		for(i=0; i<=N; i++)
		sum+=A[j][i];
	return sum;
	}
}
spirit_trapper вне форума Ответить с цитированием
Старый 23.12.2009, 16:45   #7
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

исправте
Код:
int Str (double A[N][N], int a, int b);
int Stb (double A[N][N], int a, int b);
и
Код:
int Str (double A[N][N], int a, int b)
{
	int i,j;
	for (i=0; i<a; i++)
	{
		for (j=0; j<b; j++)
		A[i][j]=s(i,j);
	}
	return i,j;
}

int Stb (double A[N][N], int a, int b)
{
	int i,j;
	
	for (i=0; i<a; i++)
	{
		for (j=0; j<b; j++)
		printf ("A[%d][%d]=%-7.4lf", i+1, j+1, A[i][j]);
	}
	printf ("\n");
	return i,j;
}
на
Код:
void Str (double A[N][N], int a, int b);
void Stb (double A[N][N], int a, int b);
Код:
void Str (double A[][N], int a, int b)
{
	int i,j;
	for (i=0; i<a; i++)
        	for (j=0; j<b; j++)
	     	A[i][j]=s(i,j);

}

void Stb (double A[][N], int a, int b)
{
 int i,j;
 for (i=0; i<a; i++)
  {
   for (j=0; j<b; j++)
   printf ("A[%d][%d]=%-7.4lf", i, j, A[i][j]);
   printf ("\n");
   }
}
и массив будет заполняться в соответствии с заданием.
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 23.12.2009, 17:06   #8
spirit_trapper
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 19
По умолчанию

Sweta

Не выходит.

Вот код:

Код:
#include <ncurses.h>
#include <stdio.h>
#include <math.h>
# define N 20

void Str (double A[N][N], int a, int b);
void Stb (double A[N][N], int a, int b);
double s(int i, int j);
double Summ(double A[N][N], int k, int b);

int main()
{
	double A[N][N], B[N][N];
	int M=20,a,b,k;
	
	do
	{
		clear;
		printf ("Введите a: ");
		scanf ("%u", &a);
		printf ("Введите b: ");
		scanf ("%u", &b);
	}
	while (a>M && b>M);
	printf("\n");
	Str (A,a,b);
	Stb (A,a,b);
	do
	{
		printf ("\nВведите k: ");
		scanf ("%u", &k);
	}
	while (0 <= k && k < a);
	printf ("\nСумма элементов k-столбца=%-7.4lf", Summ(A,k,b));
	return 0;
	getch();
}

void Str (double A[][N], int a, int b)
{
	int i,j;
	for (i=0; i<a; i++)
        	for (j=0; j<b; j++)
	     	A[i][j]=s(i,j);

}

void Stb (double A[][N], int a, int b)
{
 int i,j;
 for (i=0; i<a; i++)
  {
   for (j=0; j<b; j++)
   printf ("A[%d][%d]=%-7.4lf", i, j, A[i][j]);
   printf ("\n");
   }
}

double s(int i, int j)
{
	if (i<=j)
	return (1/((i*i)+2));
	else
	if (i>j)
	return (1/(i+j));
}

double Summ(double A[N][N], int k, int b)
{
	int i,j;
	double sum=A[0][k];
	
	for (j=0; j<b; j++)
	{
		sum=0.0;
		for(i=0; i<=N; i++)
		sum+=A[j][i];
	return sum;
	}
}
Вот как он выполняется:

Код:
spirit_trapper@spirit:~/CPP$ ./laba_4
Введите a: 8                                                          
Введите b: 8                                                          

A[0][0]=0.0000 A[0][1]=0.0000 A[0][2]=0.0000 A[0][3]=0.0000 A[0][4]=0.0000 A[0][5]=0.0000 A[0][6]=0.0000 A[0][7]=0.0000 
A[1][0]=1.0000 A[1][1]=0.0000 A[1][2]=0.0000 A[1][3]=0.0000 A[1][4]=0.0000 A[1][5]=0.0000 A[1][6]=0.0000 A[1][7]=0.0000
A[2][0]=0.0000 A[2][1]=0.0000 A[2][2]=0.0000 A[2][3]=0.0000 A[2][4]=0.0000 A[2][5]=0.0000 A[2][6]=0.0000 A[2][7]=0.0000
A[3][0]=0.0000 A[3][1]=0.0000 A[3][2]=0.0000 A[3][3]=0.0000 A[3][4]=0.0000 A[3][5]=0.0000 A[3][6]=0.0000 A[3][7]=0.0000
A[4][0]=0.0000 A[4][1]=0.0000 A[4][2]=0.0000 A[4][3]=0.0000 A[4][4]=0.0000 A[4][5]=0.0000 A[4][6]=0.0000 A[4][7]=0.0000
A[5][0]=0.0000 A[5][1]=0.0000 A[5][2]=0.0000 A[5][3]=0.0000 A[5][4]=0.0000 A[5][5]=0.0000 A[5][6]=0.0000 A[5][7]=0.0000
A[6][0]=0.0000 A[6][1]=0.0000 A[6][2]=0.0000 A[6][3]=0.0000 A[6][4]=0.0000 A[6][5]=0.0000 A[6][6]=0.0000 A[6][7]=0.0000
A[7][0]=0.0000 A[7][1]=0.0000 A[7][2]=0.0000 A[7][3]=0.0000 A[7][4]=0.0000 A[7][5]=0.0000 A[7][6]=0.0000 A[7][7]=0.0000

Введите k: 5

Введите k: 1

Введите k: 2

Введите k: 8

Сумма элементов k-столбца=1.0000
т.е. в матрице выдаются нули, а запрос K повторяется пока я не введу значение, равное а или b. И даже в этом случае почему-то выдается 1.
spirit_trapper вне форума Ответить с цитированием
Старый 23.12.2009, 17:08   #9
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

замените программу суммирования на
Код:
double Summ(double A[][N], int k, int a)
{
	int i;
	double sum=A[0][k];

	for (i=1; i<=a; i++)
	sum+=A[i][k];
	return sum;
}
и вызов ее на
Код:
	printf ("\nСумма элементов k-столбца=%-7.4lf", Summ(A,k,a))
Только вот у меня есть замечание
A[i][j] i-это строка; j- это столбец и элементы массива индексируются с 0. Поэтому при вводе столбца необходимо проверять, что 0< k<b но если Вам 0 сердцу не мил, то в функции суммирования необходимо вычесть 1.
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 23.12.2009, 17:09   #10
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Код:
double s(int i, int j)
{
	if (i<=j)
	return (1.0/((i*i)+2));
	else
	if (i>j)
	return (1.0/(i+j));
}
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подсчитать суммы элементов заданной строки и заданного столбца и определить, где сумма минимальна lubov09 Помощь студентам 4 11.11.2009 17:02
Сумма четных элементов матрицы. Произведение элементов 3-го столбца. Минимальный элемент матрицы. renovare Помощь студентам 2 03.07.2009 21:13
В прямоугольной матрице переставить столбцы так, чтобы сумма элементов столбца росла от первого столбца Aleo13 Помощь студентам 5 15.10.2008 18:34