БИЛЕТ 23.
1) Преобразование типов
Операнды бинарной операции могут быть разного типа. В этом случае перед ее выполнением компилятор предварительно приводит операнды к одному типу. Перечислим правила приведения типов в Си:
1) операнды разных типов приводятся к "старшему", т.е. более длинному, типу. Ниже перечислены типы, начиная от самого старшего, в порядке убывания старшинства: самый старший long double, double, float, unsigned long, long int, unsigned, int, char – самый младший;
2) при выполнении операции присваивания результат приводится к типу переменной слева от знака операции. В этом случае может возникнуть ситуация преобразования старшего типа к младшему.
Преобразование младшего целого типа к старшему целому типу требует расширения значения на 8 или 24 бит. Эти старшие биты могут заполняться либо нулями, либо самым старшим битом преобразуемого значения.
Преобразование типа char в int, unsigned int, long int или unsigned long выполняется размножением нуля тогда, когда тип char считается беззнаковым типом unsigned char. В противном случае происходит размножение знака.
Преобразование типа short в int, int в unsigned int и long int в unsigned long не меняет двоичный код значения.
Преобразование типа int в long и unsigned long выполняется размножением знака.
Преобразование типа unsigned int в long unsigned выполняется добавлением двух нулевых старших байтов.
Преобразование целых типов в типы с плавающей точкой выполняется по специальным библиотечным процедурам с заполнением свободных битов мантиссы нулями. Диапазон представления типов с плавающей точкой намного шире диапазона представления целых типов, и такое преобразование всегда дает корректный результат. Например:
long int ff=0x1234; int i;
i=ff; /* равняется 0x34 */
Иногда преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной лил константы. Например, так можно быстро выделить старшее и младшее слова в значении переменной long unsigned:
long unsigned fat_ptr;
unsigned offset, segment;
…..
offset = far_ptr;
segment = far_ptr>>16;
Преобразование более старшего типа с плавающей точкой в младший тип (например, long double в float) выполняется по специальным библиотечным процедурам округлением числа до нужного количества знаков после десятичной точки.
Преобразование типа с плавающей точкой в целый тип выполняется по специальным библиотечным процедурам и дает ближайшее целое число. Результат корректен только тогда, когда целая часть преобразуемого числа с плавающей точкой помещается в диапазон представления для данного целого типа. Например:
long int ff;
double i=1.5e8;
ff=i;
дает для ff корректное значение 150 000 000, а если i=1.5e20, ff не может вместить такое большое число. Значение в ff в этом случае неправильное.
2)Операция запятая.
Связывает два выражения в одно и гарантирует, что первое выражение будет вычислено первым. Следует различать операцию запятую и перечисление (аргументы функций перечисляются).
Несколько выражений, разделенных запятыми ",”, вычисляются последовательно слева направо. В качестве результата сохраняются тип и значение самого правого выражения. Таким образом, операция "запятая” группирует вычисления слева направо. Тип и значение результата определяются самым правым из разделенных запятыми операндов (выражений). Значения всех левых операндов игнорируются. Например, если переменная х имеет тип int, то значением выражения (х=3, 3*х) будет 9, а переменная х примет значение 3.
*************************************23 - 3
Написать функцию поиска заданного элемента в отсортированном по возрастанию целочисленном массиве. Использовать метод бинарного поиска.
#include<conio.h>
#include<stdio.h>
void main()
{
clrscr();
int a[]={3,5,5,7,10,11,12,14,15};
int n=sizeof(a)/sizeof(int)-1;
int i=0,j,k=11,m=2;
while (a[i] != k)
{
i = n/m;
for (;i<n;i++)
{
m+=2;
if (a[i-1]==k)
i-=1;
if(a[i+1]==k)
i+=1;
if(a[i]==k)
break;
if (a[i-1] > k)
i = n/m;
else
i += n/m;
m+=2;
}
}
printf("%d",i);
}
*************************************23 - 4
Напишите функцию, которая вставляет пробел после каждой точки в строку, полученную ей в виде параметра.
#include<conio.h>
#include<stdio.h>
int n=33;
char str[]="Fuc...k you.Bitch www.deneg.net.";
int i,j,n_temp=0,k;
void main()
{
clrscr();
for (i=0;i<n;i++)
{
if (str[i] == '.')
{
i++;
for (j=n;j>=i;j--)
str[j]=str[j-1];
str[i++]=' ';
n++;
i--;
}
}
getch();
}