Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 17
1

Класс работы с массивами и чтение из файла

21.12.2014, 16:07. Просмотров 1420. Ответов 11
Метки нет (Все метки)

Нужна помощь в решении задачи :

Заданы 2 бинарных файла со следующей структурой:
N - число эл-тов одномерного целочисленного массива, 0<N<=500, далее непосредственно записаны сами эл-ты,значения которых лежат в диапазоне [-100;100].
Найти :
1)Максимальный эл-т массива
2)Произведение эл-тов массива,расположенных между максимальным и минимальным элементами.
3)Переопределить операцию "&", которая сжимает массив,удаляя из него все эл-ты,модуль которых находится в интервале [a,b].
Предусмотреть переопределение конструктора для обеспечения возможности генерации элементов массива внутри класса и передачи в класс уже сформированного из вне массива.

Я написал программку, но есть проблемы, не знаю как сжать массив и как считывать размер массива и самы элементы из бинарного файла.

Вот мой код:
Файлы содержащие класс генерации рандомных числел,хедер и цппшник,на них можно не обращать внимания.
CL_Random.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ifndef CL_RANDOM
#define CL_RANDOM
 
#include <time.h>
// Класс генерации случайных чисел. Выдает случайные числа, равномерно
// распределенные в фиксированном диапазоне. Используется детерминистический
// алгоритм, начинающийся с инициализирующего(seed) значения. Процесс генерации
// детерминистический, т.к. он берет начальное значение и выполняет
// фиксированный набор инструкций. Выход - уникален, определяется данными и
// инструкциями. Из-за начальной зависимости от seed-значения, ГСЧ создает
// одну и ту же последовательность при использовании одного и того же
// seed-значения.
// Класс создает псевдослучайную последовательность в соответствии с начальным
// seed-значением. Обеспечивается автоматический выбор seed-значения, в случае,
// если конструктору не передается никакого значения, тогда пользователь
// получает независимые псевдослучайные последовательности.
// Для генерации используется линейный конгруэнтный алгоритм, использующий
// большой нечетный постоянный множитель и постоянное слагаемое вместе с
// seed-значением для итеративного создания случайных чисел и обновления
// seed-значения.
const unsigned long maxshort = 65536L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;
 
class RND
{
private:
   unsigned long randSeed;   //текущее seed-значение
 
public:
// Параметр s=0 (по умолчанию) задает автоматич.выбор seed-значения
   void PutSeed(unsigned int _s=0);
// ГСЧ в диапазоне [0 ,..., n-1]
   unsigned int Random(unsigned int n);
// ГСЧ в диапазоне [0 ,..., 1.0]
   double fRandom(void);
};
#endif
CL_Random.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "Cl_Random.h"
#include <stdio.h>
#include <conio.h>
 
#pragma hdrstop
void RND :: PutSeed(unsigned int _s)
{
   if(!_s) randSeed = time(NULL);
   randSeed = _s;
}
 
unsigned int RND :: Random(unsigned int n)
{
    randSeed = multiplier * randSeed + adder;
    return (unsigned int) (randSeed  % n);
}
 
double RND :: fRandom(void)
{
    return Random(maxshort)/double(maxshort);
}
Теперь,собственно,сам класс работы с массивами:
CL_Array.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef CL_ARRAY
#define CL_ARRAY
 
#include"CL_Random.h"
#include<iostream>
using namespace std;
 
class Array
{
    int *Arr;
    int N;
public:
    Array(int _N);
    Array(int*_Arr,int _N);
    ~Array();
    void Display();
    int ArrMaxEl(); // 1) Максимальный э-лт массива
    int Product(); // 2) Произведение эл-тов массива, расположенных между максимальным и минимальным элементами
    Array operator&(); /* 3) Переопределение операции,которая сжимает массив, 
                                  удаляя из него все эл-ты модуль которых находится в интервале [a,b] */
};
#endif
CL_Array.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include"CL_Array.h"
#include"CL_Random.h"
#include<iostream>
#include <fstream>
#include<cstdlib>
using namespace std;
 
Array::Array(int _N)
{
    N=_N;
    Arr = new int[N];
    RND rnd;
    int tmp;
    for(int i=0;i<N;i++)
    {
        tmp=rnd.Random(100);
        Arr[i]=rnd.Random(100);
        if(tmp<=20) Arr[i]=-Arr[i];
    }
}
 
Array::Array(int*_Arr,int _N)
{
    N=_N;
    Arr=_Arr;
}
 
Array::~Array()
{
        delete[]Arr;
}
 
void Array::Display()
{
    for(int i=0;i<N;i++)
    {
        cout<< Arr[i] <<"  ";
    }
    cout<<endl;
    return;
}
 
int Array::ArrMaxEl()
{
    int MAX = Arr[0];
    for(int i=0;i<N;i++)
    {
        if(MAX<Arr[i]) MAX=Arr[i]; 
    }
    return MAX;
}
 
int Array::Product()
{
    int MAX = Arr[0];
    int MIN = Arr[1];
    int MaxInd,MinInd,Pr=1;
    
    for(int i=0;i<N;i++)
    {if(MAX<Arr[i]) MAX=Arr[i];}
    
    for(int i=0;i<N;i++)
    {if(MIN>Arr[i]) MIN=Arr[i];}
    
    for(int i=0;i<N;i++)
    {
        if(MAX==Arr[i]) MaxInd = i;
        if(MIN==Arr[i]) MinInd = i;
    }
    if(MaxInd>MinInd)
    {
    for(int i=MinInd+1;i<MaxInd;i++)
    {Pr*=Arr[i];}}
    else
    {for(int i=MaxInd+1;i<MinInd;i++)
    {Pr*=Arr[i];}}
    return Pr;
}
 
