Форум программистов, компьютерный форум CyberForum.ru

Помогите с задачкой, пожалуйста. (С++) - C++

Восстановить пароль Регистрация
 
nameplov
0 / 0 / 0
Регистрация: 15.02.2012
Сообщений: 7
15.02.2012, 20:18     Помогите с задачкой, пожалуйста. (С++) #1
Вообщем, программирование только началось, а вопросов куча :\
Помогите, если есть у кого-нибудь желание.
Ближе к задаче: нам дан обычный текстовый файл.. в нём написана информация о номерах телефона.. ну и получается так, что в каждой строке находится информация об одном абоненте: номер телефона, фио, адрес. Нужно написать программу, которая для каждой АТС выводит процент заполненности телефонных номеров. (!)с использованием процедур и функций(!)

Ну как я понял, к каждой АТС может быть подключено 10 000 абонентов, т.е. изменяются 4 последние цифры, поэтому нужно как-то оттолкнуться от первых трех чисел строки..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2012, 20:18     Помогите с задачкой, пожалуйста. (С++)
Посмотрите здесь:

C++ Помогите с задачкой на С++
Помогите с олимпиадной задачкой ( C++
C++ помогите с задачкой((
C++ Помогите с задачкой.
Помогите с Задачкой C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
15.02.2012, 22:34     Помогите с задачкой, пожалуйста. (С++) #2
Попробуем.
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
#include <cstdlib>
#include <ctime>
#include <string>
#include <sstream>
#include <fstream>
#include <iterator>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
 
class Serializable {
 public:
  virtual std::ostream &serialize(std::ostream &stream) const = 0;
};
 
class Deserializable {
 public:
  virtual std::istream &deserialize(std::istream &stream) = 0;
};
 
std::ostream &operator<<(std::ostream &stream, const Serializable &object) {
  return object.serialize(stream);
}
 
std::istream &operator>>(std::istream &stream, Deserializable &object) {
  return object.deserialize(stream);
}
 
class Record : public Serializable, public Deserializable {
 public:
  Record() : name_(), address_(), phone_() {}
  explicit Record(std::istream &stream) { deserialize(stream); }
  Record(const std::string &name, const std::string &address, size_t phone)
    : name_(name), address_(address), phone_(phone) {}
  const std::string getName() const { return name_; }
  const std::string getAddress() const { return address_; }
  const size_t getPhone() const { return phone_; }
  virtual std::ostream &serialize(std::ostream &stream) const {
    return stream << getName() << ';' << getAddress() << ';' <<
      getPhone() << ';';
  }
  virtual std::istream &deserialize(std::istream &stream) {
    getline(stream, name_, ';');
    getline(stream, address_, ';');
    std::string buffer;
    getline(stream, buffer, ';');
    std::stringstream sstream(buffer);
    sstream >> phone_;
    return stream;
  }
 private:
  std::string name_;
  std::string address_;
  size_t phone_;
};
 
void createSomeRecords(const std::string &filename) {
  std::vector<Record> records;
 
  for (int i = 0; i < 10000; ++i)
    records.push_back(Record("Name", "Address",
      (rand() % 4 + 1) * 1000000 + rand() % 10000));
 
  std::ofstream outfile(filename.c_str());
  std::copy(records.begin(), records.end(),
    std::ostream_iterator<Record>(outfile));
}
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
  const std::string filename = "tutor0090.txt";
 
  // создадим несколько случайных записей
  createSomeRecords(filename);
  
  std::vector<Record> records;
  std::ifstream infile(filename.c_str());
 
  // прочитаем записи из файла
  std::copy(std::istream_iterator<Record>(infile), 
    std::istream_iterator<Record>(), std::back_inserter(records));
 
  // составим карту телефонов по "атс".
  std::map<size_t, std::set<size_t> > phoneNumbers;
  for (std::vector<Record>::iterator i = records.begin();
    i != records.end(); ++i)
    phoneNumbers[i->getPhone() / 10000].insert(i->getPhone() % 10000);
 
  // посчитаем количество номеров для каждой "атс" и процент занятых
  for (std::map<size_t, std::set<size_t> >::iterator i = phoneNumbers.begin();
    i != phoneNumbers.end(); ++i)
    std::cout << "ATS " << i->first << ". " << i->second.size() <<
      " numbers, " << i->second.size() / 100 << "%" << std::endl;
}
nameplov
0 / 0 / 0
Регистрация: 15.02.2012
Сообщений: 7
16.02.2012, 02:12  [ТС]     Помогите с задачкой, пожалуйста. (С++) #3
Большое спасибо за проделанную работу.. Но всё же у меня огромные трудности с восприятием данной программы, ибо классы не изучал, да и изучить, боюсь, без объяснения лектора, не смогу в скором времени. Собственно, верхняя часть программы мне и вовсе не понятна( Можно ли, хоть как-нибудь, реализовать данную задачу в самом простом и понятном виде?


Не по теме:

ибо нуб

lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
16.02.2012, 09:46     Помогите с задачкой, пожалуйста. (С++) #4
Цитата Сообщение от nameplov Посмотреть сообщение
Можно ли, хоть как-нибудь, реализовать данную задачу в самом простом и понятном виде?
Вам нужно не проще и понятнее, а как можно примитивнее. Называйте вещи своими именами.

Введем ограничение -- в списке нет повторяющихся номеров. В таком случае, можно обойтись без сета. Мап заменит просто массив из тысячи интеджеров. Жертвуем килобайтами ради примитивности. Так же уберем чтение в память, будем считать прямо при чтении из файла. В жертву универсальность, пишем для сферического коня в вакууме, зато без структур и динамической памяти.

Ну и для вящей примитивности, совместимость с чистым С.

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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
 
int main(int argc, char *argv[]) {
  srand(time(0));
  const char filename[] = "tutor2101.txt";
  int i;
 
  // создание файла
  FILE *outfile = fopen(filename, "w");
  if (!outfile) {
    perror("Could not open file.");
    return 1;
  }
  for (i = 0; i < 60000; ++i)
    fprintf(outfile, "%s;%s;%d;\n", "Name", "Address", 
      (rand() % 3 + 1) * 1000000 + i);
  fclose(outfile);
  
  // атс
  int atses[1000];
  for (i = 0; i < 1000; ++i)
    atses[i] = 0;
 
  // чтение/подсчет
  FILE *file = fopen(filename, "r");
  if (!file) {
    perror("Could not open file.");
    return 1;
  }
  char name[512];
  char address[512];
  size_t phone;
  while (!feof(file))
    if (fscanf(file, "%[^;];%[^;];%d;\n", name, address, &phone) == 3)
      ++atses[phone / 10000];
  fclose(file);
 
  // результат
  for (i = 0; i < 1000; ++i)
    if (atses[i] > 0)
      printf("ATS %d has %d phone(s), it is at %.2f%% of capacity.\n",
        i, atses[i], atses[i] / 100.);
 
  return 0;
};
nameplov
0 / 0 / 0
Регистрация: 15.02.2012
Сообщений: 7
16.02.2012, 10:54  [ТС]     Помогите с задачкой, пожалуйста. (С++) #5
Да, именно то, что я и хотел. Спасибо огромное за проделанную работу!
Yandex
Объявления
16.02.2012, 10:54     Помогите с задачкой, пожалуйста. (С++)
Ответ Создать тему
Опции темы

Текущее время: 03:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru