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

Разработать функцию для определения простого числа. Написать программу, которая тестирует работоспособность данной функции. C и C++

Категория:

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

Дисциплина:

Системное программирование

Город:

Беларусь, Минск

Учебное заведение:

БНТУ, ФИТР

Тег:

#ОперационныеCистемы

Стоимость работы:

бесплатный

Оценка: 9
Объем страниц: 11
Год сдачи: 2020
Дата публикации: 07.10.2020

* Кроме файла с работой, также есть архив с дополнительными файлами.

Описание дополнительных файлов:

Архив содержит следующие файлы:
• main.cc – файл, в котором описана главная функция main и предусмотрено два способа ввода: через аргументы командной строки и стандартного ввода данных во время работы программы.
• Array_Processing.h – файл заголовка, в котором описан прототип функции, который модифицирует строку;
• Array_Processing.cc – файл реализации функции модифицирующей строку. Вызывает функции проверки Search_English_Words(), Vowels_Consonants( ) и подсчитывает количество латинских слов и слов, с равным количеством гласных и согласных букв ;
• Search_English_Words.h – файл заголовка, в котором описан прототип функции проверки: содержит ли введённое слово только символы латинского алфавита;
• Search_English_Words.cc – файл реализации функции проверки: содержит ли вве-дённое слово только символы латинского алфавита;
• Vowels_Consonants.h – файл заголовка, в котором описан прототип функции по нахождению слов с равным количеством гласных и согласных букв;
• Vowels_Consonants.cc – файл реализации функции по нахождению слов с равным количеством гласных и согласных букв;

Фрагменты для ознакомления

ЛАБОРАТОРНАЯ РАБОТА № 2

КОМПИЛЯЦИЯ И ОТЛАДКА ПРИЛОЖЕНИЙ В LINUX

Цель работы

Изучить инструментарий разработки приложений для Linux и фундаментальные основы системного программирования с использованием утилит gcc (g++) и gdb для создания, компиляции и отладки приложений на языке программирования С/C++.

 

Требования

Разработать приложение согласно варианту бригады. Во всех программах необходимо ввести N-строк, используя два способа ввода: через аргументы командной строки и стандартного ввода данных во время работы программы. Запустить программу в режиме отладки и продемонстрировать знания основных команд gdb.

При разработки программы использовать модульный принцип.

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

При выполнении задания запрещается использовать интегрированные средства разработки (Integrated Development Environment, IDE). Рекомендуется задействовать любой текстовый редактор (к примеру, gedit) и набор компиляторов GNU Compiler Collection (GCC), в частности, компилятор языка программирования С/C++ gcc/g++.

При разработке программ придерживайтесь соглашений по написанию кода на C/C++ (Code-Convention).

 

Индивидуальное задание:

Ввести n слов с консоли. Найти количество слов, содержащих только символы латинского алфавита, а среди них – количество слов с равным числом гласных и согласных букв. 

 

Ход выполнения лабораторной работы:

  1. Установил, обновил соответствующий инструментарий для выполнения лабораторной работы (gcc, g++ и gdb).
  2. Для удобства навигации по файлам установил дополнительно свободный файловый менеджер GNOME Comander (gnome-commender).
  3. Изучил теорию об использовании аргументов командной строки и принцип работы функции strtok().
  4. Выбрал метод решения индивидуального задания и разработал алгоритм.
  5. В текстовом редакторе gedit набрал исходный код решения задания на языке программирования С++ и сохранил исходник с именем. Программа состоит из следующих файлов (см. рис. 1):

main.cc – файл, в котором описана главная функция main и предусмотрено два способа ввода: через аргументы командной строки и стандартного ввода данных во время работы программы. 

Array_Processing.h  файл заголовка, в котором описан прототип функции, который модифицирует строку;

Array_Processing.cc  файл реализации функции модифицирующей строку. Вызывает функции проверки Search_English_Words(), Vowels_Consonants( ) и подсчитывает количество латинских слов и слов, с равным количеством гласных и согласных букв ;

