// sem2_lab1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы. // #include #include #include "histogram.h" #include "show_histogram.h" #include "svg.h" #include #include #include #include using namespace std; struct Input { vector numbers; size_t bin_count{}; }; Input input_data(istream& in,bool prompt, int bins_cht) { Input in_data; int number_count; if(prompt)cerr << "Enter number count: "; in >> number_count; in_data.numbers.resize(number_count); for (size_t i = 0; i < number_count; i++) { in >> in_data.numbers[i]; } if (bins_cht == 0) { if (prompt)cerr << "Enter bin count: "; in >> in_data.bin_count; } else in_data.bin_count = bins_cht; return in_data; } static size_t write_data(void* items, size_t item_size, size_t item_count, void* ctx) { size_t data_size = item_size * item_count; stringstream* buffer = reinterpret_cast(ctx); buffer->write((char*)items, data_size); return data_size; } Input download(const string& address, int bins_cht) { stringstream buffer; CURL* curl = curl_easy_init(); if (curl) { CURLcode res; curl_easy_setopt(curl, CURLOPT_URL, address.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); res = curl_easy_perform(curl); if (res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); exit(1); } curl_easy_cleanup(curl); } return input_data(buffer, false, bins_cht); } bool IsAllDigits(string s) { for(char c : s) if (!isdigit(c)) return false; return true; } int main(int argc, char* argv[]) { curl_global_init(CURL_GLOBAL_ALL); setlocale(LC_ALL, "Russian"); Input input; bool get_bins = false; int get_bins_pos = -1; int bins_cnt = 0; string URL = ""; if (argc > 4) { cerr << "Количество параметров не должно превышать трех"; exit(1); } if (argc > 1) { for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-bins")==0) { get_bins = true; get_bins_pos = i; } else if ((IsAllDigits(argv[i])) && (get_bins_pos == (i-1))) bins_cnt = atoi(argv[i]); else URL = argv[i]; } if (get_bins && (bins_cnt == 0)) { cerr << "После ключа -bins должно следовать натуральное число"; exit(1); } } if (URL == "") input = input_data(cin, true, bins_cnt); else input = download(URL, bins_cnt); auto bins = make_histogram(input.numbers, input.bin_count); show_histogram_svg(bins, input.numbers.size()); return 0; } // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки" // Отладка программы: F5 или меню "Отладка" > "Запустить отладку" // Советы по началу работы // 1. В окне обозревателя решений можно добавлять файлы и управлять ими. // 2. В окне Team Explorer можно подключиться к системе управления версиями. // 3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения. // 4. В окне "Список ошибок" можно просматривать ошибки. // 5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода. // 6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.