Вы находитесь на странице: 1из 11

Министерство науки и высшего образования Российской Федерации

федеральное государственное бюджетное образовательное учреждение


высшего образования
«Балтийский государственный технический университет «ВОЕНМЕХ» им. Д.Ф. Устинова»
(БГТУ «ВОЕНМЕХ» им. Д.Ф. Устинова»)
БГТУ.СМК-Ф-4.2-К5-01

Факультет О Естественнонаучный
шифр Наименование
Информационные системы и программная
Кафедра О7 инженерия
шифр Наименование
Дисциплина Компьютерный практикум

Лабораторная работа №1
на тему
«Командная строка и особенности использования набора
компиляторов и утилит GCC»
Вариант 7

Выполнил студент группы О715Б


Векслер А.Ю.
Фамилия И.О.

Преподаватель
Садырова А. К.
Фамилия И.О. Подпись

Оценка
«_____» 2022 г.

Санкт-Петербург
2022 г.
Задания к лабораторной работе
Часть I
1. Написать программу 1 в соответствии с вариантом при помощи
любого текстового редактора.
2. Провести поэтапную компиляцию исходного текста написанной
программы, разобраться в результатах, полученных на каждом этапе
компиляции.
3. Провести оптимизацию кода написанной программы с помощью
набора компиляторов GCC, пояснить внесенные для оптимизации кода
изменения.
Часть II
4. Написать программы 2 и 3 в соответствии с вариантом при помощи
любого текстового редактора. Функции для работы с массивом вынести в
отдельные файлы: в одном файле описать функции для ввода/вывода
массива, в другом – для обработки массива. В обеих программах должны
использоваться одни и те же функции для ввода/вывода массивов, описанные
в одном из этих файлов.
5. Провести раздельную компиляцию написанных файлов.
6. Скомпилировать обе программы, используя созданные объектные
файлы, обе программы должны использовать один и тот же объектный файл
с функциями для ввода/вывода массива.
7. Создать статическую библиотеку для ввода/вывода и обработки
массива и продемонстрировать возможности по ее подключению.

1. Для натурального числа N получить все его натуральные делители.


2. Вычислить сумму элементов массива М (15), значения которых
лежат в введенном с клавиатуры диапазоне [X, Y].
3. Удалить из массива А (20) первый отрицательный элемент.
Задание 1
1. Для натурального числа N получить все его натуральные
делители.
Исходный код программы
Файл «main.c»
#include <stdio.h>
int main(void)
{
int i, n;
scanf("%d", &n);

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


if (n % i == 0)
printf("%d" "\n", i);
return 0;
} #include <stdio.h>
int main(void)
{
int i, n;
scanf("%d", &n);
for (i = 1; i <= n; i++)
if (n % i == 0)
printf("%d" "\n", i);
return 0;
}

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

Рисунок 1 – Ввод команды в командную строку

Применив команду на рис. 2, получим файл 1try.s с ассемблерным


кодом, соответствующим исходному тексту.
Рисунок 2 – Ввод команды в командную строку
Результатом команды показанной на рис. 3 будет объектный файл,
содержащий блоки готового к исполнению машинного кода, блоки данных, а
также список определенных в файле функций и внешних переменных.

Рисунок 3 – Ввод команды в командную строку

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


исполняемого файла.

Рисунок 4 – Ввод команды в командную строку

2. Оптимизация кода

Применив команду на рис. 5, получим файл optim1.s с ассемблерным


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

Рисунок 5 – Ввод команды в командную строку

С помощью команд на рис. 6 создаём файлы: optim11.s, optim12.s и


optim13.s с различной степенью оптимизации.

O1 - включает оптимизацию. Пытается уменьшить размер кода и


ускорить работу программы. Соответственно увеличивается время
компиляции.
O2 - оптимизирует еще больше. GCC выполняет почти все поддерживаемые
оптимизации, которые не включают уменьшение времени исполнения за счет
увеличения длины кода. Компилятор не выполняет раскрутку циклов или
подстановку функций, когда вы указываете -O2. По сравнению с -O, эта
опция увеличивает как время компиляции, так и эффективность
сгенерированного кода.
O3- оптимизирует еще немного. Включает все оптимизации -O2 и также
включает флаги.

Рисунок 6 – Ввод команды в командную строку

Входные данные Ожидаемый результат Полученный


результат

4 1,2,4

9 1,3,9

Таблица 1 – Тест работы программы


Задание 2
Вычислить сумму элементов массива М (15), значения которых лежат в
введенном с клавиатуры диапазоне [X, Y].
1.Исходный код программы
Файл «main.c»
#include <stdio.h>
#include <stdlib.h>
#include “1.h”
#include “2.h”
int main(){

const int N = 15;


int a[N];
EnterArray(a,N);
func(a,N);
}

