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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2010, 00:13   #1
fatefighter
 
Аватар для fatefighter
 
Регистрация: 16.03.2010
Сообщений: 3
По умолчанию программа с использованием динамических матриц

помогите, пожалуйста, найти и исправить ошибки в фрагменте программы. вообще она должна делать с матрицами все, но пока проблема в том, чтобы их перемножить и грамотно вывести на экран.
программа должна быть написана на си, без использования с++
сама программа:
Код:
#include "stdafx.h"
#include <stdlib.h>
#include <math.h>

int print_matrix(int **arr, int m, int n);
int **get_matrix(int m, int n);
int check_matrixes(int m1, int n1, int m2, int n2);
int multiply_matrixes(  int **matrix_1, int m1, int n1,
						int **matrix_2, int m2, int n2,
						int ***result_matrix, int *result_m, int *result_n);
int main()
{
	int m_A, n_A,q , m_B, n_B , m_C, n_C;
	int **A=(int **) calloc(m_A, sizeof(int));   
        for (int i=0; i<m_A; i++)
                A[i]=(int *) calloc(n_A, sizeof(int));
	int **B=(int **) calloc(m_B, sizeof(int));   
        for (int i=0; i<m_B; i++)
                B[i]=(int *) calloc(n_B, sizeof(int));
	int **C=(int **) calloc(m_C, sizeof(int));   
        for (int i=0; i<m_C; i++)
                C[i]=(int *) calloc(n_C, sizeof(int));
	do 
		{	printf("write original matrix size:\n");
			printf("write row number:\n");
				scanf ("%d",&m_A);
			printf ("write coloum number:\n");
				scanf ("%d",&n_A);
		(get_matrix(m_A, n_A));
		}
	while (m_A<=0||n_A<=0);
//интерфейс
		for ( ; ; )
		{printf("write the number of operation:\n 0-print matrix\n 1-Addition\n  C=k1*A+k2*B\n");
		 printf(" 2-Multiplication\n  C=A*B\n 3-determinant\n 4-inverse matrix\n 5-exit\n");
		  scanf("%d",&q);
			switch (q)
			{	case 0: (print_matrix(A, m_A, n_A));
						break;
				case 1: 
						break;
				case 2: do 
						{	printf("write second matrix size:\n");
								printf("write row number:\n");
									scanf ("%d",&m_B);
								printf ("write coloum number:\n");
									scanf ("%d",&n_B);
							(get_matrix(m_B, n_B));
						}
						while (m_B<=0||n_B<=0); 
					if (check_matrixes(m_A , n_A, m_B, n_B))
					{
						if (multiply_matrixes(*A, m_A, n_A,
							*B, m_B, n_B,
							*C, &m_C, &n_C))
						{
							printf ("\n\nRESULT:\n\n");
							print_matrix (*C, m_C, n_C);
						}
					}else printf ("\n\n====MATRIXES CAN NOT BE MULTIPLY====\n\n");
						break;
				case 3: 
						break;
				case 4:
						break;
				case 5: return 0;
						break;
				default: printf("\n\n====WRONG NUMBER====\n\n");
			}
		}

		return 0;
}
//функция выделения памяти и получения матрицы
int **get_matrix(int m, int n)
{	
    int **arr=(int **) calloc(m, sizeof(int));   
        for (int i=0; i<m; i++)
                arr[i]=(int *) calloc(n, sizeof(int));
		//Ввод элементов матрицы 
		printf("write matrix elements:\n");
		for(int i=0; i < m; i++)
			for(int j=0; j < n; j++)
				scanf("%d", (*(arr+i)+j));
	return arr;
}
//функция вывода матрицы на экран
int print_matrix(int **arr, int m, int n)
{
	for(int i=0; i < m; i++)
		for(int j=0; j < n; j++)
					printf("%d\t", *(*(arr + i) + j));
return 0;
}
// проверка размерностей матриц
int check_matrixes(int m1, int n1, int m2, int n2)
{
	return (m2==n1);
}
// умножение матриц
int multiply_matrixes(  int **matrix_1, int m1, int n1,
						int **matrix_2, int m2, int n2,
						int ***result_matrix, int *result_m, int *result_n)
{
	*result_m = m1;
	*result_n = n1;
	int **ret = (int **) calloc(*result_m, sizeof(int));   
        for (int i=0; i<*result_m; i++)
                ret[i]=(int *) calloc(*result_n, sizeof(int));
		if (ret !=0 )
		{
			for (int i=0; i<*result_m; i++)
				for (int j=0; j<*result_n; j++)
				{
					int sum = 0;
					for (int t=0; t< m2; t++)
					{
						sum += matrix_1[i][t]*matrix_2[t][j];
					}
					(*result_matrix)[i][j] = sum;
				}return 0;
		}else return 1;
}

