Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебно-практическое пособие ПРОГ лаб.раб..doc
Скачиваний:
19
Добавлен:
20.11.2019
Размер:
3.08 Mб
Скачать

Пример выполнения работы

1.Определить количество “особых” элементов массива. Элемент “особый”, если количество отрицательных элементов, расположенных до него равно количеству отрицательных элементов, расположенных после него.

2.Дана квадратная матрица. Требуется вывести строки матрицы, в которых есть элемент, равный сумме любых двух других элементов этой строки.

Выполнение задания 1.

На первом шаге детализации выделим следующие функции:

  • Ввод массива

  • Подсчет числа "особых" элементов массива.

Алгоритм первого шага детализации представлен блок-схемой на рис.Л2.1. Процедурой ReadArray формируется массив A из N элементов. Затем функцией KSpecific определяется количество “особых” элементов массива.

Приведем спецификацию выделенных функций.

Функция ReadArray.

Заголовок: void ReadArray(int a[], int *n)

Назначение: Ввод элементов массива .

Входные параметры: нет.

Выходные параметры:

  • a – массив;

  • n – количество элементов массива.

Алгоритм представлен блок-схемой на рис.Л2.2.

Функция KSpecific.

Заголовок: int KSpecific(int a[], int n)

Назначение: Определяет количество “особых” элементов массива.

Входные параметры:

  • a – массив;

  • n – количество обрабатываемых элементов.

Выходные параметры: нет.

Возвращаемое значение: количество “особых” элементов массива.

Алгоритм представлен блок-схемой на рис.Л2.3.

Функция KNeg.

Заголовок: int KNeg(int a[], int i1, int i2)

Назначение: Определяет количество отрицательных элементов массива в заданном интервале шндексов.

Входные параметры:

  • a – массив;

  • i1 – нижняя граница интервала индексов;

  • i2 – верхняя граница интервала индексов.

Выходные параметры: нет.

Возвращаемое значение: количество отрицательных элементов.

Алгоритм представлен блок-схемой на рис.Л2.4.

Наборы тестовых данных представлены в табл.Л2.2.

Таблица Л2.2

Номер набора

Исходные данные

Результат

n

a

1

0

0

2

1

3

0

3

5

1 2 3 4 5

0

4

5

-2 2 -3 4 4 5 -1 -2 6 7

3

5

10

-2 2 3 4 -4 3 3 1 -1 5

1

3. Программная реализация алгоритма решения задачи на языке Си приведена ниже.

#include <stdio.h>

#include <stdlib.h>

#define N_MAX 100

int a[N_MAX];

int n,k=0;

void ReadArray(int a[], int *n) {

int i;

printf("Введите число элементов в массиве a: "); scanf("%d",n);

for (i=0;i<*n;i++) {

printf("a[%d]=",i); scanf("%d",&a[i]);

}

}

int KNeg(int a[], int i1, int i2) {

int k=0,i;

for (i=i1;i<=i2;i++)

if (a[i]<0) k++;

return k;

}

int KSpecific(int a[], int n) {

int k=0,i,k1,k2;

for (i=1;i<n;i++) {

k1=KNeg(a,0,i-1); k2=KNeg(a,i+1,n);

if ((k1==k2)&&(k1!=0)) k++;

}

return k;

}

int main(void) {

setbuf(stdout, NULL);

printf("ЛАБОРАТОРНАЯ РАБОТА №2 (задание 1)\n");

ReadArray(a,&n);

k=KSpecific(a,n);

printf("k=%d\n",k);

printf("Работа программы завершена.\n");

return EXIT_SUCCESS;

}

Результат работы данной программе представлен на рис.Л2.5.

Выполнение задания 2.

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

На первом шаге детализации выделим следующие функции:

  • Ввод матрицы

  • Проверка содержит ли заданная строка матрицы элемент равный сумме двух других элементов этой строки.

  • Вывод строки матрицы

Алгоритм первого шага детализации представлен блок-схемой на рис.Л2.6.

