Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 23, 2016 11:14:51

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Взять данные с Си (90) и при помощи питон-скрипта построить график по этим данным.

пишем программу на С которая данные отправляет в STDOUT; Пишем питон программу которая либо считывает сама STDOUT (что бы можно было построить цепочку вызовов программ) либо изнутри вызывает С программу у которой перехватывает вывод и строит по ним график



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#2 Окт. 23, 2016 11:40:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Взять данные с Си (90) и при помощи питон-скрипта построить график по этим данным.

Argo
Код уже подготовил, осталось только как-то брать эти значения переменных и отправлять их из Си в питон
Запости код, который подготовил.

Argo
Значения X и Y я вывожу в фаил. например “1; 5” где х=1, а y=5. При этом следующая пара значения выводится на новую строку. Как воспользоваться питон-скриптом чтобы он считывал значения переменных правильно и строил по ним график?
Если у тебя есть файл с парами x;y, то можешь открыть его в скрипте на питоне и прочитать эти пары как числа, а потом по ним строить график через matplotlib.

Просто, действительно, описание даёшь смутное, а совет хочешь конкретный и точный - так не бывает. Если спрашиваешь “как сделать что-то там, сам не знаю, что”, то и ответ будет “ну, сделай как-то там сам знаешь, как”.



Отредактировано py.user.next (Окт. 23, 2016 11:42:30)

Офлайн

#3 Окт. 23, 2016 12:11:45

Argo
Зарегистрирован: 2016-10-19
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Взять данные с Си (90) и при помощи питон-скрипта построить график по этим данным.

FishHook
Может лучше в CSV?
Допустим сделаю с ним, но как запустить это всё? чтобы отработал код на си и потом открылся код на питоне?

Офлайн

#4 Окт. 23, 2016 12:15:10

Argo
Зарегистрирован: 2016-10-19
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Взять данные с Си (90) и при помощи питон-скрипта построить график по этим данным.

py.user.next
Запости код, который подготовил.
Тут всё очень сложно, программа с адаптивным шагом, сделана в Clion если что
Сейчас комментарии ещё поставлю
#include <stdio.h>
#include <math.h>