Search_English_Words.h  файл заголовка, в котором описан прототип функции проверки: содержит ли введённое слово только символы латинского алфавита;

Search_English_Words.cc –  файл реализации функции проверки: содержит ли введённое слово только символы латинского алфавита;

Vowels_Consonants.h – файл заголовка, в котором описан прототип функции по нахождению слов с равным количеством гласных и согласных букв;

Vowels_Consonants.cc –  файл реализации функции по нахождению слов с равным количеством гласных и согласных букв;

  • Запустил терминал Linux и с помощью команды cd перешёл в папку местонахождения исходных кодов программы.
  1. Для компиляции программы использовал компилятор g++ с вводом соответствующих параметров (см. рис. 2);
  2. Для тестирования работоспособности запустил программу с соответствующими аргументами командной строки (см. рис. 2).
  3. Для отладки программы использовал gdb (см. рис. 3).

 

Результаты выполнения лабораторной работы:

Рисунок 1 – Содержимое папки программы лабораторной работы № 2

 

Рисунок 2.1 — Компиляция и выполнение программы test.out, c помощью, стандартного ввода данных во время работы программы

 

Рисунок 2.2 —Выполнение программы test.out, через аргументы командной строки.

 

Рисунок 3 — Запуск и отладка программы test с использованием gdb

 

Что я освоил в процессе выполнения лабораторной работы:

  1. Установку и обновление компиляторов gcc и g++ через консоль.
  2. Процесс создания исполняемой программы с использованием модульного принципа.
  3. Процесс передачи данных из командной строки при вызове функции.
  4. Применение функции strtok, последовательный вызов которой приводит к разбиению определённой строки на части (лексемы).
  5.  Команды ls, clear,  mv, cd, rm, cat для работы в Linux-терминале.
  6. Научился компилировать и запускать модульные  C/C++ программы с использованием gcc и g++ компиляторов.
  7. Научился отлаживать работу программы с использованием встроенного отладчика gdb.
  8. Разобрался в процессе создания компилятором выполняемой программы (что именно происходит за «кулисами»), а также как воедино собрать проект, который написан с использованием модульного принципа.

Выводы:

1. GCC (GNU Compiler Collection) – набор компиляторов для различных языков программирования, разработанный в рамках проекта GNU. GCC является свободным программным обеспечением, распространяется фондом свободного программного обеспечения (FSF) на условиях GNU GPL и GNU LGPL и является ключевым компонентом GNU toolchain. GCC используется как стандартный компилятор для свободных UNIX-подобных операционных систем.

2. Команды компилятора gcc:

  • gcc filename – исходный файл будет скомпилирован в исполняемый;
  • ./a.out запуск исполняемого файла;
  • gcc filename -o outputfile – указать в командной строке имя исполняемого файла, который получим на выходе;
  • -Wall  отображать все предупреждения;
  • -ansi чтобы  компилятор «точно» поддерживал стандарты ANSI; 
  • gcc filename -g -o outputfile – отлаживать исполняемый файл в отладчике GDB;
  • gcc filename -o outputfile –lm  –  чтобы привязать библиотеку;

gcc —help –  руководство (на русском) к компилятору gcc

3. Процесс создания исполняемой программы включает в себя четыри стадии:

  • Написание исходного кода прогарммы (получаем файлы *.h, *.с / *.сс);
  • Препроцессирование: Создание кода, более не содержащего директив. Разворачивание макросов;
  • Компиляция: Берется обработанный код, проводятся лексический и синтаксический анализы, и генерируется ассемблерный код;
  • Ассемблирование: Принимаются ассемблерные мнемоники и производятся объектные коды, содержащие коды команд;
  • Компоновка(или линковка): Трансформирует объектные файлы в итоговые исполняемые. 

