Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб. практикум

.pdf
Скачиваний:
89
Добавлен:
12.03.2015
Размер:
658.95 Кб
Скачать

101

операнд

приоритет

 

 

 

 

 

 

 

операция

 

 

 

 

 

 

 

 

 

┌───┬────┬───┐

┌───┬─┬─┐

┌───┬─┬─┐

┌───┬─┬─┐

┌───┬─┬─┐

┌───┬─┬─┐

│130│

+ │ 1

│130│+│1│

│205│-│1│

│205│-│1│

│205│-│1│

│157│ │0│

│ 25│

* │ 2

│ 75│-│1│

│160│/│2│

│ 8│*│2│

│ 48│ │0│

│ │ │

│ 3│ - │ 1 │

│ │ │

│ 20│*│2│

│ 6│ │0│

│ │ │

│ │ │

└───┴────┴───┘

└───┴─┴─┘

└───┴─┴─┘

└───┴─┴─┘

└───┴─┴─┘

└───┴─┴─┘

Рис. 12.1. Пример заполнения стека операндов, операций и приоритетов.

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

/* Программа 12.1 */

 

#include <stdio.h>

 

#include <conio.h>

 

/*-------------------------------------------------------------------

*/

 

/* Функция выделения числа и преобразования */

 

/*

его из символьной формы в целочисленную */

 

/*--------------------------------------------------------------------

*/

 

int Сhislo ( char text [ ], int *i )

 

 

/* Входные данные:

 

 

text - символьная строка,

 

 

*i - индекс первой цифры числа в строке text.

 

 

Выходные данные:

 

 

*i - индекс следующего после числа символа.

*/

 

Функция возвращает целое число

{ int c=0; /* возвращаемое значение */

 

while (text[*i]>='0' && text[*i]<='9')

 

{

c=c*10+(text[*i]-'0');

 

 

(*i)++;

 

}

return c;

}

/*───────────────────*/ /* Главная функция */ /*───────────────────*/

main()

{char text [80]; /* вх. текст - арифм. выражение */

int i ;

/* индекс массива text */

float

opd [3];

/* стек операндов

*/

char

opc [3];

/* стек операций

*/

int

pr [3] ;

/* стек приоритетов */

102

int j = -1 ; /* указатель стека */

printf ("\nВведите арифметическое выражение.\n"); gets (text);

i = -1; do

{ i++;

/* запись числа, операции и ее приоритета в стек */ opd[++j] = Сhislo(text,&i); opc[j] = text[i];

switch (text[i])

{

case '+':

case '-': pr[j] = 1; break; case '*':

case '/': pr[j] = 2; break; case ' ' /* пробел */: pr[j]=0;

}

while (j > 0 && pr[j] <= pr[j-1])

{ /* выполнение соответствующей операции */ switch (opc[j-1])

{case '+' : opd[j-1] = opd[j-1] + opd[j]; break; case '-' : opd[j-1] = opd[j-1] - opd[j]; break;

case '*' : opd[j-1] = opd[j-1] * opd[j]; break; case '/' : opd[j-1] = opd[j-1] / opd[j];

}

/* удаление выполненной операции из стека */ opc[j-1] = opc[j]; pr[j-1] = pr[j]; j--;

}

}

while (text[I] != ' ');

printf ("Результат:%.2f\n",opd[0]); getch();

}

Результаты тестирования:

Введите арифметическое выражение.

9/4-12

Результат:-9.75

Введите арифметическое выражение.

10*2/5+6/3

Результат:6.00

103

Введите арифметическое выражение.

130+25*3-160/20*6

Результат:157.00

Введите арифметическое выражение.

2345

Результат:2345.00

Контрольные вопросы

1.Что такое стек?

2.Как можно хранить стек?

3.Как программируется операция инициализации стека?

4.Как программируется операция включения в стек нового элемента?

5.Как программируется операция исключения элемента из стека?

6.Почему в программе 12.1 стеки объявлены как массивы всего из трех элементов?

Задания

1. Дано арифметическое выражение длиной до 20 символов, оканчивающееся пробелом. Выражение содержит однобуквенные идентификаторы и знаки операций +, -, *, /. Преобразовать выражение в обратную польскую запись, используя стек операций и приоритетов.

Пример.

Вх. текст: a*b+c/d-e Результат: ab*cd/+e-

2. Дано арифметическое выражение в постфиксной (обратной польской) записи длиной до 20 символов, оканчивающееся пробелом.

104

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

а) В левой части операторов присваивания использовать вспомогательные переменные R1,R2,R3,...

Пример.

Вх. текст: abc*+def+/-

Результат: R1=b*c R2=a+R1 R3=e+f R4=d/R3 R5=R2-R4

б) В левой части операторов присваивания использовать вспомогательные переменные R1,R2,R3,..., сократив до минимума число этих переменных.

Пример.

Вх. текст: abc*+def+/-

Результат: R1=b*c R1=a+R1 R2=e+f R2=d/R2 R2=R1-R2

3. Дано арифметическое выражение длиной до 30 символов, оканчивающееся знаком равенства. Выражение содержит знаки операций +, -, *, / и однозначные целые числа и представлено в обратной польской записи. Вычислить значение выражения, используя стек операндов.

Пример.

Вх. текст: 345+2*63/-+= 19

результат

105

