Методические указания к лабораторным работам по курсу «Программирование на языках высокого уровня»


Скачать 321.08 Kb.
НазваниеМетодические указания к лабораторным работам по курсу «Программирование на языках высокого уровня»
страница2/3
ТипМетодические указания
1   2   3

Варианты задания (номер варианта определяется по последней цифре номера студенческого билета):


0. Сформировать двумерный массив A размером N x 2 (N - количество строк, равное предпоследней цифре номера студенческого билета+2 2 – количество столбцов) с помощью генератора случайных чисел и вывести элементы массива. Найти наибольший элемент каждой строки матрицы А. Из этих максимальных элементов составить одномерный массив F. Вывести элементы массива F.

1. Сформировать двумерный массив B размером N x 3 (N – количество строк, равное предпоследней цифре номера студенческого билета +2 3 – количество столбцов) с помощью генератора случайных чисел и вывести элементы массива. Составить одномерный массив D из минимальных элементов столбцов матрицы. Вывести элементы массива D.

2. Сформировать двумерный массив B размером N x 4 (N – количество строк, равное предпоследней цифре номера студенческого билета +2 4 – количество столбцов) с помощью генератора случайных чисел и вывести элементы массива. Вычислить и вывести строку матрицы B, содержащую максимальное количество отрицательных.

3. Сформировать двумерный массив C размером N x 5 (N – количество строк, равное предпоследней цифре номера студенческого билета +2 5 – количество столбцов) с помощью генератора случайных чисел и вывести элементы массива. Вычислить сумму положительных элементов в каждой строке матрицы C . Из полученных сумм составить одномерный массив D. Вывести элементы массива D.

4. Сформировать двумерный массив D размером N x 6 (N – количество строк, равное предпоследней цифре номера студенческого билета +2 6 – количество столбцов) с помощью генератора случайных чисел и вывести элементы массива на экран и в файл (см. п.3.4. и п.3.6.). В каждом столбце матрицы D найти максимальный элемент. Среди найденных чисел найти минимальное и вывести на экран и в файл.

5. Сформировать двумерный массив E размером N x 7 (N – количество строк, равное предпоследней цифре номера студенческого билета +2 7 – количество столбцов) с помощью генератора случайных чисел и вывести элементы массива. Вычислить сумму отрицательных элементов столбца, в котором находится максимальный элемент матрицы E. Вывести полученную сумму и номер столбца.

6. Сформировать двумерный массив F размером N x 8 (N – количество строк, равное предпоследней цифре номера студенческого билета +2 8 – количество столбцов) с помощью генератора случайных чисел и вывести элементы массива. В строке матрицы F, содержащей максимальный элемент, заменить все отрицательные числа на нули. Вывести номер этой строки и максимальный элемент.

7. Сформировать двумерный массив G размером N x 9 (N – количество строк, равное предпоследней цифре номера студенческого билета +2 9 – количество столбцов) с помощью генератора случайных чисел и вывести элементы массива. Записать в одномерный массив F строку матрицы G, содержащую минимальный элемент. Вывести элементы массива F.

8. Сформировать двумерный массив L размером N x 10 (N – количество строк, равное предпоследней цифре номера студенческого билета +2 10 – количество столбцов) с помощью генератора случайных чисел и вывести элементы массива. Вывести номер строки и саму строку матрицы L, в которой сумма положительных элементов максимальна.

9. Сформировать двумерный массив Z размером N x 11 (N – количество строк, равное предпоследней цифре номера студенческого билета +2 11 – количество столбцов) с помощью генератора случайных чисел и вывести элементы массива. Вычислить сумму положительных элементов строки, в которой находится минимальный элемент матрицы Z. Вывести полученную сумму и номер строки.

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




    1. Как объявить матрицу? Как инициализировать?

    2. Ввод – вывод матрицы по строкам.

    3. Как поменять местами строки в матрице?

    4. Как найти минимальный элемент матрицы и его индексы?

    5. Как вычислить сумму элементов строки матрицы?

    6. Как получить транспонированную матрицу?


2 часть

