Вторник, 21.05.2024, 12:08
Приветствую Вас, Гость

БИЛЕТ 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();

}