int main() {
int n, tf, j;
double G, F, Y, x, a, x1, r, y_values, y, y2;
y = 0;
j = 0;
y2 = 0;
tf = 1;
do {
if (tf == 1) {
printf(“%s”, “Введите начальную границу X = ”);
scanf(“%lf”, &x);
printf(“%s”, “Введите A = ”);
scanf(“%lf”, &a);
printf(“%s”, “Введите конечную границу Х1 = ”);
scanf(“%lf”, &x1);
printf(“%s”, “Введите размер шага= ”);
scanf(“%lf”, &r);
printf(“%s”,
“Введите: \n N = 1 для нахождения значения переменной G. \n N = 2 для нахождения значения переменной F. \n N = 3 для нахождения значения переменной Y. \n”);
scanf(“%i”, &n);
FILE *v;
v = fopen(“/home/argo/ClionProjects/Laba3C/text.csv”, “w+”);
switch (n) {
case 1:
while (x <= x1) {
if ((5 * pow(a, 2) - 9 * a * x + 4 * pow(x, 4)) != 0) {
G = (5 * (-10 * pow(a, 2) + 27 * a * x + 28 * pow(x, 2))) /
(5 * pow(a, 2) - 9 * a * x + 4 * pow(x, 4));

fprintf(v, “%.3lf %.3lf\n”, x, G); /* Выводим данные в файл text.csv */

if (j == 0) { /* Для первого “круга” работы цикла даём значение первому из двух индексов массива y_values (это значение “y”) */
y_values = G;
printf(“X=%.3lf Y=%.3lf\n”, x, G);
}
if (j >= 1) { /* Для последующих “кругов” работы цикла мы присваем значение “y” только второму индексу массива. Почему? потому что в конце выполнения цикла я приравниваю y_values к y_values */
y_values = G;
printf(“X=%.3lf Y=%.3lf\n”, x, G);
}
if (j == 1) /* Когда нам известны значения y_values и то можем найти среднее арифметическое между ними. Переменную ‘y’ нахожу только один раз, далее я буду присваивать ей значение y2 после выполнения операций */
y = (y_values + y_values) / 2;
else if (j > 1) /* находим второе среднее арифметическое для того чтобы сравнить первое и второе и сделать вывод как сильно изменяется функция. далее напишу для чего это */
y2 = (y_values + y_values) / 2;
if ((fabs(y) > 1.2 * fabs(y2)) && (j > 1) && (y2 != 0)) { /* сравниваем, если модуль первого среднего арифметического, чем модуль второго умноженный на 1.2 (это просто коэфициент), то увеличиваем шаг */
x += r * 2;
y = y2;
} else {
if ((fabs(y) < 1.2 * fabs(y2)) && (j > 1) && (y2 != 0)) { /* опять же сравниваем, если модуль первого среднего арифметического меньше чем 1.2 * модуль второго, то шаг уменьшаем */
x += r * 2;
y = y2;
} else x += r;/* если предыдущие условия не верны, то просто прибавляем шаг и считаем дальше */
if (j > 1) {
y = y2;
}
}
y_values = y_values;
j += 1;
printf(“Количество шагов:%i\n”, j);
continue;
} else
printf(“%s\n”,
“G не может быть результатом деления на 0. Введите другие значения переменных.”);
break;
}
break;
case 2:
while (x <= x1) {
F = sin(28 * pow(a, 2) - 57 * a * x + 14 * pow(x, 2));
if ((F >= -1) && (F <= 1)) {
printf(“X=%lf, Y=%.2lf\n”, x, F);
fprintf(v, “%.3lf %.3lf\n”, x, G);

if (j == 0) {
y_values = G;
printf(“X=%.3lf Y=%.3lf\n”, x, G);
}
if (j >= 1) {
y_values = G;
printf(“X=%.3lf Y=%.3lf\n”, x, G);
}
if (j == 1)
y = (y_values + y_values) / 2;
else if (j > 1)
y2 = (y_values + y_values) / 2;
if ((fabs(y) > 1.2 * fabs(y2)) && (j > 1) && (y2 != 0)) {
x += r * 2;
y = y2;
} else {
if ((fabs(y) < 1.2 * fabs(y2)) && (j > 1) && (y2 != 0)) {
x += r * 2;
y = y2;
} else x += r;
if (j > 1) {
y = y2;
}
}
j += 1;
printf(“Количество шагов:%i\n”, j);
continue;

} else
printf(“%s\n”,
“Переменная F не принадлежит отрезку синуса от -1 до 1. Введите другие значения”);
break;
}
break;
case 3:
while (x <= x1) {
Y = log(-27 * pow(a, 2) + 24 * a * x + 35 * pow(x, 2) + 1);
if (Y > 0) {
fprintf(v, “%.3lf %.3lf\n”, x, G);

if (j == 0) {
y_values = G;
printf(“X=%.3lf Y=%.3lf\n”, x, G);
}
if (j >= 1) {
y_values = G;
printf(“X=%.3lf Y=%.3lf\n”, x, G);
}
if (j == 1)
y = (y_values + y_values) / 2;
else if (j > 1)
y2 = (y_values + y_values) / 2;
if ((fabs(y) > 1.2 * fabs(y2)) && (j > 1) && (y2 != 0)) {
x += r * 2;
y = y2;
} else {
if ((fabs(y) < 1.2 * fabs(y2)) && (j > 1) && (y2 != 0)) {
x += r * 2;
y = y2;
} else x += r;
if (j > 1) {
y = y2;
}
}
j += 1;
printf(“Количество шагов:%i\n”, j);
continue;
} else
printf(“%s\n”,
“Логарифм не может быть найден при таких значениях переменных. Введите другие значения переменных.”);
break;
}
break;

default:
printf(“%s\n”, “Ошибка, попросите вывод результата одной из переменных G,F или Y.”);

}
}


printf(“%s”,
“Хотите ли ещё раз просчитать функцию? \n Введите 1 если хотите просчитать заново. \n Введите 0 для отмены.”);
scanf(“%i”, &tf);

if (tf == 0) break;
else continue;
} while (1);


return 0;
}

Отредактировано Argo (Окт. 23, 2016 12:32:35)

Офлайн

#5 Окт. 23, 2016 12:53:57

Argo
Зарегистрирован: 2016-10-19
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Взять данные с Си (90) и при помощи питон-скрипта построить график по этим данным.

JOHN_16
пишем программу на С которая данные отправляет в STDOUT; Пишем питон программу которая либо считывает сама STDOUT (что бы можно было построить цепочку вызовов программ) либо изнутри вызывает С программу у которой перехватывает вывод и строит по ним график
А как их связать? чтобы вызывалась сначала программа на си, а потом на питоне

Офлайн

#6 Окт. 23, 2016 12:57:52

