Главная страница

ОАИП. ОАИП(Гинсеровский) —. Лабораторная работа По дисциплине Основы алгоритмизации и программирования Вариант 4 Гинсеровский Егор Сергеевич


Скачать 233.5 Kb.
НазваниеЛабораторная работа По дисциплине Основы алгоритмизации и программирования Вариант 4 Гинсеровский Егор Сергеевич
АнкорОАИП
Дата04.01.2022
Размер233.5 Kb.
Формат файлаdoc
Имя файлаОАИП(Гинсеровский) — .doc
ТипЛабораторная работа
#324069

«Белорусский государственный университет информатики и радиоэлектроники»


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

По дисциплине: Основы алгоритмизации и программирования»

Вариант №4

Выполнил:

Гинсеровский Егор Сергеевич

студент 1 курса, 081971 группы,

зачётная книжка: 08197005

Проверил:


Минск 2020
Лабораторная работа №4. Функции пользователя
Подпрограмма – это именованная и определенным образом оформленная группа операторов, вызываемая по мере необходимости.

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

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

тип_результата ID_функции (список типов параметров);

а определение функции имеет следующую структуру:

тип_результата ID_функции (список параметров)

{

код функции

return результат;

}

Результат возвращается из функции в точку вызова при помощи оператора return и преобразуется к типу, указанному в заголовке функции. Если тип функции не указан, то по умолчанию устанавливается тип int, если же функция не возвращает результата, то следует указать пустой тип void. Список параметров состоит из перечня типов и ID параметров, разделенных запятыми.

Из функции можно передать только одно значение, при необходимости возвратить несколько – в списке параметров используют указатели.

Пример реализации функции, определяющей наименьшее из двух целых чисел:

int Min_x_y(int x, int y) {

return (x
Вызов функции имеет следующий формат:

ID_функции(список аргументов);

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

Вызов предыдущей функции может иметь вид: min = Min_x_y(a, b);

Область действия переменных

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

Глобальные переменные объявляются вне какой-либо функции и могут быть использованы в любом месте программы, но перед их первым использованием они должны быть объявлены и инициализированы. Область действия глобальных переменных – вся программа с момента их объявления. При объявлении глобальные переменные обнуляются.

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

В языке С каждая переменная принадлежит одному из четырех классов памяти – автоматической (auto), внешней (extern), статической (static) и регистровой (register). Тип памяти указывается перед спецификацией типа, например, register int a; или static double b; По умолчанию устанавливается класс auto и переменные размещаются в стеке.

Указатель на функцию

Функции могут быть использованы в качестве формальных параметров, для этого используется указатель на функцию. Например, указатель р на функцию, возвращающую результат типа double и имеющую два параметра doublet и int, объявляется следующим образом:

double (*p)(double, int);

Используя операцию typedef, тип такого указателя может быть объявлен так

typedef double (*TFun)(double, int);

Решение:
#include

#include

typedef double (*TFun)(double); // Декларация типа указателя на функцию

double fun1(double); // Декларации прототипов функций

double fun2(double);

double fact(int);

void Out_Rez(TFun, double, double, double);

void main()

{

double a, b, h;

puts("Input a,b,h"); scanf_s("%lf%lf%lf", &a, &b, &h);

puts("\n\t Function - SUM"); Out_Rez(fun1, a, b, h);

puts("\n\t Function - cos(x)"); Out_Rez(fun2, a, b, h);

puts("\n Press any key ... ");

}

//---------- Реализации функций пользователя ---------------------------------

double fun1(double r) {

double s = 0;

double b;

int n=4, zn = -1, k;//написано что n - любое число, я выбрал 4

for (k = 0; k <= n; k++) {

b = pow(-1, k) * pow(r, 2 * k) / fact(2*k);

s += b;

}

return s;

}

double fact(int N)

{

if (N < 0)

return 0;

if (N == 0)

return 1;

else

return N * fact(N - 1);

}

double fun2(double r) {

return cos(r);

}

void Out_Rez(TFun f, double xn, double xk, double h) {

for (double x = xn; x <= xk; x += h)

printf(" x = %5.2lf, y = %8.4lf\n", x, f(x));

}

Лабораторная работа №7. Использование строк
Строки как одномерные массивы символов
В языке С/С++ строка – это одномерный массив символов, заканчиваю­щийся нулевым байтом, каждый бит которого равен нулю, при этом для нулевого байта определена константа ´\0´ (признак окончания строки или нуль-терминатор).

Для строки, состоящей из 80 символов, в описании массива необходимо указать размер 81, т.к. последний байт отведится под нуль-терминатор.

Напомним, что строковая константа – это набор символов, заключенных в кавычки, например, “Лабораторная работа по строкам” (´\0´ не указывается).

Строки можно инициализировать при декларации, например:

char S1[10] = ”123456789”, S2[ ] = ”12345”;

в последнем случае размер строки устанавливается по фактическому количеству.

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

1) strcpy(S1, S2) – копирует содержимое строки S2 в строку S1;

2) strcat(S1, S2) – присоединяет строку S2 к строке S1 и помещает ее в массив, где находилась строка S1, при этом строка S2 не изменяется; нулевой байт, который завершал строку S1, заменяется первым символом строки S2;

