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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2010, 03:13   #1
Evgen51
 
Регистрация: 24.11.2009
Сообщений: 5
Восклицание Функции в си. Вывод двумерного массива из функции.

Здравствуйте.
Помогите, пожалуйста.

Есть задание
Цитата:
Дана действительная матpица A[ij],i,j=1,..,n.Получить действительную матpицу B[ij],i,j=1,...,n,
элемент Bij котоpой pавен сумме отрицательных
элементов данной матpицы,pасположенных в области,
опpеделяемой индексами i,j так, как показано на pисунке
(область обозначена точками, включая границы).

Обработку массива вынести в отдельную функцию.
Все данные, необходимые функции, должны быть переданы ей как параметры.
ВСЕ ПЕРЕМЕННЫЕ ДОЛЖНЫ БЫТЬ ОБЪЯВЛЕНЫ НА ВНУТРЕННЕМ УРОВНЕ.
Ввод-вывод в функции крайне нежелателен

┌─────────────┐
│ │
│ │
│ │
│ │
├─────── a(i,j) │
│............│ │
│............│ │
│............│ │
│............│ │
│............│ │
└─────────────┘
В самой программе, я более мене разобрался, вот только не знаю как сделать так, чтобы моя функция возвращала мой двумерный массив B. Через return нельзя, надо как-то работать с указателями.

Вот, выкладываю свой код.

Цитата:
void massiv (int N, int M, double **A, double **B)
{ int i,j,l,k;
double sum=0;
for (i = 0; i < N; i++) {
for (j = 0; i < M; j++) {
for (l=i; l < N; l++) {
for (k=0; k < j; k++) {
if (A[k][l]<0) { sum = sum+A[k][l];}}}
B[i][j]=sum;
}
}
}
int main()
..............
printf ("Vvedenu B massiv \n");
for (i = 0; i < N; i++)
{for (j = 0; j < M; j++)
{printf("%g ",B[i][j]);}
printf("\n");};
printf("\n");
...............
Рисунок немного сьехал, поэтому прилагаю скрин
Программа на языке Си.
Спасибо за внимание, надеюсь на помощь.
Изображения
Тип файла: jpg Картинка.JPG (13.4 Кб, 463 просмотров)

Последний раз редактировалось Evgen51; 12.05.2010 в 03:23.
Evgen51 вне форума Ответить с цитированием
Старый 12.05.2010, 09:00   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Почему же нежелателен?
Код:
int* NewMatrix(int* A, int N)
 {
 int** B = new int*[N];
 for (int i = 0; i < N; i++)
  B[i] = new int[N];
 for (int i = 0; i < N; i++)
  for (int j = 0; j < N; j++)
   {
   //Здесь определяете чему равен B[i][j]
   }
 return B;
 }

int main()
{
int** A;
int N;
//Здесь пользователь вводит N и все элементы A
int** B = NewMatrix(A, N);
//Выводите матрицу B
}
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 12.05.2010, 12:48   #3
Evgen51
 
Регистрация: 24.11.2009
Сообщений: 5
По умолчанию

Гром
Спасибо, но у меня язык Си, а там нельзя использовать new, как в си++
Да, и массив А - двумерный.

Сделал вот так, посмотрите пожалуйста

Цитата:
int massiv (int N, int M, float **A)
{ int i,j,l,k;
float sum=0, **B;


B = (float **)malloc(N*sizeof(float *));
for(i=0;i<N;i++)
B[i] = (float *)malloc(N*sizeof(float));


for (i = 0; i < N; i++) {
for (j = 0; i < M; j++) {
for (l=i; l < N; l++) {
for (k=0; k < j; k++) {
if (A[k][l]<0) { sum = sum+A[k][l];}}}
B[i][j]=sum;
}
}
return (B);
}
int main();
..........................
printf ("Vvedenu B massiv \n");
for (i = 0; i < N; i++)
{for (j = 0; j < M; j++)
{
float **B = massiv(N,M,A);
printf(" %g ",B[i][j]);}
printf("\n");};
printf("\n");
Программа комилируется, но после сообщения Vvedenu B massiv, на экран ничего не выводит и затормаживается.
Evgen51 вне форума Ответить с цитированием
Старый 12.05.2010, 13:01   #4
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

В главной функции массив B нужно заполнять перед тем как выводишь и не в цикле
Код:
printf ("Vvedenu B massiv \n");
float **B = massiv(N,M,A);
for (i = 0; i < N; i++)
{for (j = 0; j < M; j++)
    printf(" %g ",B[i][j]);
  printf("\n");
};
printf("\n");
И перед этим надеюсь не забыл заполнить массив А
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 12.05.2010, 13:33   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Во-первых, используйте не тег QUOTE, а тег CODE для кода (он прямо справа от QUOTE).
Во-вторых, new/delete или malloc/free - не суть важно в данном случае, просто деталь реализации.
В-третьих, вводить надо только массив A, массив B будет сформирован на его основе.
В-четвертых, printf печатает, а не считывает переменные.
Ввод матрицы A будет выглядеть где-то так:
Код:
int** A;
//Выделение памяти
int i, j;
for (i = 0; i < N; i++)
 for (j = 0; j < N; j++)
  {
  printf("\nEnter A[%d][%d]: ", i , j);
  scanf("%d", &A[i][j]);
  }
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 12.05.2010, 15:24   #6
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

