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

Учебное_пособие_заочное (брошюра)

.pdf
Скачиваний:
24
Добавлен:
21.03.2016
Размер:
1.92 Mб
Скачать

2)Создайте файл спроектированной БД в какой-либо СУБД;

3)Создайте спроектированные таблицы в СУБД и охарактеризуйте их структуру;

4) С помощью запроса измените структуру какой-либо таблицы (например, добавить или удалить какой-либо атрибут) и просмотрите результаты изменения;

5)Организуйте ввод данных в таблицы и внесите данные в таблицы (не менее 10 кортежей в каждой таблице);

6)Реализуйте с помощью языка SQL запросы, которые будут использоваться для манипулирования данными:

4 запроса на изменение данных (добавление, удаление, обновление, создание таблиц)

4 запроса на выборку;

При создании запросов на выборку следует обязательно использовать в каких-либо из запросов агрегатные функции

исортировку выходных данных);

7)Покажите результаты выполненных запросов;

8)С помощью языка SQL создайте однотабличный подзапрос и просмотрите его результаты;

9)Аналогично с помощью языка SQL создайте многотабличный подзапрос и просмотрите его результаты;

10)Опишите подробно весь процесс выполнения всех пунктов задания и дайте общую характеристику СУБД, в которой вы выполняли задание.

ВАРИАНТЫ

N

Тематика БД

1 Деятельность торговой фирмы;

122

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

Если не будет обнаружено ни одного совпадения, то выполняется оператор(ы) в цепи, помеченной ключевым словом default. Впрочем, последняя может и отсутствовать в операторе switch.

Работа переключателя приведена на рисунке 1.4.8.

Рис. 1.4.8. Схема работы оператора switch.

1.4.11. Операторы break и continue.

Оператор break имеет следующий вид: break;

Оператор break прерывает выполнение операторов while, do, for и switch и передает управление следующему за ними оператору. В случае вложенных друг в друга выше перечисленных операторов оператор break прерывает их выполнение только на текущем уровне вложенности.

Оператор break не может быть использован в других, кроме выше перечисленных, конструкциях языка Си.

31

В отличие от оператора break оператор continue прерывает не выполнение самих операторов while, do или for, а только их текущую итерацию и имеет вид:

continue;

Пример 1.4.9.

По номеру дня недели напечатать его название.

# include stdio.h void main( )

{int n ;

printf ( Введите номер дня недели \n ); scanf ( %d , &n);

switch (n)

{ case 1: printf ( Понедельник );

break;

case 2: printf ( Вторник );

break;

case 3: printf ( Среда );

break;

………………………………………

 

………………………………………

 

case 7: printf( Воскресенье );

break;

default: printf( Неверный номер дня недели );

}

}

32

вещественные

переменные:

x для

обозначения

числового значения точки разбиения,

a, b – для

обозначения границ отрезка [a ,b] , h – для обозначения шага разбиения, s – для накопления суммы значений

функции

в

точках

разбиения

и

расчета

среднеарифметического

значения,

 

которая

предварительно инициализируется нулем.

 

 

Далее

вводятся числовые значения

a, b

и рас-

считывается количество точек разбиения отрезка [a ,b]. Затем открывается цикл for, параметром цикла

которого является переменная x, в цикле содержится вызов функции f(x) для расчета текущего значения f(x). После расчета числовое значение f(x) передается в вызывающую функцию main(). В этом же цикле происходит суммирование значений функции f(x) на отрезке [a,b].

На следующем этапе рассчитывается среднее арифметическое значение функции f(x) на отрезке [a,b] и выводится при помощи функции printf() на стандартное устройство вывода. Далее, тело функции main() закрывается фигурной скобкой. На этом программа заканчивается.

4.4.ЗАДАНИЕ 2.

1)Спроектируйте базу данных (БД) согласно теме, указанной в варианте задания.

Для этого:

a)создайте основное отношение, соответствующее тематике;

b)используя метод нормальных форм, нормализуйте данное отношение путем декомпозиции его на 3 или более отношений;

