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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2013, 19:08   #1
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию Как правильно выделить память?

Как правильно выделить память для треугольной матрицы MхN,

N=N-1, при i=1,n

Надеюсь правильно написал формулу) Должно получится что-то вида:

1 1 1
1 1 -
1 - -

Код:
	A=(float**)malloc(n * sizeof(float*));
		if(A==NULL)
		{
			printf("Динамический массив не создан!");
			return 0;
		}

		int m=n;
		
//==================================================================
// Ввод треугольной матрицы
	printf("Введите элементы треугольной матрицы");
	for(int i=0;i<n;i++)
	{
		
		A[i]=(float *)malloc(n * sizeof(float*));
		if(A[i]==NULL)
			{
				printf("Динамический массив не создан!");
				return 0;
			}
	
			for(int j=0;j<m;j++)
		{		
			do
			{
			printf("\nA[%d][%d] = ", i+1, j+1);
			if(!scanf("%f", &A[i][j]))
			{
				system("cls");
				printf("Неверный ввод!\n");
				fflush(stdin);
				fl=1;
			}
			else
			{
				fl=0;
				if(A[i][j]==0)
					{
						printf("В матрице не должно быть нулей!:\n");
						fflush(stdin);
						j-=1;
					}
			}
			}while(fl==1);
		}
		m--;
	}
Вот кусок кода, но не рабочий
Praud вне форума Ответить с цитированием
Старый 07.12.2013, 14:06   #2
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Актуально!!!!!
Praud вне форума Ответить с цитированием
Старый 07.12.2013, 15:24   #3
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Код:
int m,n;
m =n = 20;

srand(time(NULL));
int** A;
A=(int**)malloc(n * sizeof(int*));

for(int i=0;i<n;i++)
{

	A[i]=(int *)malloc(m * sizeof(int));

	for(int j=0;j<m;j++)
	{		
		A[i][j] = rand()%10;			
	}
	m--;
}

m=n;

for(int i=0;i<n;i++)
{
	for(int j=0;j<m;j++)
	{		
		printf(" %d", A[i][j]);

	}
	printf("\n");
	m--;
}
Матрица нормально создается.

1) Когда создается под-массив, то он должен быть нужного размера:
Цитата:
A[i]=(float *)malloc(m * sizeof(float*));
2) Цикл ввода - что-то напутали с флагом fl:
Код:
int fl;
do
{
	fl=0;
	printf("\nA[%d][%d] = ", i+1, j+1);
	if(!scanf("%f", &A[i][j]))
	{
		system("cls");
		printf("Неверный ввод!\n");
		fflush(stdin);
		fl=1;
	}
	else
	{		
		if(A[i][j]==0)
		{
			printf("В матрице не должно быть нулей!:\n");
			fflush(stdin);
			fl=1;
		}
	}
}while(fl==1);
Smogg вне форума Ответить с цитированием
Старый 07.12.2013, 15:53   #4
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Вывод пустую матрицу.
Praud вне форума Ответить с цитированием
Старый 07.12.2013, 16:18   #5
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от Praud Посмотреть сообщение
Вывод пустую матрицу.
Телепатирую:
Код:
//покзываем что получилось:
m=n;
for(int i=0;i<n;i++)
{
	for(int j=0;j<m;j++)
	{		
		printf(" %f", A[i][j]); //%d и %f - не одно и то же?

	}
	printf("\n");
	m--;
}
Ага?

Последний раз редактировалось Smogg; 07.12.2013 в 16:20.
Smogg вне форума Ответить с цитированием
Старый 07.12.2013, 17:16   #6
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Не угадали) У меня матрица должна быть вещественная. Вы мне показали пример с целочисленной, я переделал под себя. Так что %f там у меня правильно стоит
Praud вне форума Ответить с цитированием
Старый 07.12.2013, 19:06   #7
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Я предположил, что при переделке могли и забыть поменять буковку.
Тогда не знаю, по какому еще поводу могут нули случится)
Smogg вне форума Ответить с цитированием
Старый 07.12.2013, 19:15   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

1) A[i]=(float *)malloc(m * sizeof(float));
2) Покажите весь код (ну или хотя бы циклы ввода и вывода)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.12.2013, 18:01   #9
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Код:
#include "stdio.h"  //Стандартная библиотека ввода вывода
#include "conio.h"  //библиотека необходимая длazazQzqzaq1a							я функции getch();
#include <locale.h> //библиотека для поддержки русского языка в консоли
#include <malloc.h> 
#include "windows.h" //библиотека для функции system("cls");

void print_matrix(float**, int,int );

int main()
{
	setlocale(LC_ALL, "Russian"); // поддержка вывода русского языка в консоли

	float **A; //исходная матрица
	int n; // размер матрицы
	int fl=0; // флаг, необходимый при неправильных входных данных.

		printf("Введите размерность матрицы:\n");
	do
	{
	if(!scanf("%d", &n))
	{
		system("cls");
		printf("Неверный ввод!\n");
		fflush(stdin);
		fl=1;
	}
	else 
	{
		fl=0;
	
		if(n<1)
			{
				system("cls");
				printf("Неверно указана размерность матрицы. Повторите ввод\n");
			}
	}
	}while(n<1);

		A=(float**)malloc(n * sizeof(float*));
        if(A==NULL)
        {
            printf("Динамический массив не создан!");
            return 0;
        }
 
        int m=n;
        
//==================================================================
// Ввод треугольной матрицы
    printf("Введите элементы треугольной матрицы");
    for(int i=0;i<n;i++)
    {
        A[i]=(float *)malloc(m * sizeof(float));
        if(A[i]==NULL)
            {
                printf("Динамический массив не создан!");
                return 0;
            }
    
		for(int j=0;j<m;j++)
        {       
            do
            {
            printf("\nA[%d][%d] = ", i+1, j+1);
            if(!scanf("%f", &A[i][j]))
            {
                system("cls");
                printf("Неверный ввод!\n");
                fflush(stdin);
                fl=1;
            }
            else
            {
                fl=0;
                if(A[i][j]==0)
                    {
                        printf("В матрице не должно быть нулей!:\n");
                        fflush(stdin);
                        j-=1;
                    }
            }
            }while(fl==1);
        }
        m--;
    } 


	printf("Ваша текущая матрица имеет вид:\n\n");	
	print_matrix(A, n,m);
	getch();
	printf("Измененная матрица:\n");
	print_matrix(A, n,m);

	for(int i=0;i<n;i++)
	free(A[i]);
	free(A);

	getch(); 

}


	

void print_matrix(float **A, int n, int m)   //Функция вывода матрицы на экран
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{

			printf("%10.3f ", A[i][j]);
		}
		printf("\n");
		m--;
	}
}
Вот весь код
Praud вне форума Ответить с цитированием
Старый 08.12.2013, 18:36   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Можно избавиться от m, чтобы не путаться:
Код:
#include "stdio.h"  //Стандартная библиотека ввода вывода
#include "conio.h"  //библиотека необходимая длazazQzqzaq1a							я функции getch();
#include <locale.h> //библиотека для поддержки русского языка в консоли
#include <malloc.h> 
#include "windows.h" //библиотека для функции system("cls");

void print_matrix(float**, int,int );

int main()
{
	setlocale(LC_ALL, "Russian"); // поддержка вывода русского языка в консоли

	float **A; //исходная матрица
	int n; // размер матрицы
	int fl=0; // флаг, необходимый при неправильных входных данных.

		printf("Введите размерность матрицы:\n");
	do
	{
	if(!scanf("%d", &n))
	{
		system("cls");
		printf("Неверный ввод!\n");
		fflush(stdin);
		fl=1;
	}
	else 
	{
		fl=0;
	
		if(n<1)
			{
				system("cls");
				printf("Неверно указана размерность матрицы. Повторите ввод\n");
			}
	}
	}while(n<1);

		A=(float**)malloc(n * sizeof(float*));
        if(A==NULL)
        {
            printf("Динамический массив не создан!");
            return 0;
        }
        
//==================================================================
// Ввод треугольной матрицы
    printf("Введите элементы треугольной матрицы");
    for(int i=0;i<n;i++)
    {
        A[i]=(float *)malloc((n - i) * sizeof(float));
        if(A[i]==NULL)
            {
                printf("Динамический массив не создан!");
                return 0;
            }
    
		for(int j=0;j<n - i;j++)
        {       
            do
            {
            printf("\nA[%d][%d] = ", i+1, j+1);
            if(!scanf("%f", &A[i][j]))
            {
                system("cls");
                printf("Неверный ввод!\n");
                fflush(stdin);
                fl=1;
            }
            else
            {
                fl=0;
                if(A[i][j]==0)
                    {
                        printf("В матрице не должно быть нулей!:\n");
                        fflush(stdin);
                        j-=1;
                    }
            }
            }while(fl==1);
        }
    } 


	printf("Ваша текущая матрица имеет вид:\n\n");	
	print_matrix(A, n);
	getch();
	printf("Измененная матрица:\n");
	print_matrix(A, n);

	for(int i=0;i<n;i++)
	free(A[i]);
	free(A);

	getch(); 

}


	

void print_matrix(float **A, int n)   //Функция вывода матрицы на экран
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n-i;j++)
		{
			printf("%10.3f ", A[i][j]);
		}
		printf("\n");
	}
}
Или делать вызов:
Код:
print_matrix(A, n,n);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 08.12.2013 в 18:41.
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как выделить память под TBitmap Volkogriz Общие вопросы Delphi 8 03.02.2013 20:57
Как выделить память для структуры посредством new? Suby Общие вопросы C/C++ 11 07.11.2012 23:10
Как правильно выделить буфер для приёма строки от WinApi функции c0mp Win Api 14 03.08.2012 17:10
Как выделить память 750mb? VintProg Общие вопросы Delphi 10 29.06.2009 20:30
как выделить память для указателя (pointer), и сюда же, записать : integer, потом через 4 байта, boolean? bigxman Общие вопросы Delphi 1 02.02.2009 21:17