Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 Перевести код с python на c++  [new]
xamelione25
Member

Откуда:
Сообщений: 70
Помогите перевести код с python на c++ дополнительно добавив вывод значений в excel из строки 25
автор
print(*list(zip(bins, lambd * np.exp(-lambd * bins))), sep='\n')

**********************************
import numpy as np
if __name__ == '__main__':
    import matplotlib.pyplot as plt
    lambd1 = 0.1
    N = 10000
    def expa(lambd, N):
        import random
        import math
        xi = []
        yi = []
        sum = 0
        sig = 0
        for i in range(N):
            xi.append(random.random())
            yi.append(-1/lambd * math.log(xi[i]))
            sum += yi[i]
        my = sum / N
        for i in range(N):
            sig = (yi[i] - my) ** 2
        sig = sig / (N - 1)
        return yi
    arr = expa(lambd1, N)
    def test_exponential(lambd, arr):
        count, bins, ignored = plt.hist(arr, 30, density=True)
        print(*list(zip(bins, lambd * np.exp(-lambd * bins))), sep='\n')
        plt.plot(bins, lambd * np.exp(-lambd*bins), linewidth=1, color='y')
        i = 0
        plt.grid()
        plt.show()
    s = test_exponential(lambd1, arr)
20 фев 21, 15:44    [22284126]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Забей, это переводу не поддаётся.

Posted via ActualForum NNTP Server 1.5

20 фев 21, 16:35    [22284160]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
xamelione25
Member

Откуда:
Сообщений: 70
Dimitry Sibiryakov,

ну подается или нет,

мне нужно просто таже самое выполнить только на c++ просто нарисовать график и его опорные точки по которым он строиться - вывести в иксель
20 фев 21, 17:54    [22284189]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
Dima T
Member

Откуда:
Сообщений: 15689
С++ тебе зачем? Такие задачи на нем неудобно решать, возьми C#, производительность почти такая же и есть готовые библиотеки под твою задачу.
20 фев 21, 17:58    [22284191]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
White Owl
Member

Откуда:
Сообщений: 12682
xamelione25,

Заплатишь за перевод?
20 фев 21, 17:59    [22284194]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
xamelione25
Member

Откуда:
Сообщений: 70
Dima T,

White Owl,

поймите я сам понимаю что некоторые не просто так на питоне сделали...

у меня основа уже сделана на c++ и мне нужно просто сделать график, даже правильнее сказать не сам мне график сделать как просто значения координат точек вывести в иксель по которым я потом смогу в самому икселе график построить

мне сама прорисовка графика не так важна

Сообщение было отредактировано: 20 фев 21, 18:02
20 фев 21, 18:04    [22284196]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

xamelione25
даже правильнее сказать не сам мне график сделать как просто значения координат точек
вывести в иксель

Как тебе уже сказали в предыдущем топике: выводи данные в CVS файл. Всё упрощается тем,
что они у тебя числовые. В чём проблема?

Posted via ActualForum NNTP Server 1.5

20 фев 21, 18:42    [22284207]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
xamelione25
Member

Откуда:
Сообщений: 70
Dimitry Sibiryakov,

Да проблема не с выводом в excel ...

проблема в том что мне нужно просто координаты формируемого графика вывести (даже не сам график) .... хоть в txt ...(в excel не сильно принципиально)

а там это выполнено в питоне..... вот у меня возник ступор.... чтобы сделать аналогично на c++
20 фев 21, 20:15    [22284238]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

xamelione25
а там это выполнено в питоне..... вот у меня возник ступор.... чтобы сделать аналогично на c++

Арифметические действия не отличаются. Правда у питона арифметика длинная, так что и в
С++, возможно, придётся взять библиотеку длинной арифметики. С какой именно операцией у
тебя проблема?

Posted via ActualForum NNTP Server 1.5

20 фев 21, 20:30    [22284242]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
xamelione25
Member

Откуда:
Сообщений: 70
Dimitry Sibiryakov,


Dimitry Sibiryakov
С какой именно операцией у
тебя проблема?


ну смотрите, у меня есть программа на с++
+
#include<iostream>
#include<conio.h>
#include<locale.h>
#include<math.h>
#include<time.h>
#include<cmath>
#include<fstream>
#include<string>
float tpostyp = 0;//random
float tobrk = 0;//random
float tobrevm = 0;//random
int k = 0;
int t0 = 0;
int emkost = 0;
float lambda = 0.1;
float Xi = 0;
bool KanalSvob = true;
float proizvoditelnost = 0;
float stoimost = 0;
float cena = 1;
float vsignala = 0.01;
float p = 0;
using namespace std;

