Учебное_пособие_заочное (брошюра)
.pdf2)Создайте файл спроектированной БД в какой-либо СУБД;
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