Задание (1114880)
Текст из файла
(1)
a) Выяснить способ представления типа char: signed- или unsigned- вариант.
b) Почему
printf("%d\n", '\377' == 0377 );
printf("%d\n", '\xFF' == 0xFF );
печатает 0 (ложь)?
(3)
a) Выяснить, как упорядочены коды символов '0'-'9', 'a'-'z', 'A'- 'Z', пробел (между собой и относительно друг друга ).
b) Рассмотреть программу
#include <stdio.h>
int main(int ac, char **av){
int c;
while((c = getchar()) != EOF)
switch(c){
case 'ы': printf("Буква ы\n"); break;
case 'й': printf("Буква й\n"); break;
default: printf("Буква с кодом %d\n", c); break;
}
return 0;
}
Она работает так:
% a.out
йфыв
Буква с кодом 202
Буква с кодом 198
Буква с кодом 217
Буква с кодом 215
Буква с кодом 10
^D
%
Выполняется всегда default, почему не выполняются case 'ы' и case 'й'?
(5)
Проконтролировать, допускается ли инициализация переменных при описании; происходит ли инициализация по умолчанию.
(2)
a) Проверьте, действительно ли операции отношения == и != имеют более низкий приоритет, чем все другие операции отношения.
b) Операции умножения * и деления / и % обычно достаточно медленны. В критичных по скорости функциях можно предпринять некоторые ручные оптимизации, связанные с представлением чисел в двоичном коде (хороший компилятор делает это сам!) - пользуясь тем, что операции +, &, >> и << гораздо быстрее. Пусть у нас есть
unsigned int x;
Вычислить максимально быстро «x * 80».
(3)
Проверьте, выполняется ли правило "ленивых вычислений" выражений в Си, т.е. прекращается ли вычисление выражений с логическими операциями, если возможно "досрочно" установить значение результата.
(2)
a) Проверьте, все ли виды операнда операции sizeof, определяемые стандартом для арифметических типов, допускаются компилятором; действительно ли аргумент-выражение не вычисляется.
b) Напишите программу, которая устанавливает в 1 бит 3 и сбрасывает в 0 бит 6 без использования циклов.
(2)
Определите, каким образом "малое" целое расширяется до int (старшие разряды int заполняются нулями или знаковым разрядом "малого" целого ).
(3)
Определите, каким образом расширяются unsigned- варианты "малых" целых ( до unsigned int как в "классическом" Си или сначала делается попытка расширить до int, и только в случае неудачи - до unsigned int ).
(3)
Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование знаковых целых
(M-битовое представление ) к знаковым целым (N-битовое представление ) при M > N, M = N, M < N.
(3)
a) Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование беззнаковых целых
(M-битовое представление ) к знаковым целым (N-битовое представление ) при M > N, M = N, M < N.
b) Объясните, почему для:
unsigned a, b, c;
a < b + c не эквивалентно a - b < c
(5)
a) Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование вещественных чисел ( X ) к знаковым целым ( N-битовое представление ) при | X | < 2N-1, | X | >= 2N-1.
b) Есть быстрый способ определить, является ли int X степенью двойки. Найти его и заменить в следующем примере “xxx” на выражение из ДВУХ операторов:
if (xxx == 0) printf(“Степень двойки\n”);
c) Операции умножения * и деления / и % обычно достаточно медленны. В критичных по скорости функциях можно предпринять некоторые ручные оптимизации, связанные с представлением чисел в двоичном коде - пользуясь тем, что операции +, &, >> и << гораздо быстрее. Пусть у нас есть:
unsigned int x;
Вычислить максимально быстро «x * 320».
(3)
Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование знаковых целых X (M-битовое представление) к беззнаковым целым ( N-битовое представление ) при M > N, M = N, M < N; X >= 0, X < 0.
(3)
Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование беззнаковых целых
(M-битовое представление ) к беззнаковым целым ( N-битовое представление ) при M > N, M = N, M < N.
(4)
a) Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование вещественных чисел ( X ) к беззнаковым целым (N-битовое представление ) при 0<=X< 2N, X < 0, X >= 2N.
b) Почему в примере
double x = 5 / 2;
printf( "%g\n", x );
значение x равно 2 а не 2.5 ?
(5)
Проконтролировать, допускается ли инициализация переменных при описании; происходит ли инициализация по умолчанию.
(3)
Проверьте, выполняется ли правило "ленивых вычислений" выражений в Си, т.е. прекращается ли вычисление выражений с логическими операциями, если возможно "досрочно" установить значение результата.
(2)
a) Проверьте, все ли виды операнда операции sizeof, определяемые стандартом для арифметических типов, допускаются компилятором; действительно ли аргумент-выражение не вычисляется.
b) Истинно ли выражение и почему:
if( 2 < 5 < 4 )
(3)
a) Определите, каким образом расширяются unsigned- варианты "малых" целых ( до unsigned int как в "классическом" Си или сначала делается попытка расширить до int, и только в случае неудачи - до unsigned int ).
b) Почему программа "зависает"?
int x = 0;
while( x < 100 );
printf( "%d\n", x++ );
printf( "ВСЕ\n" );
(5)
Проконтролировать, допускается ли инициализация переменных при описании; происходит ли инициализация по умолчанию.
(4)
Описать функцию, которая упорядочивает элементы целочисленного массива по неубыванию, используя сортировку вставками: пусть первые k элементов массива (от 0 до
k-1) уже упорядочены по неубыванию; тогда берется xk и рaзмещается среди первых k элементов так, чтобы упорядоченными оказались уже k+1 первых элементов; этот метод повторяется при k от 1 до n-1.
(3)
Описать функцию, вычисляющую значение x0 + x0x1 + x0x1x2 + …+ x0x1x2 … xm, где xi - элементы вещественного массива x из n элементов, m - индекс первого отрицательного элемента этого массива либо число n-1, если такого элемента в массиве нет.
(4)
Описать функцию, которая изменяет заданную строку следующим образом: сначала записывает все элементы с четными индексами, а затем все элементы с нечетными индексами ( с сохранением их относительного порядка в каждой группе).
Например, abcdefgh => acegbdfh, vwxyz => vxzwy.
(3)
Описать функцию, осуществляющую циклический сдвиг на n позиций вправо элементов целочисленного массива, содержащего m элементов (n<m).
(3)
Вычислить 1 - 1/2 + 1/3 - 1/4 + ...+1/9999 - 1/10000 следующими способами:
a). последовательно слева направо;
b). последовательно справа налево;
c). последовательно слева направо вычисляются 1 +1/3 + 1/5 + ... + 1/9999 и 1/2 + 1/4 + ... + 1/10000, затем второе значение вычитается из первого;
d). последовательно справа налево вычисляются 1 +1/3 + 1/5 + ... + 1/9999 и 1/2 + 1/4 + ... + 1/10000, затем второе значение вычитается из первого.
Сравнить и объяснить полученные результаты.
(3)
Проверить следующие утверждения в ваших тестовых программах:
a) «тип выражения в операторе return должен совпадать с типом результата функции»
b) «функция, которая не возвращает результата (тип результата void), может не содержать оператор return;»
c) «функция, которая возвращает результат, может не содержать оператор return E; но вызывает другую функцию, которая содержит такой оператор»
d) «функция, которая возвращает результат, может содержать несколько операторов return E; »
e) «в Си можно войти в блок, минуя его заголовок; при этом память под локальные переменные, описанные в этом блоке, будет отведена, но инициализация (если она есть) выполняться не будет»
f) «в теле одной функции могут находиться два разных оператора, помеченных одинаковыми метками, если эти операторы находятся в разных блоках»; например,
void f(void)
{ ... label: S1; ...
{ ... label: S2; ... goto label; ...}
... goto label; ...
}
g) «в Си нельзя использовать две (или более) взаимно рекурсивных функций»; например, если есть void f(void){... g();...} и void g(void){...f();...}, то программа, использующая такие функции, будет ошибочной.
(4)
Ответить на вопросы и и справить ошибки:
а) Почему программа зацикливается? Мы хотим подсчитать число пробелов и табуляций в начале строки:
int i = 0;
char *s = " 3 spaces";
while(*s == ' ' || *s++ == '\t')
printf( "Пробел %d\n", ++i);
b) char *val(int x){
char str[20];
sprintf(str, "%d", x);
return str;
}
void main(){
int x = 5; char *s = val(x);
printf("The values:\n");
printf("%d %s\n", x, s);
}
c) switch(c){
case 1:
x++; break;
case 2:
y++; break;
defalt:
z++; break;
}
Если c=3, то z++ не происходит. Почему?
(4)
Понять, что вычисляет следующая программа, и предложить аналогичное решение:
int popc;
for (popc = 0; X != 0; X &= X - 1)
popc++;
(5)
Для поиска номера позиции старшего единичного бита в 32-битном числе можно использовать простейший for-цикл с 32-мя иттерациями. Найдите способ решения той же задачи, но используя всего 5 иттераций! (без «раскрутки» цикла ит.п.)
(3)
Напишите функцию, печатающую целое число в системе счисления с основанием base.
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.