4. GNU Debugger — переносимый отладчик проекта GNU, который работает на многих UNIX-подобных системах и умеет производить отладку многих языков программирования, включая Си, C и др. В ходе выполнения лабораторной работы были изучены такие команды GNU GDB, как :

  • break – установка точки останова, а delete – удаляет точку останова;
  • run – запуск программы внутри отладчика;
  • list – просмотр исходного кода;
  • info breakpoints – просмотр всех точек останова;
  • print – показывает чему равно на данном этапе значение переменной;
  • display – величина переменной будет показываться каждый раз, когда программа останавливается, без специального указания;
  • clear – удаляет все точки останова на текущем уровне стека (то есть в текущей функции);
  • continue – продолжение выполнения программы
  • set – прямо во время выполнения программы изменяет значение переменной;
  • step - проходим программу, останавливаясь на каждой строчке;
  • next - при вызове функции, программа не входит в неё, а продолжает дальше выполняться только на текущем уровне стека;
  • finish - выполняет программу до выхода из текущей функции;

5. g++ традиционное обозначение GNU C++, свободно распространяемого компилятора языка C++. Является частью GCC – коллекции компиляторов GNU.

 

ПРИЛОЖЕНИЕ A

Листинг исходного кода программы

 

Файл main.cc

#include <cstdio>
#include "Array_Processing.h"

 int main (int argc, char *argv[])
{ 
            if(argc>1)
            {
                        Array_Processing(argv,argc);
            }
            else
            {           
                        int rows, row, length, count;
                        printf("Enter the number of rows = ");
                        scanf("%d", &rows);
                        row=rows+1;
                        printf("Enter the length of argvings = ");
                        scanf("%d", &length);
                        argv = new char *[row]; 
                        for (count = 0; count < row; count++)
                                    argv[count] = new char[length]; 
                        printf("Enter string:\n");
                        for (int i = 0; i < row;  i++)
                                    fgets(argv[i], length, stdin);
                        Array_Processing(argv,row);
                        for (count = 0; count < row; count++)
                                    delete []argv[count];
            }
            return 0; 
 }

 

Файл Array_Processing.h

void Array_Processing(char **str, int row);

 

Файл Array_Processing.cc

#include <cstdio>
#include <cstring>
#include "Search_English_Words.h"
#include "Vowels_Consonants.h"

 void Array_Processing(char **str, int row)
 {
              int count=0, counter=0;
              char *word;              
              for (int i = 1; i < row;  i++) 
              {                     
                          word = strtok(str[i], " ,.!/?;():\n\t");
                          while (word)
                          { 
                                      if (Search_English_Words(word))
                                      {
                                                  count ++;
                                                  if (Vowels_Consonants(word)) counter++;
                                      }
                                      word = strtok(NULL, " ,.!/?;():\n\t");
                          }
              }
              printf("In the entered text found: %d english words\n",count);
              printf("Words with the same number of vowels and consonants of the english alphabet: %d \n",counter); 
 }

 

Файл Search_English_Words.h

int Search_English_Words(char *str);

 

Файл Search_English_Words.cc

#include <cstring>

int Search_English_Words(char *str) 
{   
            int count=1, len = strlen(str), i;
            for (i = 0; i < len ; i++)
            {
                        if (count=1 && str[i]>64 && str[i]<91|| str[i]>96 && str[i]<123) continue;
                        else
                        {
                                    count=0;
                                    break;
                        }
            }
            return count;
}

 

 

Файл Vowels_Consonants.h

bool Vowels_Consonants(char *str);

 

Файл Vowels_Consonants.cc

#include <cstring>
#include <cctype>

bool Vowels_Consonants(char *str)
{
            char symbol;
            int len = strlen(str), vowels=0, consonants=0;
            for (int i = 0; i < len ; i++)
            {
                        symbol=tolower(str[i]);
                        switch(symbol)
                                    {
                                    case'a':                                  
                                    case'e':                                   
                                    case'i':                                   
                                    case'o':                                  
                                    case'u':                                  
                                    case'y':                                   
                                                vowels++;
                                                break;
                                    default:
                                                consonants++;
                                                break;
                                    }
            }
            if (vowels == consonants) return true;
            else return false;
}
225