Файл «EnterArray.c» (также используется в 3 программе)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include “1.h”
void EnterArray(int * a, int size)
{
printf(“Enter Array: “);
int I;
for (I = 0; I < size; i++)
scanf(“%d”, &a[i]);
}

void PrintArray(int * a, int size)


{
int I;
for( I = 0; I < size; i++)
printf(“%d\t”, a[i]);
}

Файл «Scan.c»
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include “2.h”

void func(int * a, int size){


int x, y;
do{
printf(“x = “);
scanf(“%d”,&x);
}while(x < 1 || size < x);
do{
printf(“y = “);
scanf(“%d”,&y);
}
while(y < x || size < y);
int sum = 0;
for (int I = x -1 ; I <= y; ++i){
sum += a[i];
}
printf(“sum = %d”, sum);
}

Файл «1.h» (также используется в 3 задании)


void EnterArray(int * , int );
void PrintArray(int * , int );

Файл «2.h» (также используется в 3 задании)


void func(int * , int );

2. Раздельная компиляция
С помощью команд на рис. 7 компилируем исходный файлы в
объектные файлы.

Рисунок 7 – Ввод команды в командную строку


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

Рисунок 8 – Ввод команды в командную строк

3. Создание статической библиотеки

С помощью команды на рисунке 9 создаем статическую библиотеку


libar.a, содержащую объектные файлы Scan.o и EnterArray.o.

Рисунок 9 – Ввод команды в командную строк

Для компиляции с использованием библиотеки используется команда


указанная на рис. 10
Опция -L передает путь к библиотеке, в описанном случае -L.
Показывает, что искать следует в каталоге с исходным текстом.

Рисунок 10 – Ввод команды в командную строку

Входные Ожидаемый Полученный результат


данные результат
1, 2, 3, 4, 5, 6, 7, sum =6
8, 9, 10, 11, 12,
13, 14, 15
X=1,Y=3
1, 1, 1, 1, 1, 1, 1, sum = 5
1, 1, 1, 1, 1, 1, 1,
1
X=1, Y=5
Таблица 2 – Тест работы программы
Задание 3
Удалить из массива А (5) первый отрицательный элемент.

1.Исходный код программы


Файл «main.c»
#include <stdio.h>
#include <stdlib.h>
#include "1.h"
#include "2.h"
int main()
{
int i,j=0;
const int N = 5;
int a[N];
EnterArray(a,N);
work(a,N);
PrintArray(a,N);
}

Файл «EnterArray.c» (также используется в 3 программе)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "1.h"
void EnterArray(int * a, int size)
{
printf("Enter Array: ");
int i;
for (i = 0; i < size; i++)
scanf("%d", &a[i]);
}

void PrintArray(int * a, int size)


{
int i;
for( i = 0; i < size; i++)
printf("%d\t", a[i]);
}

Файл «Worl.c»
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "2.h"

void work(int * a, int size){


int i,j;
for(i=0;i<size;i++)
if(a[i]<0)
{
for(;i<size;i++)
{
a[i]=a[i+1];
j++;
}
size--;

}
if (j==0)
{
printf("There is no negative numbers");
}

else
{

for(i=0;i<size;i++)
printf("%d\n ",a[i]);

system("pause");
return 0;
}

Файл «1.h» (также используется в 3 задании)


void EnterArray(int * , int );
void PrintArray(int * , int );

Файл «2.h» (также используется в 3 задании)


void (int * , int );

1. Раздельная компиляция
С помощью команд на рис. 10 компилируем исходный файлы в
объектные файлы.

Рисунок 10 – Ввод команды в командную строку

С помощью команды на рисунке 11 связываем три ранее созданных


объектных
файла в исполняемый файл.

Рисунок 11 – Ввод команды в командную строк

2. Создание статической библиотеки

С помощью команды на рисунке 12 создаем статическую библиотеку


libar.a, содержащую объектные файлы Scan.o и EnterArray.o.

Рисунок 12 – Ввод команды в командную строк

Для компиляции с использованием библиотеки используется команда


указанная на рис. 13

Опция -L передает путь к библиотеке, в описанном случае -L.


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

Рисунок 13 – Компиляция с использованием библиотеки


Входные Ожидаемый Полученный результат
данные результат
1, -2, 3, 4, 5 1, 3, 4, 5

1, -2, -3, 4, -4 1, -3, 4, -4

Таблица 3 – Тест работы программы

Вам также может понравиться