Argo
Зарегистрирован: 2016-10-19
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Взять данные с Си (90) и при помощи питон-скрипта построить график по этим данным.

Или может это лучше сделать через питон-скрипт?

Офлайн

#7 Окт. 23, 2016 13:09:41

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Взять данные с Си (90) и при помощи питон-скрипта построить график по этим данным.

FishHook
Тащить сюда numpy, это как-то слишком. Может лучше в CSV?
matplotlib все равно потащит numpy



Офлайн

#8 Окт. 23, 2016 13:25:56

Argo
Зарегистрирован: 2016-10-19
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Взять данные с Си (90) и при помощи питон-скрипта построить график по этим данным.

doza_and
matplotlib все равно потащит numpy
Для меня не проблема построить функцию в самом питоне (я сделал программу которая строит график), проблема в том, что я не знаю как мне связать Си с питоном и как взять данные из файла для питона
Ах да, если что я использую Clion

Отредактировано Argo (Окт. 23, 2016 13:33:33)

Офлайн

#9 Окт. 23, 2016 15:49:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Взять данные с Си (90) и при помощи питон-скрипта построить график по этим данным.

Argo
Тут всё очень сложно, программа с адаптивным шагом, сделана в Clion если что
Сейчас комментарии ещё поставлю
Надо не комментарии, а теги кода, иначе стираются отступы и заменяются кавычки. (Нужно так отправлять код, чтобы его можно было скопировать и скомпилировать без всяких замен.)

Пример
printf("abc");



Отредактировано py.user.next (Окт. 23, 2016 15:50:20)

Офлайн

#10 Окт. 23, 2016 17:05:41

Argo
Зарегистрирован: 2016-10-19
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Взять данные с Си (90) и при помощи питон-скрипта построить график по этим данным.

py.user.next
Надо не комментарии, а теги кода, иначе стираются отступы и заменяются кавычки. (Нужно так отправлять код, чтобы его можно было скопировать и скомпилировать без всяких замен.)
 #include <stdio.h>