Приведем спецификацию выделенных функций.

Функцияа ReadMatr.

Заголовок: void ReadMatr(int matr[N_MAX][M_MAX], int *n, int *m)

Назначение: Ввод элементов матрицы.

Входные параметры: нет.

Выходные параметры:

  • a – матрица;

  • n – количество строк матрицы;

  • m – количество столбцов матрицы.

Алгоритм представлен блок-схемой на рис.Л2.7.

Процедура WriteStrMatr.

Заголовок: void WriteStrMatr(int matr[N_MAX][M_MAX], int i, int m)

Назначение: Вывод на экран строки матрицы.

Входные параметры:

  • matr – матрица;

  • i - номер строки матрицы, выводимой на экран.

  • m – число столбцов матрицы.

Выходные параметры: нет.

Алгоритм представлен блок-схемой на рис.Л2.8.

Функция Condition.

Заголовок: int Condition(int matr[N_MAX][M_MAX], int i, int m)

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

Входные параметры:

  • a – матрица;

  • i – номер строки;

  • m – количество столбцов.

Выходные параметры: нет.

Возвращаемое значение:

  • 1, если в i-ой строке матрицы a есть элемент, равный сумме любых двух других элементов этой строки;

  • 0 – в противном случае.

Алгоритм представлен блок-схемой на рис.Л2.9.

Наборы тестовых данных представлены в табл.Л2.3.

Таблица Л2.3

Номер набора

Исходные данные

Результат

n

m

matr

1

3

4

1 2 8 4

5 6 2 9

9 10 11 22

2

6

4

1 2 3 4

3 1 5 2

1 7 3 2

1 2 8 4

1 2 7 4

1 4 3 0

1 2 3 4

3 1 5 2

1 7 3 2

1 4 3 0

Программная реализация алгоритма решения задачи на языке Си.

#include <stdio.h>

#include <stdlib.h>

#define N_MAX 20

#define M_MAX 30

int matr[N_MAX][M_MAX];

int n,m;

void ReadMatr(int matr[N_MAX][M_MAX], int *n, int *m) {

int i,j;

printf("Введите число строк в матрице: "); scanf("%d",n);

printf("Введите число столбцов в матрице: "); scanf("%d",m);

for (i=0;i<*n;i++)

for (j=0;j<*m;j++) {

printf("matr[%d,%d]=",i,j); scanf("%d",&matr[i][j]);

}

}

void WriteStrMatr(int matr[N_MAX][M_MAX], int i, int m) {

int j;

for (j=0;j<m;j++) printf("%d ",matr[i][j]);

printf("\n");

}

int Condition(int matr[N_MAX][M_MAX], int i, int m) {

int f=0,j=0,j1,j2;

while ((j<m)&&(!f)){

j1=0;

while ((j1<m-1)&&(!f)){

j2=j1+1;

while ((j2<m)&&(!f)){

f=matr[i][j]==matr[i][j1]+matr[i][j2]?1:0;

j2++;

}

j1++;

}

j++;

}

return f;

}

int main(void) {

int i;

setbuf(stdout, NULL);

printf("ЛАБОРАТОРНАЯ РАБОТА №2 (задание 2)\n");

ReadMatr(matr,&n,&m);

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

if (Condition(matr,i,m))

WriteStrMatr(matr,i,m);

printf("Работа программы завершена.\n");

return EXIT_SUCCESS;

}

Результат работы данной программе представлен на рис.Л2.10.

Контрольные вопросы к защите

К защите лабораторной работы №2 следует подготовить вопросы для повторения темы 3.

Способ оценки результатов

Критерии оценки результатов лабораторной работы №2 не отличаются от критериев оценки результатов лабораторной работы №1.

Лабораторная работа №3.Работа с файлами.

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

Требования к содержанию, оформлению и порядку выполнения

