Программирование лаб1. Масловкий лаб1. Синтаксис языка C. Работа с памятью в С
Скачать 19.46 Kb.
|
Лабораторная работа №1 Тема: Синтаксис языка C++. Работа с памятью в С++. Цель: Научиться программировать на языке С++ базовые операции с данными разных типов, разветвляющиеся и циклические алгоритмы, научиться работать с динамической памятью в С++, осуществлять консольный ввод-вывод данных. Контрольные вопросы: Перечислите типы данных С++ с примерами объявления переменных. int i = 7; char c = “p”; float f = 0.3; bool b = true; Перечислите и кратко опишите классы памяти в С++. Регистровый (register) Когда мы определяем регистровую переменную, то мы просим компилятор, чтобы переменная располагалась в регистре, а не в оперативной памяти. Автоматический (automatic) По умолчанию, локальные переменные имеют класс auto. Такие переменные располагаются на стеке, а их область видимости ограничена своим блоком. Спецификатор auto уведомляет компилятор о том, что локальная переменная, перед именем которой он стоит, создаётся при входе в блок и разрушается при выходе из блока. Внешний (external) Внешние переменные вводятся как противоположные автоматическим. Это глобальные переменные и к ним можно обращаться именами из любой функции. Статический (static) Спецификатор static указывает компилятору на хранение локальной переменной во время всего жизненного цикла программы вместо ее создания и разрушения при каждом входе в область действия и выходе из неё. Что из себя представляют указатели и ссылки? Приведите пример их взаимосвязи. Что из себя представляет арифметика указателей (pointer arithmetic)? Указатель - это адрес, который является числовым значением. Следовательно, мы можете выполнять арифметические операции с указателем так же, как и с числовым значением. ptr++ ptr будет указывать на местоположение потому что каждый раз когда ptr увеличивается, он будет указывать на следующее целочисленное местоположение. Эта операция переместит указатель в следующую ячейку памяти, не влияя на фактическое значение в ячейке памяти. Область действия переменных в С++. Приведите пример кода с memory leak. Memory leak – это утечка памяти int main() { int * p = new int; delete p; // Memory leak int * q = new int; } Синтаксис функций на С++. Что такое сигнатура функции? Сигнатура функции-это части объявления функции, которые компилятор использует для выполнения разрешения перегрузки. Поскольку несколько функций могут иметь одно и то же имя компилятору нужен способ определить к какой из нескольких возможных функций с определенным именем должен быть разрешен вызов функции. В чем заключается особенность переменных, объявленных в функциях с ключевым словом static? Static препятствует повторной инициализации переменной. Одной из особенностей использования ключевого слова static является то, что оно автоматически устанавливает переменную в ноль Как можно организовать возврат значения в параметре функции? Функция получает на вход некие параметры, обрабатывает их как-то внутри и в ответ на свой вызов возвращает вызывающей стороне некоторое значение, результат своей работы. #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; } Организация ввода-вывода с помощью cstdio. int scanf(const char *format, ...) // фоматированный консольный ввод int printf(const char *format, ...) // фоматированный консольный вывод Организация ввода-вывода с помощью 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); } |