c)определите первичные и внешние ключи ( если они есть) в таблицах и необходимые связи между атрибутами таблиц для обеспечения целостности БД ;

121

Начало f (x)

f =arctg x +ln2x2

Окончание f (x)

c) Пояснительная записка.

Программа начинается с комментария, который заключается между символами /* и */.

Далее идут директивы препроцессора, которые дают указание препроцессору подключить к программе заголовочный файл stdio.h с описанием функций вводавывода и заголовочный файл math.h с описанием математических функций.

Программа состоит из двух функций: пользовательской функции f(x) и обязательной функции main(). Функция main() не возвращает никаких значений и поэтому она объявляется с ключевым словом void. В отличие от функции main(), функция f(x) возвращает вещественное значение f и объявляется с ключевым словом float. Тела функций являются блоками и поэтому ограничены фигурными скобками.

В определении функции f участвует вещественная переменная x, которая является формальным параметром этой функции. Далее определяется значение функции f(x) в зависимости от параметра x. Оператор return используется для возврата числового значения f(x) в вызывающую функцию.

В теле функции main() объявляются:

целая переменная n – необходима для подсчета количества точек разбиения отрезка [a ,b] ;

120

Рис. 1.4.9. Блок-схема к примеру 1.4.9.

Оператор break используется здесь для исключения последующих функций printf() после первого совпадения значения переменной n с константами 1, 2,…7.

Пример 1.4.10.

Даны натуральные числа от 1 до100. Напечатать числа, кратные 5.

# include stdio.h void main()

{ int i;

for (i=1; i<=100; i++ )

{

if ( i % 5) continue; printf(“%d\t”, i); }

}

 

 

33

Рис. 1.4.10. Блок-схема к примеру 1.4.10.

Пример 1.4.11.

Напечатать таблицу умножения.

# include stdio.h void main()

{

int i, j ;

for ( i=1; i<10; i++ )

{

for ( j=1; j<10; j++ )

printf (“%d*%d=%2d\t “, i, j, i*j ) ;

printf (“\n”) ;

}

}

34

Блок-схема состоит из двух частей, поскольку программа состоит из двух функций и каждая функция изображается отдельной блок-схемой.

Начало main()

Ввод a, b

n=(b-a)/h+1

x = a, b, h,

f (x )

s = s + f(x)

s = s / n

Вывод s

Окончание

main()

119

Задача 3.

Найти среднее арифметическое значение функции в точках разбиения отрезка [а, b] с шагом h=0.1, используя обращение

к функции f arctg x ln2 x2 .

Решение.

a)Программа.

/* Задача 3 */ #include <stdio.h> #include <math.h>

/* Определение функции f(x) */ float f (float x) {

return atan(x)+pow(log(x*x), 2);

}

/* Главная функция main() */ void main()

{

int n;

floatx, a, b , h = 0.1, s = 0; printf(”\nВведите a, b ”); scanf(”\n%f %f”, &a, &b ); n=(b-a)/h+1;

for(x = a; x <= b; x += h) /* Обращение к функции f(x) */

s += f(x);

/* Вычисление среднеарифметического значения */ s/ =n;

printf(“среднеарифметическое значение = %f”, s);

}

b) Блок-схема.

118

Рис. 1.4.11. Блок-схема к примеру 1.4.11.

1.4.12. Оператор goto.

Оператор goto используется для безусловной передачи управления внутри блока на помеченный оператор. Синтаксис указанного оператора имеет вид:

goto метка;

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

Метку не надо объявлять, она отделяется от помеченного оператора символом : и должна находиться в том же блоке, что и оператор goto.

Например,

if (r > 1) goto m1;

m1: y = log(r);

35

В основном этот оператор используется для быстрого выхода из вложенных циклов.

1.4.13. Массивы.

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

 

тип имя[размер];

где

тип – определяет тип компонент массива,

 

имя – имя массива,

 

размер – выражение целого типа, определяющее

количество компонент описываемого массива. Например,

float data[100];