3) strcmp(S1, S2) – сравнивает строки S1 и S2 и возвращает значение =0, если строки равны, т.е. содержат одно и то же число одинаковых символов; значение <0, если S1<S2; и значение >0, если S1>S2.

4) strlen(S) – возвращает длину строки, т.е. количество символов, начиная с первого (S[0]) и до нуль-терминатора, который не учитывается.

5) strstr(S1, S2) – указывает первое появление подстроки S2 в строке S1.

6) преобразование строки S в число (библиотека stdlib.h): целое – (int) atoi(S); длинное целое – (long) atol(S); действительное – (double) atof(S);

при возникновении ошибки данные функции возвращают значение 0;

7) преобразование числа V в строку S: целое – itoa(int V, char S, int kod); длинное целое – ltoa(long V, char S, int kod); значение параметра kod определяет выбор системы счисления для преобразования и находится в диапазоне 2kod36, для отрицательных чисел kod= 10.
Решение:
#include

#include

#include

using namespace std;
int main() {

string str, str2;

int i, k;

cout << "ENter string: " << endl;

getline(cin, str); cout << endl;

i = 0;

while (i < str.length())

{

str2 = "";

k = 0;

while (str[i] == ' ')

{

i++;

if (i >= str.length()) return 0;

}

while (str[i] != ' ' && str[i] != (char)NULL)

{

str2 += str[i++];

k++;

}

if (k % 2 == 0) cout << str2 << endl;

i++;

}
return 0;

}
Формат вводимых данных в консоль при запуске:


Лабораторная работа №8. Обработка структур с использованием файлов


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

struct Рerson {

char Fio[30];

double sball;

};

Объявление переменных созданного структурного типа:

Person Stud, *p_Stud;

Обращение к элементам структур производится посредством:

1) операции принадлежности ( . ) в виде:

ID_структуры . ID_поля или (*указатель) . ID_поля

2) операции косвенной адресации (–>) в виде:

указатель –> ID_поля или &(ID_структуры) . ID_поля

Для приведенного выше примера

1) Stud.Fio = “Иванов А.И.”; //Инициализация данных

Stud.sball = 5.75;

2) р_Stud –> Fio = “Иванов А.И.”;

р_Stud –> sball =5.75;

В языке C/С++ файл рассматривается как поток (stream), представляющий собой последовательность считываемых или записываемых байт. При этом последовательность записи определяется самой программой.

Работа с файлами

Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки и пересылке как единое целое. Прототипы большинства функций по обработке файлов описаны в библиотеках stdio.h и io.h.

Прежде чем работать с файлом, его нужно открыть для доступа, т.е. создать и инициализировать область данных, которая содержит информацию о файле: имя, путь и т.д. В языке С/С++ это выполняет функция fopen(), которая связывает физический файл на носителе с логическим именем в программе. Логическое имя – это указатель на файл, т.е. на область памяти, где хранится информация о файле. Указатели на файлы необходимо декларировать:

