Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Различные методы сортировки и поиска си, программирование .docx
Скачиваний:
8
Добавлен:
04.01.2017
Размер:
49.33 Кб
Скачать

Поиск инверсными массивами

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

void search(float* arr[],int len ,int height) {

char answer;

float **inv_arr=NULL,*p=NULL;

int i,j;

int flag,counter;

p=(float*)malloc(height*sizeof(float));

inv_arr=(float**)malloc(len*sizeof(float*));

for(i=0;i<height;i++) {

inv_arr[i]=(float*)malloc(height*sizeof(float)); }

for(;;) {

printf("\n");

for(i=0;i<height;i++) {

printf("Input P%d ",i+1);

scanf("%f",&p[i]); }

for(i=0;i<height;i++) {

for(j=0;j<len;j++) {

if(arr[i][j]==p[i]) inv_arr[i][j]=1;

else inv_arr[i][j]=0; } } flag=0;

for(i=0;i<len;i++) {

counter=0;

for(j=0;j<height;j++) {

if(inv_arr[j][i]) counter++; }

if(counter==height) {printf("Found object %d\n",i+1);flag=1; } }

if(flag==0) printf("Nothing found\n");

printf("Continue searching?(y\\n) ");

answer=getche();

if(answer=='n') {printf("\n");break; } }

free(inv_arr); }

int main (void) {

char file_name[500];

float **arr,temp;

int i=0,j=0,len=0,height=0;

int size;

FILE *file;

printf("Input source filename\n");

scanf("%s",&file_name);

file=fopen(file_name,"r");

if(file==NULL) {

printf("Error. File %s is not exist.\n",file_name);

system("pause");

return 0; }

fseek(file,0,SEEK_END);

size=ftell(file);

fseek(file,0,SEEK_SET);

while(!feof(file)) {

fgets(file_name,size,file); printf("%s",file_name);

height++; }

fseek(file,0,SEEK_SET);

while(!feof(file)) {

fscanf(file,"%f",&temp);

i++; }

len=i/height;

arr=(float**)malloc(len*sizeof(float));

for(i=0;i<height;i++) {

arr[i]=(float*)malloc(len*sizeof(float)); }

fseek(file,0,SEEK_SET);

for(i=0;i<height;i++) {

for(j=0;j<len;j++) {

fscanf(file,"%f",&temp);

arr[i][j]=temp; } }

search(arr,len,height);

fclose(file);

system("pause");

free(arr);

return 0; }

Метод золотого сечения

#include<stdio.h>

#include <conio.h>

#include <math.h>

#include <locale.h>

float func(float x) {

return sin(x*x/1)*exp(x/10)/(x*x+1); }

void main() {

char s[10];

FILE *fp;

float a, b, g, h, f1, f2, eps; //а,b - исходный интервал, g,h - точки золотого сечения, f1, f2 -

значение функции в этих точках

setlocale(LC_ALL,"Russian");

printf("введите имя файла для записи результатов:\n");

fp=fopen(gets(s), "w");

printf("введите границы вычисления:\n");

fprintf(fp, "введите границы вычисления:\n");

scanf("%f %f", &a, &b);

fprintf(fp, "%f %f\n", a, b);

printf("введите точность вычисления:\n");

fprintf(fp, "введите точность вычисления:\n");

scanf("%f", &eps);

fprintf(fp, "%f\n", eps);

g = a+(b-a)*(3-sqrtf(float(5)))/2;

h = a+(b-a)*(sqrtf(float(5))-1)/2;

f1 = func(g);

f2 = func(h);

printf ("находим минимум на [%f; %f]\n g=%f, f(g)=%f\n h=%f, f(h)=%f", a, b, g, f1, h, f2);

fprintf (fp, "находим минимум на [%f; %f]\n g=%f, f(g)=%f\n h=%f, f(h)=%f", a, b, g, f1, h,

f2);

while (abs(f1-f2) > eps)// проверка точности {

if( f1<=f2 ) // минимум слева от f2 {

b = h;

h = g; //получили интервал от a до h

f2 = f1; //значение функции в новой точке h(которая раньше была точкой g)

g = a+(b-a)*(3-sqrtf(float(5)))/2;

f1 = func(g);

printf("\nминимум в пределах [%f; %f]\n g=%f h=%f\n f(g)=%f f(h)=%f", a, b, g, h, f1, f2); fprintf(fp, "\nминимум в пределах [%f; %f]\n g=%f h=%f\n f(g)=%f f(h)=%f", a, b, g, h, f1, f2); }

else // справа от f1 {

a = g;

g = h;

f1 = f2;

h = a+(b-a)*(sqrtf(float(5))-1)/2;

f2 = func(h);

printf("\nминимум в пределах [%f; %f]\n g=%f h=%f\n f(g)=%f f (h)=%f", a, b, g, h, f1, f2);

fprintf(fp, "\nминимум в пределах [%f; %f]\n g=%f h=%f\n f(g)=%f f(h)=%f", a, b, g, h, f1, f2); } }

printf("\nТОЧКА МИНИМУМА = %f\nМИНИМУМ ФУНКЦИИ = %f", (a+b)/2, func((a+b)/2));

fprintf(fp, "\nТОЧКА МИНИМУМА = %f\nМИНИМУМ ФУНКЦИИ = %f", (a+b)/2, func((a+b)/2));

fclose(fp);

getch();}