Лабораторная работа № 4

Функции. Рекурсия.

1. ЦЕЛЬ РАБОТЫ: Изучение методов использования функций языка Си.

2. ОСНОВНЫЕ СВЕДЕНИЯ

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

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

<тип > <имя функции>(<формальные параметры>){<тело функции >}

Если тип возвращаемого функцией значения не указан, то подразумевается int. Если с именем функции не связан результат, то нужно указать тип функции void. Параметры, записываемые в обращении к функции, называются фактическими; параметры, указанные в описании функции - формальными. Фактические пара­метры должны соответствовать формальным по количеству, порядку следования и типу. Объекты, объявленные вне функции, действуют в любой функции и называются глобальны­ми. Объекты, объявленные в функции, действуют только в ней и называются локальными. В теле функции обычно присутствует оператор return <выражение>, определяющий возвращаемое функцией значение.

Все параметры функции, кроме массивов, передаются по значению, т.е. внутри функции создаются локальные копии параметров. Если необходимо передать саму переменную, а не её копию, то в функцию передаётся адрес этой переменной. Таким образом, через параметры можно передавать результат выполнения функции. То есть, параметры, с помощью которых результаты должны передаваться из функции в точку вызова, описываются как указатели. Вызов функции может быть оформлен в виде оператора, если с именем функции не связано возвращаемое значение, или в виде выражения, если возвращаемое значение связано с именем функции.

Прототип функции может указываться до вызова функции вместо описания функции для того, чтобы компилятор мог выполнить проверку соответствия типов аргументов и параметров. Прототип функции по форме такой же, как и заголовок функции. В конце него ставится «;».

Функции можно подключать с помощью директивы #include <имя файла>. Такие файлы с функциями удобно использовать в диалоговых программах с пользовательским меню, позволяющих выбрать один из режимов.

Пример 1: Функция с параметрами-значениями. Результат связан с именем функции. В программе объявляется прототип функции, а сама функция описывается ниже.

//lab8_1

#include

#include

int max(int,int); //Прототип функции

void main()

{ int x,y,z;

printf(" input x,y ");

scanf("%d%d",&x,&y);

z=max(x,y); //Вызов функции с фактическими параметрами

printf("x=%d y=%d max=%d",x,y,z);

getch();

}

int max(int a ,int b) //Заголовок функции с формальными параметрами

{ int c;

if (a>b) c=a;

else c=b;

return c;

}
Пример 2: Функция с параметрами-указателями. Здесь передаются адреса фактических параметров, по которым и получаем результат. Функция меняет местами переменные x,y.

//lab8_2

#include

#include

main()

{ float x,y;

void swap(float *, float *); // Прототип функции с параметрами - указателями

printf("\n введите x,y ");

scanf("%f%f",&x,&y);

swap(&x,&y); // Передаём адреса переменных

printf("\n x=%4.2f y=%4.2f ",x,y);

getch();

}

void swap(float * a, float * b)

{float c;

c=*a; // *a - содержимое по адресу a

*a=*b;

*b=c;

}
Пример 3: Подключение файлов с функциями и создание меню.

! Внимание! Следите за тем, чтобы константы, объявленные директивой #define, не переобъявлялись в функциях.

//lab8_3

#include

#include

#include "lab3.c"

#include "lab5.c"

#include "lab6.c"

main()

{ int nom;

while(1)

{ clrscr();

printf("\n 1. Сумма ряда \n");

printf(" 2. Матрица \n");

printf(" 3. Строки \n");

printf(" 4. Выход \n");

scanf("%d",&nom);

switch(nom)

{

case 1:lab3();break;

case 2:lab5();break;

case 3:lab6();break;

case 4:return 0;

default:printf("Неверный режим");

}

}

getch();

}

Пример 4: Передача в функцию массива с использованием указателя. Результат – элементы массива возводятся в квадрат. Функция описывается до вызова, поэтому прототип не объявляется.

//lab8_4

#include

#include

void quart(int n, float * x) // Можно void quart(int n, float x[])

