Вызов стандартных функций сортировки и поиска

Функция qsort выполняют сортировку массива, элементы которого имеют произвольный тип. Эта функция реализует «быстрый алгоритм» сортировки массивов и имеет следующий прототип:

void qsort(void *base, size_t n, size_t size, int (*cmp) (const void *e1, const void *e2));

который описан в заголовочном файле stdlib.h. Кратко опишем назначение параметров этой функции:

base адрес массива,

n количество элементов в массиве,

size длина элемента массива,

cmp указатель на функцию сравнения, которая возвращает:

отрицательное число, если элемент e1 меньше элемента e2;

0, если элемент e1 равен элементу e2;

положительное число, если элемент e1 больше элемента e2.

 

/* функция для сравнения элементов массива */

int comp_int(const int* e1, const int* e2)

{

return (*e1-*e2);

}

 

Функция bsearch выполняет бинарный поиск элемента в отсортированном массиве. Эта функция имеет следующий прототип:

void* bsearch(const void *key, const void *base,

size_t n, size_t size, int (*cmp)(const void *ck, const void *ce);

который также описан в заголовочном файле stdlib.h. Первый параметр key этой функции является указателем на элемент, который нужно найти. Остальные параметры повторяют параметры функции qsort. В случае успешного завершения поиска функция bsearch возвращает адрес найденного элемента, а в случае неудачи NULL.

 

/* функция для сравнения элементов массива */

int comp_int(const int* e1, const int* e2)

{

return (*e1-*e2);

}

 

Перевод чисел из одной системы счисления в другую.

Программа переводит целое число из десятичной системы счисления в систему счисления с другим основанием(от двоичной до шестнадцатеричной)

с точностью до десяти знаков после запятой.

#include <stdio.h>

#include <math.h>

void Revers(char *a,int n)

{
int k;


// Переворачивание элементов массива


for (int i=0;i<n/2;i++)

{
k=a[i];

a[i]=a[n-i-1];

a[n-i-1]=k;

}

}

 

void Psystem(double re, int si ,char s[],int *n)

{
int r,i,z=0;

double dre;

unsigned char c_c[]="0123456789abcdef";

double y=modf(re,&dre);

int x=dre;

i=0;
while (x>=si)

{ r=x % si;

x=x / si;

s[i]=c_c[r];

i++; }

s[i++]=c_c[x];

Revers(s,i);
if (y!=0)

{ s[i++]='.';z=0;

do
{ re=modf(re,&dre);

re = re*si;

int j=re;

s[i++]=c_c[j];

z=z+1;

}

while (re !=0 && z !=10);

} *n=i;}

 

void main(void)

{

double re,dre;

int si,n;

char s[100];

printf("Введите основание системы (2..16) :");

scanf("%d",&si);

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

scanf("%lf",&re);

Psystem(re,si ,s,&n);

PrintArray (s,n);


}

 

14 В Си++ различают символьные и строковые константы и переменные.

Символьная константа – это символ в одинарных кавычках. Она имеет тип char.

Строковая константа – это последовательность символов кода ASCII, заключённая: "...". Она имеет тип char[].

Определение и инициализация строк.

Строкой называется массив символов, который заканчивается символом '\0' (нулевой байт).

Поэтому строка объявляется как обычный символьный массив:

char *str;

char str[10];

Этот вид инициализации является краткой формой стандартной инициализации массива

char str[]={‘T’,’g’,’\0’};

Без символа 0 мы имеем массив символов, а не строку.

Как и для других массивов, имя str является указателем на первый элемент массива:

str == &str[0], *str == 'T', и *(str+1) == str[1] == 'h'

 

 

char heart[ ] = "Программирование на языке Cи++";

char *head = "Программирование на языке Pascal";

Основное отличие состоит в том, что указатель heart является константой, в то время как указатель head - переменной.

В том и в другом случае можно использовать операцию сложения с указателем.

 

Указатели и строки

Смысл заключается в том, что сама строка никогда не копируется. Оператор создает второй указатель, ссылающийся на ту же самую строку.

 

 

Для ввода строки с консоли служит функция

char* gets(char *str);

Символ перехода на новую строку не копируется. В конец прочитанной строки помещается нулевой байт. В случае успеха функция возвращает указатель на прочитанную строку, а в случае неудачи NULL.