Требования к содержанию, оформлению и порядку выполнения лабораторной работы №3 не отличаются от соответствующих требований к лабораторной работе №1. Работы №1,3 содержат повторяющийся материал (см. список индивидуальных данных). Этот материал в отчет работы №3 не выносится. Однако при сдаче работы №3 следует представить отчеты по работе №1.

Теоретическая часть

Необходимая информация по выполнению лабораторной работы приведена в учебном пособии и в описании лабораторной работы №1.

Общая постановка задачи

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

Список индивидуальных данных

В лабораторной работе используются задания, определенные в 1 и 2 лабораторной работах.

Пример выполнения работы

Переделаем задание 1 из лабораторной работы №1 таким образом, чтобы исходные данные (значения x, y и z) вводились из текстового файла. Текст программы на Си будет следующий:

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

double a,b;

float xyz[3];

#define LEN 50

char str[LEN];

char NameFile[LEN]="c:\\dat_1_1.txt";

int main(void) {

int i=0;

setbuf(stdout, NULL);

printf("ЛАБОРАТОРНАЯ РАБОТА №3 (задание 1)\n");

printf("Исходные данные находятся в текстовом файле %s\n",NameFile);

FILE *pTextFile = fopen(NameFile,"r");

if(pTextFile == NULL) {

printf("Ошибка открытия файла %s\n",NameFile);

return EXIT_FAILURE;

}

printf("Считаны следующие данные:\n");

while ((fgets(str,LEN,pTextFile) != NULL) && (i<3)) {

xyz[i]=atof(str);

printf(" %f\n",xyz[i]);

i++;

}

if (i!=3) {

printf("В файле %s \n",NameFile);

printf("должно быть 3 вещественных числа по одному в строке\n");

return EXIT_FAILURE;

}

fclose(pTextFile);

printf("Результаты расчета:\n");

a=(0.5*cos(xyz[0]+1)*cos(xyz[0]+1)-sqrt(sqrt(exp(2*xyz[1]))))/

(xyz[1]+8+0.1*cos(xyz[0]+1));

printf("a=%f\n",a);

b=exp(-xyz[2]*xyz[1])-pow(exp(2*xyz[1]),1.0/5.0);

printf("b=%f\n",b);

printf("Работа программы завершена.\n");

return EXIT_SUCCESS;

}

Результат работы программы представлен на рис.Л3.1.

Переделаем задание 2 из лабораторной работы №1 таким образом, чтобы исходные данные (значения x, y и z) вводились из текстового файла, и результат работы также записывался в текстовый файл. Текст программы на Си будет следующий:

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

double a,b;

float xyz[3];

#define LEN 50

char str[LEN];

char NameFileInp[LEN]="c:\\dat_inp_1_2.txt";

char NameFileOut[LEN]="c:\\dat_out_1_2.txt";

int main(void) {

int i=0;

setbuf(stdout, NULL);

printf("ЛАБОРАТОРНАЯ РАБОТА №3 (задание 2)\n");

printf("Исходные данные находятся в текстовом файле %s\n",NameFileInp);

FILE *pTextFileInp = fopen(NameFileInp,"r");

if(pTextFileInp == NULL) {

printf("Ошибка открытия файла %s\n",NameFileInp);

return EXIT_FAILURE;

}

printf("Считаны следующие данные:\n");

while ((fgets(str,LEN,pTextFileInp) != NULL) && (i<3)) {

xyz[i]=atof(str);

printf(" %f\n",xyz[i]);

i++;

}

if (i!=3) {

printf("В файле %s \n",NameFileInp);

printf("должно быть 3 вещественных числа по одному в строке\n");

return EXIT_FAILURE;

}

fclose(pTextFileInp);

printf("Результаты расчета:\n");

if((xyz[0]>0)&&(xyz[1]>0)&&(xyz[2]>0)) printf("Верно\n");

else printf("Неверно\n");

FILE *pTextFileOut = fopen(NameFileOut,"w");

if(pTextFileOut == NULL) {

printf("Ошибка создания файла %s\n",NameFileOut);

return EXIT_FAILURE;

}

if((xyz[0]>0)&&(xyz[1]>0)&&(xyz[2]>0)) fprintf(pTextFileOut,"Верно\n");

else fprintf(pTextFileOut,"Неверно\n");

printf("Результаты расчета записаны в файл %s:\n",NameFileOut);

fclose(pTextFileOut);

printf("Работа программы завершена.\n");

return EXIT_SUCCESS;

}

