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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2012, 23:32   #1
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию Динамическая память для двумерного массива

Доброе время суток!
Помогите разобраться с проблемой.
При вводе размера матрицы выдает ошибку и программа вылетает.
Я так понимаю это связано с функцией генерации массива.
И еще вопрос как сделать что бы нули входили в массив случайных чисел.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void GenMass(int m, int n, int a, int b, int **mas);
void OutMass(int m, int n, int **mas);

int main()
{
	int **mass=NULL;
	int m, n;

	system("chcp 1251 > nul");

	printf("\n Введите размер массива (M N): ");
	scanf("%d %d",&m, &n);

	printf("\n Генерация МАССИВА\n");
	GenMass(m,n,-10,10,mass);
	OutMass(m,n,mass);

	return 0;
}

/* Функция генерации массива */
void GenMass(int m, int n, int a, int b, int **mas)
{
	int i, j;

	srand(time(NULL)*1000);
	mas = (int **)malloc(m*sizeof(int *));
	if(mas == NULL)
		{
			printf("NO MEMORY!!!");
			exit(0);
		}
		for(i = 0; i < m; i++)
		{
			mas[i] = (int *)malloc(n*sizeof(int));
			if(mas[i] == NULL)
			{
				printf("NO MEMORY!!!");
				exit(0);
			}
			for(j = 0; j < n; j++)
				mas[i][j] = rand()%(b-a)+a;
		}
}

/* Функция вывода массива */
void OutMass(int m, int n, int **mas)
{
	int i, j;

	for(i = 0; i < m; i++)
	{
		for(j = 0; j < n; j++)
			printf("%3d", mas[i][j]);
			printf("\n");
			free(mas[i]);
	}
	free(mas);
}
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Stilet; 25.10.2012 в 22:57.
Bugrimov вне форума Ответить с цитированием
Старый 25.10.2012, 00:26   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int **GenMass(int m, int n, int a, int b);
void OutMass(int m, int n, int **mas);

int main()
{
    int **mass=NULL;
    int m, n;

    system("chcp 1251 > nul");

    printf("\n Введите размер массива (M N): ");
    scanf("%d %d",&m, &n);

    printf("\n Генерация МАССИВА\n");
    mass=GenMass(m,n,-10,10);
    OutMass(m,n,mass);
    return 0;
}

/* Функция генерации массива */
int **GenMass(int m, int n, int a, int b)
{
    int i, j;

    srand(time(NULL)*1000);
    int **mas = (int **)malloc(m*sizeof(int *));
    if(mas == NULL)
    {
        printf("NO MEMORY!!!");
        exit(0);
    }
    for(i = 0; i < m; i++)
    {
        mas[i] = (int *)malloc(n*sizeof(int));
        if(mas[i] == NULL)
        {
            printf("NO MEMORY!!!");
            exit(0);
        }
        for(j = 0; j < n; j++)
            mas[i][j] = rand()%(b-a)+a;
    }
    return mas;
}

/* Функция вывода массива */
void OutMass(int m, int n, int **mas)
{
    int i, j;

    for(i = 0; i < m; i++)
    {
        for(j = 0; j < n; j++)
            printf("%3d", mas[i][j]);
        printf("\n");
        free(mas[i]);
    }
    free(mas);
}
mass передавался по значению.
(если сделать вывод mass после GenMass, то он равен 0)

Или
Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void GenMass(int m, int n, int a, int b,int ***mas);
void OutMass(int m, int n, int **mas);

int main()
{
    int **mass=NULL;
    int m, n;

    system("chcp 1251 > nul");

    printf("\n Введите размер массива (M N): ");
    scanf("%d %d",&m, &n);

    printf("\n Генерация МАССИВА\n");
    GenMass(m,n,-10,10,&mass);
    OutMass(m,n,mass);
    return 0;
}

/* Функция генерации массива */
void GenMass(int m, int n, int a, int b, int ***mas)
{
    int i, j;

    srand(time(NULL)*1000);
    *mas = (int **)malloc(m*sizeof(int *));
    if(*mas == NULL)
    {
        printf("NO MEMORY!!!");
        exit(0);
    }
    for(i = 0; i < m; i++)
    {
        (*mas)[i] = (int *)malloc(n*sizeof(int));
        if((*mas)[i] == NULL)
        {
            printf("NO MEMORY!!!");
            exit(0);
        }
        for(j = 0; j < n; j++)
            (*mas)[i][j] = rand()%(b-a)+a;
    }
}