здесь описан массив ста вещественных компонент.

Обращение к элементам массива осуществляется по имени массива и номеру его компоненты в квадратных скобках, причем нумерация компонент начинается с нуля.

Например,

data[34] = data[91] / 100;

При описании массив может быть инициализирован, например,

float my[5] {1.2, 3.01, 0.2, 1.1, 5.0};

В соответствии с синтаксисом в языке Си определяются только одномерные массивы, однако элементами одномерного массива, в свою очередь, могут быть массивы. Поэтому двумерный массив определяется как массив массивов.

36

c) Пояснительная записка.

Программа начинается с комментария, который заключается между символами /* и */.

Далее идет директива препроцессора, начинающиеся с символа # , которая дает указание препроцессору подключить к программе заголовочный файл stdio.h с описанием функций ввода-вывода.

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

В теле функции main() объявляются:

целая переменная i – необходима для параметра цикла for;

вещественные переменные: x для обозначения массива из 10 элементов, s – для накопления суммы элементов массива и расчета среднего значения, которая предварительно инициализируется нулем;

Далее открывается цикл for, в котором содержится вызов функции printf(), которая выводит на экран подсказку для ввода текущего элемента массива, вызов функции scanf(), которая вводит текущий элемент массива с клавиатуры и накопление суммы элементов массива в переменной s.

Следующий оператор рассчитывает среднее значение элементов массива.

Далее снова открывается цикл for, в котором преобразуются значения элементов массива, путем вычитания из каждого элемента среднего значения. В этом же цикле организуется вывод на экран преобразованных значений элементов массива.

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

Далее, как уже было замечено выше, тело функции main() закрывается фигурной скобкой. На этом программа заканчивается.

117

b) Блок-схема.

Начало

s=0

i = 0, 9, 1

Ввод x[ i ]

s=s+x[ i ]

s = s / 10

i = 0, 9, 1

x[ i ]=x[ i ] -s

Вывод x [ i ]

Окончание

116

Aналогично определяются многомерные массивы. Стандарт языка Си требует, чтобы транслятор мог обрабатывать определения массивов с размерностью до 31.

Например, конструкция

float b[5][3];

описывает двумерный массив с именем b, содержащий пять элементов, каждый из которых содержит по три элемента..

Инициализирование двумерных массивов может быть различным:

1)int a[2][3] = { 1, 5, 6, 9, 7, 8 } ; 2)int a[2][3] = {{ 1, 5, 6}, {9, 7, 8}} ; 3)int a[ ][ ] = {{1, 5, 6}, { 9, 7, 8}} ;

Одномерные массивы символов представляют собой строки. Строки должны заканчиваться специальным нуль-символом \0 . Если инициализация строки осуществляется посимвольно, то пользователь должен сам позаботиться о добавлении нуль-символа в конец строки, например,

char s1[ 6] { L , i , n , u , x , \0 };

Если в описании строки присутствует инициализация в виде строки, то компилятор автоматически добавляет этот символ в конец строки. Например, в следующем примере:

char s2[ 6] Linux ;

массив символов s2 содержит шесть символов, причем s2[5] равен символу \0 .

Для ввода массивов используются циклы for.

1) Для одномерных массивов:

float a[7] ; int i ;

37

for ( i=0; i<7; i++ )

{ printf (“ a[%d] = ”, i+1) ;

scanf (“ %f “, &a[i] ) ;

}

2) Для двумерных массивов:

 

float a[4][5] ; int i , j ;

 

for ( i=0; i<4; i++ )

 

for ( j=0; j<5; j++ )

 

{ printf (“ a[%d][%d] = ”, i+1, j+1) ;

scanf (“ %f ”, &a[i][j] ) ;

}

Ввод строк можно осуществлять по разному:

1)char str[20] ; scanf ( “ %s “, str ) ;

2)char str[20] ; gets ( str ) ;

Впервом случае ввод идет до первого пробела, во втором – можно вводить и пробелы, конец ввода определяется нажатием клавиши “Enter”.