FILE *указатель на файл;

Формат функции

fopen( “строка 1” , “строка 2” );

в строке 1 указывается место, в которое мы собираемся поместить файл, например: “d:\\work\\sved.txt” – файл с именем sved.txt, который будет находиться на диске d, в папке work; если путь к файлу не указывать, то он будет размещен в рабочей папке проекта.

В строке 2 указывается код открытия файла:

w – для записи, если файла с заданным именем нет, то он будет создан, если же такой файл существует, то перед открытием прежняя информация уничтожается;

r – для чтения; если файла нет, то возникает ошибка;

a – для добавления новой информации в конец;

r+, w+ – возможны чтение и запись информации;

a+ – то же, что и для a, только запись можно выполнять в любое место файла, доступно и чтение файла.

По умолчанию файл открывается в текстовом режиме (t), указав b – файл открывается в двоичном режиме.

Если при открытии файла произошла ошибка, функция fopen возвращает значение NULL.

После работы доступ к файлу необходимо закрыть с помощью функции fclose(указа­тель файла), например, fclose ( f );

Для закрытия нескольких файлов введена функция: void fcloseall(void);

Приведем пример минимального набора операторов, необходимых для корректной работы с файлом:

#include

. . .

FILE *f_my;

if( ! ( f_my = fopen(“rez.txt”, “r+t” ) ) ) {

puts(“\n Ошибка открытия файла!”);

// В оконном режиме – ShowMessage("Ошибка открытия файла");

return;

}

. . . // Работа с файлом

fclose(f_my);

. . .

Для работы с текстовыми файлами в консольном приложении удобнее всего пользоваться функциями fprintf() и fscanf(), параметры и выполняемые действия аналогичны функциям printf() и scanf(), (см. лаб.раб.№1), только первым параметром добавлен указатель файла, к которому применяется данная функция.

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

Для создания баз данных удобнее пользоваться функциями работы с бинарными файлами. Рассмотрим некоторые из них, обозначив указатель файла – fp (FILE *fp;):

1) int fread(void *ptv, int size, int n, fp) – считывает n блоков по size байт каждый из файла fp в область памяти, на которую указывает ptv (необходимо заранее отвести память под считываемый блок);

2) int fwrite(void *ptv, int size, int n, fp) – записывает n блоков по size байт каждый из области памяти, на которую указывает ptv в файл fp;

3) int fileno(fp) – возвращает значение дескриптора файла fp (дескриптор –число, определяющее номер файла);

4) long filelength(int дескриптор) – возвращает длину файла в байтах;

5) int chsize(int дескриптор, long pos) – выполняет изменение размера файла fp, признак конца файла устанавливается после байта с номером pos;

6) int fseek(fp, long size, int kod) – выполняет смещение указателя на size байт в направлении признака kod: 0 – от начала файла; 1 – от текущей позиции; 2 – от конца файла;

7) long ftell(fp) – возвращает значение указателя на текущую позицию файла fp (-1 – ошибка);

8) int feof(указатель файла) – возвращает ненулевое значение при правильной записи признака конца файла;

9) int fgetpos(указатель файла, long *pos) – определяет значение текущей позиции pos файла; при успешном завершении возвращает значение 0.

Решение:
#include

#include

using namespace std;

const int n = 3, m = 4;

int main()

{

int A[n][m];

int k = 0, sum = 0;

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

{

for (int j = 0; j < m; j++)

{

cout << "Input [" << i << "][" << j << "] element: ";

cin >> A[i][j];

}

}

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

{

for (int j = 0; j < m; j++)

{

cout << A[i][j] << " ";

}

cout << endl;

}

for (int i = 0; i < m; i++)

{

for (int j = 0; j < n; j++)

{

sum = sum + A[j][i];

}

for (int a = 0; a < n; a++)

{

if (A[a][i] > sum - A[a][i]) k++;

}

sum = 0;

}

cout << "Result: " << k << endl;

return 0;

}
Формат вводимых данных в консоль при запуске:





написать администратору сайта