birmaga.ru
добавить свой файл

1
ЛАБОРАТОРНАЯ РАБОТА №4

Оператор множественного выбора switch.



Цель работы: Получить навыки составления программ с использованием оператора множественного выбора switch.
Программа работы:

  1. Изучить оператор множественного выбора switch. Получить навыки составления программ с использованием этого оператора (выполнить два задания из п.1. методических указаний).

  2. Выполнить индивидуальное задание — написать программу-тест.


Методические указаниия

        1. К п.1. Оператор ( функция ) выбора switch — case — default.


Для осуществления операций в зависимости от значения некоторой переменной целого типа в языке Си существует специальный оператор switch –переключатель. Формат оператора следующий:

switch ( Выражение ) // Заголовок оператора
{


case Константа:
Операторы
case
Константа: Операторы
...

default:
Операторы
}


Оператор switch
состоит из двух частей:

  • заголовок switch

  • тело оператора, записанное в фигурных скобках.

Выражение, следующее в заголовке за ключевым словом switch в круглых скобках, может быть любым выражением, допустимым в языке программирования Си, или переменной символьного или целочисленного типа. Значение этого выражения является ключевым для выбора из нескольких вариантов дальнейшего выполнения программы.

Ниже приведены примеры правильного и неправильного заголовков:

int c,a;

char s;

double g;
switch (c)        //Правильно (целая переменная)

switch ((a+c)+2)  //Правильно (выражение целого типа)

switch (g)        //Неправильно (вещественная переменная)


switch (s)        //Правильно (символьная переменная)
Тело оператора switch состоит из нескольких операторов, помеченных ключевым словом case с последующим константным выражением.

Так как константное выражение вычисляется во время трансляции, оно не может содержать переменные или вызовы функций. Обычно в качестве константного выражения используются целые или символьные константы.

Все константные выражения в операторе switch должны быть уникальны.

Кроме операторов, помеченных ключевым словом case, может быть, фрагмент, помеченный ключевым словом default
(обычно вариант default указывается в теле оператора switch последним, но он может находиться и в любом другом месте тела или вообще отсутствовать). Оператор выбора default будет выполняться в том случае, если ни одно из константных выражений при case не совпадает с выражением, находящимся в круглых скобках заголовка.
Схема выполнения оператора switch следующая:


  1. вычисляется выражение в круглых скобках заголовка;

  2. вычисленное значение последовательно сравнивается с константными выражениями, следующими за ключевыми словами case;

  3. если одно из константных выражений совпадает со значением выражения указанного в заголовке, то управление передается на оператор, помеченный соответствующим ключевым словом case;

  4. если ни одно из константных выражений не равно выражению, указанному в заголовке, то управление передается на оператор, помеченный ключевым словом default, а в случае его отсутствия управление передается на следующий после switch оператор.

Ключевые слова case
и default в теле оператора switch существенны только при начальной проверке, когда определяется начальная точка выполнения тела оператора switch. Все операторы, между начальным оператором и концом тела, выполняются вне зависимости от ключевых слов, если только какой-то из операторов не передаст управления из тела оператора switch. Таким образом, программист должен сам позаботится о выходе из case, если это необходимо. Чаще всего для этого используется оператор break. Использование оператора break позволяет в необходимый момент прервать последовательность выполняемых операторов в теле оператора switch, путем передачи управления оператору, следующему за switch.


Задание: Для усвоения материала напишите две нижеприведенных программы и представьте результат их выполнения в отчете. Объясните полученные результаты, сделайте соответствующие выводы. (Выполните программу для i=2, i=0 и i=6)

Пример1:

...

int i=2;

switch (i)

{

case 1: i += 2;

case 2: i *= 3;

case 0: i /= 2;

case 4: i -= 5;

default: i += 10;

}

printf(...)

...

Пример2:

...

int i=2;

switch (i)

{

case 1: i += 2;

break;

case 2: i *= 3;

break;

case 0: i /= 2;

break;

case 4: i -= 5;

break;

default: i += 10;

}

printf(...)

...

Отметим, что в теле оператора switch можно использовать вложенные операторы switch, при этом в ключевых словах case можно использовать одинаковые константные выражения.

Задание: Для закрепления материала выполните нижеприведенную программу, результаты ее работы представьте и прокомментируйте в отчете.

Пример:

...