float FuncPostuplenie_v_kanal_vrem(int regim)
{
	if (regim == 2)
	{
		return tpostyp = 10;
	}
	else
	{
		Xi = (double)(1 + rand() % 100) / 100;
		tpostyp = -1 / 0.1 * log(Xi);
		return tpostyp;
	}
}
float FuncObrabotka_v_kanal_vrem(int regim)
{
	if (regim == 2)
	{
		return tobrk = 10;
	}
	else
	{
		Xi = (double)rand() / RAND_MAX;
		tobrk = 1.5 * cos(2 * 3.14 * Xi) * sqrt(-2 * log(Xi)) + 10;
		return tobrk;
	}
}
float FuncObrabotka_v_evm_vrem(int regim)
{
	if (regim == 2)
	{
		return tobrevm = 33;
	}
	else
	{
		Xi = (double)rand() / RAND_MAX;
		tobrevm = 3 * cos(2 * 3.14 * Xi) * sqrt(-2 * log(Xi)) + 33;
		return tobrevm;
	}
}
float FuncEmkost(int regim)
{
	if (regim == 2)
	{
		return emkost = 4;
	}
	else
	{
		return emkost = 2 + rand() % 6;
	}
}

int main()
{
	int N = 0;
	int reg = 0;
	int j = 0;
	int min = -1;
	int mindex = 0;
	string stroka = "";
	//int **Mass;
	setlocale(LC_ALL, "Russian");
	srand(time(NULL));
	ofstream f1;
	f1.open("log.txt", ios_base::trunc);
	if (f1)
	{
		cout << "Файл успешно открыт для записи в него статистики" << endl;
	}
	cout << "	Введите количество ЭВМ, участвующих в процессе = ";
	cin >> N;//столько будет массивов (очередей)
	f1 << "Всего ЭВМ " << N << endl;
	int* MassEVM = new int[N];
	for (int i = 0; i < N; i++)
	{
		MassEVM[i] = 0;//эвм без сигналов
	}
	int* EmkostEVM = new int[N];//массив емкостей эвм
	for (int i = 0; i < N; i++)
	{
		EmkostEVM[i] = 4;//инициализация
	}
	int* countSignalEVM = new int[N];//сколько сигналов обработала каждая эвм (для статистики)
	for (int i = 0; i < N; i++)
	{
		countSignalEVM[i] = 0;//инициализация
	}
	int countDestroySignal = 0;//сколько сигналов было уничтожено из - за смены емкости эвм
	int* SvobodnostEVM = new int[N];//состояние  емкостей эвм 0 -свободно, 1-работает
	for (int i = 0; i < N; i++)
	{
		SvobodnostEVM[i] = 0;//инициализация
	}
	int* TimerEVM = new int[N];//Таймер на каждой ЭВМ, отвечающий за обработку сигнала
	for (int i = 0; i < N; i++)
	{
		TimerEVM[i] = 0;//инициализация
	}
	int buffer = 10000;
	cout << "Введите режим работы генератора 1- случайно, 2 - постоянно" << endl;
	cin >> reg;
	float time1 = 0;
	float time2 = 0;
	float time3 = 0;
	float tend1 = 0;
	float tend2 = 0;
	float* tend3 = new float[N];
	for (int i = 0; i < N; i++)
	{
		tend3[i] = 0;
	}
	bool flag = true;
	bool newsignal = false;
	bool flagkanal = true;
	int* flagevm = new int[N];
	for (int i = 0; i < N; i++)//0 - свободная, 1 - обрабатывает
	{
		flagevm[i] = 0;
	}
	do
	{
		t0 = t0 + 1;
		if (KanalSvob == true)//проверка на свободность канала
		{
			if (flagkanal == true)
			{
				tend1 = t0 + (time1 = FuncPostuplenie_v_kanal_vrem(reg));
				//f1 << "Yi " << tpostyp << endl;
				flagkanal = false;
			}
			KanalSvob = false;
		}
		else
		{
			if (buffer != 0)//если в буфере есть место, заносим сигнал в него
			{
				buffer--;//буфер уменьшен на величину сигнала
			}
		}
		//начало обработки сигнала в канале
		if (KanalSvob == false)//значит в канале есть сигнал
		{
			if (flag == true)
			{
				tend2 = t0 + (time2 = FuncObrabotka_v_kanal_vrem(reg));
				flag = false;
			}
			if (t0 < tend2)
			{//идет обработка сигнала
			}
			else
			{
				k++;//увеличиваем счетчик количества обработанных сигналов на 1
				newsignal = true;
				f1 << "Прошло " << t0 << " мск " << " Канал " << KanalSvob << " Из канала вышел новый сигнал. Всего сигналов обработано в канале = " << k << endl;
				if (t0 >= tend1)
				{
					KanalSvob = true;
					flag = true;
					flagkanal = true;
					buffer++;//берем из буфера следующий необработанный сигнал и освобождаем место
				}
			}
		}
		//поступление в ЭВМ
		if ((k != 0) && (newsignal == true))
		{
			//min=FuncCountElementinEVM(MassEVM,N); //ищем ЭВМ с наименьшей занятостью
			min = MassEVM[0];
			mindex = 0;
			for (j = 1; j < N; j++)//проход по каждой эвм
			{
				if (MassEVM[j] < min)//ищем наименьший элемент в очереди эвм
				{
					min = MassEVM[j];///////!!!!!
					mindex = j;
				}
			}
			//cout<<"минимальный элемент равен"<<min;
			MassEVM[mindex] = MassEVM[mindex] + 1;//добавляем сигнал в очередь на обработку ЭВМ
			if (MassEVM[mindex] > 0)//если машина обрабатывает сигнал, то её емкость не меняем
			{
				SvobodnostEVM[mindex] = 1;
				time3 = FuncObrabotka_v_evm_vrem(reg);
				TimerEVM[mindex] = time3;//Заводим таймер для выбранной ЭВМ
			}
		}
		//сама обработка
		for (int j = 0; j < N; j++)
		{
			if ((flagevm[j] == 0) && (newsignal == true))
			{
				tend3[j] = t0 + TimerEVM[j];
				flagevm[j] = 1;
				newsignal = false;
			}
			if (t0 <= tend3[j])
			{
				//сигнал еще обрабатывается
				f1 << "Прошло " << t0 << " мск" << "Канал " << KanalSvob << " Сигнал обрабатывается в " << j + 1 << " ЭВМ" << endl;
				for (int index = 0; index < N; index++)
				{
					if (SvobodnostEVM[index] == 0)//если ЭВМ не работает, то изменяем её емкость
					{
						EmkostEVM[index] = FuncEmkost(reg);
						countDestroySignal = countDestroySignal + MassEVM[index];
						MassEVM[index] = 0;//очищаем очередь ЭВМ, т.к была изменена её ёмкость
					}
				}
			}
			else
			{
				//SvobodnostEVM[j]=0;
				for (int index3 = 0; index3 < N; index3++)
				{
					if ((t0 > tend3[index3]) && (tend3[index3] > 0) && (SvobodnostEVM[index3] == 1))//вм закончила обработку
					{
						if (flagevm[index3] == 1)
						{
							SvobodnostEVM[index3] = 0;
							countSignalEVM[index3] = countSignalEVM[index3] + 1;//увеличиваем счетчик количесва обработанных ЭВМ сигналов
							f1 << "Прошло " << t0 << " мск" << "Сигнал обработался в " << index3 + 1 << " ЭВМ" << endl;
							TimerEVM[index3] = 0;//обнуляем таймер ЭВМ, которая закончила свою работу
							flagevm[index3] = 0;
						}
					}
				}
			}
		}
		if (min == -1)
		{
			f1 << "Прошло " << t0 << " мск " << " Канал " << KanalSvob << " Сигнал обрабатывается в канале и не поступал в ЭВМ" << endl;
		}
		else
		{
		}
	} while ((k < 1000) && (buffer != 0));//k=1000
	cout << "Запись в файл завершена" << endl;
	int signalovobr = 0;
	f1 << "Прошло " << t0 << " мск " << " Канал " << KanalSvob << " Обработка завершена. Обработано сигналов каждой ЭВМ:" << endl;
	for (int index = 0; index < N; index++)
	{
		f1 << "ЭВМ № " << index + 1 << " " << countSignalEVM[index] << endl;
		signalovobr = signalovobr + countSignalEVM[index];
	}
	f1 << "В результате изменения емкости ЭВМ было уничтожено " << countDestroySignal << " сигналов" << endl;
	proizvoditelnost = float(k) / float(t0);
	stoimost = signalovobr * cena;
	p = emkost / vsignala / k;
	f1 << "Производительность системы = " << proizvoditelnost << " сигналов / мск " << endl;
	f1 << "Стоимость обработки сигналов  в ЭВМ = " << stoimost << " руб." << endl;
	f1 << "Вероятность переполнения накопителя = " << p << endl;
	f1.close();
	system("Pause");
}


