Вариант- 1 Выполнил студент Группы 021754: Юсупов Э. И проверил: Соболь А. М минск 2022


Download 1.41 Mb.
Pdf ko'rish
bet3/6
Sana18.06.2023
Hajmi1.41 Mb.
#1573658
1   2   3   4   5   6
Bog'liq
2-работа.

Индивидуальное Задание -1

Написать программу нахождения массива K последовательных значений 


функции y[i]=sin(2*PI*i/N) (где i=0, 1, 2...K-1) с использованием ряда 
Тейлора. Пользователь задаёт значения K, N и количество n членов ряда 
Тейлора. Для расчета каждого члена ряда Тейлора запускается отдельный 
поток. Каждый поток выводит на экран свой pid и рассчитанное значение 
ряда. Головной процесс суммирует все члены ряда Тейлора, и полученное 
значение y[i] записывает в файл. 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include 
#define PI 3.14159265358979323846 
extern int errno
FILE *input,*output;
char InPath[]="/tmp/math.txt";
char OuPath[]="/tmp/result.txt";
int *thread_count;
typedef struct args_st { 
int i; 
int j; 
int N; 
int c; 
} args_t; 
//удаление строки из подстроки 
void DeletePartPath(char *str, char *fnd, char *buf) 
{
char *p=strstr(str, fnd);
if(p==NULL) 
{strcpy(buf, str); return;}
char *fnd1=fnd; 
while(str
{*buf=*str; buf++; str++; *buf='\0';} 
while(*fnd1) 
{str++; fnd1++;}
strcpy(buf, str); 
return; 

//вид ошибки 
void mist(char err[])

switch(errno) 

case ENOTTY:{fprintf(stderr,"%s Ошибка: Неизвестное управление операциями I/O!
\n",err);break;} 
case EACCES:{fprintf(stderr,"%s Ошибка: Доступ запрещен!\n",err);break;} 
case EBADF :{fprintf(stderr,"%s Ошибка: Недопустимый дескриптор файла!
\n",err);break;} 


case EBUSY :{fprintf(stderr,"%s Ошибка: Ресурс занят!\n",err);break;} 
case EMFILE:{fprintf(stderr,"%s Ошибка: Слишком много открытых файлов!
\n",err);break;} 
case EISDIR:{fprintf(stderr,"%s Ошибка: это каталог!\n",err);break;} 
default: {fprintf(stderr,"%s Ошибка:!\n",err);break;} 


double PowFloat(double value,int in) 

int i; 
double result=1; 
for(i=1;i<=abs(in);i++) 
result*=value/i; 
return result; 

int PowMinusOne(int in) 

if((in%2)==0) return 1; 
else return -1; 

void *element(void *args)
{
args_t *arg = (args_t*)args; 
int sign;
double degree; //считать X^i 
double perem=0; 
double per;
per = 2*PI*arg->i/arg->N; 
degree=PowFloat((per),2*arg->j+1);//считая X^(2i+1) 
sign=PowMinusOne(arg->j+2); //знак изменения 
perem=sign*degree;
//подсчет и идентификатор процесса 
fprintf(stdout,"thread=%d and perem[%d]=%.25f\n",(int)pthread_self(),arg->i,perem); 
//формирование строки 
if(fprintf(input, "%d %d %.8lf\n", (int)pthread_self(),arg->i, perem) == -1) 

fprintf(stdout,"thread error found"); 
pthread_exit(NULL); 

thread_count[arg->c] = 0; 
free(arg); 
pthread_exit(NULL); 

int TailorFunction(char err[], int K, int N, int FF) 

if((input=fopen(InPath,"w+"))==NULL) 

DeletePartPath(err,"./",err); 
mist(err); 
return 1; 

pthread_t thread[FF];
int processes = 0; 
int perem = 0; 
for(int i = 0; ithread_count[i] = 0; 
}


for (int i=0;i{
for (int j=0;j
if (processes == FF) 

int flag = 0; 
while (1) { 
for(int s = 0; sif (thread_count[s] == 0) { 
flag = 1; break; 


if (flag != 0) {break;} 
}
processes--; 

for(int s = 0; sif (thread_count[s] == 0)

perem = s; 
thread_count[s] = 1; 
break; 


args_t *ar = (args_t*)malloc(sizeof(args_t)); 
ar->i = i; 
ar->j = j; 
ar->N = N; 
ar->c = perem; 
if (pthread_create(&thread[perem],NULL,element,ar) != 0) { 
DeletePartPath(err,"./",err); 
mist(err); 
return 1; 

processes++;


for(int i = 0; i
pthread_join(thread[i],NULL); 

if((output=fopen(OuPath,"w"))==NULL) 

DeletePartPath(err,"./",err); 
mist(err); 
return 1; 

double *result = alloca(sizeof(double)*N); 
memset(result, 0, sizeof(double)*N); 
rewind(input); 
int pidd, f; 
double member_value; 
for (int i = 0; i < N*K; i++) { 
if (fscanf(input, "%d %d %lf", &pidd, &f, &member_value) == -1){ 
DeletePartPath(err,"./",err); 
mist(err); 


return 1; 

result[f] += member_value; 

for (int i = 0; i < K; i++)

if (fprintf(output, "y[%d]=%.8lf\n", i, result[i]) == -1) 

DeletePartPath(err,"./",err); 
mist(err); 
return 1; 
}

//пытаясь закрыть 
if(fclose(input)==-1) 

DeletePartPath(err,"./",err); 
mist(err); 
return 1; 

//пытаясь закрыть 
if(fclose(output)==-1) 

DeletePartPath(err,"./",err); 
mist(err); 
return 1; 

//освободить(результат); 
return 0; 

int main(int argc,char *argv[]) 

int K,N,FF; 
//количество аргументов 
if(argc<4) 

fprintf(stderr,"Ошибка:Слишком мало аргументов!\n"); 
return 1; 

K=atoi(argv[1]); 
N=atoi(argv[2]); 
FF=atoi(argv[3]); 
thread_count = calloc(FF,sizeof(int)); 
TailorFunction(argv[0],K,N,FF); 
free(thread_count); 
return 0; 



Мы тут задаем значения, а после видим на экране результат 
Далее создается две папки в которых хранятся результаты 



Download 1.41 Mb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling