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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2008, 16:38   #1
kermit
Пользователь
 
Аватар для kermit
 
Регистрация: 08.06.2008
Сообщений: 14
По умолчанию работа с файлами в с++

Помогите пожалста написать программу(лаба):

3адание:

В текстовом файле хранится вещественная матрица 30х8. Записать ее в другой файл таким образом, чтобы в первом столбце находились минимальные элементы строк, а в последнем – максимальные.

Я в программировании не сильно разбираюсь, поэтому и прошу помочь

Вот моя попытка:
Код:
include <cstdlib>
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <conio.h>

using namespace std;

#define N 30
#define M 8

void CreatInFile(const char *InFile, double* array); 
void ViewFile(const char *InFile);
void CreatOutFile(const char *InFile, const char *OutFile, double *array);

int main(int argc, char *argv[])
{
    const char first_file[] ={"1.txt"}; 
    const char second_file[]={"2.txt"}; 
    
    double array[N][M];              

    CreatInFile(first_file, &array); 
    ViewFile(first_file);
    CreatOutFile(first_file ,second_file, &array);
    ViewFile(second_file);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

void CreatInFile(char const *File, double *array)
{
     int i,j;
     ofstream outFile(File);
     for(i=0; i<N; i++)
     {
            for(j=0; j<M; j++)
            {
                     *(array+i*j+i)=(50-rand()%100)/5.25;
                     outFile.width(4);
                     outFile<< *(array+i*j+i);
                     }
            outFile<<endl;
            }
     outFile.close();
}

void ViewFile()const char *File)
{
     ifstream file(File);
     cout<< file.rdbuf();
     file.close();
}

void CreatOutFile(const char *InFile, char const *OutFile, double *array)
{
     int i, j;
     double minimum = temp1= *array;
     double maximum = temp2=*array;
     
     ifstream inFile(InFile);
     ofstream outFile(OutFile);
     
     for(i=0; i<N; i++)
     {
              for(j=0; j<M; j++) {inFile>> *(array+i*j+i);}
     }
     inFile.close();
     
     for(i=0; i<N; i++)
     {
              minimum=temp1;
              maximum=temp2;
              for(j=0; j<M; j++)
              {
                       if(*(array+i*j+i) < minimum)
                       {
                                         minimum=*(array+i*j+i);
                                         array[i][0]=minimum;
                       }
                       if(*(array+i*j+i) > maximum)
                       {
                                         maximum=*(array+i*j+i);
                                         array[i][7]=*(array+i*j+i);
                       }
                       outFile<<*(array+i*j+i);
              }
              outFile<<endl;
     }
     outFile.close();
}
Мне несовсем понятно, каким образом осуществляется передача двумерного массива в функцию. Попытался через указатель, передал адресс первого эл-та массива (&array) , а в вызываемой ф-ии написал (тип *array). но не получилось.

Помогите пожалста.
kermit вне форума Ответить с цитированием
Старый 08.06.2008, 16:44   #2
kermit
Пользователь
 
Аватар для kermit
 
Регистрация: 08.06.2008
Сообщений: 14
По умолчанию

и еще вопрос: правильно ли я развернул массив? massiv[i][j]==*(massiv+i*j+i)
kermit вне форума Ответить с цитированием
Старый 08.06.2008, 17:54   #3
kermit
Пользователь
 
Аватар для kermit
 
Регистрация: 08.06.2008
Сообщений: 14
По умолчанию

Вот вроде разобрался(пришлось упростить, и сделать для типа int).
Код:
#include <cstdlib>
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <conio.h>

using namespace std;

#define N 30
#define M 8

void CreatInFile(const char *InFile, int *array);
void ViewFile(const char *InFile);
void CreatOutFile(const char *InFile, const char *OutFile, int *array);