/* Функция вывода массива */
void OutMass(int m, int n, int **mas)
{
    int i, j;

    for(i = 0; i < m; i++)
    {
        for(j = 0; j < n; j++)
            printf("%3d", mas[i][j]);
        printf("\n");
        free(mas[i]);
    }
    free(mas);
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 25.10.2012 в 00:30.
BDA вне форума Ответить с цитированием
Старый 25.10.2012, 06:16   #3
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

А по поводу 0-й в массиве. Как генерировать случайные числа, что бы в матрице присутствовали нули.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 25.10.2012, 16:07   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

А они там есть (генерируются)
Изображения
Тип файла: png zero.png (5.3 Кб, 48 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.10.2012, 21:07   #5
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Есть еще один вопрос!!!
Возможно подсчитать произведение отрицательных элементов в каждом столбике матрицы. Как это можно сделать? Использовать переменную буфер.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 25.10.2012, 21:28   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void GenMass(int m, int n, int a, int b,int ***mas);
void OutMass(int m, int n, int **mas);
void FreeMass(int m, int n, int ***mas);
void ProductColumn(int m, int n, int **mas);

int main()
{
    int **mass=NULL;
    int m, n;

    system("chcp 1251 > nul");

    printf("\nВведите размер массива (M N): ");
    scanf("%d %d",&m, &n);
    printf("\nГенерация МАССИВА\n");
    GenMass(m,n,-10,10,&mass);
    OutMass(m,n,mass);
    printf("\nПроизведения элементов в столбцах\n");
    ProductColumn(m,n,mass);
    FreeMass(m,n,&mass);
    return 0;
}

/* Функция генерации массива */
void GenMass(int m, int n, int a, int b, int ***mas)
{
    int i, j;

    srand(time(NULL)*1000);
    *mas = (int **)malloc(m*sizeof(int *));
    if(*mas == NULL)
    {
        printf("NO MEMORY!!!");
        exit(0);
    }
    for(i = 0; i < m; i++)
    {
        (*mas)[i] = (int *)malloc(n*sizeof(int));
        if((*mas)[i] == NULL)
        {
            printf("NO MEMORY!!!");
            exit(0);
        }
        for(j = 0; j < n; j++)
            (*mas)[i][j] = rand()%(b-a)+a;
    }
}

/* Функция вывода массива */
void OutMass(int m, int n, int **mas)
{
    int i, j;

    for(i = 0; i < m; i++)
    {
        for(j = 0; j < n; j++)
            printf("%4d", mas[i][j]);
        printf("\n");
    }
}

void FreeMass(int m, int n, int ***mas)
{
    int i;
    for(i = 0; i < m; i++)
        free((*mas)[i]);
    free(*mas);
    *mas = NULL;
}

void ProductColumn(int m, int n, int **mas)
{
    int i, j;

    for(j = 0; j < n; j++)
    {
        int tmp = 1;
        int count = 0;
        for(i = 0; i < m; i++)
        {
            if (mas[i][j]<0)
            {
                tmp*=mas[i][j];
                ++count;
            }
        }
        if (count>0)
            printf("%4d", tmp);
        else
            printf(" undf ");
    }
    printf("\n");
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.10.2012, 21:37   #7
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

++count;
}
}
if (count>0)
printf("%4d", tmp);
else
printf(" undf ");

Не совсем понимаю эту часть кода. Для чего нужна count... Для вывода tmp?????
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 25.10.2012, 21:52   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Это проверка на присутствие отрицательных элементов в столбце.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.10.2012, 22:01   #9
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Вроде ясно! count будет больше нуля в том случае если проверяемое число будет отрицательным. Во всех остальных случаях count = 0.
Я верно понимаю???? И еще , что это за надпись в else выводится? Не определено.... что ли
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 25.10.2012 в 22:04.
Bugrimov вне форума Ответить с цитированием
Старый 25.10.2012, 22:08   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

count больше нуля, если встречается отрицательное число в столбце.
count - счетчик отрицательных чисел в столбце.
Если таких чисел нет (count = 0), то undefined.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно написать программу для двумерного массива caught.let Паскаль, Turbo Pascal, PascalABC.NET 3 18.03.2012 11:28
Динамическая память, заполнение массива zink Общие вопросы C/C++ 4 18.02.2012 20:46
Динамическая память vladxxl Общие вопросы C/C++ 0 25.04.2011 20:04
динамическая память zhenya.ya Помощь студентам 2 24.02.2010 20:58
динамическая память в си Serjuk Помощь студентам 0 27.12.2009 13:54