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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2010, 00:08   #1
mego4el
Пользователь
 
Аватар для mego4el
 
Регистрация: 19.09.2010
Сообщений: 87
Печаль работа с матрицей

Пожалуйста помогите дописать правильно функцию int iz_faila().
Эта функция у меня читает матрицу из фаила, и выводит ее на экран. В добавок к этому необходимо, что бы программа подсчитала новую из той, которая была в фаиле, (по форме, как в функции void s_klav().) и ее вывела на экран. И что бы после этого, полученную матрицу, можно было записать в фаил, как в функции int masv_file(). Это у меня не получается((

Код:
#include <iostream>
#include <ctime> 
#include <cmath>
#include <stdio.h> 
#include <cstdlib>
const int NotUsed=system("color F0");
  
using namespace std;
int sr_geo(); //среднее геометрическое
void s_klav(); //ввод с клавиатуры
void mas_vyv(); //вывод на экран
int m_menu(); //меню программы
int iz_faila(); //чтение матрицы из фаила
int masv_file(); //вывод в фаил
int **arr;
int Rw=0;        //размерность матрицы
int sr_geo(int **arr, int n)
{
    int sr_geo=0;
    float pr=1;
    for(int i=0; i<n; i++)
        pr*=abs(arr[i][i]);
    
    sr_geo = (int)exp(log((float)pr)/n);
        return sr_geo;
}
 
int main()
{
    char fv;
    if(m_menu())
    {
    cout<<endl;
    mas_vyv();
    cout<<"Vyvesti v fail? y/n \n";
    do 
    {
        cin>>fv;
    }
    while(fv!='y' && fv!='n');
    if (fv=='y')
    masv_file();
    else printf("Exit \n");
    }
    return 0;
}
void s_klav()
{
    srand((unsigned)time(NULL));
    int n,i,j;
    int sr;
    cout<<"Vvedite razmer massiva: ";
    cin>>Rw;
    arr = new int*[Rw];
    cout<<"Massiv: "<<endl;
    for(i=0; i<Rw; i++)
    {
        arr[i] = new int[Rw];
        for(j=0; j < Rw; j++)
        {
            arr[i][j]=rand()%9+1;
            cout<<arr[i][j]<<"  ";
        }
            cout<<endl;
    }
}
void mas_vyv()
{
    int sr = sr_geo(arr,Rw); 
        cout<<endl;
        cout<<"Sformirovannaya matrica:"<<endl;
        for(int i=0; i < Rw; i++)
        {
            for(int j=0; j < Rw; j++)
            {
                    if((i+j)%2==0)
                    {
                            arr[i][j]=sr;
                    }
                    cout<<arr[i][j]<<"  ";
            }
            cout<<endl;
        }
}
int m_menu()
{
    int cho;
    
    cout<<"1 - vvesti s klaviaturi\n2 - iz faila\n0 - vyhod\n";
    cin>>cho;
    switch(cho)
    {
    case 0:
        exit('Exit');
        break;
    case 1:
        s_klav();
        return 1;
        break;
    case 2:
        return iz_faila();
        break;
        default: cout<<"vvedite pynkt menu \n";
    }
    return 1;
}
int iz_faila()
{
    FILE *f;
    char FileName [80];
    printf ("Vvedite adres faila: \n");
    scanf("%s",FileName);
    printf ("Adres faila: %s\n", FileName);
    f=fopen(FileName,"rt");
    int nElements=0, m=0;
    char ch;
    if(f!=NULL)
    {
        printf("Fail yspeshno otkrit! \n\n");
        while((ch=getc(f))!=EOF)
        {
            if((ch!='\n')&&(ch!=' '))nElements++;    
                printf(" %c ", ch);            
        }
        cout<<endl<<endl;
        printf("Number=%d",nElements);
        cout<<endl;
        fseek(f,0,SEEK_SET);
        fclose(f);
        return 1;
    }
    else 
    {
        cout<<"Oshibka otkritiya!\n";
        return iz_faila();
    }
}
int masv_file()
{
    char fname [80];
    cout<<"Vvedite polnoe nazvanie fayla: \n";
    cin>>fname;
    FILE *pFile = fopen(fname, "w+");
    if(pFile != NULL)
    {
        for (int i=0; i < Rw; i++)
        {
            for (int j=0; j < Rw; j++)
            {
                fprintf(pFile,"%d ", arr[i][j]);
            }
            fprintf(pFile,"\n");
            puts("");
        }
        fclose(pFile);
            return 1;
    }
    else 
    {
        cout<<"Oshibka otkritiya!\n";
        exit(1);
    }
    return 1;
}
mego4el вне форума Ответить с цитированием
Старый 20.12.2010, 11:48   #2
TranceSmile
Смайлик :)
Форумчанин
 
Аватар для TranceSmile
 
Регистрация: 12.12.2010
Сообщений: 445
По умолчанию

Ну писать код не буду. Скажу только как сделать. Первые 2 числа в файле, это будет размерность массива.
Самый перспективный framework Yii (c)
TranceSmile вне форума Ответить с цитированием
Старый 20.12.2010, 19:22   #3
mego4el
Пользователь
 
Аватар для mego4el
 
Регистрация: 19.09.2010
Сообщений: 87
По умолчанию

Цитата:
Ну писать код не буду. Скажу только как сделать. Первые 2 числа в файле, это будет размерность массива.
??????????

это не имеет отношения, размерность итак работает, читайте внимательнее вопрос!

люди помогите пожалуйста, очень срочно!
mego4el вне форума Ответить с цитированием
Старый 21.12.2010, 18:20   #4
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Код:
struct Matrix
{
	int width; // ширина массива
	int height; // высота массива
	int *data; // сам массив
};

void ReadMatrixFromFile(const char *filePath, Matrix &out_matrix)
{
	HANDLE file = CreateFileA(
		filePath,
		GENERIC_READ,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);

	DWORD tempReaded;

	ReadFile(file, &out_matrix.width, sizeof(int), &tempReaded, NULL);
	ReadFile(file, &out_matrix.height, sizeof(int), &tempReaded, NULL);
	ReadFile(file, out_matrix.data, sizeof(int) * out_matrix.width * out_matrix.height, &tempReaded, NULL);

	CloseHandle(file);
}

void WriteMatrixToFile(const char *filePath, Matrix &matrix)
{
	HANDLE file = CreateFileA(
		filePath,
		GENERIC_WRITE,
		FILE_SHARE_READ,
		NULL,
		CREATE_ALWAYS,
		FILE_ATTRIBUTE_NORMAL,
		NULL);

	DWORD tempWritten;

	WriteFile(file, &matrix.width, sizeof(int), &tempWritten, NULL);
	WriteFile(file, &matrix.height, sizeof(int), &tempWritten, NULL);
	WriteFile(file, matrix.data, sizeof(int) * matrix.width * matrix.height, &tempWritten, NULL);

	CloseHandle(file);
}

void main()
{
	Matrix matrixToWrite;

	// заполняешь данными
	matrixToWrite.width = 5;
	matrixToWrite.height = 5;
	matrixToWrite.data = new int[matrixToWrite.width * matrixToWrite.height];

	// пишешь в файл
	WriteMatrixToFile("file1.matrix", matrixToWrite);

	Matrix matrixToRead;

	// читаешь из файла
	ReadMatrixFromFile("file1.matrix", matrixToRead);

	// дальше используешь matrixToRead - это прочитанная матрица
}
вот структура матрицы (матрица сидит в поле data как одномерный массив) и 2 функции для чтения и записи. проверку на ошибки я не делал и вобще не тестил это, читаешь матрицу из файла и делаешь с ней что нужно используя matrixToRead.data[j * matrixToRead.width + i] для доступа к элементу [i][j]
UltimaBeaR вне форума Ответить с цитированием
Старый 22.12.2010, 02:52   #5
mego4el
Пользователь
 
Аватар для mego4el
 
Регистрация: 19.09.2010
Сообщений: 87
По умолчанию

Цитата:
struct Matrix
{
int width; // ширина массива
int height; // высота массива
int *data; // сам массив
};

void ReadMatrixFromFile(const char *filePath, Matrix &out_matrix)
{
HANDLE file = CreateFileA(
filePath,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

DWORD tempReaded;

ReadFile(file, &out_matrix.width, sizeof(int), &tempReaded, NULL);
ReadFile(file, &out_matrix.height, sizeof(int), &tempReaded, NULL);
ReadFile(file, out_matrix.data, sizeof(int) * out_matrix.width * out_matrix.height, &tempReaded, NULL);

CloseHandle(file);
}

void WriteMatrixToFile(const char *filePath, Matrix &matrix)
{
HANDLE file = CreateFileA(
filePath,
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);

DWORD tempWritten;

WriteFile(file, &matrix.width, sizeof(int), &tempWritten, NULL);
WriteFile(file, &matrix.height, sizeof(int), &tempWritten, NULL);
WriteFile(file, matrix.data, sizeof(int) * matrix.width * matrix.height, &tempWritten, NULL);

CloseHandle(file);
}

void main()
{
Matrix matrixToWrite;

// заполняешь данными
matrixToWrite.width = 5;
matrixToWrite.height = 5;
matrixToWrite.data = new int[matrixToWrite.width * matrixToWrite.height];

// пишешь в файл
WriteMatrixToFile("file1.matrix", matrixToWrite);

Matrix matrixToRead;

// читаешь из файла
ReadMatrixFromFile("file1.matrix", matrixToRead);

// дальше используешь matrixToRead - это прочитанная матрица
}

вот структура матрицы (матрица сидит в поле data как одномерный массив) и 2 функции для чтения и записи. проверку на ошибки я не делал и вобще не тестил это, читаешь матрицу из файла и делаешь с ней что нужно используя matrixToRead.data[j * matrixToRead.width + i] для доступа к элементу [i][j]
спасибо большое. но мне пока нельзя использовать столь совершенных функций), мне именно необходимо дописать мою ф-ю чтения из фаила(
mego4el вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с матрицей GM402 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 29.11.2010 23:22
работа с матрицей AleksENN Помощь студентам 0 23.10.2010 14:13
Работа с матрицей Absent Помощь студентам 2 05.04.2009 15:46
Работа с матрицей Absent Помощь студентам 1 24.05.2008 13:33
Работа с матрицей Absent Помощь студентам 3 17.05.2008 22:20