{ int i;

for (i=0;i
x[i]=x[i]*x[i];

}

main()

{ float z[]={1,2,3,4};int j;

clrscr();

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

printf(" %6.2f",z[j]);

quart(4,z);

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

printf("\n %6.2f",z[j]);

getch();

}
В языке Си функции могут вызывать сами себя, т.е. обладать свойством рекурсивности. Рекурсивная функция обязательно должна содержать в себе условие окончания рекурсивности, чтобы не вызвать зацикливания программы. При каждом рекурсивном вызове создается новое мно­жество локальных переменных. Т.о. переменные, расположенные вне вызываемой функции, не изменяются.

Пример. Составить рекурсивную функцию, вычисляющую факториал числа n следующим образом: n!= 1 , если n<= 1 и n!= ( n -1 )! · n, если n > 1

long fact( int n)

{ if (n <=1) return l;

else return (n * fact ( n -1 )); // функция fact вызывает саму себя

}

Таким образом, последовательно вызываются функции f(n), f(n-1),f(n-2)…f(1).

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

3. ВЫПОЛНЕНИЕ РАБОТЫ

Используя функции, написать программу по своему варианту.

Варианты заданий

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

2. Написать функцию вычисления произведения прямоугольной матрицы A размера k x m на прямоугольную матрицу B размера m x n. В главной программе обратиться к этой функции.

3. Написать функцию вычисления суммы ряда s=s(1)+…+s(n),

где s(n)=(-1)n x(2n-1)/(2n+1) с точностью до eps=0.001. В качестве параметров выбрать x и eps.

4. Написать функцию, которая вычисляет для заданной квадратной матрицы A её симметричную часть S(ij)=(A(ij)+A(ji))/2 и кососимметричную часть K(ij)=(A(ij)-A(ji))/2.

5. Написать функцию “шапочка” f(x), зависящую от параметров a и b: если |x| >a то f(x)=0 иначе f(x)=b*exp(-a2/(a2-|x|2)). В качестве параметров передать a,b,x.

6. Написать функцию поиска максимального и минимального элементов одномерного массива. В основной программе вызвать эту функцию для двух разных массивов.

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

8. Написать функцию, которая по двум заданным одномерным массивам (A размера m и B размера n) вычисляет максимальное значение двумерного массива c(ij)=a(i)*b(j).

9. Написать функцию вычисления суммы ряда y=x-x/2!+…

+(-1)n+x/n! с точностью до eps=0.001. В качестве параметров передать x (в радианах) и eps.

10. Написать функцию вычисления ряда y=x+x3/3!+…+x2n+1/(2n+1)! с точностью до eps=0.0001. В качестве параметров передать x и eps.

11. Написать функцию обработки матриц A и B одинакового размера m x n. Получить матрицу C =max(a(i,j),b(i,j)), и матрицу D=min(a(i,j),b(i,j)). Матрицы C и D вывести в главной программе.

4. КОНТРОЛЬНЫЕ ВОПРОСЫ

4.1. Описание функции. Для чего объявляется прототип?

4.2. Что такое формальные и фактические параметры? Локальные и глобальные?

4.3. Как можно передавать массив в функцию?

4.4. Способы вызова функций.
Лабораторная работа № 5

Динамические массивы
1. ЦЕЛЬ РАБОТЫ: приобретение практических навыков создания и обработки одномерных и многомерных динамических массивов.

2. ОСНОВНЫЕ ПОНЯТИЯ

При определении статического массива: тип имя_массива [количество_элементов] , имя_массива становится указателем на область памяти, выделяемой для размещения элементов массива. Количество элементов должно быть константой. Таким образом, размеры памяти, выделяемой под массив, заданы в определении массива. Но иногда нужно, чтобы размеры памяти были не фиксированными, а выделялись в ходе выполнения программы при решении конкретной задачи.

Формирование массивов с переменными размерами можно организовать с помощью указателей и средств для динамического выделения памяти. Эти средства описаны в файле . Функции malloc() и calloc() динамически выделяют память в соответствии со значениями их параметров и возвращают адрес начала выделенного участка памяти. Тип возвращаемого значения указателя void *. Его можно преобразовать к указателю любого типа с помощью явного приведения типа. Функция free(void *) освобождает память, выделенную с помощью malloc() или calloc().

int *p;

p=(int *)malloc(size); //Указателю на целое p присваивается адрес начала выделенной области памяти размером size байт.

p=(int *)calloc(n, size); //Указателю на целое p присваивается адрес начала выделенной области памяти размером n*size байт.

free(p); //Освобождает выделенную по адресу p память. Преобразование указателя любого типа к типу void * осуществляется автоматически, так что в качестве фактического параметра можно подставить указатель любого типа без явного приведения типов.

Пример формирования одномерного динамического массива

#include

#include

#include

main()

{ float *p,d;

int i,n;

printf("\n input n:");

scanf("%d",&n);

p=(float *)malloc(n*sizeof(float));

for (i=0;i
{printf("x[%d]=",i);

scanf("%f",&d);

p[i]=d;

}

for (i=0;i
{ if (i%4==0) printf("\n");

printf("\t x[%d]=%6.2f",i,p[i]);

}

free(p);

getch();

}

Доступ к участкам выделенной памяти выполняется с помощью операции индексирования: p[i].

Каждый элемент массива может быть, в свою очередь, массивом. Именно так конструируются динамические многомерные массивы. Рассмотрим алгоритм создания и обработки двумерного массива.

  1. Определяем указатель на массив указателей , задающий адреса начала строк матрицы: тип **uk.

  2. Вводим размеры матрицы n,m.

  3. Создаём динамический массив указателей на указатели начала строк : uk=(тип **)malloc(n*sizeof(тип *));

  4. В цикле выделяем память под n массивов – строк по m элементов в каждом: for (i=0;i

  5. Обработка массива (работа с индексированными элементами uk[i][j]).

  6. В цикле освобождаем память, занятую под n массивов – строк : for (i=0;i

  7. Освобождаем память, занятую под массив указателей : free(uk).

Пример обработки двумерного динамического массива

Составить программу, создающую динамическую матрицу размером n*n, заполнить матрицу случайными числами. Вычислить сумму каждой строки и поместить суммы строк в одномерный динамический массив.

//lab11_2

#include

#include

#include

#include

void main()

{ int n,j,i;

float ** matr; float * mass; // Объявляем matr - указатель на массив указателей и //mass – указатель на одномерный массив

clrscr();

printf("Введите размер квадратной матрицы n: "); scanf("%d",&n);

mass=(float *)malloc(n*sizeof(float )); // Выделяем память под одномерный массив

if (mass==NULL)

{ puts("не создан динамический массив!");

return;}

matr=(float **)malloc(sizeof(float *)*n); //Выделяем память под массив указателей

if (matr==NULL)

{ puts("не создан динамический массив!");

return;}

randomize();

for (i=0;i
{ matr[i]=(float *)malloc(sizeof(float)*n); // Выделяем память под i-ю строку

if (matr[i]==NULL)

{ puts("не создан динамический массив!");

return;}

for (j=0;j
}

for (i=0;i
{ mass[i]=0;

for (j=0;j
mass[i]+=matr[i][j];

}

for (i=0;i
{ for (j=0;j
printf("\t%6.2f",matr[i][j]);

printf("\n");

}

for (i=0;i
printf("\n сумма %d строки %8.2f",i,mass[i]);

for (i=0;i
free(matr[i]); //Освобождаем память i – й строки

free(matr); // Освобождаем память массива указателей

free(mass); // Освобождаем память массива сумм

getch();

}
3. ВЫПОЛНЕНИЕ РАБОТЫ

3.1. Проанализировать приведенные программы.

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

Варианты заданий

1. Даны матрица A размером m*n и вектор В размером m. Записать на главную диагональ элементы вектора, а в вектор - элементы главной диагонали.

2. Выбрать максимальный элемент матрицы С (размер m*n), элементы четных строк разделить на максимальный элемент, а к элементам нечетных прибавить максимальный элемент.

3. Найти минимальный элемент матрицы С (размер m*n), и поменять его местами с первым элементом.

4. Дана матрица Е размером m*n. Вычислить суммы элементов каждого столбца. Определить наибольшее значение этих сумм и номер соответствующего столбца.

5. В матрице К размером m*n найти в каждом столбце произведение отрицательных элементов и количество нулевых элементов в матрице .

6. Даны две матрицы А и В одинаковой размерности m*n. Получить матрицу

C = max (a i j, b i j ), и матрицу D = min (a i j, b i j).

7. Дана матрица Р размером m*n . Найти сумму минимальных элементов каждого столбца матрицы.

8. Даны матрицы: А размером m*k и В размером k*n.Получить матрицуС=A*В.

9. Дана матрица К размером m*n. Вычислить сумму минимальных элементов каждого столбца.

10. Дана матрица С размером m*n. Упорядочить эту матрицу по возрастанию элементов в каждом столбце.

11. Дан одномерный массив A из m элементов. Вводится число k (k
12. В матрице Т размером m*k переставить элементы в строках так, чтобы по диагонали они были упорядочены по возрастанию.

4. КОНТРОЛЬНЫЕ ВОПРОСЫ

4.1. Отличия динамического массива от статического.

4.2. Как создать одномерный динамический массив?

4.3. Как создать динамическую матрицу?

4.4. Как освобождается память, занятая под динамические структуры?
Лабораторная работа № 6 (КР)

Обработка бинарных файлов

1. ЦЕЛЬ РАБОТЫ: приобретение практических навыков создания и обработки бинарных файлов.

2. ОСНОВНЫЕ ПОНЯТИЯ

Файл - это упорядоченная последовательность однотипных компонентов, расположенных на внешнем носителе. Файлы предназначены только для хранения информации, а обработка этой информации осу­ществляется программами. Использование файлов целесообразно в случае:

  • долговременного хранения данных;

  • доступа различных программ к одним и тем же данным;

  • обработки больших массивов данных, которые невозможно целиком разместить в оперативной памяти компьютера.

Файл, не содержащий ни одного элемента, называется пустым. Создается файл путем добавления новых записей в конец первоначально пустого файла. Длина файла, т.е. количество элементов, не задается при определении файла. При вводе и выводе данные рассматриваются как поток байтов. Физически поток – это файл или устройство (клавиатура или дисплей). В Си поток можно открыть для чтения и/или записи в текстовом или бинарном (двоичном) режиме. В текстовых файлах не употребляются первые 31 символ кодовой таблицы ASCII (управляющие), а символы конца строки 0x13 (возврат каретки, CR) и 0x10 (перевод строки LF) преобразуются при вводе в одиночный символ перевода строки \n (при выводе выполняется обратное преобразование). Эти символы добавляются в конце каждой строки, записываемой в текстовый файл. При обнаружении в текстовом файле символа с кодом 26 (0x26), т.е. признака конца файла, чтение файла в текстовом режиме заканчивается, хотя файл может иметь продолжение.

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

Функция открытия потока fopen возвращает указатель на предопределенную структуру типа FILE (содержащую всю необходимую для работы с потоком информацию) при успешном открытии потока, или NULL в противном случае.

В заголовочном файле stdio.h содержится описание файлового типа FILE, с которым связывается файловая переменная (указатель на файл). При открытии файла указатель на файл связывается с конкретным файлом на диске и определяется режим открытия файла:

r (r+) - файл открывается для чтения (чтения и записи);

w (w+) - открывается пустой файл для записи (чтения и записи). Если файл с таким именем существует, он стирается;

a (а+)- файл открывается для дополнения в конец (чтения и дополнения).

Режим открытия может также содержать символы t (текстовый файл) и b (двоичный файл), указывающий на вид открываемого файла: rb, wb, ab, rt, at, rb+, wb+, ab+ и т.д.

Закрытие файла (текстового или бинарного) выполняется функцией fclose(), установка указателя на начало файла - функцией rewind(). Если при попытке чтения данных из файла встречается символ конца файла, то возвращается специальное значение EOF. Функции feof(),ferror() сообщают о причинах, по которым операция ввода/вывода не выполнилась.

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

Бинарные файлы могут содержать любую информацию. Чаще всего используются файлы, содержащие структуры. Для чтения и записи в бинарные файлы можно использовать функции fread(), fwrite() или fscanf(),fprintf().

fread –функция для чтения из файла:

int fread(void *ptr, unsigned size, unsigned count, FILE *f);

Из файла f считываются и по адресу ptr записываются count элементов размером size каждый. Функция возвращает число фактически считанных элементов.

fwrite – функция для записи в файл:

int fwrite(void *ptr, unsigned size, unsigned count, FILE *f);

В файл записываются, начиная с адреса ptr, count элементов размером size каждый. Функция возвращает число фактически записанных элементов.

fseek – функция для произвольного доступа к байтам бинарных файлов:

int fseek(FILE *f, long offset, int w);

offset показывает, на сколько байт нужно сместиться относительно точки отсчёта – w.

w должно быть равно одной из трех констант:

SEEK_SET или 0 - начало файла;

SEEK_CUR или 1 – текущая позиция в файле;

SEEK_END или 2 – конец файла.

ftell - возвращает текущую позицию в файле как длинное целое:

long int ftell (FILE *f);
1   2   3

Похожие:

Методические указания к лабораторным работам по курсу «Программирование на языках высокого уровня» iconМетодические указания к лабораторным работам по изучению субд access...
«Информационные технологии (ИТ): Методические указания к лабораторным работам по курсу ит для направления 552800 Информатика и вычислительная...

Методические указания к лабораторным работам по курсу «Программирование на языках высокого уровня» iconМетодические указания к лабораторным работам по дисциплине «Управление проектами»
Методические указания к лабораторным работам по дисциплине «Управление проектами» для студентов и слушателей факультета «Инженерный...

Методические указания к лабораторным работам по курсу «Программирование на языках высокого уровня» iconМетодические указания к лабораторным работам по математическому моделированию...
Методические указания к лабораторным работам по математическому моделированию и теории принятия решений

Методические указания к лабораторным работам по курсу «Программирование на языках высокого уровня» iconСамостоятельная работа Методические указания к выполнению самостоятельной...
Методические указания выполнению самостоятельной работы по курсу «Информатика» и «Информатика и программирование»: Авт сост Н. В....

Методические указания к лабораторным работам по курсу «Программирование на языках высокого уровня» iconМетодические рекомендации по разработке методических указаний к практическим...
Методические рекомендации по разработке методических указаний к практическим занятиям, лабораторным работам по дисциплине/ Составители...

Методические указания к лабораторным работам по курсу «Программирование на языках высокого уровня» iconМетодические указания к лабораторным работам Рязань 2013
Цель работы: изучение метода релаксационной спектроскопии глубоких уровней и методов анализа спектров рсгу

Методические указания к лабораторным работам по курсу «Программирование на языках высокого уровня» iconМетодические указания по проведению лабораторных работ по дисциплине «Информатика»
Методические указания по проведению лабораторных работ предназначены для студентов гоапоу «Липецкий металлургический колледж» технических...

Методические указания к лабораторным работам по курсу «Программирование на языках высокого уровня» iconМетодические указания к лабораторным работам по дисциплине информатика...
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

Методические указания к лабораторным работам по курсу «Программирование на языках высокого уровня» iconМетодические указания к лабораторным работам для студентов III курса автф направления230100. 62
Изучить команды монитора Mysql, освоить операции создания таблиц, выборки, вставки, изменения и удаления данных

Методические указания к лабораторным работам по курсу «Программирование на языках высокого уровня» iconРазработка электронного документа в субд access методические указания к лабораторным работам
Методические указания предназначены для студентов экономических и других специальностей, изучающих дисциплины «Информационные системы»,...

Вы можете разместить ссылку на наш сайт:


Все бланки и формы на filling-form.ru




При копировании материала укажите ссылку © 2019
контакты
filling-form.ru

Поиск