Пример 1.4.12.

Вычислить среднее геометрическое положительных элементов целочисленного массива X[12].

#include stdio.h

#include <math.h>

void main()

{

int X[12], i, k=0; float sg=1; for ( i=0; i<12; i++ )

{

printf (“ X[%d] = ”, i+1) ; scanf (“ %d “, &X[i] ) ;

if (X[i] >0 ) { sg *= X[i] ; k++ ; }

}

sg = pow (sg , 1./k ) ;

38

переменной min в сопровождении текста “min=”. Здесь также используется спецификация вывода %f, поскольку min – вещественное число.

Далее, как уже было замечено выше, тело функции main() закрывается фигурной скобкой. На этом программа заканчивается.

Задача 2.

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

Решение.

a)Программа.

/* Задача 2 */ #include <stdio.h>

void main()

{ int i; floatx[10], s=0;

/*Ввод элементов массива и нахождение их суммы */ for(i = 0; i < 10; i++ )

{

printf(”\nx[%d]=”, i+1); scanf(”%f”, &x[i]);

s+=x[i]; }

/* Нахождение среднего значения */ s/ = 10;

/* Преобразование и вывод исходного массива */ for (i = 0; i < 10; i++)

{ x[i] - = s; printf(”\nx[%d]=%f”, i+1, x[i]);

}

}

115

подключается заголовочный файл stdio.h с описанием функций ввода-вывода.

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

В теле функции main() объявляются вещественные переменные x, y, z, p, q, min.

x, y, z –исходные данные;

p для хранения суммы x, y, z;

q для хранения произведения x, y, z;

min для хранения минимального из p и q значения . Далее содержится вызов библиотечной функции

printf(), которая выводит на экран текст «Введите x, y, z». Предварительно происходит перевод строки, который задается в функции printf() управляющими символами ‘\n’.

Ввод числовых значений x, y, z происходит со стандартного устройства ввода (клавиатуры) по адресам: &x, &y, &z соответственно. Осуществляет это библиотечная функция scanf(), в которой используется спецификация формата ввода %f, так как x, y, z – вещественные числа.

Далее вычисляются значения p и q с помощью арифметических операций сложения, умножения и присваивания.

Использование условного оператора:

if (выражение) оператор 1; else оператор 2; позволяет выбрать минимальное из значений p и q, которое затем присваивается переменной min. Выражение сравнения в условном операторе имеет вид: ( p < q ). Операторами 1 и 2 являются присваивания: min=p и min=q. Если p < q, то min=p, в противном случае min=q.

Использование вышеуказанной библиотечной функции printf() дает возможность вывести на стандартное устройство вывода (монитор) числовое значение

114

printf (“среднее геометрическое = %f “, sg

) ;

}

Рис. 1.4.12. Блок-схема к примеру 1.4.12.

Пример 1.4.13.

Найти сумму целых положительных чисел, меньших 50 и кратных 4 из целочисленного массива С[3][7].

#include stdio.h void main()

{

int С[3][7], i, j, s=0; for ( i=0; i<3; i++ ) for ( j=0; j<7; j++ )

{

printf (“ C[%d][%d] = ”, i+1, j+1 ) ; scanf (“ %d “, &C[i][j] ) ;

39

if ( C[i][j] >0 && C[i][j]<50 && C[i][j]%4= =0

)

s + = C[i][j] ;

}

printf (“сумма = %d “, s ) ;

}

Рис. 1.4.13. Блок-схема к примеру 1.4.13.

1.4.14. Функции.

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

Нами уже использовались многие функции из стандартных библиотек языка Си, например, математические функции,

40

Начало

Ввод x, y, z

p=x*y*z

q=x+y+z

min=p

p<q

min=q

Вывод min

Окончание

c)Пояснительная записка.

Программа начинается с комментария, который заключается между символами /* и */.

Далее идут директивы препроцессора, начинающиеся с символа # , которые дают указание препроцессору подключить к программе заголовочные файлы с описанием тех или иных библиотечных функций. В данном случае

113