Результат работы программы представлен на рис.Л3.2.

Переделаем задание 3 из лабораторной работы №1 таким образом, чтобы промежуточные вычисления и результат работы записывались в текстовый файл. Текст программы на Си будет следующий:

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#define LEN 50

char NameFileOut[LEN]="c:\\dat_out_1_3.txt";

double s,Y;

float x,E;

int i;

int main(void) {

setbuf(stdout, NULL);

FILE *pTextFileOut = fopen(NameFileOut,"w");

if(pTextFileOut == NULL) {

printf("Ошибка создания файла %s\n",NameFileOut);

return EXIT_FAILURE;

}

printf("ЛАБОРАТОРНАЯ РАБОТА №3 (задание 3)\n");

printf("x="); scanf("%f",&x);

printf("E="); scanf("%f",&E);

fprintf(pTextFileOut,"ЛАБОРАТОРНАЯ РАБОТА №3 (задание 3)\n");

fprintf(pTextFileOut,"Исходные данные:\n");

fprintf(pTextFileOut,"x=%f\n",x);

fprintf(pTextFileOut,"E=%f\n",E);

fprintf(pTextFileOut,"Этапы расчета:\n");

s=0.0; Y=1.0; i=0;

fprintf(pTextFileOut,"Y=%f s=%f\n",Y,s);

while (fabs(Y)>=E) {

s=s+Y;

i++;

Y=Y*x/i;

fprintf(pTextFileOut,"Y=%f s=%f\n",Y,s);

}

fclose(pTextFileOut);

printf("s=%f\n",s);

printf("Протокол работы записан в файл %s\n",NameFileOut);

printf("Работа программы завершена.\n");

return EXIT_SUCCESS;

}

Результат работы программы представлен на рис.Л3.3.

Контрольные вопросы к защите

К защите лабораторной работы №3 следует подготовить вопросы для повторения темы 4.

Способ оценки результатов

Критерии оценки результатов лабораторной работы №3 не отличаются от критериев оценки результатов лабораторной работы №1.

Лабораторная работа №4.Распределение памяти

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

Требования к содержанию, оформлению и порядку выполнения

Требования к содержанию, оформлению и порядку выполнения лабораторной работы №4 не отличаются от соответствующих требований к лабораторной работе №1. Работы №2,4 содержат повторяющийся материал (см. список индивидуальных данных). Этот материал в отчет работы №4 не выносится. Однако при сдаче работы №4 следует представить отчет по работе №2.

Теоретическая часть

Необходимая информация по выполнению лабораторной работы приведена в учебном пособии и в описании лабораторной работы №1.

Общая постановка задачи

Требуется переделать задания, выполненные в рамках лабораторных работ №2 так, чтобы память для используемых структурированных данных выделялась и освобождалась в процессе выполнения программы.

Список индивидуальных данных

В лабораторной работе используются задания, определенные во 2 лабораторной работе.

Пример выполнения работы

Переделаем задание 1 из лабораторной работы №2 таким образом, чтобы память для используемого массива выделялась динамически (на этапе выполнения программы). Текст программы на Си будет следующий:

#include <stdio.h>

#include <stdlib.h>

int *a;

int n,k=0;

int *ReadArray(int *n) {

int *a,i;

printf("Введите число элементов в массиве a: "); scanf("%d",n);

a = (int*)malloc(*n*sizeof(int));

for (i=0;i<*n;i++) {

printf("a[%d]=",i); scanf("%d",&a[i]);

}

return a;

}