{

char a;

printf("CHISLO DNEY V ZIMNIH MESYACAH: \n");

printf("Vvedite mesyac (d-dekabr', y-yanvar', f-fevral') \n");

scanf("%c", &a);

switch (a)

{

case 'd': printf("31\n");

break;

case 'f': printf("Vvedite '1' esli visokosniy god, inache vvedite '2' \n");

int s;

scanf("%d", &s);

switch (s)

{

case 1:printf("29 \n");

break;

case 2:printf("28 \n");

break;

}

break;

case 'y': printf("31 \n");


break;

}

...

К п.2 Задание: Напишите индивидуальную программу-TECT c использованием операторов условия и множественного выбора. Тест должен содержать не менее 5 вопросов с несколькими вариантами ответов каждый. В зависимости от ответов должны выводиться различные окончательные результаты (не менее трех).

ЛАБОРАТОРНАЯ РАБОТА №5

Символьные строки.



Цель работы: Получить навыки работы с символьными строками.
Программа работы:

  1. Получить навыки работы с символами и символьными строками. Выполнить три задания п.1. методических указаний.

  2. Выполнить индивидуальное задание согласно выданному преподавателем варианту.


Методические указания

        1. К п.1. Символы.


  1. В языке Си тип char используется для хранения одиночных символов. Каждому символу сопоставлено число от 0 до 255, которое называется ASCII-кодом символа (рисунок 8). Например, символу 'F' соответствует число 70. Символами можно оперировать, как числами и, наоборот, переменные типа int можно интерпретировать как символы (сравнивать с символами или печатать как символы).



  2. Рисунок 8. Таблица ASCII-кодов символов



  3. Для того, чтобы считывать один символ есть функция getchar из библиотеки stdio.
  4. Рассмотрим программу, реализующую считывание символа и вывод его на экран в двух форматах: в виде символа (формат "%c") и в виде числа (формат "%d"), согласно таблице ASCII-кодов. Считывание и вывод на экран будут производиться до тех пор, пока символ (а точнее его ASCII код) не будет равен 32, то есть пока не будет нажата клавиша пробел (SPACE).


  5. #include

  6. #include

  7. int main(int argc, char *argv[])

  8. {

  9. int ch;

  10. do

  11. {

  12. ch = getchar();

  13. if (ch != 10)

  14. {

  15. printf ("You enter symbol %c;\nASCII-code = %d.\n", ch, ch);

  16. }

  17. }

  18. while (ch != 32);

  19. system("PAUSE");

  20. return 0;

  21. }

  22. Задание: выполнить данный программный код. Написать комментарий к каждой строке программы. Результат работы программы представить в отчете.

  23. Строка символов.

  24. В языке Си нет отдельного типа для строк. Работа с символьными строками реализована через массивы. В Си символьная строка - это одномерный массив типа char, заканчивающийся «нуль-символом» (обозначается как «\0») - нулевым байтом. «Нуль-символ» – это не цифра 0, этот символ не выводится на печать и в таблице кода ASCII имеет номер 0.

  25. Если в массиве должно содержаться N символов, то нужно определять массив как массив для N+1 элемента. Например, когда мы говорим, что массив состоит из 100 элементов: a[0], a[1], ..., a[99], то это значит, что 99 из них (с a[0] по a[98]) могут содержать символы, а элемент a[99] содержит «нуль-символ».

  26. Строковая константа - это набор символов + «нуль-символ», являющийся признаком окончания строки. Символ «\0» добавляется компилятором автоматически при обработке строковой константы. Например, константа "Информация" будет выглядеть в памяти как массив символов:

    1. И


    1. н

    1. ф

    1. о

    1. р

    1. м

    1. а

    1. ц

    1. и

    1. я

    1. \0

  27. Объявление массива из 40 ячеек памяти, в каждую из которых можно поместить один элемент типа char будет выглядеть следующим образом:

  28. char name[40];

  29. Такой массив может содержать строку длиной до 39 символов плюс нуль-символ.

  30. Допускается объявление строки без указания числа ее элементов:

char str[] = "Very long line";

  1. Компилятор автоматически определяет длину массива (в нашем случае 15: 14 символов плюс нуль-символ) и инициализирует его последовательностью символов "Very long line\0".

  2. Существуют несколько способов ввода строк с клавиатуры. Первый способ - воспользоваться уже знакомой функцией scanf() со спецификацией ввода %s. При этом надо помнить, что функция вводит символы до первого пробела. Второй способ - это воспользоваться специальной библиотечной функцией gets(). Она находится в файле stdio.h. Данная функция позволяет вводить строки, содержащие пробелы. При этом можно исправлять введенные символы пока не нажата клавиша ENTER. Ввод информации заканчивается нажатием клавиши ENTER.

  3. Закрепим полученные знания на следующем примере:

  4. #include

  5. #include
  6. int main(int argc, char *argv[])


  7. {

  8. char str[30];

  9. char str1[30];

  10. printf ("Enter string_1 \n");

  11. gets(str);

  12. printf ("You enter: %s \n", str);

  13. printf ("Enter string_2 \n");

  14. scanf("%s", str1);

  15. printf("You enter: %s \n", str1);

  16. system("PAUSE");

  17. return 0;

  18. }

  19. Задание: выполнить данный программный код. В качестве строки№1 ввести «Лабораторная работа». В качестве строки№2 ввести «Информационные технологии». Результат работы программы представить в отчете.

  20. Приведем код программы, реализующей работу со строками: преобразование введенной строки в верхний регистр.

  21. #include

  22. #include

  23. int main()

  24. {

  25. char str[50];

  26. printf ("Enter string\n");

  27. gets(str);

  28. int i;

  29. for (i=0; str[i]!='\0';i++)

  30. {

  31. if (str[i]!=' ')

  32. str[i] -= 32;

  33. }

  34. for (i=0; str[i]!='\0';i++)

  35. printf ("%c", str[i]);

  36. printf ("\n");



  37. system("PAUSE");

  38. return 0;

  39. }

  40. Задание: выполнить данный программный код. Написать комментарий к каждой строке программы. Пояснить принцип преобразования символов в верхний регистр. Указать условия, при которых программа работает корректно. Результат работы программы представить в отчете.



  41. К.п.2. Задание к лабораторной работе №4
  1. Во введенной пользователем строке посчитать количество букв «а» и «о» вывести их число на экран.


  2. Во введенной пользователем строке заменить символ «4» на «ch» и символ «0» (нуль) на «о».

  3. Во введенной пользователем строке удалить все цифры (от 0 до 9).

  4. Во введенной пользователем строке добавить символ «!» в конце каждого слова.

  5. Во введенной пользователем строке поменять местами символы «!» и «.».

  6. Во введенной пользователем строке посчитать количество слов и вывести их число на экран.

  7. Во введенной пользователем строке заменить символ «s» на «$» и символ «a» на «@».

  8. Во введенной пользователем строке удалить все заглавные буквы.

  9. Во введенной пользователем строке добавить символ «#» после каждой цифры (0-9).

  10. Во введенной пользователем строке заменить пробелы на знак подчеркивания.