Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на языке Си. Билеты и ответы

.pdf
Скачиваний:
317
Добавлен:
10.09.2019
Размер:
761.78 Кб
Скачать

scanf("%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;

}