Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Bringoff
СуперМодулятор
133 / 132 / 48
Регистрация: 03.11.2012
Сообщений: 974
1

Файловые операции: генерировать файл, читать, редактировать, записывать

02.12.2014, 11:20. Просмотров 322. Ответов 4
Метки нет (Все метки)

Попалось задание на заочке, немного не представляю, как его сделать на плюсах (тем более чтобы работало на Borland C++ 5). Кто может помочь?
Задание: "Дан массив записей, который содержит сведения о музыкальном товаре: носитель (грампласинка, аудиокассета, лазерный диск), порядковый номер в каталоге, название,исполнитель (фамилия, имя), время звучания, количество произведений, цена по каталогу. Определить перечень дисков для покупки заказчиком, общая стоимость которых не превышает указанного лимита."
То есть, надо 2 небольших модуля: один должен редактировать файл (как минимум, генерировать файл с несколькими случайными записями), второй его читать и работать с подбором.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2014, 11:20
Ответы с готовыми решениями:

Как правильно открывать файл и записывать/читать из него
Как правильно открывать файл и записывать/читать из него? На разных сайтах и...

Как записывать и читать с БИНАРНОГО файла
доброго времени суток. вопрос такой. есть программа, игра на которой есть...

Файловые операции
Написать программу, которая считывает текст из файла и определяет, сколько в...

Файловые операции 2-ого уровня сложности.
Подскажите пожалуйста найти такую штуку: список файловых ошибок(не уверен что...

Существует ли возможность перехватить файловые операции?
Профи, вопрос для вас!!!) Существует ли возможность перехватить файловые...

4
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 1
02.12.2014, 13:09 2
Bringoff, определитесь, вам нужно средствами C++ реализовать вашу задачу или с помощью борландового диалекта? Это два совершенно разных подхода.
0
Bringoff
СуперМодулятор
133 / 132 / 48
Регистрация: 03.11.2012
Сообщений: 974
03.12.2014, 11:20  [ТС] 3
SatanaXIII, C99. Думаю, так понятнее.

Добавлено через 19 часов 56 минут
В общем, накатал сам такое полотно:
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
89
90
91
92
93
94
95
#define FILENAME "catalogue.dat"
 
#include <cstdio>
#include <time.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
 
using namespace std;
 
struct Composition
{
    int position;
    string media;
    string title;
    string singer_name;
    int duration; //in seconds
    int count_of_songs;
    float price; //in dollars
};
 
const int catalogue_size = 10;
 
const vector<string> media_types{ "7 picture disc", "audiocassette", "CD" };
 
const vector<string> singers{ "Steven Tyler", "Joe Cocker", "B.B. King",
"John Lee Hooker", "Elvis Presley", "Al Green",
"Bob Dylan", "Otis Redding", "Tina Turner", "Freddie Mercury" };
 
const vector<string> albums({ "Ankit", "Bohra", "Xyz", "Cheese",
    "Pepperoni", "Black Olives", "foo",
    "bar", "bletch", "one", "two", "three" });
 
float random_float(float min, float max)
{
    if (max < min) return min;
    float random = ((float)rand()) / (float)RAND_MAX;
 
    float range = max - min;
    return (random*range) + min;
}
 
int generate_catalogue()
{
    srand(time(NULL));
    //const char *FName = FILENAME;
    FILE *file;
    if ((file = fopen(FILENAME, "w")) == NULL)
    {
        perror(FILENAME);
        return 1;
    }
 
    std::ofstream out;
 
    for (int n = 0; n < catalogue_size; n++)
    {
        Composition temp;
        memset(&temp, 0, sizeof temp);
        temp.position = n + 1;
        temp.media = media_types.at(rand() % media_types.size());
        temp.count_of_songs = rand() % 15 + 1;
        temp.duration = rand() % 200 + 150;
        temp.singer_name = singers.at(rand() % singers.size());
        temp.price = random_float(10.0, 200.0);
        temp.title = albums.at(rand() % albums.size());
 
        ofstream f(FILENAME, ios::binary | ios::out | ios::app);
        f.write((char*)&temp, sizeof temp);
        f.close();
    }
 
    return 0;
}
 