int main()
{
    const char first_file[] ={"1.txt"};
    const char second_file[]={"2.txt"};

    int array[N][M];
    int *pt;
    pt=&array[0][0];             

    CreatInFile(first_file, pt); 
    ViewFile(first_file);
    CreatOutFile(first_file ,second_file, pt);
    ViewFile(second_file);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

void CreatInFile(char const *File, int *array)
{
     int i,j;
     ofstream outFile(File);
     for(i=0; i<N; i++)
     {
            for(j=0; j<M; j++)
            {
                     *(array+i*j+i)=50-rand()%100;//5.25;
                     outFile.width(4);
                     outFile<< *(array+i*j+i);
                     }
            outFile<<endl;
            }
     outFile.close();
}

void ViewFile(const char *File)
{
     ifstream file(File);
     cout<< file.rdbuf();
     file.close();
}

void CreatOutFile(const char *InFile, char const *OutFile, int *array)
{
     int i, j;
     int temp1, temp2;
     int minimum = temp1= *array;
     int maximum = temp2=*array;
     
     ifstream inFile(InFile);
     ofstream outFile(OutFile);
     
     for(i=0; i<N; i++)
     {
              for(j=0; j<M; j++) {inFile>> *(array+i*j+i);}
     }
     inFile.close();
     
     for(i=0; i<N; i++)
     {
              minimum=temp1;
              maximum=temp2;
              for(j=0; j<M; j++)
              {
                       if(*(array+i*j+i) < minimum)
                       {
                                         minimum=*(array+i*j+i);
					                     *(array+i)=minimum;
                       }
                       if(*(array+i*j+i) > maximum)
                       {
                                         maximum=*(array+i*j+i);
                                         *(array+i*7+i)=*(array+i*j+i);
                       }
                       outFile<<*(array+i*j+i)<<"\t";
              }
              outFile<<endl;
     }
     outFile.close();
}
Теперь хотябы запускается и работает, но не правильно

Непойму как обратится к определенному эл-ту массива в такой форме записи:
*(array+i*j+i), в частности нужны 1 и последние эл-ты каждой строки. Никак не пойму
kermit вне форума Ответить с цитированием
Старый 08.06.2008, 18:07   #4
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Цитата:
Сообщение от kermit Посмотреть сообщение
Мне несовсем понятно, каким образом осуществляется передача двумерного массива в функцию.
Например, т.к. вы знаете размер на этапе компиляции, то можно так:

Код:
void func(int mas[20][20])
{
  mas[5][3] = 0;
}

int main()
{
  int mas[20][20];
  func(mas);
}
Цитата:
Сообщение от kermit Посмотреть сообщение
и еще вопрос: правильно ли я развернул массив? massiv[i][j]==*(massiv+i*j+i)
Нет, massiv[i][j]!=*(massiv+i*j+i)
filosof_x86 вне форума Ответить с цитированием
Старый 08.06.2008, 18:20   #5
kermit
Пользователь
 
Аватар для kermit
 
Регистрация: 08.06.2008
Сообщений: 14
По умолчанию

Я передею массив в ф-ю через указатель.
Код:
Нет, massiv[i][j]!=*(massiv+i*j+i)
тогда как его правильно развернуть?
kermit вне форума Ответить с цитированием
Старый 08.06.2008, 18:32   #6
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Код:
#include <iostream>

int main()
{
  const int N = 20, M = 20,
            i = 5, j = 4;
  int massiv[N][M];
  massiv[i][j] = 5;
  std::cout << *(((int *)massiv) + i*N + j) << std::endl;
  std::cout << ( massiv[i][j] == *(((int *)massiv) + i*N + j) ) << std::endl;
  return 0;
}
filosof_x86 вне форума Ответить с цитированием
Старый 08.06.2008, 18:36   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

kermit, а вот такой вариант....

Код:
#include <stdio.h>

#define  M 5
#define	 N 3

typedef double  MyArray[M][N];

void print(MyArray p)
{
	for( int i = 0; i < M; i ++) {
		for( int j = 0; j < N; j ++) {
			printf("| %8.5f ", p [i][j]);
		}
		puts("|");
	}
}

int main()
{
	MyArray arr;
	int k = 0;
	for( int i = 0; i < M; i ++) for(int j = 0; j < N; j ++) arr[i][j] = k ++;

	print(arr);
	getchar();
	return 0;
}
B_N вне форума Ответить с цитированием
Старый 08.06.2008, 18:51   #8
kermit
Пользователь
 
Аватар для kermit
 
Регистрация: 08.06.2008
Сообщений: 14
По умолчанию

странно, теперь ошибка сегментации. Отладчик показывает на

Код:
void CreatInFile(char const *File, int *array)
{
     int i,j;
     ofstream outFile(File);
     for(i=0; i<N; i++)
     {
            for(j=0; j<M; j++)
            {
                     *((int *)array+i*N+j)=50-rand()%100;//5.25; -вот эта вот строчка
                     outFile.width(4);
                     outFile<< *((int *)array+i*N+j);
                     }
            outFile<<endl;
     }
     outFile<<endl;       
     outFile.close();
}
kermit вне форума Ответить с цитированием
Старый 08.06.2008, 19:08   #9
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Я допустил ошибку - надо i*M
filosof_x86 вне форума Ответить с цитированием
Старый 08.06.2008, 19:45   #10
kermit
Пользователь
 
Аватар для kermit
 
Регистрация: 08.06.2008
Сообщений: 14
По умолчанию

Спасибо) помогло
kermit вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами Yar Помощь студентам 2 02.06.2008 08:03
Работа с файлами Stiker Общие вопросы C/C++ 1 10.04.2008 22:47
Работа с файлами ShVad Общие вопросы Delphi 4 03.02.2007 10:43
Работа с файлами El_Bint0 Помощь студентам 1 20.12.2006 02:07