Вариант- 1 Выполнил студент Группы 021754: Юсупов Э. И проверил: Соболь А. М минск 2022
Download 1.41 Mb. Pdf ko'rish
|
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; i } for (int i=0;i for (int j=0;j if (processes == FF) { int flag = 0; while (1) { for(int s = 0; s flag = 1; break; } } if (flag != 0) {break;} } processes--; } for(int s = 0; s { 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; } Мы тут задаем значения, а после видим на экране результат Далее создается две папки в которых хранятся результаты |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling