Программирование на языке Си. Билеты и ответы
.pdfscanf("%f %f %f", &e, &f, &g); printf("%%F: %f %f %f\n", e, f, g); printf("%%A: %a %a %a\n", e, f, g); printf("%s | %c", str, ch);
return 0;
}
ЗАДАЧА: НАПИСАТЬ ФУНКЦИЮ, МЕНЯЮЩУЮ МЕСТАМИ 1-УЮ И ПОСЛЕДНЮЮ СТРОКИ ДВУМЕРНОГО МАССИВА. ПРОДЕМОНСТРИРОВАТЬ ЕЁ ИСПОЛЬЗОВАНИЕ В ПРОГРАММЕ.
СИ
#include <stdio.h>
///Функция, меняющая местами 1-ую и последнюю строки двумерного массива
///arr — массив, n — количество строк, m — количество столбцов
///Сложность алгоритма: T(n) = O(n)
void bilet4(char *arr, int n, int m){ int i; char ch; int wn = n - 1; for (i = 0; i < m; i++){
ch = arr[i];
arr[i] = arr[m*wn + i]; arr[m*wn + i] = ch;
}
}
int main()
{
int i, j; /// Счетчики циклов
/// Массив строк: 4 строки, в каждой по 6 символов
char arr4[4][6] = {{"str_1"}, {"str_2"}, {"str_3"}, {"str_4"}};
///6 символ в каждой строке — \0 bilet4(&arr4[0][0], 4, 6); /// Обработка for (i = 0; i < 4; i++) {
for (j = 0; j < 5; j++)
printf("%c", arr4[i][j]); /// Вывод printf(" ");
}
printf("\n");
///Вывод: str_4 str_2 str_3 str_1
return 0;
}
БИЛЕТ №5.
ТЕОРЕТИЧЕСКИЙ ВОПРОС: ОПЕРАТОРЫ IF, SWITCH.
УСЛОВНЫЙ ОПЕРАТОР IF
Полная форма IF |
Краткая форма IF |
|||
|
|
|
|
|
1 вариант |
2 вариант |
1 вариант |
2 вариант |
|
|
|
|
|
|
|
if (<условие>){ |
|
|
|
if (<условие>) |
<набор_инструкций1>; |
|
if (<условие>) { |
|
<инструкция1>; |
} |
if (<условие>) |
||
<набор_инструкций1>; |
||||
else |
else { |
<инструкция1>; |
||
} |
||||
<инструкция2>; |
<набор_инструкций2>; |
<инструкция2>; |
||
<набор_инструкций2>; |
||||
<инструкция3>; |
} |
|
||
|
|
|||
|
<набор_инструкций3>; |
|
|
|
Если <условие> |
|
Если <условие> |
|
|
истинно, то |
Если <условие> истинно, то |
Если <условие> истинно, то |
||
выполнится |
выполнится |
истинно, то |
||
выполнится |
выполнится |
|||
<инструкция1>, иначе |
<набор_инструкций1>, иначе |
|||
<инструкция1>. |
<набор_инструкций1>. |
|||
<инструкция2>. |
<набор_инструкций2>. |
|
|
|
<инструкция3> |
<набор_инструкций3> |
<инструкция2> |
<набор_инструкций2> |
|
выполнится в любом |
выполнится в любом случае. |
|||
выполнится в любом |
выполнится в любом случае. |
|||
случае. |
|
|||
случае. |
|
|
|
ЗАДАНИЕ
Решение. Пример с полной формой IF |
Решение. Пример с краткой формой IF |
#include <stdio.h> |
|
#include <math.h> |
|
int main() |
#include <stdio.h> |
{ |
#include <math.h> |
float x; |
int main() |
scanf("%f", &x); |
{ |
if (x <= 0.0) |
float x; |
printf("%f", pow(sin(x),2.0)/2.0); |
scanf("%f", &x); |
else if (x <= 1.0) |
if (x <= 0.0) printf("%f", pow(sin(x),2.0)/2.0); |
printf("%f", x); |
if ((1.0 >= x) && (x > 0.0)) printf("%f", x); |
else if (x <= 3.0) |
if ((3.0 >= x) && (x > 1.0)) printf("%f", x*x*x); |
printf("%f", x*x*x); |
if ((x > 3.0)) printf("%f", 27.0+pow((x-3.0),2.0)); |
else |
return 0; |
printf("%f", 27.0+pow((x-3.0),2.0)); |
} |
return 0; |
|
} |
|
ОПЕРАТОР SWITCH
Переключатель SWITCH
switch (<выражение>) {
case <константа1>: <инструкция1>; [break;] case <константа1>: <инструкция1>; [break;]
<…>
case <константаN>: <инструкцияN>; [break;] default: <инструкция>;
}
При выполнении этого оператора вычисляется выражение, стоящее в
скобках после ключевого слова switch, которое должно быть целым. Оно, в частности, может быть и символьным значением. Эта целая величина используется в качестве критерия для выбора одного из возможных вариантов. Ее значение сравнивается с константой операторов case. Вместо целой или литерной константы в операторе case может стоять некоторое константное выражение. Значения таких констант (выражений) должны быть различными в разных операторах case. При несовпадении выполняется переход к следующему case и сравнивается его константа.
В случае совпадения <константыI> выполняется <инструкцияI>, а также все последующие операторы case и default. Чтобы выполнялась только <инструкцияI> (и ничего более), необходимо поставить break; после неё.
Если не было ни одного совпадения и имеется оператор default, то выполняется стоящий за ним оператор. Если же оператора default не было, выполнение программы продолжится с оператора, следующего за структурой switch. Таким образом, при каждом выполнении оператора просматриваются все метки case.
Пример "Калькулятор"
#include <stdio.h> |
|
int main() |
|
{ |
|
float a, b, y = 0; |
|
char c; |
|
scanf("%f %c %f", &a, |
&c, &b); /// Вводим вещ. число, операцию, ещё одно вещ. число |
switch (c) { |
|
case '+': y = a + |
b; break; |
case '-': y = a - |
b; break; |
case '*': y = a * |
b; break; |
case '/': y = a / |
b; break; |
default: printf("ERROR");
}
printf("%f", y); /// Получаем результат return 0;
}
ЗАДАЧА: НАПИСАТЬ ФУНКЦИЮ, МЕНЯЮЩУЮ МЕСТАМИ 1-ЫЙ И ПОСЛЕДНИЙ СТОЛБЕЦ ДВУМЕРНОГО МАССИВА. ПРОДЕМОНСТРИРОВАТЬ ЕЁ ИСПОЛЬЗОВАНИЕ В ПРОГРАММЕ.
СИ
#include <stdio.h>
///Функция, меняющая местами 1-ый и последний столбец двумерного массива
///arr — массив, n — количество строк, m — количество столбцов
///Сложность алгоритма: T(n) = O(n)
void bilet5(double *arr, int n, int m){ int i; double d; int wm = m - 1;
for (i = 0; i < n; i++){ /// Меняем местами 1-ый и последний столбец i-той строки d = arr[i*m];
arr[i*m] = arr[i*m + wm]; arr[i*m + wm] = d;
}
}
int main()
{
int i, j; /// Счетчики циклов
/// Массив строк: 4 строки, в каждой по 6 символов
double arr5[3][4] = {{-1.5, 3.9, 4.2, 41.0}, {-5.4, -1.0, 56.6, 42.2}, {-3.8, 1.9, 6.2, 96.8}}; bilet5(&arr5[0][0], 3, 4); /// Обработка
for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++)
printf("%lf ", arr5[i][j]); /// Вывод printf("\n");
}
return 0;
}
БИЛЕТ №6.
ТЕОРЕТИЧЕСКИЙ ВОПРОС: ОПЕРАТОРЫ ОРГАНИЗАЦИИ ЦИКЛОВ.
ЦИКЛ FOR
Цикл со счётчиком — цикл, в котором некоторая переменная изменяет своё значение от заданного начального значения до конечного значения с некоторым шагом, и для каждого значения этой переменной тело цикла выполняется один раз. В большинстве процедурных языков программирования реализуется оператором for, в котором указывается счётчик (так называемая «переменная цикла»), требуемое количество проходов (или граничное значение счётчика) и, возможно, шаг, с которым изменяется счётчик.
Цикл FOR |
Пример использования |
for (<начало>;<условие>;<шаг>) |
/// от 1 до 100 |
{ |
int i; |
<инструкции>; |
for (i = 1; i <= 100; i++) |
} |
printf("%d\n", i); |
ЦИКЛ WHILE
Цикл с предусловием — цикл, который выполняется, пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).
Цикл WHILE |
Пример использования |
Аналогичный короткий |
|
пример |
|||
|
|
||
|
/// от 1 до 100 |
|
|
while (<условие>) |
int i = 1; |
/// от 1 до 100 |
|
while (i <= 100) { |
|||
{ |
int i = 1; |
||
printf("%d\n", |
|||
<инструкции>; |
while (i <= 100) |
||
i); |
|||
} |
printf("%d\n", i++); |
||
i++; |
|||
|
|
||
|
} |
|
ЦИКЛ DO-WHILE
Цикл с постусловием — цикл, в котором условие проверяется после выполнения тела цикла. Отсюда следует, что тело всегда выполняется хотя бы один раз.
Цикл DO-WHILE |
Пример использования |
Аналогичный короткий |
|
пример |
|||
|
|
||
|
/// от 1 до 100 |
|
|
do { |
int i = 1; |
/// от 1 до 100 |
|
<инструкции>; |
do { |
int i = 1; |
|
} while |
printf("%d\n", i); |
do printf("%d\n", i++); |
|
(<условие>); |
i++; |
while (i <= 100); |
|
|
} while (i <= 100); |
|
ОПЕРАТОРЫ BREAK И CONTINUE
Оператор break (разрыв) вызывает немедленный выход из циклов, организуемых с помощью операторов for, while, do-while, а также прекращение оператора switch.
Оператор continue (продолжить) тоже предназначен для прерывания циклического процесса, организуемого операторами for, while, do-while. Но в отличии от оператора break, он не прекращает дальнейшее выполнение цикла, а только немедленно переходит к следующей итерации того цикла, в теле которого он оказался.
ЗАДАЧА: НАПИСАТЬ ФУНКЦИЮ, МЕНЯЮЩУЮ МЕСТАМИ ПОСЛЕДНЮЮ И ПРЕДПОСЛЕДНЮЮ СТРОКИ ДВУМЕРНОГО МАССИВА. ПРОДЕМОНСТРИРОВАТЬ ЕЁ ИСПОЛЬЗОВАНИЕ В ПРОГРАММЕ.
СИ
#include <stdio.h>
///Функция, меняющая местами последнюю и предпоследнюю строки двумерного массива
///arr — массив, n — количество строк, m — количество столбцов
///Сложность алгоритма: T(n) = O(n)
void bilet6(char *arr, int n, int m){ int i; char ch;
int wn1 = n - 1; int wn2 = n - 2; for (i = 0; i < m; i++){
ch = arr[m*wn1 + i];
arr[m*wn1 + i] = arr[m*wn2 + i]; arr[m*wn2 + i] = ch;
}
}
int main()
{
int i, j; /// Счетчики циклов
/// Массив размером 4 x 6 (4 строки, 6 символов)
char arr[4][6] = {{"str_1"}, {"str_2"}, {"str_3"}, {"str_4"}};
///6 символ в каждой строке — \0 bilet6(&arr[0][0], 4, 6); /// Обработка for (i = 0; i < 4; i++) {
for (j = 0; j < 5; j++)
printf("%c", arr[i][j]); /// Вывод printf(" ");
}
printf("\n");
///Вывод: str_1 str_2 str_4 str_3
return 0;
}