Последний раз редактировалось Stilet; 19.10.2010 в 07:48.
fatefighter вне форума Ответить с цитированием
Старый 19.10.2010, 08:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Я любитель. И притом начинающий чайник. Я мало понимаю в матрицах, и вообще далек от компьютеров я космонавт бороздю просторы вселенной, но... Могу предложить по настоянию Космоса некую мимолетную мыслю по поводу начинания:
Код:
// werewrewr.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <malloc.h>
#include <stdlib.h>

int **a,**b,**c;

int** ФормируемМатрицу(int Ширина, int Длина){
    int** Матрица=0;
    Матрица=(int**)malloc(sizeof(int)*(Ширина+1));
    Матрица[0]=(int*)malloc(sizeof(int)*Длина);
    for(int i=1;i<Ширина;i++){
        Матрица[i]=(int*)malloc(sizeof(int)*Длина);
        for(int j=0;j<Длина;j++){
            Матрица[i][j]=rand()/1000;
        }
    }
    Матрица[0][1]=Ширина;
    Матрица[0][2]=Длина;
    return Матрица;
}
void ПечатаемМатрицу(int** Матрица){
    for(int i=1;i<Матрица[0][1];i++){
        for(int j=0;j<Матрица[0][2];j++){
            printf("%d\t",Матрица[i][j]);
        } printf("\n");
    }printf("\n");
}

int** Множимматрицу(int** Матрица1,int** Матрица2){
    int** Матрица=0;
    int Ширина=Матрица1[0][1];
    int Длина=Матрица1[0][2];
    Матрица=(int**)malloc(sizeof(int)*(Ширина+1));
    Матрица[0]=(int*)malloc(sizeof(int)*Длина);
    for(int i=1;i<Ширина;i++){
        Матрица[i]=(int*)malloc(sizeof(int)*Длина);
        for(int j=0;j<Длина;j++){
            Матрица[i][j]=Матрица1[i][j]*Матрица2[i][j];
        }
    }
    Матрица[0][1]=Ширина;
    Матрица[0][2]=Длина;
    return Матрица;
}

void Свобода(int** Матрица){
    for(int i=1;i<Матрица[0][1];i++){
            delete[] Матрица[i];
    }
    delete[] Матрица;
}


int _tmain(int argc, _TCHAR* argv[])
{
    a=ФормируемМатрицу(6,3);    b=ФормируемМатрицу(6,3);
    ПечатаемМатрицу(a);            ПечатаемМатрицу(b);
    c=Множимматрицу(a,b);
    ПечатаемМатрицу(c);
    Свобода(a);Свобода(b);Свобода(c);
    getchar();
    return 0;
}
Короче типа такого...
I'm learning to live...

Последний раз редактировалось Stilet; 19.10.2010 в 08:33.
Stilet вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
класс динамических матриц zoluxa Общие вопросы C/C++ 1 16.04.2010 21:30
Программа с использованием макросов... BioHoHoL Помощь студентам 3 17.02.2010 16:45
программа с использованием БД Paradox hinku Общие вопросы Delphi 0 07.10.2008 11:27
Программа на C++ с использованием fstream Dergard Помощь студентам 2 14.12.2007 05:18
Программа с использованием функции Cartman18 Помощь студентам 1 10.12.2007 16:29