/*
Array Array :: operator&()
{
    int a,b;
    a=-30;b=30;
    //Алгоритм сжатия
    return *this;
}
*/
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include"CL_Array.h"
#include"CL_Random.h"
#include <locale.h>
#include<iostream>
using namespace std;
 
int main()
{
    setlocale( LC_ALL, "Russian");
    
    int N,MAX,Pr;
    cout<<" Введите размер массива N = : ";
    scanf("%d",&N);
 
    Array Arr(N);
 
    Arr.Display();
 
    MAX = Arr.ArrMaxEl();
    cout<<" Максимальный элемент массива : "<<MAX<<endl;
 
    Pr = Arr.Product();
    cout<<" Произведение эл-тов между максимальным и минимальным : "<<Pr<<endl;
 
    //Arr = &Arr;
    //Arr.Display();
    
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2014, 16:07
Ответы с готовыми решениями:

Класс для работы с массивами
В общем, кину сразу код, который наполовину работает class Arr { protected $array = ; ...

Создать класс для работы с массивами
:resent: В с++ еще только плаваю и застряла на класах. Помогите плиз с решением, если не затруднит...

Создать класс для работы с массивами
Начал создавать класс для работы с массивами. Он создает массивы, но всегда возвращает одинаковые...

Класс,содержащий методы для работы с массивами
Создать класс, содержащий методы для работы с массивами. Класс должен содержать поле для количества...

11
lss
934 / 862 / 356
Регистрация: 10.10.2012
Сообщений: 2,706
21.12.2014, 16:33 2
Цитата Сообщение от astonone Посмотреть сообщение
и как считывать размер массива и самы элементы из бинарного файла.
А как записывать в файл знаешь?
0
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 17
21.12.2014, 16:41  [ТС] 3
А как записывать в файл знаешь?
В текстовый файл в да, а в бинарный нет;
0
lss
934 / 862 / 356
Регистрация: 10.10.2012
Сообщений: 2,706
21.12.2014, 16:50 4
Лучший ответ Сообщение было отмечено astonone как решение

Решение

Бинарный метод записи: http://www.cplusplus.com/refer... eam/write/
Бинарный метод чтения: http://www.cplusplus.com/refer... ream/read/
В примерах есть, как открывать файл для бинарной записи/чтения.

Добавлено через 2 минуты
В классе перегрузи операторы >> и << (как дружественные функции), передавай в них ссылку на поток, связанный с файлом, и ссылку на объект класса. И в них распиши процессы бинарной записи/чтения объекта класса.
1
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 17
21.12.2014, 17:29  [ТС] 5
Спасибо. Попробую

Добавлено через 20 минут
Пример из бинарного метода записи вылетает при запуске с кодом 3.
0
lss
934 / 862 / 356
Регистрация: 10.10.2012
Сообщений: 2,706
21.12.2014, 17:36 6
Цитата Сообщение от astonone Посмотреть сообщение
Пример из бинарного метода записи вылетает при запуске с кодом 3.
А файл "test.txt" существует, чтобы пример работал?
0
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 17
21.12.2014, 19:52  [ТС] 7
теперь существует)
0
lss
934 / 862 / 356
Регистрация: 10.10.2012
Сообщений: 2,706
21.12.2014, 19:55 8
Цитата Сообщение от astonone Посмотреть сообщение
теперь существует)
И? Всё равно ошибка?
0
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 17
21.12.2014, 20:01  [ТС] 9
Теперь все заработало,корректно считалось и записалось в другой файл, только вот есть неясность с переопределением операций >> и << :

я объявляю в СL_Array.h

friend Array operator<<(); - а вот не пойму что в качестве аргументов написать?
0
lss
934 / 862 / 356
Регистрация: 10.10.2012
Сообщений: 2,706
21.12.2014, 20:05 10
Цитата Сообщение от astonone Посмотреть сообщение
а вот не пойму что в качестве аргументов написать?
Писал же:
Цитата Сообщение от lss Посмотреть сообщение
передавай в них ссылку на поток, связанный с файлом, и ссылку на объект класса.
Добавлено через 2 минуты
Цитата Сообщение от astonone Посмотреть сообщение
friend Array operator<<();
Возвращаемое значение не Array, а ссылка на поток.
0
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 17
21.12.2014, 20:13  [ТС] 11
извините,но я не понимаю,что значит передать ссылку на поток связанный с файлом :

friend /*что написать тут? */ operator<<(Array _Arr);
0
lss
934 / 862 / 356
Регистрация: 10.10.2012
Сообщений: 2,706
22.12.2014, 01:06 12
Поиском по форуму пользуйтесь:
Перегрузка операторов ввода/вывода
Перегрузка операторов ввода/вывода.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2014, 01:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Создать класс для работы с одномерными массивами
Условие: Класс описывает одномерный массив состоящий из n целых элементов со значениями в...

Нужен готовый класс для работы с массивами
Для работы с массивами, то есть добавление, вычитание, умножение и все в таком роде. Буду очень...

Описать класс для работы с одномерными массивами чисел
Описать класс для работы с одномерными массивами чисел. Класс должен реализовывать возможность:...

Создайте класс «matrix» для работы с одномерными целочисленными массивами
Создайте класс «matrix» для работы с одномерными целочисленными массивами. Организовать ввод данных...

Реализовать класс для работы с одномерными массивами указателей строк
всем привет. помогите пожалуйста не могу написать прогу по заданию. реализовать класс для работы с...

Создать класс для работы с одномерными массивами вещественных чисел
#include &lt;iostream.h&gt; // заголовочные файлы стандартных #include &lt;windows.h&gt; // библиотек ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.