#include <math.h>
int main() {
    int n, tf, j;
    double G, F, Y, x, a, x1, r, y_values[2], y, y2;
    y = 0;
    j = 0;
    y2 = 0;
    tf = 1;
    do {
        if (tf == 1) {
            printf("%s", "Введите начальную границу X = ");
            scanf("%lf", &x);
            printf("%s", "Введите A = ");
            scanf("%lf", &a);
            printf("%s", "Введите конечную границу Х1 = ");
            scanf("%lf", &x1);
            printf("%s", "Введите размер шага= ");
            scanf("%lf", &r);
            printf("%s",
                   "Введите: \n N = 1 для нахождения значения переменной G. \n N = 2 для нахождения значения переменной F. \n N = 3 для нахождения значения переменной Y. \n");
            scanf("%i", &n);
            FILE *v;
            v = fopen("/home/argo/For-PenzGTU/Laba3/Laba3C/text.csv", "w+");
            switch (n) {
                case 1:
                    while (x <= x1) {
                        if ((5 * pow(a, 2) - 9 * a * x + 4 * pow(x, 4)) != 0) {
                            G = (5 * (-10 * pow(a, 2) + 27 * a * x + 28 * pow(x, 2))) /
                                (5 * pow(a, 2) - 9 * a * x + 4 * pow(x, 2));
                            fprintf(v, "%.3lf %.3lf\n", x,",", G); /* Выводим данные в файл text.csv */
                            if (j ==0) { /* Для первого "круга" работы цикла даём значение первому из двух индексов массива y_values (это значение "y") */
                                y_values[1] = G;
                                printf("X=%.3lf Y=%.3lf\n", x, G);
                            }
                            if (j >= 1) {
                                /* Для последующих "кругов" работы цикла мы присваем значение "y" только второму индексу массива. Почему? потому что в конце выполнения цикла я приравниваю y_values[1] к y_values[2] */
                                y_values[2] = G;
                                printf("X=%.3lf Y=%.3lf\n", x, G);
                            }
                            if (j == 1)
                                /* Когда нам известны значения y_values[1] и [2] то можем найти среднее арифметическое между ними. Переменную 'y' нахожу только один раз, далее я буду присваивать ей значение y2 после выполнения операций */
                                y = (y_values[1] + y_values[2]) / 2;
                            else if (j > 1){
                                /* находим второе среднее арифметическое для того чтобы сравнить первое и второе и сделать вывод как сильно изменяется функция. далее напишу для чего это */
                                y2 = (y_values[1] + y_values[2]) / 2;}
                            if ((fabs(y) > 1.2 * fabs(y2)) && (j > 1) && (y2 != 0)) {
                                /* сравниваем, если модуль первого среднего арифметического, чем модуль второго умноженный на 1.2 (это просто коэфициент), то увеличиваем шаг */
                                x +=r*2;
                                y = y2;
                            } else {
                                if ((fabs(y) < 1.2 * fabs(y2)) && (j > 1) && (y2 != 0)) {
                                    /* опять же сравниваем, если модуль первого среднего арифметического меньше чем 1.2 * модуль второго, то шаг уменьшаем */
                                    x +=r / 2;
                                    y = y2;
                                }
                                if (j > 1) {
                                    y = y2;
                                }
                            }
                            x += r;/* если предыдущие условия не верны, то просто прибавляем шаг и считаем дальше */
                            if (j >= 1) {
                                y_values[1] = y_values[2];
                            }
                            j += 1;
                            printf("Количество шагов:%i\n", j);
                            continue;
                        } else
                            printf("%s\n",
                                   "G не может быть результатом деления на 0. Введите другие значения переменных.");
                        break;
                    }
                    break;
                case 2:
                    while (x <= x1) {
                        F = sin(28 * pow(a, 2) - 57 * a * x + 14 * pow(x, 2));
                        if ((F >= -1) && (F <= 1)) {
                            printf("X=%lf,  Y=%.2lf\n", x, F);
                            fprintf(v, "%.3lf %.3lf\n", x, G);
                            if (j == 0) {
                                y_values[1] = G;
                                printf("X=%.3lf Y=%.3lf\n", x, G);
                            }
                            if (j >= 1) {
                                y_values[2] = G;
                                printf("X=%.3lf Y=%.3lf\n", x, G);
                            }
                            if (j == 1)
                                y = (y_values[1] + y_values[2]) / 2;
                            else if (j > 1)
                                y2 = (y_values[1] + y_values[2]) / 2;
                            if ((fabs(y) > 1.2 * fabs(y2)) && (j > 1) && (y2 != 0)) {
                                x += r * 2;
                                y = y2;
                            } else {
                                if ((fabs(y) < 1.2 * fabs(y2)) && (j > 1) && (y2 != 0)) {
                                    x += r * 2;
                                    y = y2;
                                } else x += r;
                                if (j > 1) {
                                    y = y2;
                                }
                            }
                            j += 1;
                            printf("Количество шагов:%i\n", j);
                            continue;
                        } else
                            printf("%s\n",
                                   "Переменная F не принадлежит отрезку синуса от -1 до 1. Введите другие значения");
                        break;
                    }
                    break;
                case 3:
                    while (x <= x1) {
                        Y = log(-27 * pow(a, 2) + 24 * a * x + 35 * pow(x, 2) + 1);
                        if (Y > 0) {
                            fprintf(v, "%.3lf %.3lf\n", x, G);
                            if (j == 0) {
                                y_values[1] = G;
                                printf("X=%.3lf Y=%.3lf\n", x, G);
                            }
                            if (j >= 1) {
                                y_values[2] = G;
                                printf("X=%.3lf Y=%.3lf\n", x, G);
                            }
                            if (j == 1)
                                y = (y_values[1] + y_values[2]) / 2;
                            else if (j > 1)
                                y2 = (y_values[1] + y_values[2]) / 2;
                            if ((fabs(y) > 1.2 * fabs(y2)) && (j > 1) && (y2 != 0)) {
                                x += r * 2;
                                y = y2;
                            } else {
                                if ((fabs(y) < 1.2 * fabs(y2)) && (j > 1) && (y2 != 0)) {
                                    x += r * 2;
                                    y = y2;
                                } else x += r;
                                if (j > 1) {
                                    y = y2;
                                }
                            }
                            j += 1;
                            printf("Количество шагов:%i\n", j);
                            continue;
                        } else
                            printf("%s\n",
                                   "Логарифм не может быть найден при таких значениях переменных. Введите другие значения переменных.");
                        break;
                    }
                    break;
                default:
                    printf("%s\n", "Ошибка, попросите вывод результата одной из переменных G,F или Y.");
            }
        }
        printf("%s",
               "Хотите ли ещё раз просчитать функцию? \n Введите 1 если хотите просчитать заново. \n Введите 0 для отмены.");
        scanf("%i", &tf);
        if (tf == 0) break;
        else continue;
    } while (1);
    return 0;
}
поставил как питон, но это си 90 если что

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version