мне нужно чтобы процедура
автор
FuncPostuplenie_v_kanal_vrem
выполняла те манипуляции которые выполняются (прописаны) в коде из первого поста, за исключением формирования графика. Не принципиально куда должны будут выводиться координаты сформированного графика или в txt или в xlsx - без разницы.
20 фев 21, 20:52    [22284256]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
Не знаю Питон но я-бы спросил следующее.

Что-за библиотека Numpy. Что-то с числами? Длинная арифметика? Нужно найти ей аналог в сях.

Что за отсутсвие типизации в шапке функции? Какой тип она возвращает.
import numpy as np
if __name__ == '__main__':
    import matplotlib.pyplot as plt
    lambd1 = 0.1
    N = 10000
    def expa(lambd, N):


Предположительно это может быть аналог

std::vector<double> expa(double lambd, int N) {

}


Но я-бы еще проверил. Чортов змей выводит типы в рантайме.
20 фев 21, 22:38    [22284287]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
xamelione25
Member

Откуда:
Сообщений: 70
mayton,

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

Там тоже самое фактически есть и в коде c++ в том что я скинул... Но там нету просто вывода самих этих координат графика...

У меня сама проблема то в том что мне нужно чтобы у меня эти координаты отображались
20 фев 21, 22:46    [22284289]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