int main() {
    if (generate_catalogue() != 0) return 1;
 
    Composition * cp = new Composition[10];
    ifstream in(FILENAME, ios::binary | ios::in);
    for (int i = 0; i < catalogue_size; i++)
    {
        in.read((char*)&cp[i], sizeof cp[i]);
    }
 
    for (int i = 0; i < catalogue_size; i++)
    {
        cout << cp[i].position << cp[i].singer_name << cp[i].title << "\n";
    }
 
    system("pause");
 
    return 0; 
}
Кто может помочь непосредственно с формированием списка "перечня дисков для покупки заказчиком, общая стоимость которых не превышает указанного лимита"?
0
Fallenworld
76 / 76 / 32
Регистрация: 14.04.2014
Сообщений: 408
03.12.2014, 11:36 4
если нужен 1 перечень, пройтись циклом по всем дискам, и добавлять их в вектор подрят, пока сумма цен меньше лимита.
если нужны все возможные, то по каждому диску пройтись.
0
Bringoff
СуперМодулятор
133 / 132 / 48
Регистрация: 03.11.2012
Сообщений: 974
03.12.2014, 14:55  [ТС] 5
Короче, вот так как-то сделал (код страшный, руками не трогать):
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#define FILENAME "catalogue.dat" //имя файла с данными
 
#include <cstdio>
#include <time.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
 
using namespace std;
 
struct Album //структура для хранения данных об альбоме
{
    unsigned int position;
    string media;
    string title;
    string singer_name;
    unsigned int duration; //in seconds
    unsigned int count_of_songs;
    float price; //in dollars
};
 
const int catalogue_size = 10;
 
//данные для создания случайного списка
const vector<string> media_types{ "7 picture disc", "audiocassette", "CD" };
 
const vector<string> singers{ "Steven Tyler", "Joe Cocker", "B.B. King",
"John Lee Hooker", "Elvis Presley", "Al Green",
"Bob Dylan", "Otis Redding", "Tina Turner", "Freddie Mercury"
};
 
const vector<string> albums({ "Ankit", "Bohra", "Xyz", "Cheese",
    "Pepperoni", "Black Olives", "foo",
    "bar", "bletch", "one"
});
//конец данных для создания случайного списка
 
/* Функция, возвращающая случайное число с плавающей запятой в необходимом диапазоне
* Необходима для генерирования случайной цены
*/
float random_float(float min, float max)
{
    if (max < min) return min;
    float random = ((float)rand()) / (float)RAND_MAX;
 
    float range = max - min;
    return (random * range) + min;
}
 
int generate_catalogue()
{
    srand(time(NULL)); //инициализация генератора случайных чисел
    FILE *file;
    std::ofstream out(FILENAME, ios::binary | ios::out | ios::app);
    if (!out) 
    {
        cerr << "Error reading " << FILENAME;
        return 1;
    }
 
    out.clear(); //очистка предыдущего списка
 
    for (int n = 0; n < catalogue_size; n++)
    {
        Album temp;
        memset(&temp, 0, sizeof temp); //инициализация полей структуры нулями
        temp.position = n + 1;
        temp.media = media_types.at(rand() % media_types.size());
        temp.count_of_songs = rand() % 15 + 1;
        temp.duration = rand() % 200 + 150;
        temp.singer_name = singers.at(n);
        temp.price = random_float(10.0, 200.0);
        temp.title = albums.at(n);
 
        out.write((char *)&temp, sizeof temp); //запись в файл в виде массива символов
    }
 
    out.close();
 
    return 0;
}
 
int main()
{
    if (generate_catalogue() != 0) return 1;
 
    Album *cp = new Album[10];
    ifstream in(FILENAME, ios::binary | ios::in); //открытие фацла для чтения
    for (int i = 0; i < catalogue_size; i++)
    {
        in.read((char *)&cp[i], sizeof cp[i]);
    }
 
    for (int i = 0; i < catalogue_size; i++)
    {
        cout << cp[i].position << " " << cp[i].singer_name << " " << cp[i].title << " " << cp[i].price << endl;
    }
 
    cout << "Get you budget: ";
    float budget = 0;
    cin >> budget;
 
    vector<string> albums_for_buying;
    int price = 0;
    for (int i = 0; i < catalogue_size; i++)
    {
        int current_price = cp[i].price;
        if (price + current_price > budget) continue;
        price += current_price;
        albums_for_buying.push_back(cp[i].title);
    }
    cout << "There is a list of albums for buying: ";
    std::copy(albums_for_buying.begin(), albums_for_buying.end(), std::ostream_iterator<string>(std::cout, "; "));
    cout << "\nTotal price is " << price << endl;
    system("pause");
 
    return 0;
}
0
03.12.2014, 14:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2014, 14:55

Записывать в файл результаты
Всем доброго времени суток. Написал игру крестики-нолики. 1) Всё отлично кроме...

Как создавать, записывать в файл
Добрый вечер!:) Подскажите пожалуйста, как создавать, записывать в файл, ввод...

Как записывать в файл символы с пробелами?
как записывать в файл символы с пробелами? Есть структура struct...


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

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

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