#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <memory.h>
#include <time.h>
#include <string.h>
void qsort(int **Arr, int SizeM, int SizeN)
{
int i, j, k;
for (i = 0; i<SizeN; i++)
{
for (j = 0; j<SizeM; j++)
{
for (k = j+1; k < SizeM; k++)
{
if (Arr[j][i] > Arr[k][i])
{
int Temp = Arr[k][i];
Arr[k][i] = Arr[j][i];
Arr[j][i] = Temp;
}
}
}
}
}
int SearchLine (int **Arr, int SizeM, int SizeN,int Col, int Value)
{
bool isSearch = false;
int Result = -1;
int Iteration = 0;
int i;
for (i = 0; i <SizeM; i++)
{
Iteration++;
if (Arr[i][Col] == Value)
{
isSearch = true;
Result = i;
break;
}
}
printf("Линейный поиск элемента %i \n", Value);
if (isSearch)
printf("Элемент %i - найден. Его позиция(строка) %i\n", Value, Result);
else
printf("Элемент %i - НЕ найден.\n", Value);
printf("Итераций на поиск: %i\n", Iteration);
return Result;
}
int SearchBin (int **Arr, int SizeM, int SizeN,int Col, int Value)
{
int bFirst = 0;
int bEnd = SizeM - 1;
int bMiddle;
int Result = -1;
int Iteration = 0;
printf("Двоичный поиск элемента %i \n", Value);
if (Value < Arr[bFirst][Col] || Value > Arr[bEnd][Col])
{
printf ("Элемент лежит вне отсортированой колонки");
return Result;
}
while ( bFirst < bEnd)
{
bMiddle = (bFirst + bEnd) / 2;
if (Value <= Arr[bMiddle][Col])
bEnd = bMiddle;
else
bFirst = bMiddle + 1;
Iteration++;
}
if (Arr[bEnd][Col] == Value)
{
Result = bEnd;
}
if (Result != -1)
printf("Элемент %i - найден. Его позиция(строка) %i\n", Value, Result);
else
printf("Элемент %i - НЕ найден.\n", Value);
printf("Итераций на поиск: %i\n", Iteration);
return Result;
}
int main (int argc, char *argv[])
{
setlocale(LC_ALL,".1251");
srand(time(NULL));
int **Arr;
int m,n;
int i,j;
int selected = 0;
int SearchValue;
int Col = 0;
FILE *File = NULL;
char filename[32]={0};
if (argv[1])
{
printf("В коммандной строке указан файл : %s",argv[1]);
strncpy(filename,argv[1],31);
}
else
{
printf("Введите имя файла : ");
scanf("%31s",filename);
printf("Прользователь указал имя файла : %s \n",filename);
printf("Выберите режим файла <0>- чтение, <1> - запись : ");
scanf("%i",&selected);
}
if (selected == 0)
{
printf("Режим чтения\n");
File = fopen(filename,"r+");
}
else
{
File = fopen(filename,"w");
printf("Режим записи\n");
}
if (!File)
{
printf("Ошибка открытия файла");
return 1;
}
if (selected !=0)
{
printf("Введите размерность [m,n] :");
scanf("%i,%i", &m, &n);
fprintf(File,"%i %i", m, n);
}
else
fscanf(File,"%i %i ",&m,&n);
printf("Размерность массива %ix%i\n",m,n);
Arr = (int**) malloc(sizeof(int*) * m);
for (int i = 0; i< m; i++)
{
Arr[i] = (int*) malloc(sizeof(int) * n);
for (int j = 0; j < n; j++)
{
Arr[i][j] = rand()%100;
if (selected !=0)
{
fprintf(File," %i", Arr[i][j]);
}
else
fscanf(File," %i",&Arr[i][j]);
printf("Arr[%i][%i] = %i\n", i, j, Arr[i][j]);
}
}
fclose(File);
printf("Введите столбец в котором будем производить поиск (индекс нач. с 0) : ");
scanf("%i",&Col);
printf("Введите элемент для поиска : ");
scanf("%i",&SearchValue);
SearchLine (Arr, m, n,Col, SearchValue);
qsort(Arr,m,n);
for (int i = 0; i< m; i++)
{
for (int j = 0; j<n; j++)
printf("%4i",Arr[i][j]);
printf("\n");
}
SearchBin (Arr, m, n,Col, SearchValue);
system("pause");
}