А потом то что я писал
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 12.05.2010, 15:56   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Хм, похоже, я не так прочитал. Так что "в-четвертых" снимается - поглючило меня.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 12.05.2010, 17:02   #8
Maks1978
Пользователь
 
Аватар для Maks1978
 
Регистрация: 25.05.2008
Сообщений: 53
По умолчанию

Цитата:
Сделал вот так, посмотрите пожалуйста
Цитата:
int massiv (int N, int M, float **A)
{ int i,j,l,k;
float sum=0, **B;


B = (float **)malloc(N*sizeof(float *));
for(i=0;i<N;i++)
B[i] = (float *)malloc(N*sizeof(float));


for (i = 0; i < N; i++) {
for (j = 0; i < M; j++) {
for (l=i; l < N; l++) {
for (k=0; k < j; k++) {
if (A[k][l]<0) { sum = sum+A[k][l];}}}
B[i][j]=sum;
}
}
return (B);
}
int main();
..........................
printf ("Vvedenu B massiv \n");
for (i = 0; i < N; i++)
{for (j = 0; j < M; j++)
{
float **B = massiv(N,M,A);
printf(" %g ",B[i][j]);}
printf("\n");};
printf("\n");
Программа комилируется, но после сообщения Vvedenu B massiv, на экран ничего не выводит и затормаживается.
Проверь оригинал, а именно часть кода:
Код:
B = (float **)malloc(N*sizeof(float *));
for(i=0;i<N;i++)
B[i] = (float *)malloc(N*sizeof(float));
В первой строке наверное у тебя ошибка:
Код:
B = (float **)malloc(N*sizeof(float *));
Наверное нужно исправить на:
Код:
B = (float **)malloc(М*sizeof(float *));
Maks1978 вне форума Ответить с цитированием
Старый 12.05.2010, 20:26   #9
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Да вроде бы
Цитата:
i,j=1,..,n
Значит матрица квадратная и, по идее, там вообще не должно быть M.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 13.05.2010, 03:59   #10
Evgen51
 
Регистрация: 24.11.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от mrChester Посмотреть сообщение
А потом то что я писал
Все верно, но если использовать вот такую функцию, то компилятор почему-то выдавал ошибку.

Код:
{ int i,j,l,k;
float sum=0, **B;


B = (float **)malloc(N*sizeof(float *));
for(i=0;i<N;i++)
B[i] = (float *)malloc(N*sizeof(float));


for (i = 0; i < N; i++) {
for (j = 0; i < M; j++) {
for (l=i; l < N; l++) {
for (k=0; k < j; k++) {
if (A[k][l]<0) { sum = sum+A[k][l];}}}
B[i][j]=sum;
}
}
return (B);
}
Цитата:
В-третьих, вводить надо только массив A, массив B будет сформирован на его основе.
Массив B я нигде не вводил, просто выделял под него память динамически.

Maks1978
Насчет ошибки - все верно, я просто опячатался.

Всем спасибо за помощь. Поразмыслив, написал вот такой код (может кому-то поможет). Компилятор кушает и выдает верный результат.

Код:
void massiv (int N, int M, float **A, float **B)
{    int i,j,l,k;
	float sum;




	for (i = 0; i < N; i++) {
	for (j = 0; j < M; j++) {
	sum=0;
	   for (l=i; l < N; l++) {
		   for (k=0; k <=j; k++) {
			   if (*(*(A+l)+k)<0) {  sum = sum + *(*(A+l)+k);};};};
			   *(*(B+i)+j)=sum;

							}
							}

}
int main()
............................
//Все что надо - считываю с консоли или из файла, под массивы (А и В) память выделяю динамически. Вывод стандартный.
..............................
Да и еще. Заметил такую вещь , что при работе в Си с динамическими двумерными масссивами, лучше писать не A[i][j], а *(*(A+i)+j)). В первом случае, не всегда программа будет работать корректно.
Компилятор Code Ger Rad Studio 2009/
Evgen51 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод двумерного массива Kocapb Общие вопросы C/C++ 4 11.10.2012 11:05
Передача двумерного массива аля матрицы из функции bondik Общие вопросы C/C++ 1 20.05.2009 15:46
Функции. Передача массива в качестве параметра функции. Wia Помощь студентам 2 17.03.2009 14:57
Вывод двумерного массива pancho Общие вопросы Delphi 10 25.01.2009 23:31
Вывод массива из функции LeoN PHP 2 13.11.2008 13:57