Вызов стандартных функций сортировки и поиска
Функция 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.