Главная » Все файлы » Просмотр файлов из архивов » PDF-файлы » Некоторые примеры из семинарских занятий по Си

Некоторые примеры из семинарских занятий по Си (А.А. Вылиток - Лекции), страница 3

PDF-файл Некоторые примеры из семинарских занятий по Си (А.А. Вылиток - Лекции), страница 3 Операционные системы (37187): Лекции - 3 семестрНекоторые примеры из семинарских занятий по Си (А.А. Вылиток - Лекции) - PDF, страница 3 (37187) - СтудИзба2019-05-08СтудИзба

Описание файла

Файл "Некоторые примеры из семинарских занятий по Си" внутри архива находится в папке "А.А. Вылиток - Лекции". PDF-файл из архива "А.А. Вылиток - Лекции", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Просмотр PDF-файла онлайн

Текст 3 страницы из PDF

количествообъектов типа char, которые в сумме занимают тот же объем памяти, что и данныйобъект).По определению, sizeof(char) равно 1.Есть еще одноименная префиксная операциятаблице приоритетов – 15.sizeofвыражение. Ее уровень вПри выполнении операции sizeof выражение само выражение не вычисляется.Только определяется его тип с учетом целочисленного повышения и балансировки.e= sizeof j++; /* j – не изменяется */Выражениеsizeof (long)-2эквивалентно выражению(sizeof (long))-2а неsizeof ((long)(-2)).Тип, возвращаемый операцией sizeof, называетсяsize_t . Он определяется вбиблиотечном файле stddef.h и во многих реализациях совпадает с типом long .Операнд операции sizeof не должен иметь незавершенный тип или тип функции, заисключением ситуации, в которой sizeof выполняется над именем формальногопараметра, объявленного как массив, или функция.

В этом случае, результат равенразмеру указательного типа, полученного в результате обычного преобразованияформальных параметров указанных типов.(Параметр T a[] преобразуется к T* a).Операнд операции sizeof не может быть l-выражением, обозначающим битовоеполе в структуре или объединении.Вопросы по теме «выражения»Может ли при каком-нибудь описании p считаться правильным выражение:++p++?Может ли при каком-нибудь описании a считаться правильным выражение:&*a[i]++?Может ли при каком-нибудь описании c и foo считаться правильным выражение:c[--foo]=c[foo++]?.Механизм передачи параметров функции в языке СиПередача параметров функции в языке Си осуществляется только по значению. Каждыйформальный параметр функции считается ее локальной переменной.

При вызове функциивычисляются значения выражений, указанных в качестве аргументов (фактическихпараметров). Выполнение функции начинается с того, что создаются локальныепеременные для формальных параметров. В эти переменные записываются значениясоответствующих фактических параметров, приведенных к типу формальных параметровкак при присваивании.

Далее выполняется тело функции (составной оператор). Если вначале тела функции есть описания переменных, то эти переменные создаются.Созданные переменные существуют, пока функция не вернет значение в точку вызова спомощью оператора return или пока не завершится тело функции. В описаниипеременной может быть выражение-инициализатор. Тогда при создании переменной этовыражение вычисляется и его значение присваивается переменной в качестве начальногозначения. Возвращаемое функцией значение приводится к типу, указанному в заголовкефункции как тип возвращаемого значения. Функция может возвращать значение любоготипа, кроме массива или функции (но может возвращать указатель на массив илиуказатель на функцию).Пример.

Пусть a и b – переменные типа int. Нужно описать функцию swap( ),которая должна поменять местами значения переменных a и b. Эту функцию можнобыло бы использовать, например, в сортировке обменами bubble_sort( ) (методпузырька) для обмена значений соседних элементов: mas[j] и mas[j+1].Если функцию swap описать таким образомvoid swap(int x, int у)/* НЕВЕРНОЕ РЕШЕНИЕ */{int temp; /* вспомогательная переменная */temp=x;x=y;y=temp;}то после вызова swap(a,b) значения переменных a и b останутся прежними, так как вфункцию передаются не сами переменные, а их значения.

Эти значения при вызовефункции будут присвоены временным локальным переменным x и y, далее в телефункции происходит обмен значениями переменных x и y, после чего функция завершаетсвою работу, а все ее локальные переменные (x, y, temp) исчезают. Как мы видим, вызовswap(a,b) не оказал никакого влияния на переменные a и b.Чтобы получить желаемый эффект, надо вызывающей программе передать указатели нате значения, которые должны быть изменены:swap(&a, &b);Операция & получает адрес переменной, и тип выражения &а есть указатель на а.

В самойфункции swap параметры должны быть описаны как указатели, при этом доступ кзначениям параметров будет осуществляться через них косвенно.В Паскале указатель на целое описывался как px:  integer. В Си аналогичнымописанием будет int * px. С учетом этого описание swap будет таким:void swap(int *px, int *ру){int temp;temp=*px;*px=*py;*py=temp;}/* перестановка *рх и *ру */Использование побитовых операцийДля целых чисел Стандарт Си требует от реализаций использование двоичногокодирования. Существуют операции,позволяющие оперировать с числами как сбитовыми наборами. Наряду со знаковыми целыми, в Си можно работать и сбеззнаковыми целыми. Беззнаковым аналогом типа int является тип unsigned.Для опреаций сдвига, а также для побитовых операций (^, |, &, ~) оба операнда должныбыть целыми,просходит повышение операндов до int или unsigned int.

Дляпобитовых (в отличие от сдвигов) типы операндов балансируются.В качестве иллюстрации использования побитовых операций рассмотрим модификациюалгоритма Евклида.Алгоритм Евклида вычисления НОД, использующий операцию взятия остатка %,записывается на Си следующим образом:unsigned gcd(unsigned x, unsigned y){while (y!=0){unsigned temp=y;y=x%y;x=temp;}return x;}Так как деление с остатком реализуется с помощью вычитания, можно записать алгоритмЕвклида с помощью только операции вычитания.

Правда число итераций цикла в этойверсии алгоритма будет большим, чем в предыдущей версии.unsigned gcd(unsigned x, unsigned y){while (x!=y)if (x>y) x-=y; else y-=x;return x;}Рассмотрим еще одну модификацию — алгоритм Евклида вычисления НОД,использующий сдвиги и вычитание, известный как бинарный алгоритм Евклида.Он может оказаться быстрее, чем алгоритм, использующий операцию взятия остатка %,если операция % в данной реализации работает существенно «медленнее», чем сдвиги ивычитания.Данный алгоритм отличается от обычного алгоритма Евклида сиспользованием вычитания тем, что позволяет сократить число шагов, основываясь надвух свойствах:1) НОД(2k  x, 2k  y) = 2k  НОД( x, y), где x или y — нечетное;2) НОД(2k  x, y) = НОД( x, y), где x и y — нечетные;unsigned binary_gcd (unsigned x, unsigned y){unsigned temp;unsigned common_power_of_two = 0;if (x == 0) return y; /* Особые случаи */if (y==0) return x;/* Определение наибольшей степени двух, делящей x и y */while ((( x|y)&1)==0){x>>=1;/* или по-другому: x=x>>1; */y>>=1;++ common_power_of_two;}while ((x&1)==0) x>>=1; /* можно while (!(x&1)) x>>=1; *//*while(y) {/* x – нечетно, y – ненулевое */while((y&1) ==0) y>>=1;/* x и y нечетные */temp=y;if (x>y) y=x-y;else y=y-x;x=temp;Теперь x равно прежнему значению y, которое нечетно.Значение yчетно, поскольку равно разности двух нечетных значений; значит, вследующем проходе цикла оно будет сдвинуто вправо хотя бы на один бит*/}return (x<< common_power_of_two);}Про массивыЕсли массив не является (1) аргументом операции sizeof, (2) операндом адреснойоперации &, (3) строковой константой, инициализирующей символьный массив, тозначение массива преобразуется (в процессе обычных унарных преобразований) вуказатель на его первый элементСложные описанияСложные описания составляются с помощью комбинации имен типов с описателями игруппировки их с помощью круглых скобок.

К описателям относятся: * -- описательуказателя , [ ] --массива , ( ) – функции.Например, чтобы задать «шестиэлементный массив указателей на функции,возвращающие значения целого типа», используется описание:int (*m[6])( );Важно, чтобы сложное описание давало корректный тип.Типы, не являющиеся корректными :1) Любой тип, включающий void, кроме «… функция, возвращающая значение типаvoid» или «указатель на void».2) «Массив функций типа…».

Массивы могут содержать указатели на функции, но несами функции.3) «Функция, возвращающая массив…». Функции могут возвращать указатели намассивы, но не сами массивы.4) «Функция, возвращающая функцию…». Функции могут возвращать указатели надругие функции, но не сами функции.Вместо того, чтобы писатьint *(*(*(*x)())[10])();что означает, что переменная x имеет тип указателя на функцию, возвращающуюуказатель на 10-элементный массив указателей функций, возвращающих указатели нацелые, можно написать так:typedefint * T4;typedefT4 (*T3) ();typedefT3 (*T2)[10];typedefT2 (*T1)();T1 x;Про оператор switchОператор switch – это конструкция, обеспечивающая множество вариантов перехода взависимости от значения управляющего выражения.switch ( выражение) операторУправляющее выражение должно возвращать значение целого типа и может подвергатьсяповышению целочисленности (promoting).

Оператор, входящий в состав конструкцииswitch, именуется телом оператора switch. Как правило (хотя и не всегда) этосоставной оператор. Любой оператор, располагающийся в теле оператора switch, в томчисле и само тело, может быть помечен меткой case или default. Более того, один итот же оператор может быть помечен несколькими метками case и, вдобавок, меткойdefault. Выражение, следующее за ключевым словом case, должно быть целымконстантным выражением. (Константное выражение вычисляется во время компиляции).сase-метка:case константное выражениеМетка case или default считается принадлежащей самому внутреннему извложенных операторов switch, в котором она расположена. Метки case и defaultне могут располагаться вне оператора switch. Не может быть двух case-меток содинаковым значением или двух меток default.Порядок выполнения оператора switch:1. Вычисляется управляющее выражение.2.

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5258
Авторов
на СтудИзбе
421
Средний доход
с одного платного файла
Обучение Подробнее