Главная страница
Навигация по странице:

  • Автоматический

  • Внешний

  • Что из себя представляет арифметика указателей (pointer arithmetic)

  • Синтаксис функций на С++. Что такое сигнатура функции

  • В чем заключается особенность переменных, объявленных в функциях с ключевым словом static

  • Как можно организовать возврат значения в параметре функции

  • Программирование лаб1. Масловкий лаб1. Синтаксис языка C. Работа с памятью в С


    Скачать 19.46 Kb.
    НазваниеСинтаксис языка C. Работа с памятью в С
    АнкорПрограммирование лаб1
    Дата09.10.2022
    Размер19.46 Kb.
    Формат файлаdocx
    Имя файлаМасловкий лаб1.docx
    ТипЛабораторная работа
    #723612

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

    Тема: Синтаксис языка C++. Работа с памятью в С++.

    Цель: Научиться программировать на языке С++ базовые операции с данными разных типов,

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

    памятью в С++, осуществлять консольный ввод-вывод данных.

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

    1. Перечислите типы данных С++ с примерами объявления переменных.

    int i = 7;

    char c = “p”;

    float f = 0.3;

    bool b = true;

    1. Перечислите и кратко опишите классы памяти в С++.

    Регистровый (register)

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

    Автоматический (automatic)

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

    Внешний (external)

    Внешние переменные вводятся как противоположные автоматическим. Это глобальные переменные и к ним можно обращаться именами из любой функции.

    Статический (static)

    Спецификатор static указывает компилятору на хранение локальной переменной во время всего жизненного цикла программы вместо ее создания и разрушения при каждом входе в область действия и выходе из неё.

    1. Что из себя представляют указатели и ссылки? Приведите пример их взаимосвязи.




    1. Что из себя представляет арифметика указателей (pointer arithmetic)?

    Указатель - это адрес, который является числовым значением. Следовательно, мы можете выполнять арифметические операции с указателем так же, как и с числовым значением.

    ptr++

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

    1. Область действия переменных в С++. Приведите пример кода с memory leak.

    Memory leak – это утечка памяти

    int main() {

    int * p = new int;

    delete p;

    // Memory leak

    int * q = new int;

    }


    1. Синтаксис функций на С++. Что такое сигнатура функции?

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


    1. В чем заключается особенность переменных, объявленных в функциях с ключевым словом static?

    Static препятствует повторной инициализации переменной. Одной из особенностей использования ключевого слова static является то, что оно автоматически устанавливает переменную в ноль


    1. Как можно организовать возврат значения в параметре функции?

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

    #include

    using namespace std;

    int sum (int a) // int вначале означает тип возвращаемого параметра

    {

    int b;

    b = a +5;

    return b;

    }

    //Наша функция прибавляет к любому целочисленному числу цифру 5, как это работает:

    int main()

    {

    int x = 4;

    int y = sum(x);

    cout << y << endl; // y = 9, т.к. 4 + 5 = 9, функция работает корректно

    return 0;

    }

    1. Организация ввода-вывода с помощью cstdio.

    int scanf(const char *format, ...) // фоматированный консольный ввод

    int printf(const char *format, ...) // фоматированный консольный вывод

    1. Организация ввода-вывода с помощью iostream и iomanip.

    Вывод:

    int n;

    char j;

    cin >> n >> j;

    cout << "Значение n равно" << n << "j=" << j;

    Ввод:

    int n;

    char j;

    cin >> n >> j;

    Вар.10 Практические задания

    Задание 1

    #include

    using namespace std;

    void insertionSort(int list[], int listLength) // задаем задачу, с пмощью которой будет осуществляться сортировка

    {

    for (int i = 1; i < listLength; i++)

    {

    int j = i - 1;

    while (j >= 0 && list[j] > list[j + 1]) // задал параметры, по которым будет осуществляться сортировка

    {

    swap(list[j], list[j + 1]); // сортировка с помощью обмена значениями

    }

    }

    }

    int main()

    {

    int list[16] = { 3,2,9,4,27,8,81,16,243,32,729,64,2187,128,6561,256 }; // вводим данные, которые должны быть отсортированны

    cout << "Input array ...\n"; // вывод на консоль данных, которые должны быть отсортированны

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

    {

    cout << list[i] << "\t";

    }

    insertionSort(list, 16);

    cout << "\n\nSorted array ... \n"; // вывод упорядоченных данных на консоль

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

    {

    cout << list[i] << "\t"; //вывод на консоль

    }

    return 0;

    }

    Задание 2

    #include

    using namespace std;

    int main()

    {

    const size_t LEN = 18; // задаем все параметры

    const size_t N = 6;

    const size_t M = 3;

    int* arr1D = new int[LEN];

    void initializeArray(int* arr, size_t n);

    { int n;

    if (n > 1)

    {

    *(arr1D + 1) = 0,1,8,24,48,80,120,168,224,288;

    for (size_t n = 2; n < n; ++n);

    *(arr1D + n) = *(arr1D + n * 2) - 1;

    // эквивалентно: arr[i] = [i*2] - 1;

    }

    }

    {

    int** makeArray (int* arr1D, size_t rows, size_t i);

    { int rows;

    int j;

    int** arr2D = new int* [rows]; // выделяем память под выходной массив

    for (size_t i = 0; i < rows; ++i) // и еще под каждый ряд массива в отдельности

    {

    *(arr2D + i) = new int;

    }

    for (size_t i = 0; i < rows; ++i);

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

    {

    *(*(arr2D) + j) = (-1);

    }

    return **arr2D; } // возвращаем указатель на выделенную память под 2-мерный массив

    Задание 3

    #include

    #include

    int main() {

    char src[40]; // задал максимальное кол-во символов ресурса

    char dest[100]; // задал максимальное кол-во символов для места копирования

    memset(dest, '\0', sizeof(dest)); // задал стартовый индекс

    strcpy_s(src, "Hello"); // тект, который должен быть скопирован

    strcpy_s(dest, src); // задал путь копирования текста

    printf("Hello", dest); // тект, который должен быть выведен

    return(0);

    }


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