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

Метод дихотомии

#include <stdio.h>

#include <conio.h>

#include <math.h>

#include <locale.h>

#include <string.h>

double f(float x)

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

int main()

{ setlocale(LC_ALL,"Rus");

double a,b,c,epsilon;

char namefile[20];

FILE *fp;

printf("Введите левый конец отрезка в пределах [-10;10]: ");

scanf("%lf",&a);

printf("Введите правый конец отрезка в пределах [-10;10]: ");

scanf("%lf",&b);

if (a>b)

{ printf("Начало отрезка не может быть больше конца отрезка");

getch();

return 0; }

if(a<-10||a>10||b>10||b<-10)

{ printf("\nКонцы отрезков не входят в [-10;10]");

getch();

return 0; }

printf("Введите точность: ");

scanf("%lf",&epsilon);

printf("Введите имя файла, в который будет записан ход решения: ");

scanf("%s",&namefile);

strcat(namefile,".txt");

fp=fopen(namefile,"w");

fprintf(fp,"Ход нахождения корней функции:\nsin(x^2/10)*exp(x/10)/(x^2+1) на отрезке: [%lf;%lf] с точностью: %lf\n\n",a,b,epsilon);

printf("\n");

if(f(a)*f(b)>0)

{ printf("Нет решения, так как функция на концах отрезков имеет одинаковые знаки...");

fprintf(fp,"Нет решения, так как функция на концах отрезков имеет одинаковые знаки...");

getch();

return 0; }

while(fabs(b-a) > epsilon)

{ c=(a+b)/2;

printf("a=%lf b=%lf c=%lf ",a,b,c);

printf("f(a)=%lf f(b)=%lf f(c)=%lf\n",f(a),f(b),f(c));

fprintf(fp,"a=%lf b=%lf c=%lf ",a,b,c);

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

if(f(b)*f(c)<0)

a=c;

else

b=c; }

c=(a+b)/2;

printf("a=%lf b=%lf c=%lf ",a,b,c);

printf("f(a)=%lf f(b)=%lf f(c)=%lf\n",f(a),f(b),f(c));

printf("\n\nКорень: %lf",c);

fprintf(fp,"a=%lf b=%lf c=%lf ",a,b,c);

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

fprintf(fp,"\n\nКорень: %lf",c);

getch(); }

Многоаспектныйпоиск с использ инверстных массивов (интервал)

#include<stdio.h>

#include<windows.h>

#include<conio.h>

#include<math.h>

#include<string.h>

#define L 5

int N,K=0;

struct unit{int key1;float key2[L];char data[L];};

int comparison(unit a,unit b,int q)

{if(q==1)

{for(int i=0;i<L;i++)

{if(a.key2[i]>b.key2[i])return 1;

else if(a.key2[i]<b.key2[i])return -1;}

return 0;}

else if(!q)

{if(a.key1<b.key1)return -1;

else if(a.key1>b.key1)return 1;

else return 0;}

else

{for(int i=0;i<L;i++)

{if(a.data[i]>b.data[i])return 1;

else if(a.data[i]<b.data[i])return -1;}

return 0; } }

unit* shell(unit *items,int q)

{ register int i, j, gap;

unit x;

gap=(int)(N/2);

while(gap>0) {

for(i=gap;i<N;i++) {

x=items[i];

for(j=i-gap;(comparison(x,items[j],q)==-1)&&(j>=0);j=j-gap)

{ items[j+gap]=items[j]; }

items[j+gap]=x;}

gap=(int)(gap/2); }

return items;}

unit* search(unit*I){

int a1,a2,N1=0,N2=0;

unit b1,b2;

unit* A=new unit[N];

unit* B=new unit[N];

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

{ A[i]=I[i];

B[i]=I[i];}

A=shell(A,0);

B=shell(B,1);

printf("Input bottom border key(int):\t");

scanf("%d",&a1);

printf("Input top border key(int):\t");

scanf("%d",&a2);

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

{if(A[i].key1>a2)break;

if(A[i].key1>=a1)A[N1++]=A[i]; } A=(unit*)realloc(A,sizeof(unit)*(N1));

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

{ printf("Input %d elemet bottom border key(float):\t",i+1);

scanf("%f",&b1.key2[i]); }

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

{ printf("Input %d element top border key(float):\t",i+1);

scanf("%f",&b2.key2[i]); }

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

{ if (comparison(B[i],b2,1)==1)break;

if(!(comparison(B[i],b1,1)==-1))B[N2++]=B[i]; }

B=(unit*)realloc(B,sizeof(unit)*(N2));

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

{ for(int j=0;j<N2;j++)

{if((A[i].key1==B[j].key1)&&!comparison(A[i],B[j],1)&&!comparison(A[i],B[j],2))A[K++]=A[i]; }}

A=(unit*)realloc(A,sizeof(unit)*(K));

return A; }

void main()

{ SYSTEMTIME tim;

GetSystemTime(&tim);

srand(tim.wMilliseconds);

printf("Input count elements:\t");

scanf("%d",&N);

unit* I=new unit[N];

unit* O;

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

{ I[i].key1=rand();

for(int j=0;j<L;j++)I[i].key2[j]=rand()/100.;

for(int j=0;j<L;j++)I[i].data[j]=(char)(rand()%220+32); }

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

{ printf("%d\t",I[i].key1);

for(int j=0;j<L;j++)printf("%.3f\t",I[i].key2[j]);

printf("\t");

for(int j=0;j<L;j++)printf("%c",I[i].data[j]);

printf("\n"); }

O=search(I);

printf("--------Search--------\n");

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

{ printf("%d\t",O[i].key1);

for(int j=0;j<L;j++)printf("%.3f\t",O[i].key2[j]);

printf("\t");

for(int j=0;j<L;j++)printf("%c",O[i].data[j]);

printf("\n"); }

getch();}