int KNeg(int a[], int i1, int i2) {

int k=0,i;

for (i=i1;i<=i2;i++)

if (a[i]<0) k++;

return k;

}

int KSpecific(int a[], int n) {

int k=0,i,k1,k2;

for (i=1;i<n;i++) {

k1=KNeg(a,0,i-1); k2=KNeg(a,i+1,n);

if ((k1==k2)&&(k1!=0)) k++;

}

return k;

}

int main(void) {

setbuf(stdout, NULL);

printf("ЛАБОРАТОРНАЯ РАБОТА №4 (задание 1)\n");

a=ReadArray(&n);

k=KSpecific(a,n);

printf("k=%d\n",k);

free(a);

printf("Работа программы завершена.\n");

return EXIT_SUCCESS;

}

Переделаем задание 2 из лабораторной работы №2 таким образом, чтобы память для используемой матрицы выделялась динамически (на этапе выполнения программы). Текст программы на Си будет следующий:

#include <stdio.h>

#include <stdlib.h>

int **matr;

int n,m;

int **ReadMatr(int *n, int *m) {

int **matr,i,j;

printf("Введите число строк в матрице: "); scanf("%d",n);

printf("Введите число столбцов в матрице: "); scanf("%d",m);

matr = (int **)malloc(*n*sizeof(int*));

for (i=0;i<*n;i++) {

matr[i] = (int *)malloc(*m*sizeof(int));

for (j=0;j<*m;j++) {

printf("matr[%d,%d]=",i,j); scanf("%d",&matr[i][j]);

}

}

return matr;

}

void WriteStrMatr(int **matr, int i, int m) {

int j;

for (j=0;j<m;j++) printf("%d ",matr[i][j]);

printf("\n");

}

int Condition(int **matr, int i, int m) {

int f=0,j=0,j1,j2;

while ((j<m)&&(!f)){

j1=0;

while ((j1<m-1)&&(!f)){

j2=j1+1;

while ((j2<m)&&(!f)){

f=matr[i][j]==matr[i][j1]+matr[i][j2]?1:0;

j2++;

}

j1++;

}

j++;

}

return f;

}

int main(void) {

int i;

setbuf(stdout, NULL);

printf("ЛАБОРАТОРНАЯ РАБОТА №4 (задание 2)\n");

matr=ReadMatr(&n,&m);

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

if (Condition(matr,i,m))

WriteStrMatr(matr,i,m);

for (i=0;i<n;i++) free(matr[i]);

free(matr);

printf("Работа программы завершена.\n");

return EXIT_SUCCESS;

}

Контрольные вопросы к защите

К защите лабораторной работы №4 следует подготовить вопросы для повторения темы 5.

Способ оценки результатов

Критерии оценки результатов лабораторной работы №4 не отличаются от критериев оценки результатов лабораторной работы №1.

Лабораторная работа №5.Реализация АТД.

Целью лабораторной работы является изучение основных АТД и приобретение навыка их реализации на различных структурах данных.

Требования к содержанию, оформлению и порядку выполнения

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

Теоретическая часть

Необходимая информация по выполнению лабораторной работы приведена в учебном пособии.

Общая постановка задачи

Требуется разработать алгоритмы, реализующие операции заданного АТД, при этом использовать заданную СД. Варианты заданий представлены в таблице в следующем разделе.

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

Список индивидуальных данных

В таблице Л5.1 приведены варианты заданий. Каждая строка таблицы соответствует варианту. Например, в первом варианте требуется разработать алгоритмы операций TOP(S) и POP(S) АТД стек, при этом стек должен быть реализован с помощью массива.

Таблица Л5.1

варианта

СД

Операции

варианта

СД

Операции

массив

указатели

TOP(S)

POP(S)

PUSH(x,S)

FRONT(Q)

ENQUEUE(x,Q)

DEQUEUE(Q)

массив

указатели

TOP(S)

POP(S)

PUSH(x,S)

FRONT(Q)

ENQUEUE(x,Q)

DEQUEUE(Q)