4.Дан орграф без циклов в виде количества вершин n≤10 и матрицы смежности.

а) Проверить, существует ли путь от вершины A к вершине B.

б) Найти какой-нибудь путь от начальной вершины к конечной, если такой существует.

Указание. Для хранения очередного пути при обходе графа использовать стек.

5.Дан орграф в виде количества вершин n≤10 и матрицы смежности.

а) Проверить, существует ли цикл, проходящий через заданную вершину A.

б) Найти какой-нибудь цикл, проходящий через начальную вершину, если такой существует.

Указание. Для хранения очередного пути при обходе графа использовать стек.

6. Дано скобочное выражение длиной до 50 символов, оканчивающееся пробелом. Напечатать попарно порядковые номера соответствующих открывающих и закрывающих скобок в выражении.

Пример.

 

 

 

 

 

 

1

4

8

10

14

19

27

Вх. текст: ( a + ( b + c ) / ( a – b ) * ( x + ( y + 2 ) *

3 ) ) / 2

Результат: 4

8

 

 

 

 

 

10

14

 

 

 

 

 

19

23

 

 

 

 

 

16

27

 

 

 

 

 

1

28

 

 

 

 

 

Указание. Для запоминания номеров открывающих скобок использовать стек.

7. Дана последовательность чисел, оканчивающаяся нулем.

106

а) Напечатать только отрицательные числа из этой последовательности, причем, если подряд идет несколько отрицательных чисел, печатать их в обратном порядке.

Пример.

Вх. последовательность: 5 -1 -20 -8 10 14 -3 5 -2 -13 -7 0 Результат: -8 -20 -1 -3 -7 -13 -2

Указание. Последовательность подряд расположенных отрицательных чисел помещать в стек.

б) Напечатать только положительные числа из этой последовательности, причем, если подряд идет несколько положительных чисел, печатать их в обратном порядке.

Пример.

 

 

 

Вх. последовательность: -2 5 10 20 15 -4

-6 2 -10 3 1 4 -5 0

Результат:

15 20 10 5 2 4 1 3

 

Указание.

Последовательность

подряд

расположенных

положительных чисел помещать в стек.

8. Дана последовательность из n слов ( n≤20 ) в алфавитном порядке. Длина каждого слова не более 10 букв. Напечатать слова, начинающиеся с одной и той же буквы в обратном порядке, используя стек.

Пример.

Вх. последовательность:

Результат:

август

апрель

апрель

август

май

море

март

март

море

май

лето

лето

107

СПИСОК ЛИТЕРАТУРЫ

1. Хохлов Д.Г. Введение в программирование: Учебное пособие.- Казань: Изд-во Казан. гос. техн. ун-та, 2005. - 136 с.

2.Хохлов Д.Г. Структуры данных и комбинаторные алгоритмы. Учебное пособие. - Казань: Изд-во Казан. гос. техн. ун-та, 2005. - 102 с.

3.Хохлов Д.Г., Захарова З.Х. Введение в программирование. Практикум на языке С: Учебное пособие. - Казань: Изд-во Казан. гос.

техн. ун-та, 2005. - 76 с.

4.Хохлов Д.Г., Захарова З.Х. Практикум по структурам данных и комбинаторным алгоритмам: Учебное пособие.- Казань: Изд-во Казан.

гос. техн. ун-та, 2005. - 48 с.

5.Хохлов Д.Г. Основы технологии модульного программирования.

Учебное пособие. - Казань. Изд-во Казан. гос. техн. ун-та , 2005. - 63 с.

6.Хохлов Д.Г. Программирование на языке высокого уровня. Часть 1: Основы программирования: Учебник. - Казань: Мастер Лайн, 2006. - 248 с.

7.Хохлов Д.Г. Программирование на языке высокого уровня. Часть 2: Методы программирования: Учебник. - Казань: Мастер Лайн, 2006. - 266 с.

8.Бикмурзина А.Р.,Захарова З.Х., Хохлов Д.Г. Программирование и структуры данных: Учебное пособие. - Казань. Изд-во Казан. гос. техн. ун-

та , 2008. - 147 с.

9.Павловская Т.А. С/С++. Программирование на языке высокого уровня. - СПб: Питер, 2004. - 461с.

10.Павловская Т.А., Щупак Ю.А. С/С++. Структурное программирование: Практикум. - СПб: Питер, 2002. - 240с.

108

СОДЕРЖАНИЕ

Предисловие………………………………………………………….…………3

Лабораторная работа №1. Работа в интегрированной среде Turbo C++ .….4

Лабораторная работа №2. Программирование простейших циклов на языке С..……………………………………………………………....14

Лабораторная работа №3. Обработка числовых последовательностей……32

Лабораторная работа №4. Последовательная обработка символов………...40

Лабораторная работа №5. Обработка массивов……………………………...44

Лабораторная работа №6. Функции…………………………………………..51

Лабораторная работа №7. Символьные строки и функции обработки строк……………………………………………………………………….60

Лабораторная работа №8. Структуры и работа с файлами…………………..70

Лабораторная работа №9. Таблицы……..…………………..…………………80

Лабораторная работа №10. Организация списков с помощью указателей и структур…………………………………………………………………85

Лабораторная работа №11. Графы…………………………………………….92

Лабораторная работа №12. Стеки………………………………………….….99

Список литературы……………………………………………………………..107

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]