xamelione25
Но там нету просто вывода самих этих координат графика...

Как это нет? Там же в каждой второй строчке что-то выводится в f1.

Posted via ActualForum NNTP Server 1.5

20 фев 21, 23:10    [22284294]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
Непонятно зачем там что-то про Excel написано. Это только сбивает с толку читающего.

Лучше сразу писать что выводим в текстовый файл в нужном формате.
20 фев 21, 23:18    [22284295]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
xamelione25
Member

Откуда:
Сообщений: 70
mayton, Dimitry Sibiryakov,

вот посмотрите как получается на скрине итоговый вывод значений - вот мне так же нужно чтобы у меня выводилось или в txt или xlsx, с помощью кода c++

К сообщению приложен файл. Размер - 137Kb


Сообщение было отредактировано: 21 фев 21, 00:04
21 фев 21, 00:10    [22284303]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

xamelione25
вот мне так же нужно чтобы у меня выводилось или в txt или xlsx, с помощью кода c++

Ну значит берите и строчку за строчкой гугльте. Потом пишите аналог этой строчки на С++.
Про отдельные особо заковыристые строки можете спросить здесь.

А чтобы "у меня есть <нагугленные много нипанятных букаф>, а мне нужно чтобы они делали
<другие нагугленные буквы>" - это так на форуме не работает.

PS: И таки да, два приведённых листинга делают совершенно разные вещи.

Posted via ActualForum NNTP Server 1.5

21 фев 21, 01:20    [22284316]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
Это что?

import matplotlib.pyplot as plt


Поддержка графического виджета для рисования графиков и диаграмм?
Как это переносить на С++? Подозреваю что никак. Тогда вызывать из С++
Python приложение как процесс? Какое-то извращение выходит.
22 фев 21, 14:08    [22284741]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3722
это стиль милторга
22 фев 21, 21:33    [22284925]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
NekZ
Member

Откуда: Stuttgart, Baden-Württemberg.
Сообщений: 3577
Nuitka в помощь
23 фев 21, 11:38    [22285059]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
NekZ, учитывая нулевой уровень вопрощающего, данный совет столь-же полезен
как и совет мастера Йоды - "использовать силу".
23 фев 21, 12:08    [22285069]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
mayton
Это что?

import matplotlib.pyplot as plt


Поддержка графического виджета для рисования графиков и диаграмм?
Как это переносить на С++? Подозреваю что никак. Тогда вызывать из С++
Python приложение как процесс? Какое-то извращение выходит.

Модератор: Редактировано


https://matplotlib-cpp.readthedocs.io/en/latest/

Сообщение было отредактировано: 23 фев 21, 15:33
23 фев 21, 14:13    [22285131]     Ответить | Цитировать Сообщить модератору
 Re: Перевести код с python на c++  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
Хм.. не знал про Matplotlib.
23 фев 21, 14:21    [22285135]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить